first commit
This commit is contained in:
+58
@@ -0,0 +1,58 @@
|
||||
/**
|
||||
* @author Toru Nagashima
|
||||
* @copyright 2016 Toru Nagashima. All rights reserved.
|
||||
* @copyright 2026 Bret Comnes. All rights reserved.
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Public Interface
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* @param {'npm-run-all' | 'run-p' | 'run-s'} name - CLI implementation name.
|
||||
* @returns {Promise<unknown>}
|
||||
*/
|
||||
export default async function bootstrap (name) {
|
||||
const argv = process.argv.slice(2)
|
||||
|
||||
switch (argv[0]) {
|
||||
case undefined:
|
||||
case '-h':
|
||||
case '--help': {
|
||||
const { default: help } = await import(`../${name}/help.js`)
|
||||
return help(process.stdout)
|
||||
}
|
||||
|
||||
case '-v':
|
||||
case '--version': {
|
||||
const { default: version } = await import('./version.js')
|
||||
return version(process.stdout)
|
||||
}
|
||||
|
||||
default: {
|
||||
// https://github.com/mysticatea/npm-run-all/issues/105
|
||||
// Avoid MaxListenersExceededWarnings.
|
||||
process.stdout.setMaxListeners(0)
|
||||
process.stderr.setMaxListeners(0)
|
||||
process.stdin.setMaxListeners(0)
|
||||
|
||||
// Main
|
||||
const { default: main } = await import(`../${name}/main.js`)
|
||||
return main(
|
||||
argv,
|
||||
process.stdout,
|
||||
process.stderr
|
||||
).then(
|
||||
() => {
|
||||
// I'm not sure why, but maybe the process never exits
|
||||
// on Git Bash (MINGW64)
|
||||
process.exit(0)
|
||||
},
|
||||
() => {
|
||||
process.exit(1)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
+302
@@ -0,0 +1,302 @@
|
||||
/**
|
||||
* @author Toru Nagashima
|
||||
* @copyright 2016 Toru Nagashima. All rights reserved.
|
||||
* @copyright 2026 Bret Comnes. All rights reserved.
|
||||
* See LICENSE file in root directory for full license.
|
||||
*
|
||||
* @import { ColorMode } from '../../lib/run-task.js'
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Helpers
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
const OVERWRITE_OPTION = /^--([^:]+?):([^=]+?)(?:=(.+))?$/
|
||||
const CONFIG_OPTION = /^--([^=]+?)(?:=(.+))$/
|
||||
const PACKAGE_CONFIG_PATTERN = /^npm_package_config_(.+)$/
|
||||
const CONCAT_OPTIONS = /^-[clnprsx]+$/
|
||||
|
||||
/**
|
||||
* @typedef {Record<string, string>} ConfigMap
|
||||
* @typedef {Record<string, ConfigMap>} PackageConfigMap
|
||||
* @typedef CliGroup
|
||||
* @property {boolean} parallel - Whether this group runs in parallel.
|
||||
* @property {string[]} patterns - Task patterns in this group.
|
||||
* @typedef {Partial<CliGroup>} InitialValues
|
||||
* @typedef ArgumentSetOptions
|
||||
* @property {boolean} [singleMode] - The flag to be single group mode.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Overwrites a specified package config.
|
||||
*
|
||||
* @param {PackageConfigMap} config - A config object to be overwritten.
|
||||
* @param {string} packageName - A package name to overwrite.
|
||||
* @param {string} variable - A variable name to overwrite.
|
||||
* @param {string} value - A new value to overwrite.
|
||||
* @returns {void}
|
||||
*/
|
||||
function overwriteConfig (config, packageName, variable, value) {
|
||||
const scope = config[packageName] || (config[packageName] = {})
|
||||
scope[variable] = value
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a package config object.
|
||||
* This checks `process.env` and creates the default value.
|
||||
*
|
||||
* @returns {PackageConfigMap} Created config object.
|
||||
*/
|
||||
function createPackageConfig () {
|
||||
/** @type {PackageConfigMap} */
|
||||
const retv = {}
|
||||
const packageName = process.env['npm_package_name']
|
||||
if (!packageName) {
|
||||
return retv
|
||||
}
|
||||
|
||||
for (const key of Object.keys(process.env)) {
|
||||
const m = PACKAGE_CONFIG_PATTERN.exec(key)
|
||||
if (m != null && m[1] && process.env[key] != null) {
|
||||
overwriteConfig(retv, packageName, m[1], process.env[key])
|
||||
}
|
||||
}
|
||||
|
||||
return retv
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a new group into a given list.
|
||||
*
|
||||
* @param {CliGroup[]} groups - A group list to add.
|
||||
* @param {InitialValues} [initialValues] - A key-value map for the default of new value.
|
||||
* @returns {void}
|
||||
*/
|
||||
function addGroup (groups, initialValues) {
|
||||
groups.push({
|
||||
parallel: false,
|
||||
patterns: [],
|
||||
...(initialValues || {})
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* ArgumentSet is values of parsed CLI arguments.
|
||||
* This class provides the getter to get the last group.
|
||||
*/
|
||||
class ArgumentSet {
|
||||
/**
|
||||
* @param {InitialValues} [initialValues] - A key-value map for the default of new value.
|
||||
* @param {ArgumentSetOptions} [options] - A key-value map for the options.
|
||||
*/
|
||||
constructor (initialValues, options) {
|
||||
/** @type {ConfigMap} */
|
||||
this.config = {}
|
||||
/** @type {boolean} */
|
||||
this.continueOnError = false
|
||||
/** @type {CliGroup[]} */
|
||||
this.groups = []
|
||||
/** @type {number} */
|
||||
this.maxParallel = 0
|
||||
/** @type {string | null} */
|
||||
this.npmPath = null
|
||||
/** @type {PackageConfigMap} */
|
||||
this.packageConfig = createPackageConfig()
|
||||
/** @type {boolean} */
|
||||
this.printLabel = false
|
||||
/** @type {boolean} */
|
||||
this.printName = false
|
||||
/** @type {boolean} */
|
||||
this.race = false
|
||||
/** @type {boolean} */
|
||||
this.aggregateOutput = false
|
||||
/** @type {ColorMode} */
|
||||
this.colorMode = 'auto'
|
||||
/** @type {string[]} */
|
||||
this.rest = []
|
||||
/** @type {boolean} */
|
||||
this.silent = process.env['npm_config_loglevel'] === 'silent'
|
||||
/** @type {boolean} */
|
||||
this.singleMode = Boolean(options?.singleMode)
|
||||
/** @type {boolean} */
|
||||
this.nodeRun = false
|
||||
|
||||
addGroup(this.groups, initialValues)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the last group.
|
||||
*/
|
||||
get lastGroup () {
|
||||
const group = this.groups[this.groups.length - 1]
|
||||
if (!group) {
|
||||
throw new Error('No argument group exists.')
|
||||
}
|
||||
return group
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets "parallel" flag.
|
||||
*/
|
||||
get parallel () {
|
||||
return this.groups.some(g => g.parallel)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses CLI arguments.
|
||||
*
|
||||
* @param {ArgumentSet} set - The parsed CLI arguments.
|
||||
* @param {string[]} args - CLI arguments.
|
||||
* @returns {ArgumentSet} set itself.
|
||||
*/
|
||||
function parseCLIArgsCore (set, args) {
|
||||
LOOP: // eslint-disable-line no-labels
|
||||
for (let i = 0; i < args.length; ++i) {
|
||||
const arg = args[i]
|
||||
if (arg == null) {
|
||||
continue
|
||||
}
|
||||
|
||||
switch (arg) {
|
||||
case '--':
|
||||
set.rest = args.slice(1 + i)
|
||||
break LOOP // eslint-disable-line no-labels
|
||||
|
||||
case '--color':
|
||||
case '--no-color':
|
||||
// do nothing.
|
||||
break
|
||||
|
||||
case '-c':
|
||||
case '--continue-on-error':
|
||||
set.continueOnError = true
|
||||
break
|
||||
|
||||
case '-l':
|
||||
case '--print-label':
|
||||
set.printLabel = true
|
||||
break
|
||||
|
||||
case '-n':
|
||||
case '--print-name':
|
||||
set.printName = true
|
||||
break
|
||||
|
||||
case '-r':
|
||||
case '--race':
|
||||
set.race = true
|
||||
break
|
||||
|
||||
case '--silent':
|
||||
set.silent = true
|
||||
break
|
||||
|
||||
case '--max-parallel':
|
||||
{
|
||||
const rawMaxParallel = args[++i]
|
||||
set.maxParallel = parseInt(rawMaxParallel ?? '', 10)
|
||||
if (!Number.isFinite(set.maxParallel) || set.maxParallel <= 0) {
|
||||
throw new Error(`Invalid Option: --max-parallel ${rawMaxParallel ?? ''}`)
|
||||
}
|
||||
}
|
||||
break
|
||||
|
||||
case '-s':
|
||||
case '--sequential':
|
||||
case '--serial':
|
||||
if (set.singleMode && arg === '-s') {
|
||||
set.silent = true
|
||||
break
|
||||
}
|
||||
if (set.singleMode) {
|
||||
throw new Error(`Invalid Option: ${arg}`)
|
||||
}
|
||||
addGroup(set.groups)
|
||||
break
|
||||
|
||||
case '--aggregate-output':
|
||||
set.aggregateOutput = true
|
||||
break
|
||||
|
||||
case '-p':
|
||||
case '--parallel':
|
||||
if (set.singleMode) {
|
||||
throw new Error(`Invalid Option: ${arg}`)
|
||||
}
|
||||
addGroup(set.groups, { parallel: true })
|
||||
break
|
||||
|
||||
case '--npm-path':
|
||||
set.npmPath = args[++i] || null
|
||||
break
|
||||
|
||||
case '-x':
|
||||
case '--node-run':
|
||||
set.nodeRun = true
|
||||
break
|
||||
|
||||
case '--color-mode': {
|
||||
const mode = args[++i]
|
||||
if (mode !== 'auto' && mode !== 'none' && mode !== '16' && mode !== '256') {
|
||||
throw new Error(`Invalid Option: --color-mode ${mode ?? ''} (expected auto, none, 16, or 256)`)
|
||||
}
|
||||
set.colorMode = mode
|
||||
break
|
||||
}
|
||||
|
||||
default: {
|
||||
let matched = null
|
||||
if ((matched = OVERWRITE_OPTION.exec(arg))) {
|
||||
overwriteConfig(
|
||||
set.packageConfig,
|
||||
matched[1] ?? '',
|
||||
matched[2] ?? '',
|
||||
matched[3] ?? args[++i] ?? ''
|
||||
)
|
||||
} else if ((matched = CONFIG_OPTION.exec(arg))) {
|
||||
const configName = matched[1]
|
||||
if (configName) {
|
||||
set.config[configName] = matched[2] ?? ''
|
||||
}
|
||||
} else if (CONCAT_OPTIONS.test(arg)) {
|
||||
parseCLIArgsCore(
|
||||
set,
|
||||
arg.slice(1).split('').map(c => `-${c}`)
|
||||
)
|
||||
} else if (arg.startsWith('-')) {
|
||||
throw new Error(`Invalid Option: ${arg}`)
|
||||
} else {
|
||||
set.lastGroup.patterns.push(arg)
|
||||
}
|
||||
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!set.parallel && set.aggregateOutput) {
|
||||
throw new Error('Invalid Option: --aggregate-output (without parallel)')
|
||||
}
|
||||
if (!set.parallel && set.race) {
|
||||
const race = args.indexOf('--race') !== -1 ? '--race' : '-r'
|
||||
throw new Error(`Invalid Option: ${race} (without parallel)`)
|
||||
}
|
||||
if (!set.parallel && set.maxParallel !== 0) {
|
||||
throw new Error('Invalid Option: --max-parallel (without parallel)')
|
||||
}
|
||||
|
||||
return set
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses CLI arguments.
|
||||
*
|
||||
* @param {string[]} args - CLI arguments.
|
||||
* @param {InitialValues} [initialValues] - A key-value map for the default of new value.
|
||||
* @param {ArgumentSetOptions} [options] - A key-value map for the options.
|
||||
* @returns {ArgumentSet} The parsed CLI arguments.
|
||||
*/
|
||||
export default function parseCLIArgs (args, initialValues, options) {
|
||||
return parseCLIArgsCore(new ArgumentSet(initialValues, options), args)
|
||||
}
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
/**
|
||||
* @author Toru Nagashima
|
||||
* @copyright 2016 Toru Nagashima. All rights reserved.
|
||||
* @copyright 2026 Bret Comnes. All rights reserved.
|
||||
* See LICENSE file in root directory for full license.
|
||||
*
|
||||
* @import { Writable } from 'node:stream'
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Public Interface
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
import { readFile } from 'node:fs/promises'
|
||||
import { resolve } from 'node:path'
|
||||
|
||||
const __dirname = import.meta.dirname
|
||||
|
||||
/**
|
||||
* Print a version text.
|
||||
*
|
||||
* @param {Writable} output - A writable stream to print.
|
||||
* @returns {Promise<null>} Always a fulfilled promise.
|
||||
* @private
|
||||
*/
|
||||
export default async function printVersion (output) {
|
||||
const packageJson = JSON.parse(
|
||||
await readFile(resolve(__dirname, '../../package.json'), 'utf8')
|
||||
)
|
||||
const version = packageJson.version
|
||||
|
||||
output.write(`v${version}\n`)
|
||||
|
||||
return Promise.resolve(null)
|
||||
}
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
/**
|
||||
* @author Toru Nagashima
|
||||
* @copyright 2015 Toru Nagashima. All rights reserved.
|
||||
* @copyright 2026 Bret Comnes. All rights reserved.
|
||||
* See LICENSE file in root directory for full license.
|
||||
*
|
||||
* @import { Writable } from 'node:stream'
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Public Interface
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Print a help text.
|
||||
*
|
||||
* @param {Writable} output - A writable stream to print.
|
||||
* @returns {Promise<null>} Always a fulfilled promise.
|
||||
* @private
|
||||
*/
|
||||
export default function printHelp (output) {
|
||||
output.write(`
|
||||
Usage:
|
||||
$ npm-run-all [--help | -h | --version | -v]
|
||||
$ npm-run-all [tasks] [OPTIONS]
|
||||
|
||||
Run given npm-scripts in parallel or sequential.
|
||||
|
||||
<tasks> : A list of npm-scripts' names and Glob-like patterns.
|
||||
|
||||
Options:
|
||||
--aggregate-output - - - Avoid interleaving output by delaying printing of
|
||||
each command's output until it has finished.
|
||||
-c, --continue-on-error - Set the flag to continue executing
|
||||
other/subsequent tasks even if a task threw an
|
||||
error. 'npm-run-all' itself will exit with
|
||||
non-zero code if one or more tasks threw error(s)
|
||||
--max-parallel <number> - Set the maximum number of parallelism. Default is
|
||||
unlimited.
|
||||
--npm-path <string> - - - Set the path to npm. Default is the value of
|
||||
environment variable npm_execpath.
|
||||
If the variable is not defined, then it's "npm".
|
||||
In this case, the "npm" command must be found in
|
||||
environment variable PATH.
|
||||
-l, --print-label - - - - Set the flag to print the task name as a prefix
|
||||
on each line of output. Tools in tasks may stop
|
||||
coloring their output if this option was given.
|
||||
-n, --print-name - - - - Set the flag to print the task name before
|
||||
running each task.
|
||||
-p, --parallel <tasks> - Run a group of tasks in parallel.
|
||||
e.g. 'npm-run-all -p foo bar' is similar to
|
||||
'npm run foo & npm run bar'.
|
||||
-r, --race - - - - - - - Set the flag to kill all tasks when a task
|
||||
finished with zero. This option is valid only
|
||||
with 'parallel' option.
|
||||
-s, --sequential <tasks> - Run a group of tasks sequentially.
|
||||
--serial <tasks> e.g. 'npm-run-all -s foo bar' is similar to
|
||||
'npm run foo && npm run bar'.
|
||||
'--serial' is a synonym of '--sequential'.
|
||||
--silent - - - - - - - - Set 'silent' to the log level of npm.
|
||||
-x, --node-run - - - - - Use \`node --run\` to execute scripts instead of
|
||||
the package manager. This is faster but
|
||||
intentionally omits: pre/post lifecycle hooks
|
||||
and npm_* environment variables. node_modules/.bin
|
||||
is still added to PATH. Sets NODE_RUN_SCRIPT_NAME
|
||||
and NODE_RUN_PACKAGE_JSON_PATH instead.
|
||||
Can also be enabled project-wide by setting
|
||||
\`"npm-run-all2": { "nodeRun": true }\` in
|
||||
package.json.
|
||||
|
||||
Examples:
|
||||
$ npm-run-all --serial clean lint build:**
|
||||
$ npm-run-all --parallel watch:**
|
||||
$ npm-run-all clean lint --parallel "build:** -- --watch"
|
||||
$ npm-run-all -l -p start-server start-browser start-electron
|
||||
|
||||
See Also:
|
||||
https://github.com/mysticatea/npm-run-all#readme
|
||||
`)
|
||||
|
||||
return Promise.resolve(null)
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* @author Toru Nagashima
|
||||
* @copyright 2015 Toru Nagashima. All rights reserved.
|
||||
* @copyright 2026 Bret Comnes. All rights reserved.
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Main
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
import bootstrap from '#bin/common/bootstrap.js'
|
||||
|
||||
bootstrap('npm-run-all')
|
||||
+85
@@ -0,0 +1,85 @@
|
||||
/**
|
||||
* @author Toru Nagashima
|
||||
* @copyright 2015 Toru Nagashima. All rights reserved.
|
||||
* @copyright 2026 Bret Comnes. All rights reserved.
|
||||
* See LICENSE file in root directory for full license.
|
||||
*
|
||||
* @import { Writable } from 'node:stream'
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Requirements
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
import runAll from '#lib'
|
||||
import parseCLIArgs from '#bin/common/parse-cli-args.js'
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Public Interface
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Parses arguments, then run specified npm-scripts.
|
||||
*
|
||||
* @param {string[]} args - Arguments to parse.
|
||||
* @param {Writable} stdout - A writable stream to print logs.
|
||||
* @param {Writable} stderr - A writable stream to print errors.
|
||||
* @returns {Promise<unknown>} A promise which comes to be fulfilled when all npm-scripts are completed.
|
||||
* @private
|
||||
*/
|
||||
export default function npmRunAll (args, stdout, stderr) {
|
||||
try {
|
||||
const stdin = process.stdin
|
||||
const argv = parseCLIArgs(args)
|
||||
|
||||
const promise = argv.groups.reduce(
|
||||
(prev, group) => {
|
||||
if (group.patterns.length === 0) {
|
||||
return prev
|
||||
}
|
||||
return prev.then(() => runAll(
|
||||
group.patterns,
|
||||
{
|
||||
stdout,
|
||||
stderr,
|
||||
stdin,
|
||||
parallel: group.parallel,
|
||||
maxParallel: group.parallel ? argv.maxParallel : 1,
|
||||
continueOnError: argv.continueOnError,
|
||||
printLabel: argv.printLabel,
|
||||
printName: argv.printName,
|
||||
config: argv.config,
|
||||
packageConfig: argv.packageConfig,
|
||||
silent: argv.silent,
|
||||
arguments: argv.rest,
|
||||
race: group.parallel && argv.race,
|
||||
npmPath: argv.npmPath,
|
||||
aggregateOutput: group.parallel && argv.aggregateOutput,
|
||||
nodeRun: argv.nodeRun,
|
||||
colorMode: argv.colorMode,
|
||||
}
|
||||
))
|
||||
},
|
||||
/** @type {Promise<unknown>} */ (Promise.resolve(null))
|
||||
)
|
||||
|
||||
if (!argv.silent) {
|
||||
promise.catch(
|
||||
/**
|
||||
* @param {unknown} err - The rejection reason.
|
||||
*/
|
||||
err => {
|
||||
const message = err instanceof Error ? err.message : String(err)
|
||||
console.error('ERROR:', message)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
return promise
|
||||
} catch (err) {
|
||||
const message = err instanceof Error ? err.message : String(err)
|
||||
console.error('ERROR:', message)
|
||||
|
||||
return Promise.reject(err)
|
||||
}
|
||||
}
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
/**
|
||||
* @author Toru Nagashima
|
||||
* @copyright 2016 Toru Nagashima. All rights reserved.
|
||||
* @copyright 2026 Bret Comnes. All rights reserved.
|
||||
* See LICENSE file in root directory for full license.
|
||||
*
|
||||
* @import { Writable } from 'node:stream'
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Public Interface
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Print a help text.
|
||||
*
|
||||
* @param {Writable} output - A writable stream to print.
|
||||
* @returns {Promise<null>} Always a fulfilled promise.
|
||||
* @private
|
||||
*/
|
||||
export default function printHelp (output) {
|
||||
output.write(`
|
||||
Usage:
|
||||
$ run-p [--help | -h | --version | -v]
|
||||
$ run-p [OPTIONS] <tasks>
|
||||
|
||||
Run given npm-scripts in parallel.
|
||||
|
||||
<tasks> : A list of npm-scripts' names and Glob-like patterns.
|
||||
|
||||
Options:
|
||||
--aggregate-output - - - Avoid interleaving output by delaying printing of
|
||||
each command's output until it has finished.
|
||||
-c, --continue-on-error - Set the flag to continue executing other tasks
|
||||
even if a task threw an error. 'run-p' itself
|
||||
will exit with non-zero code if one or more tasks
|
||||
threw error(s).
|
||||
--max-parallel <number> - Set the maximum number of parallelism. Default is
|
||||
unlimited.
|
||||
--npm-path <string> - - - Set the path to npm. Default is the value of
|
||||
environment variable npm_execpath.
|
||||
If the variable is not defined, then it's "npm."
|
||||
In this case, the "npm" command must be found in
|
||||
environment variable PATH.
|
||||
-l, --print-label - - - - Set the flag to print the task name as a prefix
|
||||
on each line of output. Tools in tasks may stop
|
||||
coloring their output if this option was given.
|
||||
-n, --print-name - - - - Set the flag to print the task name before
|
||||
running each task.
|
||||
-r, --race - - - - - - - Set the flag to kill all tasks when a task
|
||||
finished with zero.
|
||||
-s, --silent - - - - - - Set 'silent' to the log level of npm.
|
||||
-x, --node-run - - - - - Use \`node --run\` to execute scripts instead of
|
||||
the package manager. This is faster but
|
||||
intentionally omits: pre/post lifecycle hooks
|
||||
and npm_* environment variables. node_modules/.bin
|
||||
is still added to PATH. Sets NODE_RUN_SCRIPT_NAME
|
||||
and NODE_RUN_PACKAGE_JSON_PATH instead.
|
||||
Can also be enabled project-wide by setting
|
||||
\`"npm-run-all2": { "nodeRun": true }\` in
|
||||
package.json.
|
||||
|
||||
Shorthand aliases can be combined.
|
||||
For example, '-clns' equals to '-c -l -n -s'.
|
||||
|
||||
Examples:
|
||||
$ run-p watch:**
|
||||
$ run-p --print-label "build:** -- --watch"
|
||||
$ run-p -sl "build:** -- --watch"
|
||||
$ run-p start-server start-browser start-electron
|
||||
|
||||
See Also:
|
||||
https://github.com/mysticatea/npm-run-all#readme
|
||||
`)
|
||||
|
||||
return Promise.resolve(null)
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* @author Toru Nagashima
|
||||
* @copyright 2015 Toru Nagashima. All rights reserved.
|
||||
* @copyright 2026 Bret Comnes. All rights reserved.
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Main
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
import bootstrap from '#bin/common/bootstrap.js'
|
||||
|
||||
bootstrap('run-p')
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
/**
|
||||
* @author Toru Nagashima
|
||||
* @copyright 2016 Toru Nagashima. All rights reserved.
|
||||
* @copyright 2026 Bret Comnes. All rights reserved.
|
||||
* See LICENSE file in root directory for full license.
|
||||
*
|
||||
* @import { Writable } from 'node:stream'
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Requirements
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
import runAll from '#lib'
|
||||
import parseCLIArgs from '#bin/common/parse-cli-args.js'
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Public Interface
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Parses arguments, then run specified npm-scripts.
|
||||
*
|
||||
* @param {string[]} args - Arguments to parse.
|
||||
* @param {Writable} stdout - A writable stream to print logs.
|
||||
* @param {Writable} stderr - A writable stream to print errors.
|
||||
* @returns {Promise<unknown>} A promise which comes to be fulfilled when all npm-scripts are completed.
|
||||
* @private
|
||||
*/
|
||||
export default function npmRunAll (args, stdout, stderr) {
|
||||
try {
|
||||
const stdin = process.stdin
|
||||
const argv = parseCLIArgs(args, { parallel: true }, { singleMode: true })
|
||||
const group = argv.lastGroup
|
||||
|
||||
if (group.patterns.length === 0) {
|
||||
return Promise.resolve(null)
|
||||
}
|
||||
|
||||
const promise = runAll(
|
||||
group.patterns,
|
||||
{
|
||||
stdout,
|
||||
stderr,
|
||||
stdin,
|
||||
parallel: group.parallel,
|
||||
maxParallel: argv.maxParallel,
|
||||
continueOnError: argv.continueOnError,
|
||||
printLabel: argv.printLabel,
|
||||
printName: argv.printName,
|
||||
config: argv.config,
|
||||
packageConfig: argv.packageConfig,
|
||||
silent: argv.silent,
|
||||
arguments: argv.rest,
|
||||
race: argv.race,
|
||||
npmPath: argv.npmPath,
|
||||
aggregateOutput: argv.aggregateOutput,
|
||||
nodeRun: argv.nodeRun,
|
||||
colorMode: argv.colorMode,
|
||||
}
|
||||
)
|
||||
|
||||
if (!argv.silent) {
|
||||
promise.catch(
|
||||
/**
|
||||
* @param {unknown} err - The rejection reason.
|
||||
*/
|
||||
err => {
|
||||
const message = err instanceof Error ? err.message : String(err)
|
||||
console.error('ERROR:', message)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
return promise
|
||||
} catch (err) {
|
||||
const message = err instanceof Error ? err.message : String(err)
|
||||
console.error('ERROR:', message)
|
||||
|
||||
return Promise.reject(err)
|
||||
}
|
||||
}
|
||||
+71
@@ -0,0 +1,71 @@
|
||||
/**
|
||||
* @author Toru Nagashima
|
||||
* @copyright 2016 Toru Nagashima. All rights reserved.
|
||||
* @copyright 2026 Bret Comnes. All rights reserved.
|
||||
* See LICENSE file in root directory for full license.
|
||||
*
|
||||
* @import { Writable } from 'node:stream'
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Public Interface
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Print a help text.
|
||||
*
|
||||
* @param {Writable} output - A writable stream to print.
|
||||
* @returns {Promise<null>} Always a fulfilled promise.
|
||||
* @private
|
||||
*/
|
||||
export default function printHelp (output) {
|
||||
output.write(`
|
||||
Usage:
|
||||
$ run-s [--help | -h | --version | -v]
|
||||
$ run-s [OPTIONS] <tasks>
|
||||
|
||||
Run given npm-scripts sequentially.
|
||||
|
||||
<tasks> : A list of npm-scripts' names and Glob-like patterns.
|
||||
|
||||
Options:
|
||||
-c, --continue-on-error - Set the flag to continue executing subsequent
|
||||
tasks even if a task threw an error. 'run-s'
|
||||
itself will exit with non-zero code if one or
|
||||
more tasks threw error(s).
|
||||
--npm-path <string> - - - Set the path to npm. Default is the value of
|
||||
environment variable npm_execpath.
|
||||
If the variable is not defined, then it's "npm."
|
||||
In this case, the "npm" command must be found in
|
||||
environment variable PATH.
|
||||
-l, --print-label - - - - Set the flag to print the task name as a prefix
|
||||
on each line of output. Tools in tasks may stop
|
||||
coloring their output if this option was given.
|
||||
-n, --print-name - - - - Set the flag to print the task name before
|
||||
running each task.
|
||||
-s, --silent - - - - - - Set 'silent' to the log level of npm.
|
||||
-x, --node-run - - - - - Use \`node --run\` to execute scripts instead of
|
||||
the package manager. This is faster but
|
||||
intentionally omits: pre/post lifecycle hooks
|
||||
and npm_* environment variables. node_modules/.bin
|
||||
is still added to PATH. Sets NODE_RUN_SCRIPT_NAME
|
||||
and NODE_RUN_PACKAGE_JSON_PATH instead.
|
||||
Can also be enabled project-wide by setting
|
||||
\`"npm-run-all2": { "nodeRun": true }\` in
|
||||
package.json.
|
||||
|
||||
Shorthand aliases can be combined.
|
||||
For example, '-clns' equals to '-c -l -n -s'.
|
||||
|
||||
Examples:
|
||||
$ run-s build:**
|
||||
$ run-s lint clean build:**
|
||||
$ run-s --silent --print-name lint clean build:**
|
||||
$ run-s -sn lint clean build:**
|
||||
|
||||
See Also:
|
||||
https://github.com/mysticatea/npm-run-all#readme
|
||||
`)
|
||||
|
||||
return Promise.resolve(null)
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* @author Toru Nagashima
|
||||
* @copyright 2015 Toru Nagashima. All rights reserved.
|
||||
* @copyright 2026 Bret Comnes. All rights reserved.
|
||||
* See LICENSE file in root directory for full license.
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Main
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
import bootstrap from '#bin/common/bootstrap.js'
|
||||
|
||||
bootstrap('run-s')
|
||||
+79
@@ -0,0 +1,79 @@
|
||||
/**
|
||||
* @author Toru Nagashima
|
||||
* @copyright 2016 Toru Nagashima. All rights reserved.
|
||||
* @copyright 2026 Bret Comnes. All rights reserved.
|
||||
* See LICENSE file in root directory for full license.
|
||||
*
|
||||
* @import { Writable } from 'node:stream'
|
||||
*/
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Requirements
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
import runAll from '#lib'
|
||||
import parseCLIArgs from '#bin/common/parse-cli-args.js'
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Public Interface
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Parses arguments, then run specified npm-scripts.
|
||||
*
|
||||
* @param {string[]} args - Arguments to parse.
|
||||
* @param {Writable} stdout - A writable stream to print logs.
|
||||
* @param {Writable} stderr - A writable stream to print errors.
|
||||
* @returns {Promise<unknown>} A promise which comes to be fulfilled when all npm-scripts are completed.
|
||||
* @private
|
||||
*/
|
||||
export default function npmRunAll (args, stdout, stderr) {
|
||||
try {
|
||||
const stdin = process.stdin
|
||||
const argv = parseCLIArgs(args, { parallel: false }, { singleMode: true })
|
||||
const group = argv.lastGroup
|
||||
|
||||
if (group.patterns.length === 0) {
|
||||
return Promise.resolve(null)
|
||||
}
|
||||
|
||||
const promise = runAll(
|
||||
group.patterns,
|
||||
{
|
||||
stdout,
|
||||
stderr,
|
||||
stdin,
|
||||
parallel: group.parallel,
|
||||
continueOnError: argv.continueOnError,
|
||||
printLabel: argv.printLabel,
|
||||
printName: argv.printName,
|
||||
config: argv.config,
|
||||
packageConfig: argv.packageConfig,
|
||||
silent: argv.silent,
|
||||
arguments: argv.rest,
|
||||
npmPath: argv.npmPath,
|
||||
nodeRun: argv.nodeRun,
|
||||
colorMode: argv.colorMode,
|
||||
}
|
||||
)
|
||||
|
||||
if (!argv.silent) {
|
||||
promise.catch(
|
||||
/**
|
||||
* @param {unknown} err - The rejection reason.
|
||||
*/
|
||||
err => {
|
||||
const message = err instanceof Error ? err.message : String(err)
|
||||
console.error('ERROR:', message)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
return promise
|
||||
} catch (err) {
|
||||
const message = err instanceof Error ? err.message : String(err)
|
||||
console.error('ERROR:', message)
|
||||
|
||||
return Promise.reject(err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user