@zkochan/pnpm
Version:
A fast implementation of npm install
56 lines (45 loc) • 1.53 kB
JavaScript
;
var clone = require('lodash.clone');
var managePath = require('manage-path');
var spawn = require('spawn-command');
var _require = require('path');
var resolve = _require.resolve;
var basename = _require.basename;
var findup = require('findup');
var fs = require('fs');
module.exports = function run(nodeModulesPath, filename, env) {
var command = commandFor(nodeModulesPath, hook(filename));
if (command) {
runCommand(command, env);
}
};
function hook(filename) {
return basename(filename);
}
// replace any instance of $1 or $2 etc. to that item as an process.argv
function replacePositionalVariables(command) {
return command.replace(/\$(\d)/g, function (match, number) {
return process.argv[number];
});
}
function commandFromPackage(packagePath, hookName) {
var pkg = JSON.parse(fs.readFileSync(packagePath));
if (pkg.config && pkg.config.ghooks && pkg.config.ghooks[hookName]) {
return replacePositionalVariables(pkg.config.ghooks[hookName]);
} else {
return null;
}
}
function commandFor(nodeModulesPath, hookName) {
var pkgFile = findup.sync(nodeModulesPath, 'package.json');
return commandFromPackage(resolve(pkgFile, 'package.json'), hookName);
}
function runCommand(command, env) {
env = clone(env || process.env);
var alterPath = managePath(env);
alterPath.unshift(getNpmBin(process.cwd()));
spawn(command, { stdio: 'inherit', env: env }).on('exit', process.exit);
}
function getNpmBin(dirname) {
return resolve(dirname, 'node_modules', '.bin');
}