Coverage

93%
66
62
4

jscover.js

93%
62
58
4
LineHitsSource
1/*!
2 * jscover - lib/jscover.js
3 * Copyright(c) 2012 fengmk2 <fengmk2@gmail.com>
4 * MIT Licensed
5 */
6
71"use strict";
8
9/**
10 * Module dependencies.
11 */
12
131var debug = require('debug')('jscover');
141var exec = require('child_process').exec;
151var path = require('path');
161var ndir = require('ndir');
171var fse = require('fs-extra');
181var fs = require('fs');
19
201var root = path.dirname(__dirname);
211var JSCoverPath = path.join(root, 'bin', 'JSCover-all.jar');
221var JSCoverCommand = 'java -Dfile.encoding=UTF-8 -jar "' + JSCoverPath + '" -fs';
23
24/**
25 * Pedding codes to support nodejs
26 * @type {String}
27 */
281var PEDDING = "/* ****** automatically generated by jscover - do not edit ******/\n\
29if (typeof _$jscoverage === 'undefined') { _$jscoverage = {}; }\n\
30/* ****** end - do not edit ******/\n";
31
321module.exports = function jscover(source, target, options, callback) {
335 source = source || '';
345 target = target || '';
355 options = options || [];
365 var tmpName = '__cov__' + Date.now();
375 var tmpTargetDir = path.join(path.dirname(target), tmpName);
385 var tmpTarget = path.join(tmpTargetDir, path.basename(target));
39
405 var cmd = JSCoverCommand;
415 if (options && options.length > 0) {
421 cmd += ' ' + options.join(' ');
43 }
445 cmd += ' --exclude=node_modules --exclude=.git/ --exclude=.svn/';
455 cmd += ' --exclude="' + tmpTarget + '" --exclude="' + target + '"';
465 cmd += ' "' + source + '" "' + tmpTarget + '"';
475 debug(cmd);
485 var child = exec(cmd, function (err, stdout, stderr) {
495 var output = '';
505 if (stdout) {
512 output += stdout;
52 }
535 if (stderr) {
542 output += stderr;
552 if (!err) {
560 err = new Error(stderr.trim());
57 }
582 err.name = 'JSCover' + err.name;
59 }
605 if (err) {
612 debug(err, stderr);
622 return callback(err, output);
63 }
64
653 var success = !stdout && !stderr;
663 if (!success) {
670 return callback(null, output);
68 }
693 ndir.walk(tmpTarget, function onDir(dirpath, items) {
705 var todir = dirpath.replace(tmpTarget, target);
715 fse.mkdirpSync(todir);
725 for (var i = 0; i < items.length; i++) {
7325 var info = items[i];
7425 var from = info[0];
7525 var name = path.basename(from);
7625 if (name === '.git' || name === '.svn' || name.indexOf('jscoverage') === 0) {
7718 continue;
78 }
797 var to = path.join(todir, path.basename(from));
807 if (info[1].isDirectory()) {
812 fse.mkdirpSync(to);
825 } else if (info[1].isFile()) {
835 var content = fs.readFileSync(from);
845 if (path.extname(to).toLowerCase() === '.js') {
855 content = PEDDING + content.toString();
86 }
875 fs.writeFileSync(to, content);
88 }
89 }
90 }, function end() {
913 fse.removeSync(tmpTargetDir);
923 fse.removeSync(path.join(target, tmpName));
933 callback();
94 }, function error(err, errPath) {
950 console.error('%s error: %s', errPath, err);
960 callback(err);
97 });
98
99 });
100};

subdir/foo.js

100%
4
4
0
LineHitsSource
11exports.hello = '你好,Hello world';
21exports.hexNumber = 0x12;
31exports.count = 16;
4
51exports.hexNumber2 = 0xff;