1 // Generated by CoffeeScript 1.8.0
3 var DEFAULT_REPORT_FORMAT, Module, existsSync, fileset, fs, ibrik, istanbul, mkdirp, path, which,
6 Module = require('module');
10 path = require('path');
12 ibrik = require('./ibrik');
14 istanbul = require('istanbul');
16 mkdirp = require('mkdirp');
18 which = require('which');
20 fileset = require('fileset');
22 existsSync = fs.existsSync || path.existsSync;
24 DEFAULT_REPORT_FORMAT = 'lcov';
26 module.exports = function(opts, callback) {
27 var args, cmd, e, excludes, file, reportClassName, reportingDir, reports, runFn, _ref;
28 _ref = opts._, cmd = _ref[0], file = _ref[1], args = 3 <= _ref.length ? __slice.call(_ref, 2) : [];
30 return callback("Need a filename argument for the " + cmd + " command!");
32 if (!existsSync(file)) {
34 file = which.sync(file);
37 return callback("Unable to resolve file [" + file + "]");
40 file = path.resolve(file);
43 if ((opts['default-excludes'] == null) || opts['default-excludes']) {
44 excludes = ['**/node_modules/**', '**/test/**', '**/tests/**'];
46 reportingDir = '' + (opts.dir || path.resolve(process.cwd(), 'coverage'));
47 mkdirp.sync(reportingDir);
48 reportClassName = opts.report || DEFAULT_REPORT_FORMAT;
50 istanbul.Report.create(reportClassName, {
55 process.argv = ['node', file].concat(__slice.call(args));
57 console.log("Running: " + (process.argv.join(' ')));
59 process.env.running_under_istanbul = 1;
60 return Module.runMain(file, null, true);
62 if (opts.print !== 'none') {
65 reports.push(istanbul.Report.create('text'));
68 reports.push(istanbul.Report.create('text'));
69 reports.push(istanbul.Report.create('text-summary'));
72 reports.push(istanbul.Report.create('text-summary'));
75 return istanbul.matcherFor({
76 root: opts.root || process.cwd(),
77 includes: ['**/*.coffee'],
79 }, function(err, matchFn) {
80 var coverageVar, hookOpts, instrumenter, transformer, _ref1;
82 return callback(err, null);
84 coverageVar = "$$cov_" + (Date.now()) + "$$";
85 instrumenter = new ibrik.Instrumenter({
86 coverageVariable: coverageVar
88 transformer = instrumenter.instrumentSync.bind(instrumenter);
92 if (opts['self-test']) {
93 ibrik.hook.unloadRequireCache(matchFn);
95 ibrik.hook.hookRequire(matchFn, transformer, hookOpts);
96 process.once('exit', function() {
97 var collector, cov, report, _i, _len;
98 file = path.resolve(reportingDir, 'coverage.json');
99 if (global[coverageVar] == null) {
100 return callback('No coverage information was collected, exit without writing coverage information', null);
102 cov = global[coverageVar];
104 mkdirp.sync(reportingDir);
105 console.log('=============================================================================');
106 console.log("Writing coverage object [" + file + "]");
107 if (!opts.headless) {
108 fs.writeFileSync(file, JSON.stringify(cov), 'utf8');
110 collector = new istanbul.Collector;
112 console.log("Writing coverage reports at [" + reportingDir + "]");
113 console.log('=============================================================================');
114 for (_i = 0, _len = reports.length; _i < _len; _i++) {
115 report = reports[_i];
116 report.writeReport(collector, true);
118 return callback(null, cov);
120 if (opts != null ? (_ref1 = opts.files) != null ? _ref1.include : void 0 : void 0) {
121 if (typeof opts.files.include === 'string') {
122 opts.files.include = [opts.files.include];
124 return fileset(opts.files.include.join(' '), excludes.join(' '), function(err, files) {
125 var filename, _i, _len;
127 return console.error('Error including files: ', err);
129 for (_i = 0, _len = files.length; _i < _len; _i++) {
130 filename = files[_i];
131 instrumenter.include(filename);