80 lines
2.2 KiB
JavaScript
80 lines
2.2 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
const path = require('path')
|
||
|
const {debug} = require("../debug")
|
||
|
const {getExeBasename} = require("../exe-type")
|
||
|
const whichOrUndefined = require("../which-or-undefined")
|
||
|
|
||
|
/**
|
||
|
* Intercepts Node spawned processes.
|
||
|
*
|
||
|
* @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 mungeNode(workingDir, options) {
|
||
|
// Remember the original Node command to use it in the shim
|
||
|
const originalNode = options.file
|
||
|
|
||
|
const command = getExeBasename(options.file)
|
||
|
// make sure it has a main script.
|
||
|
// otherwise, just let it through.
|
||
|
let a = 0
|
||
|
let hasMain = false
|
||
|
let mainIndex = 1
|
||
|
for (a = 1; !hasMain && a < options.args.length; a++) {
|
||
|
switch (options.args[a]) {
|
||
|
case '-p':
|
||
|
case '-i':
|
||
|
case '--interactive':
|
||
|
case '--eval':
|
||
|
case '-e':
|
||
|
case '-pe':
|
||
|
hasMain = false
|
||
|
a = options.args.length
|
||
|
continue
|
||
|
|
||
|
case '-r':
|
||
|
case '--require':
|
||
|
a += 1
|
||
|
continue
|
||
|
|
||
|
default:
|
||
|
// TODO: Double-check this part
|
||
|
if (options.args[a].startsWith('-')) {
|
||
|
continue
|
||
|
} else {
|
||
|
hasMain = true
|
||
|
mainIndex = a
|
||
|
a = options.args.length
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const newArgs = [...options.args];
|
||
|
let newFile = options.file;
|
||
|
|
||
|
if (hasMain) {
|
||
|
const replace = path.join(workingDir, command)
|
||
|
newArgs.splice(mainIndex, 0, replace)
|
||
|
}
|
||
|
|
||
|
// If the file is just something like 'node' then that'll
|
||
|
// resolve to our shim, and so to prevent double-shimming, we need
|
||
|
// to resolve that here first.
|
||
|
// This also handles the case where there's not a main file, like
|
||
|
// `node -e 'program'`, where we want to avoid the shim entirely.
|
||
|
if (options.file === command) {
|
||
|
const realNode = whichOrUndefined(options.file) || process.execPath
|
||
|
newArgs[0] = realNode
|
||
|
newFile = realNode
|
||
|
}
|
||
|
|
||
|
debug('mungeNode after', options.file, options.args)
|
||
|
|
||
|
return {...options, file: newFile, args: newArgs, originalNode};
|
||
|
}
|
||
|
|
||
|
module.exports = mungeNode
|