12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- '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
|