module.exports = runScript var lifecycle = require('./utils/lifecycle.js') var npm = require('./npm.js') var path = require('path') var readJson = require('read-package-json') var log = require('npmlog') var chain = require('slide').chain var usage = require('./utils/usage') var output = require('./utils/output.js') var didYouMean = require('./utils/did-you-mean') var isWindowsShell = require('./utils/is-windows-shell.js') runScript.usage = usage( 'run-script', 'npm run-script <command> [-- <args>...]' ) runScript.completion = function (opts, cb) { // see if there's already a package specified. var argv = opts.conf.argv.remain if (argv.length >= 4) return cb() if (argv.length === 3) { // either specified a script locally, in which case, done, // or a package, in which case, complete against its scripts var json = path.join(npm.localPrefix, 'package.json') return readJson(json, function (er, d) { if (er && er.code !== 'ENOENT' && er.code !== 'ENOTDIR') return cb(er) if (er) d = {} var scripts = Object.keys(d.scripts || {}) console.error('local scripts', scripts) if (scripts.indexOf(argv[2]) !== -1) return cb() // ok, try to find out which package it was, then var pref = npm.config.get('global') ? npm.config.get('prefix') : npm.localPrefix var pkgDir = path.resolve(pref, 'node_modules', argv[2], 'package.json') readJson(pkgDir, function (er, d) { if (er && er.code !== 'ENOENT' && er.code !== 'ENOTDIR') return cb(er) if (er) d = {} var scripts = Object.keys(d.scripts || {}) return cb(null, scripts) }) }) } readJson(path.join(npm.localPrefix, 'package.json'), function (er, d) { if (er && er.code !== 'ENOENT' && er.code !== 'ENOTDIR') return cb(er) d = d || {} cb(null, Object.keys(d.scripts || {})) }) } function runScript (args, cb) { if (!args.length) return list(cb) var pkgdir = npm.localPrefix var cmd = args.shift() readJson(path.resolve(pkgdir, 'package.json'), function (er, d) { if (er) return cb(er) run(d, pkgdir, cmd, args, cb) }) } function list (cb) { var json = path.join(npm.localPrefix, 'package.json') var cmdList = [ 'publish', 'install', 'uninstall', 'test', 'stop', 'start', 'restart', 'version' ].reduce(function (l, p) { return l.concat(['pre' + p, p, 'post' + p]) }, []) return readJson(json, function (er, d) { if (er && er.code !== 'ENOENT' && er.code !== 'ENOTDIR') return cb(er) if (er) d = {} var allScripts = Object.keys(d.scripts || {}) var scripts = [] var runScripts = [] allScripts.forEach(function (script) { if (cmdList.indexOf(script) !== -1) scripts.push(script) else runScripts.push(script) }) if (log.level === 'silent') { return cb(null, allScripts) } if (npm.config.get('json')) { output(JSON.stringify(d.scripts || {}, null, 2)) return cb(null, allScripts) } if (npm.config.get('parseable')) { allScripts.forEach(function (script) { output(script + ':' + d.scripts[script]) }) return cb(null, allScripts) } var s = '\n ' var prefix = ' ' if (scripts.length) { output('Lifecycle scripts included in %s:', d.name) } scripts.forEach(function (script) { output(prefix + script + s + d.scripts[script]) }) if (!scripts.length && runScripts.length) { output('Scripts available in %s via `npm run-script`:', d.name) } else if (runScripts.length) { output('\navailable via `npm run-script`:') } runScripts.forEach(function (script) { output(prefix + script + s + d.scripts[script]) }) return cb(null, allScripts) }) } function run (pkg, wd, cmd, args, cb) { if (!pkg.scripts) pkg.scripts = {} var cmds if (cmd === 'restart' && !pkg.scripts.restart) { cmds = [ 'prestop', 'stop', 'poststop', 'restart', 'prestart', 'start', 'poststart' ] } else { if (pkg.scripts[cmd] == null) { if (cmd === 'test') { pkg.scripts.test = 'echo \'Error: no test specified\'' } else if (cmd === 'env') { if (isWindowsShell) { log.verbose('run-script using default platform env: SET (Windows)') pkg.scripts[cmd] = 'SET' } else { log.verbose('run-script using default platform env: env (Unix)') pkg.scripts[cmd] = 'env' } } else if (npm.config.get('if-present')) { return cb(null) } else { let suggestions = didYouMean(cmd, Object.keys(pkg.scripts)) suggestions = suggestions ? '\n' + suggestions : '' return cb(new Error('missing script: ' + cmd + suggestions)) } } cmds = [cmd] } if (!cmd.match(/^(pre|post)/)) { cmds = ['pre' + cmd].concat(cmds).concat('post' + cmd) } log.verbose('run-script', cmds) chain(cmds.map(function (c) { // pass cli arguments after -- to script. if (pkg.scripts[c] && c === cmd) { pkg.scripts[c] = pkg.scripts[c] + joinArgs(args) } // when running scripts explicitly, assume that they're trusted. return [lifecycle, pkg, c, wd, { unsafePerm: true }] }), cb) } // join arguments after '--' and pass them to script, // handle special characters such as ', ", ' '. function joinArgs (args) { var joinedArgs = '' args.forEach(function (arg) { joinedArgs += ' "' + arg.replace(/"/g, '\\"') + '"' }) return joinedArgs }
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
auth | Folder | 0755 |
|
|
config | Folder | 0755 |
|
|
doctor | Folder | 0755 |
|
|
install | Folder | 0755 |
|
|
search | Folder | 0755 |
|
|
utils | Folder | 0755 |
|
|
access.js | File | 5.54 KB | 0644 |
|
adduser.js | File | 1.31 KB | 0644 |
|
audit.js | File | 10.56 KB | 0644 |
|
bin.js | File | 515 B | 0644 |
|
bugs.js | File | 864 B | 0644 |
|
build.js | File | 4.44 KB | 0644 |
|
cache.js | File | 4.66 KB | 0644 |
|
ci.js | File | 1.31 KB | 0644 |
|
completion.js | File | 7.11 KB | 0644 |
|
config.js | File | 7.43 KB | 0644 |
|
dedupe.js | File | 4.88 KB | 0644 |
|
deprecate.js | File | 2.11 KB | 0644 |
|
dist-tag.js | File | 4.11 KB | 0644 |
|
docs.js | File | 1.04 KB | 0644 |
|
doctor.js | File | 3.98 KB | 0644 |
|
edit.js | File | 1.37 KB | 0644 |
|
explore.js | File | 1.67 KB | 0644 |
|
fetch-package-metadata.js | File | 3.97 KB | 0644 |
|
fetch-package-metadata.md | File | 1.77 KB | 0644 |
|
fund.js | File | 4.91 KB | 0644 |
|
get.js | File | 235 B | 0644 |
|
help-search.js | File | 5.64 KB | 0644 |
|
help.js | File | 6.35 KB | 0644 |
|
hook.js | File | 4.62 KB | 0644 |
|
init.js | File | 2.74 KB | 0644 |
|
install-ci-test.js | File | 486 B | 0644 |
|
install-test.js | File | 507 B | 0644 |
|
install.js | File | 36.47 KB | 0644 |
|
link.js | File | 5.6 KB | 0644 |
|
logout.js | File | 1.26 KB | 0644 |
|
ls.js | File | 16.09 KB | 0644 |
|
npm.js | File | 14.37 KB | 0644 |
|
org.js | File | 4.18 KB | 0644 |
|
outdated.js | File | 12.28 KB | 0644 |
|
owner.js | File | 6.6 KB | 0644 |
|
pack.js | File | 11.79 KB | 0644 |
|
ping.js | File | 1.11 KB | 0644 |
|
prefix.js | File | 330 B | 0644 |
|
profile.js | File | 11.13 KB | 0644 |
|
prune.js | File | 2.23 KB | 0644 |
|
publish.js | File | 5.14 KB | 0644 |
|
rebuild.js | File | 2.09 KB | 0644 |
|
repo.js | File | 1.44 KB | 0644 |
|
restart.js | File | 64 B | 0644 |
|
root.js | File | 320 B | 0644 |
|
run-script.js | File | 5.41 KB | 0644 |
|
search.js | File | 3.36 KB | 0644 |
|
set.js | File | 276 B | 0644 |
|
shrinkwrap.js | File | 9.82 KB | 0644 |
|
star.js | File | 2.11 KB | 0644 |
|
stars.js | File | 1.03 KB | 0644 |
|
start.js | File | 62 B | 0644 |
|
stop.js | File | 61 B | 0644 |
|
substack.js | File | 509 B | 0644 |
|
team.js | File | 4.61 KB | 0644 |
|
test.js | File | 374 B | 0644 |
|
token.js | File | 6.66 KB | 0644 |
|
unbuild.js | File | 4.27 KB | 0644 |
|
uninstall.js | File | 2.21 KB | 0644 |
|
unpublish.js | File | 3.51 KB | 0644 |
|
update.js | File | 2.16 KB | 0644 |
|
version.js | File | 9.79 KB | 0644 |
|
view.js | File | 15.11 KB | 0644 |
|
visnup.js | File | 4.01 KB | 0644 |
|
whoami.js | File | 1.77 KB | 0644 |
|
xmas.js | File | 1.62 KB | 0644 |
|