cross-spawn-cb 2.5.1 → 2.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/crossSpawn.js +5 -29
- package/dist/cjs/crossSpawn.js.map +1 -1
- package/dist/cjs/shim/parse.js +66 -0
- package/dist/cjs/shim/parse.js.map +1 -1
- package/dist/cjs/shim/resolve.js +1 -16
- package/dist/cjs/shim/resolve.js.map +1 -1
- package/dist/cjs/types.d.cts +5 -0
- package/dist/cjs/types.d.ts +5 -0
- package/dist/cjs/workers/async.js +6 -10
- package/dist/cjs/workers/async.js.map +1 -1
- package/dist/esm/crossSpawn.js +4 -28
- package/dist/esm/crossSpawn.js.map +1 -1
- package/dist/esm/shim/parse.js +20 -0
- package/dist/esm/shim/parse.js.map +1 -1
- package/dist/esm/shim/resolve.js +1 -16
- package/dist/esm/shim/resolve.js.map +1 -1
- package/dist/esm/types.d.ts +5 -0
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/workers/async.js +6 -10
- package/dist/esm/workers/async.js.map +1 -1
- package/package.json +1 -1
package/dist/cjs/crossSpawn.js
CHANGED
|
@@ -2,16 +2,14 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
-
Object.defineProperty(exports,
|
|
5
|
+
Object.defineProperty(exports, // Fully delegate to the loaded implementation (shim or cross-spawn)
|
|
6
|
+
"default", {
|
|
6
7
|
enumerable: true,
|
|
7
8
|
get: function() {
|
|
8
9
|
return spawn;
|
|
9
10
|
}
|
|
10
11
|
});
|
|
11
|
-
var _child_process = /*#__PURE__*/ _interop_require_default(require("child_process"));
|
|
12
12
|
var _module = /*#__PURE__*/ _interop_require_default(require("module"));
|
|
13
|
-
var _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
|
14
|
-
var _spawnSyncts = /*#__PURE__*/ _interop_require_default(require("./polyfills/spawnSync.js"));
|
|
15
13
|
function _interop_require_default(obj) {
|
|
16
14
|
return obj && obj.__esModule ? obj : {
|
|
17
15
|
default: obj
|
|
@@ -22,31 +20,9 @@ var _require = typeof require === 'undefined' ? _module.default.createRequire(re
|
|
|
22
20
|
// Use lightweight shim for legacy Node (<= 7), modern cross-spawn for Node >= 8
|
|
23
21
|
var crossSpawn = _require(major <= 7 ? './shim/index.js' : 'cross-spawn');
|
|
24
22
|
function spawn(command, args, options) {
|
|
25
|
-
|
|
26
|
-
var spawned = _child_process.default.spawn(parsed.command, parsed.args, parsed.options);
|
|
27
|
-
spawn._enoent.hookChildProcess(spawned, parsed);
|
|
28
|
-
return spawned;
|
|
23
|
+
return crossSpawn(command, args, options);
|
|
29
24
|
}
|
|
30
|
-
|
|
31
|
-
spawn.
|
|
32
|
-
var parsed = spawn._parse(command, args, options);
|
|
33
|
-
var res = cpSpawnSync(parsed.command, parsed.args, parsed.options);
|
|
34
|
-
res.error = res.error || spawn._enoent.verifyENOENTSync(res.status, parsed);
|
|
35
|
-
return res;
|
|
36
|
-
};
|
|
37
|
-
// patch earlier versions of cross-spawn with inconsistent handling of node
|
|
38
|
-
var NODES = [
|
|
39
|
-
'node',
|
|
40
|
-
'node.exe',
|
|
41
|
-
'node.cmd'
|
|
42
|
-
];
|
|
43
|
-
function _parse(command, args, options) {
|
|
44
|
-
if (NODES.indexOf(_path.default.basename(command).toLowerCase()) >= 0) {
|
|
45
|
-
var env = options ? options.env || process.env : process.env;
|
|
46
|
-
command = env.NODE || env.npm_node_execpath || command;
|
|
47
|
-
}
|
|
48
|
-
return crossSpawn._parse(command, args, options);
|
|
49
|
-
}
|
|
50
|
-
spawn._parse = major <= 7 ? _parse : crossSpawn._parse;
|
|
25
|
+
spawn.sync = crossSpawn.sync;
|
|
26
|
+
spawn._parse = crossSpawn._parse;
|
|
51
27
|
spawn._enoent = crossSpawn._enoent;
|
|
52
28
|
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/compat/cross-spawn-cb/src/crossSpawn.ts"],"sourcesContent":["import type { ChildProcess } from 'child_process';\nimport
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/compat/cross-spawn-cb/src/crossSpawn.ts"],"sourcesContent":["import type { ChildProcess } from 'child_process';\nimport Module from 'module';\nimport type { Enoent, Parsed, SpawnOptions, SpawnResult, SpawnSyncOptions } from './types.ts';\n\nconst major = +process.versions.node.split('.')[0];\nconst _require = typeof require === 'undefined' ? Module.createRequire(import.meta.url) : require;\n// Use lightweight shim for legacy Node (<= 7), modern cross-spawn for Node >= 8\nconst crossSpawn = _require(major <= 7 ? './shim/index.js' : 'cross-spawn');\n\n// Fully delegate to the loaded implementation (shim or cross-spawn)\nexport default function spawn(command: string, args: string[], options?: SpawnOptions): ChildProcess {\n return crossSpawn(command, args, options);\n}\n\nspawn.sync = crossSpawn.sync as (command: string, args: string[], options?: SpawnSyncOptions) => SpawnResult;\nspawn._parse = crossSpawn._parse as (command: string, args: string[], options?: SpawnOptions | SpawnSyncOptions) => Parsed;\nspawn._enoent = crossSpawn._enoent as Enoent;\n"],"names":["spawn","major","process","versions","node","split","_require","require","Module","createRequire","crossSpawn","command","args","options","sync","_parse","_enoent"],"mappings":";;;;+BASA,oEAAoE;AACpE;;;eAAwBA;;;6DATL;;;;;;AAGnB,IAAMC,QAAQ,CAACC,QAAQC,QAAQ,CAACC,IAAI,CAACC,KAAK,CAAC,IAAI,CAAC,EAAE;AAClD,IAAMC,WAAW,OAAOC,YAAY,cAAcC,eAAM,CAACC,aAAa,CAAC,uDAAmBF;AAC1F,gFAAgF;AAChF,IAAMG,aAAaJ,SAASL,SAAS,IAAI,oBAAoB;AAG9C,SAASD,MAAMW,OAAe,EAAEC,IAAc,EAAEC,OAAsB;IACnF,OAAOH,WAAWC,SAASC,MAAMC;AACnC;AAEAb,MAAMc,IAAI,GAAGJ,WAAWI,IAAI;AAC5Bd,MAAMe,MAAM,GAAGL,WAAWK,MAAM;AAChCf,MAAMgB,OAAO,GAAGN,WAAWM,OAAO"}
|
package/dist/cjs/shim/parse.js
CHANGED
|
@@ -17,13 +17,63 @@ var _constantsts = require("../constants.js");
|
|
|
17
17
|
var _escapets = require("./escape.js");
|
|
18
18
|
var _resolvets = require("./resolve.js");
|
|
19
19
|
var _shebangts = require("./shebang.js");
|
|
20
|
+
function _array_like_to_array(arr, len) {
|
|
21
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
22
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
23
|
+
return arr2;
|
|
24
|
+
}
|
|
25
|
+
function _array_with_holes(arr) {
|
|
26
|
+
if (Array.isArray(arr)) return arr;
|
|
27
|
+
}
|
|
20
28
|
function _interop_require_default(obj) {
|
|
21
29
|
return obj && obj.__esModule ? obj : {
|
|
22
30
|
default: obj
|
|
23
31
|
};
|
|
24
32
|
}
|
|
33
|
+
function _iterable_to_array_limit(arr, i) {
|
|
34
|
+
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
35
|
+
if (_i == null) return;
|
|
36
|
+
var _arr = [];
|
|
37
|
+
var _n = true;
|
|
38
|
+
var _d = false;
|
|
39
|
+
var _s, _e;
|
|
40
|
+
try {
|
|
41
|
+
for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
|
|
42
|
+
_arr.push(_s.value);
|
|
43
|
+
if (i && _arr.length === i) break;
|
|
44
|
+
}
|
|
45
|
+
} catch (err) {
|
|
46
|
+
_d = true;
|
|
47
|
+
_e = err;
|
|
48
|
+
} finally{
|
|
49
|
+
try {
|
|
50
|
+
if (!_n && _i["return"] != null) _i["return"]();
|
|
51
|
+
} finally{
|
|
52
|
+
if (_d) throw _e;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return _arr;
|
|
56
|
+
}
|
|
57
|
+
function _non_iterable_rest() {
|
|
58
|
+
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
59
|
+
}
|
|
60
|
+
function _sliced_to_array(arr, i) {
|
|
61
|
+
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
|
|
62
|
+
}
|
|
63
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
64
|
+
if (!o) return;
|
|
65
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
66
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
67
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
68
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
69
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
70
|
+
}
|
|
25
71
|
var isExecutableRegExp = /\.(?:com|exe)$/i;
|
|
26
72
|
var isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;
|
|
73
|
+
// Node ^4.8.0 || ^5.7.0 || >= 6.0.0 supports shell option natively
|
|
74
|
+
// See: https://github.com/nodejs/node/pull/4598
|
|
75
|
+
var _process_versions_node_split_map = _sliced_to_array(process.versions.node.split('.').map(Number), 2), major = _process_versions_node_split_map[0], minor = _process_versions_node_split_map[1];
|
|
76
|
+
var supportsShellOption = major >= 6 || major === 5 && minor >= 7 || major === 4 && minor >= 8;
|
|
27
77
|
function detectShebang(parsed) {
|
|
28
78
|
parsed.file = (0, _resolvets.resolveCommand)(parsed);
|
|
29
79
|
var shebang = parsed.file && (0, _shebangts.readShebang)(parsed.file);
|
|
@@ -65,6 +115,10 @@ function parseNonShell(parsed) {
|
|
|
65
115
|
return parsed;
|
|
66
116
|
}
|
|
67
117
|
function parseShell(parsed) {
|
|
118
|
+
// If node supports the shell option, there's no need to mimic its behavior
|
|
119
|
+
if (supportsShellOption) {
|
|
120
|
+
return parsed;
|
|
121
|
+
}
|
|
68
122
|
// Mimic node shell option for older Node versions
|
|
69
123
|
var shellCommand = [
|
|
70
124
|
parsed.command
|
|
@@ -93,6 +147,12 @@ function parseShell(parsed) {
|
|
|
93
147
|
}
|
|
94
148
|
return parsed;
|
|
95
149
|
}
|
|
150
|
+
// Handle NODE/npm_node_execpath env vars for node commands
|
|
151
|
+
var NODES = [
|
|
152
|
+
'node',
|
|
153
|
+
'node.exe',
|
|
154
|
+
'node.cmd'
|
|
155
|
+
];
|
|
96
156
|
function parse(command, args, options) {
|
|
97
157
|
// Normalize arguments
|
|
98
158
|
var argsArray;
|
|
@@ -105,6 +165,7 @@ function parse(command, args, options) {
|
|
|
105
165
|
argsArray = args ? args.slice(0) : [];
|
|
106
166
|
opts = (0, _compatts.objectAssign)({}, options || {});
|
|
107
167
|
}
|
|
168
|
+
// Build parsed object with original command/args BEFORE any substitution
|
|
108
169
|
var parsed = {
|
|
109
170
|
command: command,
|
|
110
171
|
args: argsArray,
|
|
@@ -115,6 +176,11 @@ function parse(command, args, options) {
|
|
|
115
176
|
args: argsArray
|
|
116
177
|
}
|
|
117
178
|
};
|
|
179
|
+
// Substitute node command with NODE env var if set
|
|
180
|
+
if (NODES.indexOf(_path.default.basename(parsed.command).toLowerCase()) >= 0) {
|
|
181
|
+
var env = opts.env || process.env;
|
|
182
|
+
parsed.command = env.NODE || env.npm_node_execpath || parsed.command;
|
|
183
|
+
}
|
|
118
184
|
return opts.shell ? parseShell(parsed) : parseNonShell(parsed);
|
|
119
185
|
}
|
|
120
186
|
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/compat/cross-spawn-cb/src/shim/parse.ts"],"sourcesContent":["/**\n * Command parsing for cross-platform spawn\n * Simplified from cross-spawn v6.0.5\n */\n\nimport path from 'path';\nimport { objectAssign } from '../compat.ts';\nimport { isWindows } from '../constants.ts';\nimport { escapeArgument, escapeCommand } from './escape.ts';\nimport { resolveCommand } from './resolve.ts';\nimport { readShebang } from './shebang.ts';\nimport type { Parsed, ShimSpawnOptions } from './types.ts';\n\nconst isExecutableRegExp = /\\.(?:com|exe)$/i;\nconst isCmdShimRegExp = /node_modules[\\\\/].bin[\\\\/][^\\\\/]+\\.cmd$/i;\n\nfunction detectShebang(parsed: Parsed): string | null {\n parsed.file = resolveCommand(parsed);\n\n const shebang = parsed.file && readShebang(parsed.file);\n if (shebang) {\n parsed.args.unshift(parsed.file);\n parsed.command = shebang;\n return resolveCommand(parsed);\n }\n\n return parsed.file;\n}\n\nfunction parseNonShell(parsed: Parsed): Parsed {\n if (!isWindows) return parsed;\n\n // Detect & add support for shebangs\n const commandFile = detectShebang(parsed);\n\n // We don't need a shell if the command filename is an executable\n const needsShell = !isExecutableRegExp.test(commandFile || '');\n\n if (parsed.options.forceShell || needsShell) {\n // Need to double escape meta chars if the command is a cmd-shim\n const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile || '');\n\n // Normalize posix paths into OS compatible paths\n parsed.command = path.normalize(parsed.command);\n\n // Escape command & arguments\n parsed.command = escapeCommand(parsed.command);\n parsed.args = parsed.args.map((arg) => escapeArgument(arg, needsDoubleEscapeMetaChars));\n\n const shellCommand = [parsed.command].concat(parsed.args).join(' ');\n\n parsed.args = ['/d', '/s', '/c', `\"${shellCommand}\"`];\n parsed.command = process.env.comspec || 'cmd.exe';\n parsed.options.windowsVerbatimArguments = true;\n }\n\n return parsed;\n}\n\nfunction parseShell(parsed: Parsed): Parsed {\n // Mimic node shell option for older Node versions\n const shellCommand = [parsed.command].concat(parsed.args).join(' ');\n\n if (isWindows) {\n parsed.command = typeof parsed.options.shell === 'string' ? parsed.options.shell : process.env.comspec || 'cmd.exe';\n parsed.args = ['/d', '/s', '/c', `\"${shellCommand}\"`];\n parsed.options.windowsVerbatimArguments = true;\n } else {\n if (typeof parsed.options.shell === 'string') {\n parsed.command = parsed.options.shell;\n } else if (process.platform === 'android') {\n parsed.command = '/system/bin/sh';\n } else {\n parsed.command = '/bin/sh';\n }\n parsed.args = ['-c', shellCommand];\n }\n\n return parsed;\n}\n\nexport function parse(command: string, args?: string[] | ShimSpawnOptions | null, options?: ShimSpawnOptions): Parsed {\n // Normalize arguments\n let argsArray: string[];\n let opts: ShimSpawnOptions;\n\n if (args && !Array.isArray(args)) {\n // args is actually options\n argsArray = [];\n opts = objectAssign({}, args);\n } else {\n argsArray = args ? (args as string[]).slice(0) : [];\n opts = objectAssign({}, options || {});\n }\n\n const parsed: Parsed = {\n command: command,\n args: argsArray,\n options: opts,\n file: undefined,\n original: {\n command: command,\n args: argsArray,\n },\n };\n\n return opts.shell ? parseShell(parsed) : parseNonShell(parsed);\n}\n"],"names":["parse","isExecutableRegExp","isCmdShimRegExp","detectShebang","parsed","file","resolveCommand","shebang","readShebang","args","unshift","command","parseNonShell","isWindows","commandFile","needsShell","test","options","forceShell","needsDoubleEscapeMetaChars","path","normalize","escapeCommand","
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/compat/cross-spawn-cb/src/shim/parse.ts"],"sourcesContent":["/**\n * Command parsing for cross-platform spawn\n * Simplified from cross-spawn v6.0.5\n */\n\nimport path from 'path';\nimport { objectAssign } from '../compat.ts';\nimport { isWindows } from '../constants.ts';\nimport { escapeArgument, escapeCommand } from './escape.ts';\nimport { resolveCommand } from './resolve.ts';\nimport { readShebang } from './shebang.ts';\nimport type { Parsed, ShimSpawnOptions } from './types.ts';\n\nconst isExecutableRegExp = /\\.(?:com|exe)$/i;\nconst isCmdShimRegExp = /node_modules[\\\\/].bin[\\\\/][^\\\\/]+\\.cmd$/i;\n\n// Node ^4.8.0 || ^5.7.0 || >= 6.0.0 supports shell option natively\n// See: https://github.com/nodejs/node/pull/4598\nconst [major, minor] = process.versions.node.split('.').map(Number);\nconst supportsShellOption = major >= 6 || (major === 5 && minor >= 7) || (major === 4 && minor >= 8);\n\nfunction detectShebang(parsed: Parsed): string | null {\n parsed.file = resolveCommand(parsed);\n\n const shebang = parsed.file && readShebang(parsed.file);\n if (shebang) {\n parsed.args.unshift(parsed.file);\n parsed.command = shebang;\n return resolveCommand(parsed);\n }\n\n return parsed.file;\n}\n\nfunction parseNonShell(parsed: Parsed): Parsed {\n if (!isWindows) return parsed;\n\n // Detect & add support for shebangs\n const commandFile = detectShebang(parsed);\n\n // We don't need a shell if the command filename is an executable\n const needsShell = !isExecutableRegExp.test(commandFile || '');\n\n if (parsed.options.forceShell || needsShell) {\n // Need to double escape meta chars if the command is a cmd-shim\n const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile || '');\n\n // Normalize posix paths into OS compatible paths\n parsed.command = path.normalize(parsed.command);\n\n // Escape command & arguments\n parsed.command = escapeCommand(parsed.command);\n parsed.args = parsed.args.map((arg) => escapeArgument(arg, needsDoubleEscapeMetaChars));\n\n const shellCommand = [parsed.command].concat(parsed.args).join(' ');\n\n parsed.args = ['/d', '/s', '/c', `\"${shellCommand}\"`];\n parsed.command = process.env.comspec || 'cmd.exe';\n parsed.options.windowsVerbatimArguments = true;\n }\n\n return parsed;\n}\n\nfunction parseShell(parsed: Parsed): Parsed {\n // If node supports the shell option, there's no need to mimic its behavior\n if (supportsShellOption) {\n return parsed;\n }\n\n // Mimic node shell option for older Node versions\n const shellCommand = [parsed.command].concat(parsed.args).join(' ');\n\n if (isWindows) {\n parsed.command = typeof parsed.options.shell === 'string' ? parsed.options.shell : process.env.comspec || 'cmd.exe';\n parsed.args = ['/d', '/s', '/c', `\"${shellCommand}\"`];\n parsed.options.windowsVerbatimArguments = true;\n } else {\n if (typeof parsed.options.shell === 'string') {\n parsed.command = parsed.options.shell;\n } else if (process.platform === 'android') {\n parsed.command = '/system/bin/sh';\n } else {\n parsed.command = '/bin/sh';\n }\n parsed.args = ['-c', shellCommand];\n }\n\n return parsed;\n}\n\n// Handle NODE/npm_node_execpath env vars for node commands\nconst NODES = ['node', 'node.exe', 'node.cmd'];\n\nexport function parse(command: string, args?: string[] | ShimSpawnOptions | null, options?: ShimSpawnOptions): Parsed {\n // Normalize arguments\n let argsArray: string[];\n let opts: ShimSpawnOptions;\n\n if (args && !Array.isArray(args)) {\n // args is actually options\n argsArray = [];\n opts = objectAssign({}, args);\n } else {\n argsArray = args ? (args as string[]).slice(0) : [];\n opts = objectAssign({}, options || {});\n }\n\n // Build parsed object with original command/args BEFORE any substitution\n const parsed: Parsed = {\n command: command,\n args: argsArray,\n options: opts,\n file: undefined,\n original: {\n command: command,\n args: argsArray,\n },\n };\n\n // Substitute node command with NODE env var if set\n if (NODES.indexOf(path.basename(parsed.command).toLowerCase()) >= 0) {\n const env = opts.env || process.env;\n parsed.command = env.NODE || env.npm_node_execpath || parsed.command;\n }\n\n return opts.shell ? parseShell(parsed) : parseNonShell(parsed);\n}\n"],"names":["parse","isExecutableRegExp","isCmdShimRegExp","process","versions","node","split","map","Number","major","minor","supportsShellOption","detectShebang","parsed","file","resolveCommand","shebang","readShebang","args","unshift","command","parseNonShell","isWindows","commandFile","needsShell","test","options","forceShell","needsDoubleEscapeMetaChars","path","normalize","escapeCommand","arg","escapeArgument","shellCommand","concat","join","env","comspec","windowsVerbatimArguments","parseShell","shell","platform","NODES","argsArray","opts","Array","isArray","objectAssign","slice","undefined","original","indexOf","basename","toLowerCase","NODE","npm_node_execpath"],"mappings":"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"}
|
package/dist/cjs/shim/resolve.js
CHANGED
|
@@ -21,26 +21,11 @@ function _interop_require_default(obj) {
|
|
|
21
21
|
};
|
|
22
22
|
}
|
|
23
23
|
var pathDelimiter = _constantsts.isWindows ? ';' : ':';
|
|
24
|
-
var NODES = [
|
|
25
|
-
'node',
|
|
26
|
-
'node.exe',
|
|
27
|
-
'node.cmd'
|
|
28
|
-
];
|
|
29
24
|
function resolveCommandAttempt(parsed, withoutPathExt) {
|
|
30
25
|
var command = parsed.command;
|
|
31
26
|
var options = parsed.options;
|
|
32
|
-
var env = options.env || process.env;
|
|
33
27
|
var cwd = process.cwd();
|
|
34
28
|
var hasCustomCwd = options.cwd != null;
|
|
35
|
-
// Handle NODE/npm_node_execpath env vars for node commands
|
|
36
|
-
// This is needed because shebang detection may change the command to 'node'
|
|
37
|
-
// after the initial NODE env check in crossSpawn.ts has already passed
|
|
38
|
-
if (NODES.indexOf(_path.default.basename(command).toLowerCase()) >= 0) {
|
|
39
|
-
var nodeFromEnv = env.NODE || env.npm_node_execpath;
|
|
40
|
-
if (nodeFromEnv) {
|
|
41
|
-
return nodeFromEnv;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
29
|
// If a custom cwd was specified, we need to change the process cwd
|
|
45
30
|
// because which will do stat calls but does not support a custom cwd
|
|
46
31
|
if (hasCustomCwd) {
|
|
@@ -52,7 +37,7 @@ function resolveCommandAttempt(parsed, withoutPathExt) {
|
|
|
52
37
|
var resolved = null;
|
|
53
38
|
var pathKey = (0, _envpathkey.default)({
|
|
54
39
|
env: options.env || process.env
|
|
55
|
-
})
|
|
40
|
+
});
|
|
56
41
|
try {
|
|
57
42
|
resolved = _which.default.sync(command, {
|
|
58
43
|
path: (options.env || process.env)[pathKey],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/compat/cross-spawn-cb/src/shim/resolve.ts"],"sourcesContent":["/**\n * Command resolution using which\n * Simplified from cross-spawn v6.0.5\n */\n\nimport envPathKey from 'env-path-key';\nimport path from 'path';\nimport which from 'which';\nimport { isWindows } from '../constants.ts';\nimport type { Parsed } from './types.ts';\n\nconst pathDelimiter = isWindows ? ';' : ':';\
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/compat/cross-spawn-cb/src/shim/resolve.ts"],"sourcesContent":["/**\n * Command resolution using which\n * Simplified from cross-spawn v6.0.5\n */\n\nimport envPathKey from 'env-path-key';\nimport path from 'path';\nimport which from 'which';\nimport { isWindows } from '../constants.ts';\nimport type { Parsed } from './types.ts';\n\nconst pathDelimiter = isWindows ? ';' : ':';\n\nfunction resolveCommandAttempt(parsed: Parsed, withoutPathExt?: boolean): string | null {\n const command = parsed.command;\n const options = parsed.options;\n const cwd = process.cwd();\n const hasCustomCwd = options.cwd != null;\n\n // If a custom cwd was specified, we need to change the process cwd\n // because which will do stat calls but does not support a custom cwd\n if (hasCustomCwd) {\n try {\n process.chdir(options.cwd as string);\n } catch (_err) {\n /* ignore */\n }\n }\n\n let resolved: string | null = null;\n const pathKey = envPathKey({ env: options.env || process.env });\n\n try {\n resolved = which.sync(command, {\n path: (options.env || process.env)[pathKey],\n // On Windows: undefined uses PATHEXT, pathDelimiter bypasses it\n // withoutPathExt fallback is needed to find files without extensions\n pathExt: withoutPathExt ? pathDelimiter : undefined,\n });\n } catch (_e) {\n /* not found */\n } finally {\n if (hasCustomCwd) {\n process.chdir(cwd);\n }\n }\n\n // Ensure absolute path\n if (resolved) {\n resolved = path.resolve(hasCustomCwd ? (options.cwd as string) : '', resolved);\n }\n\n return resolved;\n}\n\n// Try twice: first with PATHEXT (finds .cmd/.bat/.exe), then without (finds extensionless files)\nexport function resolveCommand(parsed: Parsed): string | null {\n return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true);\n}\n"],"names":["resolveCommand","pathDelimiter","isWindows","resolveCommandAttempt","parsed","withoutPathExt","command","options","cwd","process","hasCustomCwd","chdir","_err","resolved","pathKey","envPathKey","env","which","sync","path","pathExt","undefined","_e","resolve"],"mappings":"AAAA;;;CAGC;;;;+BAqDeA;;;eAAAA;;;iEAnDO;2DACN;4DACC;2BACQ;;;;;;AAG1B,IAAMC,gBAAgBC,sBAAS,GAAG,MAAM;AAExC,SAASC,sBAAsBC,MAAc,EAAEC,cAAwB;IACrE,IAAMC,UAAUF,OAAOE,OAAO;IAC9B,IAAMC,UAAUH,OAAOG,OAAO;IAC9B,IAAMC,MAAMC,QAAQD,GAAG;IACvB,IAAME,eAAeH,QAAQC,GAAG,IAAI;IAEpC,mEAAmE;IACnE,qEAAqE;IACrE,IAAIE,cAAc;QAChB,IAAI;YACFD,QAAQE,KAAK,CAACJ,QAAQC,GAAG;QAC3B,EAAE,OAAOI,MAAM;QACb,UAAU,GACZ;IACF;IAEA,IAAIC,WAA0B;IAC9B,IAAMC,UAAUC,IAAAA,mBAAU,EAAC;QAAEC,KAAKT,QAAQS,GAAG,IAAIP,QAAQO,GAAG;IAAC;IAE7D,IAAI;QACFH,WAAWI,cAAK,CAACC,IAAI,CAACZ,SAAS;YAC7Ba,MAAM,AAACZ,CAAAA,QAAQS,GAAG,IAAIP,QAAQO,GAAG,AAAD,CAAE,CAACF,QAAQ;YAC3C,gEAAgE;YAChE,qEAAqE;YACrEM,SAASf,iBAAiBJ,gBAAgBoB;QAC5C;IACF,EAAE,OAAOC,IAAI;IACX,aAAa,GACf,SAAU;QACR,IAAIZ,cAAc;YAChBD,QAAQE,KAAK,CAACH;QAChB;IACF;IAEA,uBAAuB;IACvB,IAAIK,UAAU;QACZA,WAAWM,aAAI,CAACI,OAAO,CAACb,eAAgBH,QAAQC,GAAG,GAAc,IAAIK;IACvE;IAEA,OAAOA;AACT;AAGO,SAASb,eAAeI,MAAc;IAC3C,OAAOD,sBAAsBC,WAAWD,sBAAsBC,QAAQ;AACxE"}
|
package/dist/cjs/types.d.cts
CHANGED
|
@@ -15,6 +15,11 @@ export interface Parsed {
|
|
|
15
15
|
command: string;
|
|
16
16
|
args: string[];
|
|
17
17
|
options: SpawnOptions | SpawnSyncOptions;
|
|
18
|
+
file?: string | null;
|
|
19
|
+
original?: {
|
|
20
|
+
command: string;
|
|
21
|
+
args: string[];
|
|
22
|
+
};
|
|
18
23
|
}
|
|
19
24
|
export interface NotFoundError extends Error {
|
|
20
25
|
code?: string;
|
package/dist/cjs/types.d.ts
CHANGED
|
@@ -15,6 +15,11 @@ export interface Parsed {
|
|
|
15
15
|
command: string;
|
|
16
16
|
args: string[];
|
|
17
17
|
options: SpawnOptions | SpawnSyncOptions;
|
|
18
|
+
file?: string | null;
|
|
19
|
+
original?: {
|
|
20
|
+
command: string;
|
|
21
|
+
args: string[];
|
|
22
|
+
};
|
|
18
23
|
}
|
|
19
24
|
export interface NotFoundError extends Error {
|
|
20
25
|
code?: string;
|
|
@@ -15,9 +15,6 @@ function _interop_require_default(obj) {
|
|
|
15
15
|
default: obj
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
|
-
function isError(obj) {
|
|
19
|
-
return Object.prototype.toString.call(obj) === '[object Error]';
|
|
20
|
-
}
|
|
21
18
|
function worker(cp, options, callback) {
|
|
22
19
|
if (typeof options === 'function') {
|
|
23
20
|
callback = options;
|
|
@@ -41,9 +38,8 @@ function worker(cp, options, callback) {
|
|
|
41
38
|
(0, _onone.default)(cp, [
|
|
42
39
|
'error',
|
|
43
40
|
'close'
|
|
44
|
-
], function(status, signal) {
|
|
45
|
-
if (
|
|
46
|
-
var err = status;
|
|
41
|
+
], function(err, status, signal) {
|
|
42
|
+
if (err) {
|
|
47
43
|
if (err.code === 'OK') return; // ignore
|
|
48
44
|
return callback(err);
|
|
49
45
|
}
|
|
@@ -66,14 +62,14 @@ function worker(cp, options, callback) {
|
|
|
66
62
|
];
|
|
67
63
|
if (res.status === null) res.status = 0; // patch: early node on windows could return null
|
|
68
64
|
// process errors
|
|
69
|
-
var
|
|
70
|
-
if (
|
|
65
|
+
var exitErr = res.status !== 0 ? new Error("Non-zero exit code: ".concat(res.status)) : null;
|
|
66
|
+
if (exitErr) {
|
|
71
67
|
for(var key in res){
|
|
72
68
|
if (_constantsts.spawnKeys.indexOf(key) < 0) continue;
|
|
73
|
-
|
|
69
|
+
exitErr[key] = Buffer.isBuffer(res[key]) ? res[key].toString(options.encoding || 'utf8') : res[key];
|
|
74
70
|
}
|
|
75
71
|
}
|
|
76
|
-
|
|
72
|
+
exitErr ? callback(exitErr) : callback(null, res);
|
|
77
73
|
});
|
|
78
74
|
// pipe input
|
|
79
75
|
if (options.input && (typeof options.input === 'string' || Buffer.isBuffer(options.input))) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/compat/cross-spawn-cb/src/workers/async.ts"],"sourcesContent":["import oo from 'on-one';\nimport { spawnKeys } from '../constants.ts';\n\nimport type { ChildProcess, SpawnCallback, SpawnError, SpawnOptions, SpawnResult } from '../types.ts';\n\
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/compat/cross-spawn-cb/src/workers/async.ts"],"sourcesContent":["import oo from 'on-one';\nimport { spawnKeys } from '../constants.ts';\n\nimport type { ChildProcess, SpawnCallback, SpawnError, SpawnOptions, SpawnResult } from '../types.ts';\n\nexport default function worker(cp: ChildProcess, options?: SpawnOptions | SpawnCallback, callback?: SpawnCallback) {\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n options = options || {};\n\n // collect output\n const res = { pid: 0, output: [], stdout: null, stderr: null, status: null, signal: null } as SpawnResult;\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n if (options.encoding && cp.stdout) cp.stdout.on('data', stdout.push.bind(stdout));\n if (options.encoding && cp.stderr) cp.stderr.on('data', stderr.push.bind(stderr));\n\n // some versions of node emit both an error and close\n oo(cp, ['error', 'close'], (err: Error | null, status: number | null, signal: NodeJS.Signals | null) => {\n if (err) {\n if ((err as SpawnError).code === 'OK') return; // ignore\n return callback(err as SpawnError);\n }\n\n // prepare result\n res.pid = cp.pid;\n res.status = status;\n res.signal = signal;\n if (options.encoding && cp.stdout) {\n res.stdout = Buffer.concat(stdout);\n if (options.encoding !== 'binary') res.stdout = res.stdout.toString(options.encoding);\n }\n if (options.encoding && cp.stderr) {\n res.stderr = Buffer.concat(stderr);\n if (options.encoding !== 'binary') res.stderr = res.stderr.toString(options.encoding);\n }\n res.output = [null, res.stdout, res.stderr];\n if (res.status === null) res.status = 0; // patch: early node on windows could return null\n\n // process errors\n const exitErr = res.status !== 0 ? new Error(`Non-zero exit code: ${res.status}`) : null;\n if (exitErr) {\n for (const key in res) {\n if (spawnKeys.indexOf(key) < 0) continue;\n exitErr[key] = Buffer.isBuffer(res[key]) ? res[key].toString(options.encoding || 'utf8') : res[key];\n }\n }\n exitErr ? callback(exitErr as SpawnError) : callback(null, res);\n });\n\n // pipe input\n if (options.input && (typeof options.input === 'string' || Buffer.isBuffer(options.input))) {\n cp.stdin.end(options.input);\n }\n}\n"],"names":["worker","cp","options","callback","res","pid","output","stdout","stderr","status","signal","encoding","on","push","bind","oo","err","code","Buffer","concat","toString","exitErr","Error","key","spawnKeys","indexOf","isBuffer","input","stdin","end"],"mappings":";;;;+BAKA;;;eAAwBA;;;4DALT;2BACW;;;;;;AAIX,SAASA,OAAOC,EAAgB,EAAEC,OAAsC,EAAEC,QAAwB;IAC/G,IAAI,OAAOD,YAAY,YAAY;QACjCC,WAAWD;QACXA,UAAU,CAAC;IACb;IACAA,UAAUA,WAAW,CAAC;IAEtB,iBAAiB;IACjB,IAAME,MAAM;QAAEC,KAAK;QAAGC,QAAQ,EAAE;QAAEC,QAAQ;QAAMC,QAAQ;QAAMC,QAAQ;QAAMC,QAAQ;IAAK;IACzF,IAAMH,SAAmB,EAAE;IAC3B,IAAMC,SAAmB,EAAE;IAC3B,IAAIN,QAAQS,QAAQ,IAAIV,GAAGM,MAAM,EAAEN,GAAGM,MAAM,CAACK,EAAE,CAAC,QAAQL,OAAOM,IAAI,CAACC,IAAI,CAACP;IACzE,IAAIL,QAAQS,QAAQ,IAAIV,GAAGO,MAAM,EAAEP,GAAGO,MAAM,CAACI,EAAE,CAAC,QAAQJ,OAAOK,IAAI,CAACC,IAAI,CAACN;IAEzE,qDAAqD;IACrDO,IAAAA,cAAE,EAACd,IAAI;QAAC;QAAS;KAAQ,EAAE,SAACe,KAAmBP,QAAuBC;QACpE,IAAIM,KAAK;YACP,IAAI,AAACA,IAAmBC,IAAI,KAAK,MAAM,QAAQ,SAAS;YACxD,OAAOd,SAASa;QAClB;QAEA,iBAAiB;QACjBZ,IAAIC,GAAG,GAAGJ,GAAGI,GAAG;QAChBD,IAAIK,MAAM,GAAGA;QACbL,IAAIM,MAAM,GAAGA;QACb,IAAIR,QAAQS,QAAQ,IAAIV,GAAGM,MAAM,EAAE;YACjCH,IAAIG,MAAM,GAAGW,OAAOC,MAAM,CAACZ;YAC3B,IAAIL,QAAQS,QAAQ,KAAK,UAAUP,IAAIG,MAAM,GAAGH,IAAIG,MAAM,CAACa,QAAQ,CAAClB,QAAQS,QAAQ;QACtF;QACA,IAAIT,QAAQS,QAAQ,IAAIV,GAAGO,MAAM,EAAE;YACjCJ,IAAII,MAAM,GAAGU,OAAOC,MAAM,CAACX;YAC3B,IAAIN,QAAQS,QAAQ,KAAK,UAAUP,IAAII,MAAM,GAAGJ,IAAII,MAAM,CAACY,QAAQ,CAAClB,QAAQS,QAAQ;QACtF;QACAP,IAAIE,MAAM,GAAG;YAAC;YAAMF,IAAIG,MAAM;YAAEH,IAAII,MAAM;SAAC;QAC3C,IAAIJ,IAAIK,MAAM,KAAK,MAAML,IAAIK,MAAM,GAAG,GAAG,iDAAiD;QAE1F,iBAAiB;QACjB,IAAMY,UAAUjB,IAAIK,MAAM,KAAK,IAAI,IAAIa,MAAM,AAAC,uBAAiC,OAAXlB,IAAIK,MAAM,KAAM;QACpF,IAAIY,SAAS;YACX,IAAK,IAAME,OAAOnB,IAAK;gBACrB,IAAIoB,sBAAS,CAACC,OAAO,CAACF,OAAO,GAAG;gBAChCF,OAAO,CAACE,IAAI,GAAGL,OAAOQ,QAAQ,CAACtB,GAAG,CAACmB,IAAI,IAAInB,GAAG,CAACmB,IAAI,CAACH,QAAQ,CAAClB,QAAQS,QAAQ,IAAI,UAAUP,GAAG,CAACmB,IAAI;YACrG;QACF;QACAF,UAAUlB,SAASkB,WAAyBlB,SAAS,MAAMC;IAC7D;IAEA,aAAa;IACb,IAAIF,QAAQyB,KAAK,IAAK,CAAA,OAAOzB,QAAQyB,KAAK,KAAK,YAAYT,OAAOQ,QAAQ,CAACxB,QAAQyB,KAAK,CAAA,GAAI;QAC1F1B,GAAG2B,KAAK,CAACC,GAAG,CAAC3B,QAAQyB,KAAK;IAC5B;AACF"}
|
package/dist/esm/crossSpawn.js
CHANGED
|
@@ -1,36 +1,12 @@
|
|
|
1
|
-
import cp from 'child_process';
|
|
2
1
|
import Module from 'module';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
import spawnSyncPolyfill from './polyfills/spawnSync.js';
|
|
5
2
|
const major = +process.versions.node.split('.')[0];
|
|
6
3
|
const _require = typeof require === 'undefined' ? Module.createRequire(import.meta.url) : require;
|
|
7
4
|
// Use lightweight shim for legacy Node (<= 7), modern cross-spawn for Node >= 8
|
|
8
5
|
const crossSpawn = _require(major <= 7 ? './shim/index.js' : 'cross-spawn');
|
|
6
|
+
// Fully delegate to the loaded implementation (shim or cross-spawn)
|
|
9
7
|
export default function spawn(command, args, options) {
|
|
10
|
-
|
|
11
|
-
const spawned = cp.spawn(parsed.command, parsed.args, parsed.options);
|
|
12
|
-
spawn._enoent.hookChildProcess(spawned, parsed);
|
|
13
|
-
return spawned;
|
|
8
|
+
return crossSpawn(command, args, options);
|
|
14
9
|
}
|
|
15
|
-
|
|
16
|
-
spawn.
|
|
17
|
-
const parsed = spawn._parse(command, args, options);
|
|
18
|
-
const res = cpSpawnSync(parsed.command, parsed.args, parsed.options);
|
|
19
|
-
res.error = res.error || spawn._enoent.verifyENOENTSync(res.status, parsed);
|
|
20
|
-
return res;
|
|
21
|
-
};
|
|
22
|
-
// patch earlier versions of cross-spawn with inconsistent handling of node
|
|
23
|
-
const NODES = [
|
|
24
|
-
'node',
|
|
25
|
-
'node.exe',
|
|
26
|
-
'node.cmd'
|
|
27
|
-
];
|
|
28
|
-
function _parse(command, args, options) {
|
|
29
|
-
if (NODES.indexOf(path.basename(command).toLowerCase()) >= 0) {
|
|
30
|
-
const env = options ? options.env || process.env : process.env;
|
|
31
|
-
command = env.NODE || env.npm_node_execpath || command;
|
|
32
|
-
}
|
|
33
|
-
return crossSpawn._parse(command, args, options);
|
|
34
|
-
}
|
|
35
|
-
spawn._parse = major <= 7 ? _parse : crossSpawn._parse;
|
|
10
|
+
spawn.sync = crossSpawn.sync;
|
|
11
|
+
spawn._parse = crossSpawn._parse;
|
|
36
12
|
spawn._enoent = crossSpawn._enoent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/compat/cross-spawn-cb/src/crossSpawn.ts"],"sourcesContent":["import type { ChildProcess } from 'child_process';\nimport
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/compat/cross-spawn-cb/src/crossSpawn.ts"],"sourcesContent":["import type { ChildProcess } from 'child_process';\nimport Module from 'module';\nimport type { Enoent, Parsed, SpawnOptions, SpawnResult, SpawnSyncOptions } from './types.ts';\n\nconst major = +process.versions.node.split('.')[0];\nconst _require = typeof require === 'undefined' ? Module.createRequire(import.meta.url) : require;\n// Use lightweight shim for legacy Node (<= 7), modern cross-spawn for Node >= 8\nconst crossSpawn = _require(major <= 7 ? './shim/index.js' : 'cross-spawn');\n\n// Fully delegate to the loaded implementation (shim or cross-spawn)\nexport default function spawn(command: string, args: string[], options?: SpawnOptions): ChildProcess {\n return crossSpawn(command, args, options);\n}\n\nspawn.sync = crossSpawn.sync as (command: string, args: string[], options?: SpawnSyncOptions) => SpawnResult;\nspawn._parse = crossSpawn._parse as (command: string, args: string[], options?: SpawnOptions | SpawnSyncOptions) => Parsed;\nspawn._enoent = crossSpawn._enoent as Enoent;\n"],"names":["Module","major","process","versions","node","split","_require","require","createRequire","url","crossSpawn","spawn","command","args","options","sync","_parse","_enoent"],"mappings":"AACA,OAAOA,YAAY,SAAS;AAG5B,MAAMC,QAAQ,CAACC,QAAQC,QAAQ,CAACC,IAAI,CAACC,KAAK,CAAC,IAAI,CAAC,EAAE;AAClD,MAAMC,WAAW,OAAOC,YAAY,cAAcP,OAAOQ,aAAa,CAAC,YAAYC,GAAG,IAAIF;AAC1F,gFAAgF;AAChF,MAAMG,aAAaJ,SAASL,SAAS,IAAI,oBAAoB;AAE7D,oEAAoE;AACpE,eAAe,SAASU,MAAMC,OAAe,EAAEC,IAAc,EAAEC,OAAsB;IACnF,OAAOJ,WAAWE,SAASC,MAAMC;AACnC;AAEAH,MAAMI,IAAI,GAAGL,WAAWK,IAAI;AAC5BJ,MAAMK,MAAM,GAAGN,WAAWM,MAAM;AAChCL,MAAMM,OAAO,GAAGP,WAAWO,OAAO"}
|
package/dist/esm/shim/parse.js
CHANGED
|
@@ -9,6 +9,10 @@ import { resolveCommand } from './resolve.js';
|
|
|
9
9
|
import { readShebang } from './shebang.js';
|
|
10
10
|
const isExecutableRegExp = /\.(?:com|exe)$/i;
|
|
11
11
|
const isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;
|
|
12
|
+
// Node ^4.8.0 || ^5.7.0 || >= 6.0.0 supports shell option natively
|
|
13
|
+
// See: https://github.com/nodejs/node/pull/4598
|
|
14
|
+
const [major, minor] = process.versions.node.split('.').map(Number);
|
|
15
|
+
const supportsShellOption = major >= 6 || major === 5 && minor >= 7 || major === 4 && minor >= 8;
|
|
12
16
|
function detectShebang(parsed) {
|
|
13
17
|
parsed.file = resolveCommand(parsed);
|
|
14
18
|
const shebang = parsed.file && readShebang(parsed.file);
|
|
@@ -48,6 +52,10 @@ function parseNonShell(parsed) {
|
|
|
48
52
|
return parsed;
|
|
49
53
|
}
|
|
50
54
|
function parseShell(parsed) {
|
|
55
|
+
// If node supports the shell option, there's no need to mimic its behavior
|
|
56
|
+
if (supportsShellOption) {
|
|
57
|
+
return parsed;
|
|
58
|
+
}
|
|
51
59
|
// Mimic node shell option for older Node versions
|
|
52
60
|
const shellCommand = [
|
|
53
61
|
parsed.command
|
|
@@ -76,6 +84,12 @@ function parseShell(parsed) {
|
|
|
76
84
|
}
|
|
77
85
|
return parsed;
|
|
78
86
|
}
|
|
87
|
+
// Handle NODE/npm_node_execpath env vars for node commands
|
|
88
|
+
const NODES = [
|
|
89
|
+
'node',
|
|
90
|
+
'node.exe',
|
|
91
|
+
'node.cmd'
|
|
92
|
+
];
|
|
79
93
|
export function parse(command, args, options) {
|
|
80
94
|
// Normalize arguments
|
|
81
95
|
let argsArray;
|
|
@@ -88,6 +102,7 @@ export function parse(command, args, options) {
|
|
|
88
102
|
argsArray = args ? args.slice(0) : [];
|
|
89
103
|
opts = objectAssign({}, options || {});
|
|
90
104
|
}
|
|
105
|
+
// Build parsed object with original command/args BEFORE any substitution
|
|
91
106
|
const parsed = {
|
|
92
107
|
command: command,
|
|
93
108
|
args: argsArray,
|
|
@@ -98,5 +113,10 @@ export function parse(command, args, options) {
|
|
|
98
113
|
args: argsArray
|
|
99
114
|
}
|
|
100
115
|
};
|
|
116
|
+
// Substitute node command with NODE env var if set
|
|
117
|
+
if (NODES.indexOf(path.basename(parsed.command).toLowerCase()) >= 0) {
|
|
118
|
+
const env = opts.env || process.env;
|
|
119
|
+
parsed.command = env.NODE || env.npm_node_execpath || parsed.command;
|
|
120
|
+
}
|
|
101
121
|
return opts.shell ? parseShell(parsed) : parseNonShell(parsed);
|
|
102
122
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/compat/cross-spawn-cb/src/shim/parse.ts"],"sourcesContent":["/**\n * Command parsing for cross-platform spawn\n * Simplified from cross-spawn v6.0.5\n */\n\nimport path from 'path';\nimport { objectAssign } from '../compat.ts';\nimport { isWindows } from '../constants.ts';\nimport { escapeArgument, escapeCommand } from './escape.ts';\nimport { resolveCommand } from './resolve.ts';\nimport { readShebang } from './shebang.ts';\nimport type { Parsed, ShimSpawnOptions } from './types.ts';\n\nconst isExecutableRegExp = /\\.(?:com|exe)$/i;\nconst isCmdShimRegExp = /node_modules[\\\\/].bin[\\\\/][^\\\\/]+\\.cmd$/i;\n\nfunction detectShebang(parsed: Parsed): string | null {\n parsed.file = resolveCommand(parsed);\n\n const shebang = parsed.file && readShebang(parsed.file);\n if (shebang) {\n parsed.args.unshift(parsed.file);\n parsed.command = shebang;\n return resolveCommand(parsed);\n }\n\n return parsed.file;\n}\n\nfunction parseNonShell(parsed: Parsed): Parsed {\n if (!isWindows) return parsed;\n\n // Detect & add support for shebangs\n const commandFile = detectShebang(parsed);\n\n // We don't need a shell if the command filename is an executable\n const needsShell = !isExecutableRegExp.test(commandFile || '');\n\n if (parsed.options.forceShell || needsShell) {\n // Need to double escape meta chars if the command is a cmd-shim\n const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile || '');\n\n // Normalize posix paths into OS compatible paths\n parsed.command = path.normalize(parsed.command);\n\n // Escape command & arguments\n parsed.command = escapeCommand(parsed.command);\n parsed.args = parsed.args.map((arg) => escapeArgument(arg, needsDoubleEscapeMetaChars));\n\n const shellCommand = [parsed.command].concat(parsed.args).join(' ');\n\n parsed.args = ['/d', '/s', '/c', `\"${shellCommand}\"`];\n parsed.command = process.env.comspec || 'cmd.exe';\n parsed.options.windowsVerbatimArguments = true;\n }\n\n return parsed;\n}\n\nfunction parseShell(parsed: Parsed): Parsed {\n // Mimic node shell option for older Node versions\n const shellCommand = [parsed.command].concat(parsed.args).join(' ');\n\n if (isWindows) {\n parsed.command = typeof parsed.options.shell === 'string' ? parsed.options.shell : process.env.comspec || 'cmd.exe';\n parsed.args = ['/d', '/s', '/c', `\"${shellCommand}\"`];\n parsed.options.windowsVerbatimArguments = true;\n } else {\n if (typeof parsed.options.shell === 'string') {\n parsed.command = parsed.options.shell;\n } else if (process.platform === 'android') {\n parsed.command = '/system/bin/sh';\n } else {\n parsed.command = '/bin/sh';\n }\n parsed.args = ['-c', shellCommand];\n }\n\n return parsed;\n}\n\nexport function parse(command: string, args?: string[] | ShimSpawnOptions | null, options?: ShimSpawnOptions): Parsed {\n // Normalize arguments\n let argsArray: string[];\n let opts: ShimSpawnOptions;\n\n if (args && !Array.isArray(args)) {\n // args is actually options\n argsArray = [];\n opts = objectAssign({}, args);\n } else {\n argsArray = args ? (args as string[]).slice(0) : [];\n opts = objectAssign({}, options || {});\n }\n\n const parsed: Parsed = {\n command: command,\n args: argsArray,\n options: opts,\n file: undefined,\n original: {\n command: command,\n args: argsArray,\n },\n };\n\n return opts.shell ? parseShell(parsed) : parseNonShell(parsed);\n}\n"],"names":["path","objectAssign","isWindows","escapeArgument","escapeCommand","resolveCommand","readShebang","isExecutableRegExp","isCmdShimRegExp","detectShebang","parsed","file","shebang","args","unshift","command","parseNonShell","commandFile","needsShell","test","options","forceShell","needsDoubleEscapeMetaChars","normalize","
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/compat/cross-spawn-cb/src/shim/parse.ts"],"sourcesContent":["/**\n * Command parsing for cross-platform spawn\n * Simplified from cross-spawn v6.0.5\n */\n\nimport path from 'path';\nimport { objectAssign } from '../compat.ts';\nimport { isWindows } from '../constants.ts';\nimport { escapeArgument, escapeCommand } from './escape.ts';\nimport { resolveCommand } from './resolve.ts';\nimport { readShebang } from './shebang.ts';\nimport type { Parsed, ShimSpawnOptions } from './types.ts';\n\nconst isExecutableRegExp = /\\.(?:com|exe)$/i;\nconst isCmdShimRegExp = /node_modules[\\\\/].bin[\\\\/][^\\\\/]+\\.cmd$/i;\n\n// Node ^4.8.0 || ^5.7.0 || >= 6.0.0 supports shell option natively\n// See: https://github.com/nodejs/node/pull/4598\nconst [major, minor] = process.versions.node.split('.').map(Number);\nconst supportsShellOption = major >= 6 || (major === 5 && minor >= 7) || (major === 4 && minor >= 8);\n\nfunction detectShebang(parsed: Parsed): string | null {\n parsed.file = resolveCommand(parsed);\n\n const shebang = parsed.file && readShebang(parsed.file);\n if (shebang) {\n parsed.args.unshift(parsed.file);\n parsed.command = shebang;\n return resolveCommand(parsed);\n }\n\n return parsed.file;\n}\n\nfunction parseNonShell(parsed: Parsed): Parsed {\n if (!isWindows) return parsed;\n\n // Detect & add support for shebangs\n const commandFile = detectShebang(parsed);\n\n // We don't need a shell if the command filename is an executable\n const needsShell = !isExecutableRegExp.test(commandFile || '');\n\n if (parsed.options.forceShell || needsShell) {\n // Need to double escape meta chars if the command is a cmd-shim\n const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile || '');\n\n // Normalize posix paths into OS compatible paths\n parsed.command = path.normalize(parsed.command);\n\n // Escape command & arguments\n parsed.command = escapeCommand(parsed.command);\n parsed.args = parsed.args.map((arg) => escapeArgument(arg, needsDoubleEscapeMetaChars));\n\n const shellCommand = [parsed.command].concat(parsed.args).join(' ');\n\n parsed.args = ['/d', '/s', '/c', `\"${shellCommand}\"`];\n parsed.command = process.env.comspec || 'cmd.exe';\n parsed.options.windowsVerbatimArguments = true;\n }\n\n return parsed;\n}\n\nfunction parseShell(parsed: Parsed): Parsed {\n // If node supports the shell option, there's no need to mimic its behavior\n if (supportsShellOption) {\n return parsed;\n }\n\n // Mimic node shell option for older Node versions\n const shellCommand = [parsed.command].concat(parsed.args).join(' ');\n\n if (isWindows) {\n parsed.command = typeof parsed.options.shell === 'string' ? parsed.options.shell : process.env.comspec || 'cmd.exe';\n parsed.args = ['/d', '/s', '/c', `\"${shellCommand}\"`];\n parsed.options.windowsVerbatimArguments = true;\n } else {\n if (typeof parsed.options.shell === 'string') {\n parsed.command = parsed.options.shell;\n } else if (process.platform === 'android') {\n parsed.command = '/system/bin/sh';\n } else {\n parsed.command = '/bin/sh';\n }\n parsed.args = ['-c', shellCommand];\n }\n\n return parsed;\n}\n\n// Handle NODE/npm_node_execpath env vars for node commands\nconst NODES = ['node', 'node.exe', 'node.cmd'];\n\nexport function parse(command: string, args?: string[] | ShimSpawnOptions | null, options?: ShimSpawnOptions): Parsed {\n // Normalize arguments\n let argsArray: string[];\n let opts: ShimSpawnOptions;\n\n if (args && !Array.isArray(args)) {\n // args is actually options\n argsArray = [];\n opts = objectAssign({}, args);\n } else {\n argsArray = args ? (args as string[]).slice(0) : [];\n opts = objectAssign({}, options || {});\n }\n\n // Build parsed object with original command/args BEFORE any substitution\n const parsed: Parsed = {\n command: command,\n args: argsArray,\n options: opts,\n file: undefined,\n original: {\n command: command,\n args: argsArray,\n },\n };\n\n // Substitute node command with NODE env var if set\n if (NODES.indexOf(path.basename(parsed.command).toLowerCase()) >= 0) {\n const env = opts.env || process.env;\n parsed.command = env.NODE || env.npm_node_execpath || parsed.command;\n }\n\n return opts.shell ? parseShell(parsed) : parseNonShell(parsed);\n}\n"],"names":["path","objectAssign","isWindows","escapeArgument","escapeCommand","resolveCommand","readShebang","isExecutableRegExp","isCmdShimRegExp","major","minor","process","versions","node","split","map","Number","supportsShellOption","detectShebang","parsed","file","shebang","args","unshift","command","parseNonShell","commandFile","needsShell","test","options","forceShell","needsDoubleEscapeMetaChars","normalize","arg","shellCommand","concat","join","env","comspec","windowsVerbatimArguments","parseShell","shell","platform","NODES","parse","argsArray","opts","Array","isArray","slice","undefined","original","indexOf","basename","toLowerCase","NODE","npm_node_execpath"],"mappings":"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"}
|
package/dist/esm/shim/resolve.js
CHANGED
|
@@ -6,26 +6,11 @@ import path from 'path';
|
|
|
6
6
|
import which from 'which';
|
|
7
7
|
import { isWindows } from '../constants.js';
|
|
8
8
|
const pathDelimiter = isWindows ? ';' : ':';
|
|
9
|
-
const NODES = [
|
|
10
|
-
'node',
|
|
11
|
-
'node.exe',
|
|
12
|
-
'node.cmd'
|
|
13
|
-
];
|
|
14
9
|
function resolveCommandAttempt(parsed, withoutPathExt) {
|
|
15
10
|
const command = parsed.command;
|
|
16
11
|
const options = parsed.options;
|
|
17
|
-
const env = options.env || process.env;
|
|
18
12
|
const cwd = process.cwd();
|
|
19
13
|
const hasCustomCwd = options.cwd != null;
|
|
20
|
-
// Handle NODE/npm_node_execpath env vars for node commands
|
|
21
|
-
// This is needed because shebang detection may change the command to 'node'
|
|
22
|
-
// after the initial NODE env check in crossSpawn.ts has already passed
|
|
23
|
-
if (NODES.indexOf(path.basename(command).toLowerCase()) >= 0) {
|
|
24
|
-
const nodeFromEnv = env.NODE || env.npm_node_execpath;
|
|
25
|
-
if (nodeFromEnv) {
|
|
26
|
-
return nodeFromEnv;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
14
|
// If a custom cwd was specified, we need to change the process cwd
|
|
30
15
|
// because which will do stat calls but does not support a custom cwd
|
|
31
16
|
if (hasCustomCwd) {
|
|
@@ -37,7 +22,7 @@ function resolveCommandAttempt(parsed, withoutPathExt) {
|
|
|
37
22
|
let resolved = null;
|
|
38
23
|
const pathKey = envPathKey({
|
|
39
24
|
env: options.env || process.env
|
|
40
|
-
})
|
|
25
|
+
});
|
|
41
26
|
try {
|
|
42
27
|
resolved = which.sync(command, {
|
|
43
28
|
path: (options.env || process.env)[pathKey],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/compat/cross-spawn-cb/src/shim/resolve.ts"],"sourcesContent":["/**\n * Command resolution using which\n * Simplified from cross-spawn v6.0.5\n */\n\nimport envPathKey from 'env-path-key';\nimport path from 'path';\nimport which from 'which';\nimport { isWindows } from '../constants.ts';\nimport type { Parsed } from './types.ts';\n\nconst pathDelimiter = isWindows ? ';' : ':';\
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/compat/cross-spawn-cb/src/shim/resolve.ts"],"sourcesContent":["/**\n * Command resolution using which\n * Simplified from cross-spawn v6.0.5\n */\n\nimport envPathKey from 'env-path-key';\nimport path from 'path';\nimport which from 'which';\nimport { isWindows } from '../constants.ts';\nimport type { Parsed } from './types.ts';\n\nconst pathDelimiter = isWindows ? ';' : ':';\n\nfunction resolveCommandAttempt(parsed: Parsed, withoutPathExt?: boolean): string | null {\n const command = parsed.command;\n const options = parsed.options;\n const cwd = process.cwd();\n const hasCustomCwd = options.cwd != null;\n\n // If a custom cwd was specified, we need to change the process cwd\n // because which will do stat calls but does not support a custom cwd\n if (hasCustomCwd) {\n try {\n process.chdir(options.cwd as string);\n } catch (_err) {\n /* ignore */\n }\n }\n\n let resolved: string | null = null;\n const pathKey = envPathKey({ env: options.env || process.env });\n\n try {\n resolved = which.sync(command, {\n path: (options.env || process.env)[pathKey],\n // On Windows: undefined uses PATHEXT, pathDelimiter bypasses it\n // withoutPathExt fallback is needed to find files without extensions\n pathExt: withoutPathExt ? pathDelimiter : undefined,\n });\n } catch (_e) {\n /* not found */\n } finally {\n if (hasCustomCwd) {\n process.chdir(cwd);\n }\n }\n\n // Ensure absolute path\n if (resolved) {\n resolved = path.resolve(hasCustomCwd ? (options.cwd as string) : '', resolved);\n }\n\n return resolved;\n}\n\n// Try twice: first with PATHEXT (finds .cmd/.bat/.exe), then without (finds extensionless files)\nexport function resolveCommand(parsed: Parsed): string | null {\n return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true);\n}\n"],"names":["envPathKey","path","which","isWindows","pathDelimiter","resolveCommandAttempt","parsed","withoutPathExt","command","options","cwd","process","hasCustomCwd","chdir","_err","resolved","pathKey","env","sync","pathExt","undefined","_e","resolve","resolveCommand"],"mappings":"AAAA;;;CAGC,GAED,OAAOA,gBAAgB,eAAe;AACtC,OAAOC,UAAU,OAAO;AACxB,OAAOC,WAAW,QAAQ;AAC1B,SAASC,SAAS,QAAQ,kBAAkB;AAG5C,MAAMC,gBAAgBD,YAAY,MAAM;AAExC,SAASE,sBAAsBC,MAAc,EAAEC,cAAwB;IACrE,MAAMC,UAAUF,OAAOE,OAAO;IAC9B,MAAMC,UAAUH,OAAOG,OAAO;IAC9B,MAAMC,MAAMC,QAAQD,GAAG;IACvB,MAAME,eAAeH,QAAQC,GAAG,IAAI;IAEpC,mEAAmE;IACnE,qEAAqE;IACrE,IAAIE,cAAc;QAChB,IAAI;YACFD,QAAQE,KAAK,CAACJ,QAAQC,GAAG;QAC3B,EAAE,OAAOI,MAAM;QACb,UAAU,GACZ;IACF;IAEA,IAAIC,WAA0B;IAC9B,MAAMC,UAAUhB,WAAW;QAAEiB,KAAKR,QAAQQ,GAAG,IAAIN,QAAQM,GAAG;IAAC;IAE7D,IAAI;QACFF,WAAWb,MAAMgB,IAAI,CAACV,SAAS;YAC7BP,MAAM,AAACQ,CAAAA,QAAQQ,GAAG,IAAIN,QAAQM,GAAG,AAAD,CAAE,CAACD,QAAQ;YAC3C,gEAAgE;YAChE,qEAAqE;YACrEG,SAASZ,iBAAiBH,gBAAgBgB;QAC5C;IACF,EAAE,OAAOC,IAAI;IACX,aAAa,GACf,SAAU;QACR,IAAIT,cAAc;YAChBD,QAAQE,KAAK,CAACH;QAChB;IACF;IAEA,uBAAuB;IACvB,IAAIK,UAAU;QACZA,WAAWd,KAAKqB,OAAO,CAACV,eAAgBH,QAAQC,GAAG,GAAc,IAAIK;IACvE;IAEA,OAAOA;AACT;AAEA,iGAAiG;AACjG,OAAO,SAASQ,eAAejB,MAAc;IAC3C,OAAOD,sBAAsBC,WAAWD,sBAAsBC,QAAQ;AACxE"}
|
package/dist/esm/types.d.ts
CHANGED
|
@@ -15,6 +15,11 @@ export interface Parsed {
|
|
|
15
15
|
command: string;
|
|
16
16
|
args: string[];
|
|
17
17
|
options: SpawnOptions | SpawnSyncOptions;
|
|
18
|
+
file?: string | null;
|
|
19
|
+
original?: {
|
|
20
|
+
command: string;
|
|
21
|
+
args: string[];
|
|
22
|
+
};
|
|
18
23
|
}
|
|
19
24
|
export interface NotFoundError extends Error {
|
|
20
25
|
code?: string;
|
package/dist/esm/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/compat/cross-spawn-cb/src/types.ts"],"sourcesContent":["import type * as child_process from 'child_process';\n\nexport type ChildProcess = child_process.ChildProcess;\nexport interface SpawnOptions extends child_process.SpawnOptions {\n encoding?: BufferEncoding;\n env?: NodeJS.ProcessEnv;\n input?: string | Buffer;\n}\nexport interface SpawnSyncOptions extends child_process.SpawnSyncOptions {\n encoding?: BufferEncoding;\n env?: NodeJS.ProcessEnv;\n input?: string | Buffer;\n}\nexport type SpawnResult = child_process.SpawnSyncReturns<string | Buffer>;\n\nexport interface Parsed {\n command: string;\n args: string[];\n options: SpawnOptions | SpawnSyncOptions;\n}\n\nexport interface NotFoundError extends Error {\n code?: string;\n errno?: string;\n syscall?: string;\n path?: string;\n spawnargs?: string[];\n}\nexport interface SpawnError extends NotFoundError, SpawnResult {}\n\nexport type SpawnCallback = (err?: SpawnError, res?: SpawnResult) => void;\n\nexport interface Enoent {\n hookChildProcess: (cp: ChildProcess, parsed: Parsed) => undefined;\n verifyENOENT: (status: number, parsed: Parsed) => NotFoundError | null;\n verifyENOENTSync: (status: number, parsed: Parsed) => NotFoundError | null;\n notFoundError: (cp: ChildProcess, parsed: Parsed) => NotFoundError;\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/compat/cross-spawn-cb/src/types.ts"],"sourcesContent":["import type * as child_process from 'child_process';\n\nexport type ChildProcess = child_process.ChildProcess;\nexport interface SpawnOptions extends child_process.SpawnOptions {\n encoding?: BufferEncoding;\n env?: NodeJS.ProcessEnv;\n input?: string | Buffer;\n}\nexport interface SpawnSyncOptions extends child_process.SpawnSyncOptions {\n encoding?: BufferEncoding;\n env?: NodeJS.ProcessEnv;\n input?: string | Buffer;\n}\nexport type SpawnResult = child_process.SpawnSyncReturns<string | Buffer>;\n\nexport interface Parsed {\n command: string;\n args: string[];\n options: SpawnOptions | SpawnSyncOptions;\n file?: string | null;\n original?: {\n command: string;\n args: string[];\n };\n}\n\nexport interface NotFoundError extends Error {\n code?: string;\n errno?: string;\n syscall?: string;\n path?: string;\n spawnargs?: string[];\n}\nexport interface SpawnError extends NotFoundError, SpawnResult {}\n\nexport type SpawnCallback = (err?: SpawnError, res?: SpawnResult) => void;\n\nexport interface Enoent {\n hookChildProcess: (cp: ChildProcess, parsed: Parsed) => undefined;\n verifyENOENT: (status: number, parsed: Parsed) => NotFoundError | null;\n verifyENOENTSync: (status: number, parsed: Parsed) => NotFoundError | null;\n notFoundError: (cp: ChildProcess, parsed: Parsed) => NotFoundError;\n}\n"],"names":[],"mappings":"AAqCA,WAKC"}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import oo from 'on-one';
|
|
2
2
|
import { spawnKeys } from '../constants.js';
|
|
3
|
-
function isError(obj) {
|
|
4
|
-
return Object.prototype.toString.call(obj) === '[object Error]';
|
|
5
|
-
}
|
|
6
3
|
export default function worker(cp, options, callback) {
|
|
7
4
|
if (typeof options === 'function') {
|
|
8
5
|
callback = options;
|
|
@@ -26,9 +23,8 @@ export default function worker(cp, options, callback) {
|
|
|
26
23
|
oo(cp, [
|
|
27
24
|
'error',
|
|
28
25
|
'close'
|
|
29
|
-
], (status, signal)=>{
|
|
30
|
-
if (
|
|
31
|
-
const err = status;
|
|
26
|
+
], (err, status, signal)=>{
|
|
27
|
+
if (err) {
|
|
32
28
|
if (err.code === 'OK') return; // ignore
|
|
33
29
|
return callback(err);
|
|
34
30
|
}
|
|
@@ -51,14 +47,14 @@ export default function worker(cp, options, callback) {
|
|
|
51
47
|
];
|
|
52
48
|
if (res.status === null) res.status = 0; // patch: early node on windows could return null
|
|
53
49
|
// process errors
|
|
54
|
-
const
|
|
55
|
-
if (
|
|
50
|
+
const exitErr = res.status !== 0 ? new Error(`Non-zero exit code: ${res.status}`) : null;
|
|
51
|
+
if (exitErr) {
|
|
56
52
|
for(const key in res){
|
|
57
53
|
if (spawnKeys.indexOf(key) < 0) continue;
|
|
58
|
-
|
|
54
|
+
exitErr[key] = Buffer.isBuffer(res[key]) ? res[key].toString(options.encoding || 'utf8') : res[key];
|
|
59
55
|
}
|
|
60
56
|
}
|
|
61
|
-
|
|
57
|
+
exitErr ? callback(exitErr) : callback(null, res);
|
|
62
58
|
});
|
|
63
59
|
// pipe input
|
|
64
60
|
if (options.input && (typeof options.input === 'string' || Buffer.isBuffer(options.input))) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/compat/cross-spawn-cb/src/workers/async.ts"],"sourcesContent":["import oo from 'on-one';\nimport { spawnKeys } from '../constants.ts';\n\nimport type { ChildProcess, SpawnCallback, SpawnError, SpawnOptions, SpawnResult } from '../types.ts';\n\
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/compat/cross-spawn-cb/src/workers/async.ts"],"sourcesContent":["import oo from 'on-one';\nimport { spawnKeys } from '../constants.ts';\n\nimport type { ChildProcess, SpawnCallback, SpawnError, SpawnOptions, SpawnResult } from '../types.ts';\n\nexport default function worker(cp: ChildProcess, options?: SpawnOptions | SpawnCallback, callback?: SpawnCallback) {\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n options = options || {};\n\n // collect output\n const res = { pid: 0, output: [], stdout: null, stderr: null, status: null, signal: null } as SpawnResult;\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n if (options.encoding && cp.stdout) cp.stdout.on('data', stdout.push.bind(stdout));\n if (options.encoding && cp.stderr) cp.stderr.on('data', stderr.push.bind(stderr));\n\n // some versions of node emit both an error and close\n oo(cp, ['error', 'close'], (err: Error | null, status: number | null, signal: NodeJS.Signals | null) => {\n if (err) {\n if ((err as SpawnError).code === 'OK') return; // ignore\n return callback(err as SpawnError);\n }\n\n // prepare result\n res.pid = cp.pid;\n res.status = status;\n res.signal = signal;\n if (options.encoding && cp.stdout) {\n res.stdout = Buffer.concat(stdout);\n if (options.encoding !== 'binary') res.stdout = res.stdout.toString(options.encoding);\n }\n if (options.encoding && cp.stderr) {\n res.stderr = Buffer.concat(stderr);\n if (options.encoding !== 'binary') res.stderr = res.stderr.toString(options.encoding);\n }\n res.output = [null, res.stdout, res.stderr];\n if (res.status === null) res.status = 0; // patch: early node on windows could return null\n\n // process errors\n const exitErr = res.status !== 0 ? new Error(`Non-zero exit code: ${res.status}`) : null;\n if (exitErr) {\n for (const key in res) {\n if (spawnKeys.indexOf(key) < 0) continue;\n exitErr[key] = Buffer.isBuffer(res[key]) ? res[key].toString(options.encoding || 'utf8') : res[key];\n }\n }\n exitErr ? callback(exitErr as SpawnError) : callback(null, res);\n });\n\n // pipe input\n if (options.input && (typeof options.input === 'string' || Buffer.isBuffer(options.input))) {\n cp.stdin.end(options.input);\n }\n}\n"],"names":["oo","spawnKeys","worker","cp","options","callback","res","pid","output","stdout","stderr","status","signal","encoding","on","push","bind","err","code","Buffer","concat","toString","exitErr","Error","key","indexOf","isBuffer","input","stdin","end"],"mappings":"AAAA,OAAOA,QAAQ,SAAS;AACxB,SAASC,SAAS,QAAQ,kBAAkB;AAI5C,eAAe,SAASC,OAAOC,EAAgB,EAAEC,OAAsC,EAAEC,QAAwB;IAC/G,IAAI,OAAOD,YAAY,YAAY;QACjCC,WAAWD;QACXA,UAAU,CAAC;IACb;IACAA,UAAUA,WAAW,CAAC;IAEtB,iBAAiB;IACjB,MAAME,MAAM;QAAEC,KAAK;QAAGC,QAAQ,EAAE;QAAEC,QAAQ;QAAMC,QAAQ;QAAMC,QAAQ;QAAMC,QAAQ;IAAK;IACzF,MAAMH,SAAmB,EAAE;IAC3B,MAAMC,SAAmB,EAAE;IAC3B,IAAIN,QAAQS,QAAQ,IAAIV,GAAGM,MAAM,EAAEN,GAAGM,MAAM,CAACK,EAAE,CAAC,QAAQL,OAAOM,IAAI,CAACC,IAAI,CAACP;IACzE,IAAIL,QAAQS,QAAQ,IAAIV,GAAGO,MAAM,EAAEP,GAAGO,MAAM,CAACI,EAAE,CAAC,QAAQJ,OAAOK,IAAI,CAACC,IAAI,CAACN;IAEzE,qDAAqD;IACrDV,GAAGG,IAAI;QAAC;QAAS;KAAQ,EAAE,CAACc,KAAmBN,QAAuBC;QACpE,IAAIK,KAAK;YACP,IAAI,AAACA,IAAmBC,IAAI,KAAK,MAAM,QAAQ,SAAS;YACxD,OAAOb,SAASY;QAClB;QAEA,iBAAiB;QACjBX,IAAIC,GAAG,GAAGJ,GAAGI,GAAG;QAChBD,IAAIK,MAAM,GAAGA;QACbL,IAAIM,MAAM,GAAGA;QACb,IAAIR,QAAQS,QAAQ,IAAIV,GAAGM,MAAM,EAAE;YACjCH,IAAIG,MAAM,GAAGU,OAAOC,MAAM,CAACX;YAC3B,IAAIL,QAAQS,QAAQ,KAAK,UAAUP,IAAIG,MAAM,GAAGH,IAAIG,MAAM,CAACY,QAAQ,CAACjB,QAAQS,QAAQ;QACtF;QACA,IAAIT,QAAQS,QAAQ,IAAIV,GAAGO,MAAM,EAAE;YACjCJ,IAAII,MAAM,GAAGS,OAAOC,MAAM,CAACV;YAC3B,IAAIN,QAAQS,QAAQ,KAAK,UAAUP,IAAII,MAAM,GAAGJ,IAAII,MAAM,CAACW,QAAQ,CAACjB,QAAQS,QAAQ;QACtF;QACAP,IAAIE,MAAM,GAAG;YAAC;YAAMF,IAAIG,MAAM;YAAEH,IAAII,MAAM;SAAC;QAC3C,IAAIJ,IAAIK,MAAM,KAAK,MAAML,IAAIK,MAAM,GAAG,GAAG,iDAAiD;QAE1F,iBAAiB;QACjB,MAAMW,UAAUhB,IAAIK,MAAM,KAAK,IAAI,IAAIY,MAAM,CAAC,oBAAoB,EAAEjB,IAAIK,MAAM,EAAE,IAAI;QACpF,IAAIW,SAAS;YACX,IAAK,MAAME,OAAOlB,IAAK;gBACrB,IAAIL,UAAUwB,OAAO,CAACD,OAAO,GAAG;gBAChCF,OAAO,CAACE,IAAI,GAAGL,OAAOO,QAAQ,CAACpB,GAAG,CAACkB,IAAI,IAAIlB,GAAG,CAACkB,IAAI,CAACH,QAAQ,CAACjB,QAAQS,QAAQ,IAAI,UAAUP,GAAG,CAACkB,IAAI;YACrG;QACF;QACAF,UAAUjB,SAASiB,WAAyBjB,SAAS,MAAMC;IAC7D;IAEA,aAAa;IACb,IAAIF,QAAQuB,KAAK,IAAK,CAAA,OAAOvB,QAAQuB,KAAK,KAAK,YAAYR,OAAOO,QAAQ,CAACtB,QAAQuB,KAAK,CAAA,GAAI;QAC1FxB,GAAGyB,KAAK,CAACC,GAAG,CAACzB,QAAQuB,KAAK;IAC5B;AACF"}
|