UNPKG

nd-jscover

Version:
90 lines (80 loc) 2.56 kB
"use strict"; /** * Module dependencies. */ var debug = require('debug')('jscover'); var exec = require('child_process').exec; var path = require('path'); var ndir = require('ndir'); var fse = require('fs-extra'); var fs = require('fs'); var root = path.dirname(__dirname); var JSCoverPath = path.join(root, 'bin', 'JSCover-all.jar'); var JSCoverCommand = 'java -Dfile.encoding=UTF-8 -jar "' + JSCoverPath + '" -fs'; /** * Pedding codes to support nodejs * @type {String} */ var PEDDING = "/* ****** automatically generated by jscover - do not edit ******/\n\ if (typeof _$jscoverage === 'undefined') { _$jscoverage = {}; }\n\ /* ****** end - do not edit ******/\n"; module.exports = function jscover(source, target, options, callback) { source = source || ''; target = target || ''; options = options || []; var tmpName = '__cov__' + Date.now(); var tmpdir = process.env.TMPDIR || '/tmp'; var tmpTargetDir = path.join(tmpdir, tmpName); var tmpTarget = path.join(tmpTargetDir, path.basename(target)); var cleanup = function () { fse.removeSync(tmpTargetDir); fse.removeSync(path.join(target, tmpName)); }; var cmd = JSCoverCommand; cmd += ' ' + source + ' ' + target; if (options && options.length > 0) { cmd += ' ' + options.join(' '); } debug(cmd); console.log (cmd); var child = exec(cmd, function (err, stdout, stderr) { var output = ''; if (stdout) { output += stdout; } if (stderr) { output += stderr; } console.log(output) return callback(null, output); ndir.walk(tmpTarget, function onDir(dirpath, items) { var todir = dirpath.replace(tmpTarget, target); fse.mkdirpSync(todir); for (var i = 0; i < items.length; i++) { var info = items[i]; var from = info[0]; var name = path.basename(from); if (name === '.git' || name === '.svn' || name.indexOf('jscoverage') === 0) { continue; } var to = path.join(todir, path.basename(from)); if (info[1].isDirectory()) { fse.mkdirpSync(to); } else if (info[1].isFile()) { var content = fs.readFileSync(from); if (path.extname(to).toLowerCase() === '.js') { content = PEDDING + content.toString(); } fs.writeFileSync(to, content); } } }, function end() { cleanup(); callback(); }, function error(err, errPath) { cleanup(); console.error('%s error: %s', errPath, err); callback(err); }); }); };