diff --git a/resources/utils.ts b/resources/utils.ts index 559947d58c..d94ad76b0f 100644 --- a/resources/utils.ts +++ b/resources/utils.ts @@ -33,41 +33,35 @@ interface NPMOptions extends SpawnOptions { } export function npm(options?: NPMOptions) { - const globalOptions = options?.quiet === true ? ['--quiet'] : []; - - // `npm` points to an executable shell script; so it doesn't require a shell per se. - // On Windows `shell: true` is required or `npm` will be picked rather than `npm.cmd`. - // This could alternatively be handled by manually selecting `npm.cmd` on Windows. - // See: https://github.com/nodejs/node/issues/3675 and in particular - // https://github.com/nodejs/node/issues/3675#issuecomment-308963807. - const npmOptions = { shell: true, ...options }; + let npmCmd; + let globalOptions = options?.quiet === true ? ['--quiet'] : []; + + // See: https://github.com/nodejs/node/issues/3675. + if (process.platform === 'win32') { + npmCmd = 'cmd'; + globalOptions = ['/c', 'npm.cmd', ...globalOptions]; + } else { + npmCmd = 'npm'; + } return { run(...args: ReadonlyArray): void { - spawn('npm', [...globalOptions, 'run', ...args], npmOptions); + spawn(npmCmd, [...globalOptions, 'run', ...args], options); }, install(...args: ReadonlyArray): void { - spawn('npm', [...globalOptions, 'install', ...args], npmOptions); + spawn(npmCmd, [...globalOptions, 'install', ...args], options); }, ci(...args: ReadonlyArray): void { - spawn('npm', [...globalOptions, 'ci', ...args], npmOptions); + spawn(npmCmd, [...globalOptions, 'ci', ...args], options); }, exec(...args: ReadonlyArray): void { - spawn('npm', [...globalOptions, 'exec', ...args], npmOptions); + spawn(npmCmd, [...globalOptions, 'exec', ...args], options); }, pack(...args: ReadonlyArray): string { - return spawnOutput( - 'npm', - [...globalOptions, 'pack', ...args], - npmOptions, - ); + return spawnOutput(npmCmd, [...globalOptions, 'pack', ...args], options); }, diff(...args: ReadonlyArray): string { - return spawnOutput( - 'npm', - [...globalOptions, 'diff', ...args], - npmOptions, - ); + return spawnOutput(npmCmd, [...globalOptions, 'diff', ...args], options); }, }; }