paco
Version:
Node package development/distribution utility kit
94 lines (76 loc) • 2.42 kB
JavaScript
;
var path = require('path');
var comeondo = require('comeondo');
var Q = require('q');
var pathHelpers = require('./paths');
/**
* Returns a path to the nearest package.json config containing a
* npm script with a given name.
*/
function getNearestPackageJsonWithTask(task) {
var packageJsonPaths = pathHelpers.getTraversedFilesNamed('package.json', {
stopAt: process.env.PACO_ROOT_PATH
});
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = packageJsonPaths[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var filepath = _step.value;
var info = require(filepath);
if (info.scripts && info.scripts[task]) {
return filepath;
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return null;
}
/**
* Checks if an npm script, optionally searching parent modules.
*/
function hasTask(task) {
var opts = arguments.length <= 1 || arguments[1] === undefined ? { traverse: true } : arguments[1];
var packageJsonPath = opts.traverse ? getNearestPackageJsonWithTask(task) : process.env.PACO_PACKAGE_JSON_PATH;
if (packageJsonPath) {
var packageJson = require(packageJsonPath);
return !!(packageJson.scripts && packageJson.scripts[task]);
}
return false;
}
/**
* Runs an npm script, optionally in parent modules with a $PACO_CWD
* node environment variable.
*/
function runTask(task) {
var opts = arguments.length <= 1 || arguments[1] === undefined ? { traverse: true } : arguments[1];
opts.cwd = opts.cwd || process.cwd();
var taskPackageJsonPath = opts.traverse ? getNearestPackageJsonWithTask(task) : process.env.PACO_PACKAGE_JSON_PATH;
if (taskPackageJsonPath) {
return comeondo.exec('npm run ' + task, {
cwd: path.dirname(taskPackageJsonPath),
env: Object.assign({}, process.env, {
PACO_CWD: opts.cwd
})
});
}
return Q(null);
}
module.exports = {
getNearestPackageJsonWithTask: getNearestPackageJsonWithTask,
hasTask: hasTask,
runTask: runTask
};