node-version-use 2.1.8 → 2.1.9
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/worker.js +4 -3
- package/dist/cjs/worker.js.map +1 -1
- package/dist/esm/worker.js +4 -3
- package/dist/esm/worker.js.map +1 -1
- package/package.json +1 -1
package/dist/cjs/worker.js
CHANGED
|
@@ -161,7 +161,7 @@ function worker(versionExpression, command, args, options, callback) {
|
|
|
161
161
|
}) : null;
|
|
162
162
|
versions.forEach(function(version) {
|
|
163
163
|
queue.defer(function(cb) {
|
|
164
|
-
installVersion(version, installOptions, function(
|
|
164
|
+
installVersion(version, installOptions, function(err, installs) {
|
|
165
165
|
var next = function next(err, res) {
|
|
166
166
|
if (err && err.message.indexOf('ExperimentalWarning') >= 0) {
|
|
167
167
|
res = err;
|
|
@@ -177,12 +177,13 @@ function worker(versionExpression, command, args, options, callback) {
|
|
|
177
177
|
cb();
|
|
178
178
|
};
|
|
179
179
|
var install = installs && installs.length === 1 ? installs[0] : null;
|
|
180
|
-
if (!install) {
|
|
180
|
+
if (err || !install) {
|
|
181
|
+
var error = err || new Error("Unexpected version results for version ".concat(version, ". Install ").concat(JSON.stringify(installs)));
|
|
181
182
|
results.push({
|
|
182
183
|
install: install,
|
|
183
184
|
command: command,
|
|
184
185
|
version: version,
|
|
185
|
-
error:
|
|
186
|
+
error: error,
|
|
186
187
|
result: null
|
|
187
188
|
});
|
|
188
189
|
return cb();
|
package/dist/cjs/worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/worker.ts"],"sourcesContent":["import spawn, { type SpawnOptions } from 'cross-spawn-cb';\nimport fs from 'fs';\nimport resolveVersions, { type VersionOptions } from 'node-resolve-versions';\nimport type { InstallOptions } from 'node-version-install';\nimport { spawnOptions as createSpawnOptions } from 'node-version-utils';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport resolveBin from 'resolve-bin-sync';\nimport spawnStreaming from 'spawn-streaming';\nimport { createSession, formatArguments } from 'spawn-term';\nimport { stringEndsWith } from './compat.ts';\nimport { storagePath } from './constants.ts';\nimport loadNodeVersionInstall from './lib/loadNodeVersionInstall.ts';\n\nimport type { Options, UseCallback, UseOptions, UseResult } from './types.ts';\n\nconst isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\nconst NODE = isWindows ? 'node.exe' : 'node';\n\n// Parse npm-generated .cmd wrapper to extract the JS script path\nfunction parseNpmCmdWrapper(cmdPath: string): string | null {\n try {\n const content = fs.readFileSync(cmdPath, 'utf8');\n // Match: \"%_prog%\" \"%dp0%\\node_modules\\...\\cli.js\" %*\n // or: \"%_prog%\" \"%dp0%\\path\\to\\script.js\" %*\n const match = content.match(/\"%_prog%\"\\s+\"?%dp0%\\\\([^\"]+)\"?\\s+%\\*/);\n if (match) {\n const relativePath = match[1];\n const cmdDir = path.dirname(cmdPath);\n return path.join(cmdDir, relativePath);\n }\n } catch (_e) {\n // ignore\n }\n return null;\n}\n\n// On Windows, resolve npm bin commands to their JS entry points to bypass .cmd wrappers\n// This fixes issues with nvm-windows where .cmd wrappers use symlinked node.exe directly\nfunction resolveCommand(command: string, args: string[]): { command: string; args: string[] } {\n if (!isWindows) return { command, args };\n\n // Case 1: Command is a .cmd file path\n if (stringEndsWith(command.toLowerCase(), '.cmd')) {\n const scriptPath = parseNpmCmdWrapper(command);\n if (scriptPath) {\n return { command: NODE, args: [scriptPath, ...args] };\n }\n }\n\n // Case 2: Try to resolve the command as an npm package bin from node_modules\n try {\n const binPath = resolveBin(command);\n return { command: NODE, args: [binPath, ...args] };\n } catch (_e) {\n // Not an npm package bin, use original command\n }\n\n return { command, args };\n}\n\nexport default function worker(versionExpression: string, command: string, args: string[], options: UseOptions, callback: UseCallback): undefined {\n // Load node-version-install lazily\n loadNodeVersionInstall((loadErr, installVersion) => {\n if (loadErr) return callback(loadErr);\n\n resolveVersions(versionExpression, options as VersionOptions, (err?: Error, versions?: string[]) => {\n if (err) {\n callback(err);\n return;\n }\n if (!versions.length) {\n callback(new Error(`No versions found from expression: ${versionExpression}`));\n return;\n }\n\n const installOptions = { storagePath, ...options } as InstallOptions;\n const streamingOptions = options as Options;\n const results: UseResult[] = [];\n const queue = new Queue(1);\n\n // Create session once for all processes (only if multiple versions)\n const interactive = options.interactive !== false;\n const session = versions.length >= 2 && createSession && !streamingOptions.streaming ? createSession({ header: `${command} ${args.join(' ')}`, showStatusBar: true, interactive }) : null;\n\n versions.forEach((version: string) => {\n queue.defer((cb) => {\n installVersion(version, installOptions, (_err, installs) => {\n const install = installs && installs.length === 1 ? installs[0] : null;\n if (!install) {\n results.push({ install, command, version, error: new Error(`Unexpected version results for version ${version}. Install ${JSON.stringify(installs)}`), result: null });\n return cb();\n }\n const spawnOptions = createSpawnOptions(install.installPath, options as SpawnOptions);\n const prefix = install.version;\n\n function next(err?, res?): undefined {\n if (err && err.message.indexOf('ExperimentalWarning') >= 0) {\n res = err;\n err = null;\n }\n results.push({ install, command, version, error: err, result: res });\n cb();\n }\n\n // On Windows, resolve npm bin commands to bypass .cmd wrappers\n const resolved = resolveCommand(command, args);\n\n if (versions.length < 2) {\n // Show command when running single version (no terminal session, unless silent)\n if (!options.silent) console.log(`$ ${formatArguments([resolved.command].concat(resolved.args)).join(' ')}`);\n return spawn(resolved.command, resolved.args, spawnOptions, next);\n }\n if (session) session.spawn(resolved.command, resolved.args, spawnOptions, { group: prefix, expanded: streamingOptions.expanded }, next);\n else spawnStreaming(resolved.command, resolved.args, spawnOptions, { prefix }, next);\n });\n });\n });\n queue.await((err) => {\n if (session) {\n session.waitAndClose(() => {\n err ? callback(err) : callback(null, results);\n });\n } else {\n err ? callback(err) : callback(null, results);\n }\n });\n });\n });\n}\n"],"names":["worker","isWindows","process","platform","test","env","OSTYPE","NODE","parseNpmCmdWrapper","cmdPath","content","fs","readFileSync","match","relativePath","cmdDir","path","dirname","join","_e","resolveCommand","command","args","stringEndsWith","toLowerCase","scriptPath","binPath","resolveBin","versionExpression","options","callback","loadNodeVersionInstall","loadErr","installVersion","resolveVersions","err","versions","length","Error","installOptions","storagePath","streamingOptions","results","queue","Queue","interactive","session","createSession","streaming","header","showStatusBar","forEach","version","defer","cb","_err","installs","next","res","message","indexOf","push","install","error","result","JSON","stringify","spawnOptions","createSpawnOptions","installPath","prefix","resolved","silent","console","log","formatArguments","concat","spawn","group","expanded","spawnStreaming","await","waitAndClose"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/worker.ts"],"sourcesContent":["import spawn, { type SpawnOptions } from 'cross-spawn-cb';\nimport fs from 'fs';\nimport resolveVersions, { type VersionOptions } from 'node-resolve-versions';\nimport type { InstallOptions } from 'node-version-install';\nimport { spawnOptions as createSpawnOptions } from 'node-version-utils';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport resolveBin from 'resolve-bin-sync';\nimport spawnStreaming from 'spawn-streaming';\nimport { createSession, formatArguments } from 'spawn-term';\nimport { stringEndsWith } from './compat.ts';\nimport { storagePath } from './constants.ts';\nimport loadNodeVersionInstall from './lib/loadNodeVersionInstall.ts';\n\nimport type { Options, UseCallback, UseOptions, UseResult } from './types.ts';\n\nconst isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\nconst NODE = isWindows ? 'node.exe' : 'node';\n\n// Parse npm-generated .cmd wrapper to extract the JS script path\nfunction parseNpmCmdWrapper(cmdPath: string): string | null {\n try {\n const content = fs.readFileSync(cmdPath, 'utf8');\n // Match: \"%_prog%\" \"%dp0%\\node_modules\\...\\cli.js\" %*\n // or: \"%_prog%\" \"%dp0%\\path\\to\\script.js\" %*\n const match = content.match(/\"%_prog%\"\\s+\"?%dp0%\\\\([^\"]+)\"?\\s+%\\*/);\n if (match) {\n const relativePath = match[1];\n const cmdDir = path.dirname(cmdPath);\n return path.join(cmdDir, relativePath);\n }\n } catch (_e) {\n // ignore\n }\n return null;\n}\n\n// On Windows, resolve npm bin commands to their JS entry points to bypass .cmd wrappers\n// This fixes issues with nvm-windows where .cmd wrappers use symlinked node.exe directly\nfunction resolveCommand(command: string, args: string[]): { command: string; args: string[] } {\n if (!isWindows) return { command, args };\n\n // Case 1: Command is a .cmd file path\n if (stringEndsWith(command.toLowerCase(), '.cmd')) {\n const scriptPath = parseNpmCmdWrapper(command);\n if (scriptPath) {\n return { command: NODE, args: [scriptPath, ...args] };\n }\n }\n\n // Case 2: Try to resolve the command as an npm package bin from node_modules\n try {\n const binPath = resolveBin(command);\n return { command: NODE, args: [binPath, ...args] };\n } catch (_e) {\n // Not an npm package bin, use original command\n }\n\n return { command, args };\n}\n\nexport default function worker(versionExpression: string, command: string, args: string[], options: UseOptions, callback: UseCallback): undefined {\n // Load node-version-install lazily\n loadNodeVersionInstall((loadErr, installVersion) => {\n if (loadErr) return callback(loadErr);\n\n resolveVersions(versionExpression, options as VersionOptions, (err?: Error, versions?: string[]) => {\n if (err) {\n callback(err);\n return;\n }\n if (!versions.length) {\n callback(new Error(`No versions found from expression: ${versionExpression}`));\n return;\n }\n\n const installOptions = { storagePath, ...options } as InstallOptions;\n const streamingOptions = options as Options;\n const results: UseResult[] = [];\n const queue = new Queue(1);\n\n // Create session once for all processes (only if multiple versions)\n const interactive = options.interactive !== false;\n const session = versions.length >= 2 && createSession && !streamingOptions.streaming ? createSession({ header: `${command} ${args.join(' ')}`, showStatusBar: true, interactive }) : null;\n\n versions.forEach((version: string) => {\n queue.defer((cb) => {\n installVersion(version, installOptions, (err, installs) => {\n const install = installs && installs.length === 1 ? installs[0] : null;\n if (err || !install) {\n const error = err || new Error(`Unexpected version results for version ${version}. Install ${JSON.stringify(installs)}`);\n results.push({ install, command, version, error, result: null });\n return cb();\n }\n const spawnOptions = createSpawnOptions(install.installPath, options as SpawnOptions);\n const prefix = install.version;\n\n function next(err?, res?): undefined {\n if (err && err.message.indexOf('ExperimentalWarning') >= 0) {\n res = err;\n err = null;\n }\n results.push({ install, command, version, error: err, result: res });\n cb();\n }\n\n // On Windows, resolve npm bin commands to bypass .cmd wrappers\n const resolved = resolveCommand(command, args);\n\n if (versions.length < 2) {\n // Show command when running single version (no terminal session, unless silent)\n if (!options.silent) console.log(`$ ${formatArguments([resolved.command].concat(resolved.args)).join(' ')}`);\n return spawn(resolved.command, resolved.args, spawnOptions, next);\n }\n if (session) session.spawn(resolved.command, resolved.args, spawnOptions, { group: prefix, expanded: streamingOptions.expanded }, next);\n else spawnStreaming(resolved.command, resolved.args, spawnOptions, { prefix }, next);\n });\n });\n });\n queue.await((err) => {\n if (session) {\n session.waitAndClose(() => {\n err ? callback(err) : callback(null, results);\n });\n } else {\n err ? callback(err) : callback(null, results);\n }\n });\n });\n });\n}\n"],"names":["worker","isWindows","process","platform","test","env","OSTYPE","NODE","parseNpmCmdWrapper","cmdPath","content","fs","readFileSync","match","relativePath","cmdDir","path","dirname","join","_e","resolveCommand","command","args","stringEndsWith","toLowerCase","scriptPath","binPath","resolveBin","versionExpression","options","callback","loadNodeVersionInstall","loadErr","installVersion","resolveVersions","err","versions","length","Error","installOptions","storagePath","streamingOptions","results","queue","Queue","interactive","session","createSession","streaming","header","showStatusBar","forEach","version","defer","cb","installs","next","res","message","indexOf","push","install","error","result","JSON","stringify","spawnOptions","createSpawnOptions","installPath","prefix","resolved","silent","console","log","formatArguments","concat","spawn","group","expanded","spawnStreaming","await","waitAndClose"],"mappings":"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"}
|
package/dist/esm/worker.js
CHANGED
|
@@ -96,14 +96,15 @@ export default function worker(versionExpression, command, args, options, callba
|
|
|
96
96
|
}) : null;
|
|
97
97
|
versions.forEach((version)=>{
|
|
98
98
|
queue.defer((cb)=>{
|
|
99
|
-
installVersion(version, installOptions, (
|
|
99
|
+
installVersion(version, installOptions, (err, installs)=>{
|
|
100
100
|
const install = installs && installs.length === 1 ? installs[0] : null;
|
|
101
|
-
if (!install) {
|
|
101
|
+
if (err || !install) {
|
|
102
|
+
const error = err || new Error(`Unexpected version results for version ${version}. Install ${JSON.stringify(installs)}`);
|
|
102
103
|
results.push({
|
|
103
104
|
install,
|
|
104
105
|
command,
|
|
105
106
|
version,
|
|
106
|
-
error
|
|
107
|
+
error,
|
|
107
108
|
result: null
|
|
108
109
|
});
|
|
109
110
|
return cb();
|
package/dist/esm/worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/worker.ts"],"sourcesContent":["import spawn, { type SpawnOptions } from 'cross-spawn-cb';\nimport fs from 'fs';\nimport resolveVersions, { type VersionOptions } from 'node-resolve-versions';\nimport type { InstallOptions } from 'node-version-install';\nimport { spawnOptions as createSpawnOptions } from 'node-version-utils';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport resolveBin from 'resolve-bin-sync';\nimport spawnStreaming from 'spawn-streaming';\nimport { createSession, formatArguments } from 'spawn-term';\nimport { stringEndsWith } from './compat.ts';\nimport { storagePath } from './constants.ts';\nimport loadNodeVersionInstall from './lib/loadNodeVersionInstall.ts';\n\nimport type { Options, UseCallback, UseOptions, UseResult } from './types.ts';\n\nconst isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\nconst NODE = isWindows ? 'node.exe' : 'node';\n\n// Parse npm-generated .cmd wrapper to extract the JS script path\nfunction parseNpmCmdWrapper(cmdPath: string): string | null {\n try {\n const content = fs.readFileSync(cmdPath, 'utf8');\n // Match: \"%_prog%\" \"%dp0%\\node_modules\\...\\cli.js\" %*\n // or: \"%_prog%\" \"%dp0%\\path\\to\\script.js\" %*\n const match = content.match(/\"%_prog%\"\\s+\"?%dp0%\\\\([^\"]+)\"?\\s+%\\*/);\n if (match) {\n const relativePath = match[1];\n const cmdDir = path.dirname(cmdPath);\n return path.join(cmdDir, relativePath);\n }\n } catch (_e) {\n // ignore\n }\n return null;\n}\n\n// On Windows, resolve npm bin commands to their JS entry points to bypass .cmd wrappers\n// This fixes issues with nvm-windows where .cmd wrappers use symlinked node.exe directly\nfunction resolveCommand(command: string, args: string[]): { command: string; args: string[] } {\n if (!isWindows) return { command, args };\n\n // Case 1: Command is a .cmd file path\n if (stringEndsWith(command.toLowerCase(), '.cmd')) {\n const scriptPath = parseNpmCmdWrapper(command);\n if (scriptPath) {\n return { command: NODE, args: [scriptPath, ...args] };\n }\n }\n\n // Case 2: Try to resolve the command as an npm package bin from node_modules\n try {\n const binPath = resolveBin(command);\n return { command: NODE, args: [binPath, ...args] };\n } catch (_e) {\n // Not an npm package bin, use original command\n }\n\n return { command, args };\n}\n\nexport default function worker(versionExpression: string, command: string, args: string[], options: UseOptions, callback: UseCallback): undefined {\n // Load node-version-install lazily\n loadNodeVersionInstall((loadErr, installVersion) => {\n if (loadErr) return callback(loadErr);\n\n resolveVersions(versionExpression, options as VersionOptions, (err?: Error, versions?: string[]) => {\n if (err) {\n callback(err);\n return;\n }\n if (!versions.length) {\n callback(new Error(`No versions found from expression: ${versionExpression}`));\n return;\n }\n\n const installOptions = { storagePath, ...options } as InstallOptions;\n const streamingOptions = options as Options;\n const results: UseResult[] = [];\n const queue = new Queue(1);\n\n // Create session once for all processes (only if multiple versions)\n const interactive = options.interactive !== false;\n const session = versions.length >= 2 && createSession && !streamingOptions.streaming ? createSession({ header: `${command} ${args.join(' ')}`, showStatusBar: true, interactive }) : null;\n\n versions.forEach((version: string) => {\n queue.defer((cb) => {\n installVersion(version, installOptions, (
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/worker.ts"],"sourcesContent":["import spawn, { type SpawnOptions } from 'cross-spawn-cb';\nimport fs from 'fs';\nimport resolveVersions, { type VersionOptions } from 'node-resolve-versions';\nimport type { InstallOptions } from 'node-version-install';\nimport { spawnOptions as createSpawnOptions } from 'node-version-utils';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport resolveBin from 'resolve-bin-sync';\nimport spawnStreaming from 'spawn-streaming';\nimport { createSession, formatArguments } from 'spawn-term';\nimport { stringEndsWith } from './compat.ts';\nimport { storagePath } from './constants.ts';\nimport loadNodeVersionInstall from './lib/loadNodeVersionInstall.ts';\n\nimport type { Options, UseCallback, UseOptions, UseResult } from './types.ts';\n\nconst isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\nconst NODE = isWindows ? 'node.exe' : 'node';\n\n// Parse npm-generated .cmd wrapper to extract the JS script path\nfunction parseNpmCmdWrapper(cmdPath: string): string | null {\n try {\n const content = fs.readFileSync(cmdPath, 'utf8');\n // Match: \"%_prog%\" \"%dp0%\\node_modules\\...\\cli.js\" %*\n // or: \"%_prog%\" \"%dp0%\\path\\to\\script.js\" %*\n const match = content.match(/\"%_prog%\"\\s+\"?%dp0%\\\\([^\"]+)\"?\\s+%\\*/);\n if (match) {\n const relativePath = match[1];\n const cmdDir = path.dirname(cmdPath);\n return path.join(cmdDir, relativePath);\n }\n } catch (_e) {\n // ignore\n }\n return null;\n}\n\n// On Windows, resolve npm bin commands to their JS entry points to bypass .cmd wrappers\n// This fixes issues with nvm-windows where .cmd wrappers use symlinked node.exe directly\nfunction resolveCommand(command: string, args: string[]): { command: string; args: string[] } {\n if (!isWindows) return { command, args };\n\n // Case 1: Command is a .cmd file path\n if (stringEndsWith(command.toLowerCase(), '.cmd')) {\n const scriptPath = parseNpmCmdWrapper(command);\n if (scriptPath) {\n return { command: NODE, args: [scriptPath, ...args] };\n }\n }\n\n // Case 2: Try to resolve the command as an npm package bin from node_modules\n try {\n const binPath = resolveBin(command);\n return { command: NODE, args: [binPath, ...args] };\n } catch (_e) {\n // Not an npm package bin, use original command\n }\n\n return { command, args };\n}\n\nexport default function worker(versionExpression: string, command: string, args: string[], options: UseOptions, callback: UseCallback): undefined {\n // Load node-version-install lazily\n loadNodeVersionInstall((loadErr, installVersion) => {\n if (loadErr) return callback(loadErr);\n\n resolveVersions(versionExpression, options as VersionOptions, (err?: Error, versions?: string[]) => {\n if (err) {\n callback(err);\n return;\n }\n if (!versions.length) {\n callback(new Error(`No versions found from expression: ${versionExpression}`));\n return;\n }\n\n const installOptions = { storagePath, ...options } as InstallOptions;\n const streamingOptions = options as Options;\n const results: UseResult[] = [];\n const queue = new Queue(1);\n\n // Create session once for all processes (only if multiple versions)\n const interactive = options.interactive !== false;\n const session = versions.length >= 2 && createSession && !streamingOptions.streaming ? createSession({ header: `${command} ${args.join(' ')}`, showStatusBar: true, interactive }) : null;\n\n versions.forEach((version: string) => {\n queue.defer((cb) => {\n installVersion(version, installOptions, (err, installs) => {\n const install = installs && installs.length === 1 ? installs[0] : null;\n if (err || !install) {\n const error = err || new Error(`Unexpected version results for version ${version}. Install ${JSON.stringify(installs)}`);\n results.push({ install, command, version, error, result: null });\n return cb();\n }\n const spawnOptions = createSpawnOptions(install.installPath, options as SpawnOptions);\n const prefix = install.version;\n\n function next(err?, res?): undefined {\n if (err && err.message.indexOf('ExperimentalWarning') >= 0) {\n res = err;\n err = null;\n }\n results.push({ install, command, version, error: err, result: res });\n cb();\n }\n\n // On Windows, resolve npm bin commands to bypass .cmd wrappers\n const resolved = resolveCommand(command, args);\n\n if (versions.length < 2) {\n // Show command when running single version (no terminal session, unless silent)\n if (!options.silent) console.log(`$ ${formatArguments([resolved.command].concat(resolved.args)).join(' ')}`);\n return spawn(resolved.command, resolved.args, spawnOptions, next);\n }\n if (session) session.spawn(resolved.command, resolved.args, spawnOptions, { group: prefix, expanded: streamingOptions.expanded }, next);\n else spawnStreaming(resolved.command, resolved.args, spawnOptions, { prefix }, next);\n });\n });\n });\n queue.await((err) => {\n if (session) {\n session.waitAndClose(() => {\n err ? callback(err) : callback(null, results);\n });\n } else {\n err ? callback(err) : callback(null, results);\n }\n });\n });\n });\n}\n"],"names":["spawn","fs","resolveVersions","spawnOptions","createSpawnOptions","path","Queue","resolveBin","spawnStreaming","createSession","formatArguments","stringEndsWith","storagePath","loadNodeVersionInstall","isWindows","process","platform","test","env","OSTYPE","NODE","parseNpmCmdWrapper","cmdPath","content","readFileSync","match","relativePath","cmdDir","dirname","join","_e","resolveCommand","command","args","toLowerCase","scriptPath","binPath","worker","versionExpression","options","callback","loadErr","installVersion","err","versions","length","Error","installOptions","streamingOptions","results","queue","interactive","session","streaming","header","showStatusBar","forEach","version","defer","cb","installs","install","error","JSON","stringify","push","result","installPath","prefix","next","res","message","indexOf","resolved","silent","console","log","concat","group","expanded","await","waitAndClose"],"mappings":"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"}
|