| 1 | | /*! |
| 2 | | * jscover - lib/jscover.js |
| 3 | | * Copyright(c) 2012 fengmk2 <fengmk2@gmail.com> |
| 4 | | * MIT Licensed |
| 5 | | */ |
| 6 | | |
| 7 | 1 | "use strict"; |
| 8 | | |
| 9 | | /** |
| 10 | | * Module dependencies. |
| 11 | | */ |
| 12 | | |
| 13 | 1 | var debug = require('debug')('jscover'); |
| 14 | 1 | var exec = require('child_process').exec; |
| 15 | 1 | var path = require('path'); |
| 16 | 1 | var ndir = require('ndir'); |
| 17 | 1 | var fse = require('fs-extra'); |
| 18 | 1 | var fs = require('fs'); |
| 19 | | |
| 20 | 1 | var root = path.dirname(__dirname); |
| 21 | 1 | var JSCoverPath = path.join(root, 'bin', 'JSCover-all.jar'); |
| 22 | 1 | var JSCoverCommand = 'java -Dfile.encoding=UTF-8 -jar "' + JSCoverPath + '" -fs'; |
| 23 | | |
| 24 | | /** |
| 25 | | * Pedding codes to support nodejs |
| 26 | | * @type {String} |
| 27 | | */ |
| 28 | 1 | var PEDDING = "/* ****** automatically generated by jscover - do not edit ******/\n\ |
| 29 | | if (typeof _$jscoverage === 'undefined') { _$jscoverage = {}; }\n\ |
| 30 | | /* ****** end - do not edit ******/\n"; |
| 31 | | |
| 32 | 1 | module.exports = function jscover(source, target, options, callback) { |
| 33 | 5 | source = source || ''; |
| 34 | 5 | target = target || ''; |
| 35 | 5 | options = options || []; |
| 36 | 5 | var tmpName = '__cov__' + Date.now(); |
| 37 | 5 | var tmpTargetDir = path.join(path.dirname(target), tmpName); |
| 38 | 5 | var tmpTarget = path.join(tmpTargetDir, path.basename(target)); |
| 39 | | |
| 40 | 5 | var cmd = JSCoverCommand; |
| 41 | 5 | if (options && options.length > 0) { |
| 42 | 1 | cmd += ' ' + options.join(' '); |
| 43 | | } |
| 44 | 5 | cmd += ' --exclude=node_modules --exclude=.git/ --exclude=.svn/'; |
| 45 | 5 | cmd += ' --exclude="' + tmpTarget + '" --exclude="' + target + '"'; |
| 46 | 5 | cmd += ' "' + source + '" "' + tmpTarget + '"'; |
| 47 | 5 | debug(cmd); |
| 48 | 5 | var child = exec(cmd, function (err, stdout, stderr) { |
| 49 | 5 | var output = ''; |
| 50 | 5 | if (stdout) { |
| 51 | 2 | output += stdout; |
| 52 | | } |
| 53 | 5 | if (stderr) { |
| 54 | 2 | output += stderr; |
| 55 | 2 | if (!err) { |
| 56 | 0 | err = new Error(stderr.trim()); |
| 57 | | } |
| 58 | 2 | err.name = 'JSCover' + err.name; |
| 59 | | } |
| 60 | 5 | if (err) { |
| 61 | 2 | debug(err, stderr); |
| 62 | 2 | return callback(err, output); |
| 63 | | } |
| 64 | | |
| 65 | 3 | var success = !stdout && !stderr; |
| 66 | 3 | if (!success) { |
| 67 | 0 | return callback(null, output); |
| 68 | | } |
| 69 | 3 | ndir.walk(tmpTarget, function onDir(dirpath, items) { |
| 70 | 5 | var todir = dirpath.replace(tmpTarget, target); |
| 71 | 5 | fse.mkdirpSync(todir); |
| 72 | 5 | for (var i = 0; i < items.length; i++) { |
| 73 | 25 | var info = items[i]; |
| 74 | 25 | var from = info[0]; |
| 75 | 25 | var name = path.basename(from); |
| 76 | 25 | if (name === '.git' || name === '.svn' || name.indexOf('jscoverage') === 0) { |
| 77 | 18 | continue; |
| 78 | | } |
| 79 | 7 | var to = path.join(todir, path.basename(from)); |
| 80 | 7 | if (info[1].isDirectory()) { |
| 81 | 2 | fse.mkdirpSync(to); |
| 82 | 5 | } else if (info[1].isFile()) { |
| 83 | 5 | var content = fs.readFileSync(from); |
| 84 | 5 | if (path.extname(to).toLowerCase() === '.js') { |
| 85 | 5 | content = PEDDING + content.toString(); |
| 86 | | } |
| 87 | 5 | fs.writeFileSync(to, content); |
| 88 | | } |
| 89 | | } |
| 90 | | }, function end() { |
| 91 | 3 | fse.removeSync(tmpTargetDir); |
| 92 | 3 | fse.removeSync(path.join(target, tmpName)); |
| 93 | 3 | callback(); |
| 94 | | }, function error(err, errPath) { |
| 95 | 0 | console.error('%s error: %s', errPath, err); |
| 96 | 0 | callback(err); |
| 97 | | }); |
| 98 | | |
| 99 | | }); |
| 100 | | }; |