node-version-use 1.9.7 → 1.9.8

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.
@@ -138,6 +138,9 @@ function worker(versionExpression, command, args, options, callback) {
138
138
  var loaderQueue = new _queuecb.default();
139
139
  var installVersion;
140
140
  var createSession;
141
+ var formatArguments = function(x) {
142
+ return x;
143
+ };
141
144
  loaderQueue.defer(function(cb) {
142
145
  return (0, _loadNodeVersionInstallts.default)(function(err, fn) {
143
146
  installVersion = fn;
@@ -147,6 +150,9 @@ function worker(versionExpression, command, args, options, callback) {
147
150
  loaderQueue.defer(function(cb) {
148
151
  return (0, _loadSpawnTermts.default)(function(err, mod) {
149
152
  createSession = mod === null || mod === void 0 ? void 0 : mod.createSession;
153
+ formatArguments = (mod === null || mod === void 0 ? void 0 : mod.formatArguments) || function(x) {
154
+ return x;
155
+ };
150
156
  cb(err);
151
157
  });
152
158
  });
@@ -206,7 +212,13 @@ function worker(versionExpression, command, args, options, callback) {
206
212
  var prefix = install.version;
207
213
  // On Windows, resolve npm bin commands to bypass .cmd wrappers
208
214
  var resolved = resolveCommand(command, args);
209
- if (versions.length < 2) return (0, _crossspawncb.default)(resolved.command, resolved.args, spawnOptions, next);
215
+ if (versions.length < 2) {
216
+ // Show command when running single version (no terminal session)
217
+ console.log("$ ".concat(formatArguments([
218
+ resolved.command
219
+ ].concat(resolved.args)).join(' ')));
220
+ return (0, _crossspawncb.default)(resolved.command, resolved.args, spawnOptions, next);
221
+ }
210
222
  if (session) session.spawn(resolved.command, resolved.args, spawnOptions, {
211
223
  group: prefix,
212
224
  expanded: streamingOptions.expanded
@@ -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, InstallResult } 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 { stringEndsWith } from './compat.ts';\nimport { storagePath } from './constants.ts';\nimport loadNodeVersionInstall from './lib/loadNodeVersionInstall.ts';\nimport loadSpawnTerm from './lib/loadSpawnTerm.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 lazy dependencies in parallel\n const loaderQueue = new Queue();\n let installVersion: (version: string, opts: InstallOptions, cb: (err?: Error, results?: InstallResult[]) => void) => void;\n let createSession:\n | ((options?: { header?: string; showStatusBar?: boolean; interactive?: boolean }) => {\n spawn: (command: string, args: string[], options: unknown, termOptions: unknown, callback: (err?: Error, res?: unknown) => void) => void;\n close: () => void;\n waitAndClose: (callback?: () => void) => void;\n })\n | undefined;\n\n loaderQueue.defer((cb) =>\n loadNodeVersionInstall((err, fn) => {\n installVersion = fn;\n cb(err);\n })\n );\n loaderQueue.defer((cb) =>\n loadSpawnTerm((err, mod) => {\n createSession = mod?.createSession;\n cb(err);\n })\n );\n\n loaderQueue.await((loadErr) => {\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 callback();\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) return spawn(resolved.command, resolved.args, spawnOptions, next);\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","loaderQueue","Queue","installVersion","createSession","defer","cb","loadNodeVersionInstall","err","fn","loadSpawnTerm","mod","await","loadErr","resolveVersions","versions","length","Error","installOptions","storagePath","streamingOptions","results","queue","interactive","session","streaming","header","showStatusBar","forEach","version","_err","installs","next","res","message","indexOf","push","install","error","result","JSON","stringify","spawnOptions","createSpawnOptions","installPath","prefix","resolved","spawn","group","expanded","spawnStreaming","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, InstallResult } 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 { stringEndsWith } from './compat.ts';\nimport { storagePath } from './constants.ts';\nimport loadNodeVersionInstall from './lib/loadNodeVersionInstall.ts';\nimport loadSpawnTerm from './lib/loadSpawnTerm.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 lazy dependencies in parallel\n const loaderQueue = new Queue();\n let installVersion: (version: string, opts: InstallOptions, cb: (err?: Error, results?: InstallResult[]) => void) => void;\n let createSession:\n | ((options?: { header?: string; showStatusBar?: boolean; interactive?: boolean }) => {\n spawn: (command: string, args: string[], options: unknown, termOptions: unknown, callback: (err?: Error, res?: unknown) => void) => void;\n close: () => void;\n waitAndClose: (callback?: () => void) => void;\n })\n | undefined;\n let formatArguments: (args: string[]) => string[] = (x) => x;\n\n loaderQueue.defer((cb) =>\n loadNodeVersionInstall((err, fn) => {\n installVersion = fn;\n cb(err);\n })\n );\n loaderQueue.defer((cb) =>\n loadSpawnTerm((err, mod) => {\n createSession = mod?.createSession;\n formatArguments = mod?.formatArguments || ((x) => x);\n cb(err);\n })\n );\n\n loaderQueue.await((loadErr) => {\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 callback();\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)\n 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","loaderQueue","Queue","installVersion","createSession","formatArguments","x","defer","cb","loadNodeVersionInstall","err","fn","loadSpawnTerm","mod","await","loadErr","resolveVersions","versions","length","Error","installOptions","storagePath","streamingOptions","results","queue","interactive","session","streaming","header","showStatusBar","forEach","version","_err","installs","next","res","message","indexOf","push","install","error","result","JSON","stringify","spawnOptions","createSpawnOptions","installPath","prefix","resolved","console","log","concat","spawn","group","expanded","spawnStreaming","waitAndClose"],"mappings":"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"}
@@ -72,12 +72,14 @@ export default function worker(versionExpression, command, args, options, callba
72
72
  const loaderQueue = new Queue();
73
73
  let installVersion;
74
74
  let createSession;
75
+ let formatArguments = (x)=>x;
75
76
  loaderQueue.defer((cb)=>loadNodeVersionInstall((err, fn)=>{
76
77
  installVersion = fn;
77
78
  cb(err);
78
79
  }));
79
80
  loaderQueue.defer((cb)=>loadSpawnTerm((err, mod)=>{
80
81
  createSession = mod === null || mod === void 0 ? void 0 : mod.createSession;
82
+ formatArguments = (mod === null || mod === void 0 ? void 0 : mod.formatArguments) || ((x)=>x);
81
83
  cb(err);
82
84
  }));
83
85
  loaderQueue.await((loadErr)=>{
@@ -137,7 +139,13 @@ export default function worker(versionExpression, command, args, options, callba
137
139
  }
138
140
  // On Windows, resolve npm bin commands to bypass .cmd wrappers
139
141
  const resolved = resolveCommand(command, args);
140
- if (versions.length < 2) return spawn(resolved.command, resolved.args, spawnOptions, next);
142
+ if (versions.length < 2) {
143
+ // Show command when running single version (no terminal session)
144
+ console.log(`$ ${formatArguments([
145
+ resolved.command
146
+ ].concat(resolved.args)).join(' ')}`);
147
+ return spawn(resolved.command, resolved.args, spawnOptions, next);
148
+ }
141
149
  if (session) session.spawn(resolved.command, resolved.args, spawnOptions, {
142
150
  group: prefix,
143
151
  expanded: streamingOptions.expanded
@@ -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, InstallResult } 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 { stringEndsWith } from './compat.ts';\nimport { storagePath } from './constants.ts';\nimport loadNodeVersionInstall from './lib/loadNodeVersionInstall.ts';\nimport loadSpawnTerm from './lib/loadSpawnTerm.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 lazy dependencies in parallel\n const loaderQueue = new Queue();\n let installVersion: (version: string, opts: InstallOptions, cb: (err?: Error, results?: InstallResult[]) => void) => void;\n let createSession:\n | ((options?: { header?: string; showStatusBar?: boolean; interactive?: boolean }) => {\n spawn: (command: string, args: string[], options: unknown, termOptions: unknown, callback: (err?: Error, res?: unknown) => void) => void;\n close: () => void;\n waitAndClose: (callback?: () => void) => void;\n })\n | undefined;\n\n loaderQueue.defer((cb) =>\n loadNodeVersionInstall((err, fn) => {\n installVersion = fn;\n cb(err);\n })\n );\n loaderQueue.defer((cb) =>\n loadSpawnTerm((err, mod) => {\n createSession = mod?.createSession;\n cb(err);\n })\n );\n\n loaderQueue.await((loadErr) => {\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 callback();\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) return spawn(resolved.command, resolved.args, spawnOptions, next);\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","stringEndsWith","storagePath","loadNodeVersionInstall","loadSpawnTerm","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","loaderQueue","installVersion","createSession","defer","cb","err","fn","mod","await","loadErr","versions","length","Error","installOptions","streamingOptions","results","queue","interactive","session","streaming","header","showStatusBar","forEach","version","_err","installs","install","push","error","JSON","stringify","result","installPath","prefix","next","res","message","indexOf","resolved","group","expanded","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, InstallResult } 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 { stringEndsWith } from './compat.ts';\nimport { storagePath } from './constants.ts';\nimport loadNodeVersionInstall from './lib/loadNodeVersionInstall.ts';\nimport loadSpawnTerm from './lib/loadSpawnTerm.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 lazy dependencies in parallel\n const loaderQueue = new Queue();\n let installVersion: (version: string, opts: InstallOptions, cb: (err?: Error, results?: InstallResult[]) => void) => void;\n let createSession:\n | ((options?: { header?: string; showStatusBar?: boolean; interactive?: boolean }) => {\n spawn: (command: string, args: string[], options: unknown, termOptions: unknown, callback: (err?: Error, res?: unknown) => void) => void;\n close: () => void;\n waitAndClose: (callback?: () => void) => void;\n })\n | undefined;\n let formatArguments: (args: string[]) => string[] = (x) => x;\n\n loaderQueue.defer((cb) =>\n loadNodeVersionInstall((err, fn) => {\n installVersion = fn;\n cb(err);\n })\n );\n loaderQueue.defer((cb) =>\n loadSpawnTerm((err, mod) => {\n createSession = mod?.createSession;\n formatArguments = mod?.formatArguments || ((x) => x);\n cb(err);\n })\n );\n\n loaderQueue.await((loadErr) => {\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 callback();\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)\n 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","stringEndsWith","storagePath","loadNodeVersionInstall","loadSpawnTerm","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","loaderQueue","installVersion","createSession","formatArguments","x","defer","cb","err","fn","mod","await","loadErr","versions","length","Error","installOptions","streamingOptions","results","queue","interactive","session","streaming","header","showStatusBar","forEach","version","_err","installs","install","push","error","JSON","stringify","result","installPath","prefix","next","res","message","indexOf","resolved","console","log","concat","group","expanded","waitAndClose"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-version-use",
3
- "version": "1.9.7",
3
+ "version": "1.9.8",
4
4
  "description": "Cross-platform solution for using multiple versions of node. Useful for compatibility testing",
5
5
  "keywords": [
6
6
  "node",
@@ -43,30 +43,30 @@
43
43
  "version": "tsds version"
44
44
  },
45
45
  "dependencies": {
46
- "cross-spawn-cb": "*",
47
- "exit": "*",
48
- "getopts-compat": "*",
49
- "homedir-polyfill": "*",
50
- "install-module-linked": "*",
51
- "node-resolve-versions": "*",
52
- "node-version-utils": "*",
53
- "queue-cb": "*",
46
+ "cross-spawn-cb": "^2.4.10",
47
+ "exit": "^0.1.2",
48
+ "getopts-compat": "^2.2.6",
49
+ "homedir-polyfill": "^1.0.3",
50
+ "install-module-linked": "^1.3.10",
51
+ "node-resolve-versions": "^1.3.11",
52
+ "node-version-utils": "^1.3.15",
53
+ "queue-cb": "^1.6.1",
54
54
  "resolve-bin-sync": "^1.0.10",
55
- "spawn-streaming": "*"
55
+ "spawn-streaming": "^1.1.13"
56
56
  },
57
57
  "devDependencies": {
58
- "@types/mocha": "*",
59
- "@types/node": "*",
60
- "cr": "*",
61
- "fs-copy-compat": "*",
62
- "fs-remove-compat": "*",
63
- "is-version": "*",
64
- "mkdirp-classic": "*",
65
- "node-version-install": "*",
66
- "node-version-use": "*",
67
- "pinkie-promise": "*",
68
- "ts-dev-stack": "*",
69
- "tsds-config": "*"
58
+ "@types/mocha": "^10.0.10",
59
+ "@types/node": "^24.10.1",
60
+ "cr": "^0.1.0",
61
+ "fs-copy-compat": "^0.1.3",
62
+ "fs-remove-compat": "^0.2.1",
63
+ "is-version": "^1.0.7",
64
+ "mkdirp-classic": "^0.5.3",
65
+ "node-version-install": "^1.4.18",
66
+ "node-version-use": "^1.9.7",
67
+ "pinkie-promise": "^2.0.1",
68
+ "ts-dev-stack": "^1.21.2",
69
+ "tsds-config": "^0.2.0"
70
70
  },
71
71
  "engines": {
72
72
  "node": ">=0.8"