parcoursup/node_modules/spawn-wrap/lib/mungers/cmd.js

60 lines
1.9 KiB
JavaScript
Raw Normal View History

2023-03-05 13:23:23 +01:00
'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