UNPKG

@zkochan/pnpm

Version:

A fast implementation of npm install

56 lines (45 loc) 1.53 kB
'use strict'; 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'); }