1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- 'use strict';
-
- const path = require("path")
- const whichOrUndefined = require("../which-or-undefined")
-
- /**
- * Intercepts Node and npm processes spawned through Windows' `cmd.exe`.
- *
- * @param workingDir {string} Absolute system-dependent path to the directory containing the shim files.
- * @param options {import("../munge").InternalSpawnOptions} Original internal spawn options.
- * @return {import("../munge").InternalSpawnOptions} Updated internal spawn options.
- */
- function mungeCmd(workingDir, options) {
- const cmdi = options.args.indexOf('/c')
- if (cmdi === -1) {
- return {...options}
- }
-
- const re = /^\s*("*)([^"]*?\bnode(?:\.exe|\.EXE)?)("*)( .*)?$/
- const npmre = /^\s*("*)([^"]*?\b(?:npm))("*)( |$)/
-
- const command = options.args[cmdi + 1]
- if (command === undefined) {
- return {...options}
- }
-
- let newArgs = [...options.args];
- // Remember the original Node command to use it in the shim
- let originalNode;
-
- let m = command.match(re)
- let replace
- if (m) {
- originalNode = m[2]
- // TODO: Remove `replace`: seems unused
- replace = m[1] + path.join(workingDir, 'node.cmd') + m[3] + m[4]
- newArgs[cmdi + 1] = m[1] + m[2] + m[3] +
- ' "' + path.join(workingDir, 'node') + '"' + m[4]
- } else {
- // XXX probably not a good idea to rewrite to the first npm in the
- // path if it's a full path to npm. And if it's not a full path to
- // npm, then the dirname will not work properly!
- m = command.match(npmre)
- if (m === null) {
- return {...options}
- }
-
- let npmPath = whichOrUndefined('npm') || 'npm'
- npmPath = path.join(path.dirname(npmPath), 'node_modules', 'npm', 'bin', 'npm-cli.js')
- replace = m[1] + '"' + path.join(workingDir, 'node.cmd') + '"' +
- ' "' + npmPath + '"' +
- m[3] + m[4]
- newArgs[cmdi + 1] = command.replace(npmre, replace)
- }
-
- return {...options, args: newArgs, originalNode};
- }
-
- module.exports = mungeCmd
|