node-version-use 2.4.0 → 2.4.2

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.
Files changed (71) hide show
  1. package/README.md +61 -84
  2. package/assets/bin/node +0 -0
  3. package/assets/installBinaries.cjs +95 -18
  4. package/assets/postinstall.cjs +16 -1
  5. package/dist/cjs/assets/installBinaries.cjs +95 -18
  6. package/dist/cjs/assets/installBinaries.cjs.map +1 -1
  7. package/dist/cjs/assets/postinstall.cjs +16 -1
  8. package/dist/cjs/assets/postinstall.cjs.map +1 -1
  9. package/dist/cjs/cli.js.map +1 -1
  10. package/dist/cjs/commands/default.js +30 -4
  11. package/dist/cjs/commands/default.js.map +1 -1
  12. package/dist/cjs/commands/index.js.map +1 -1
  13. package/dist/cjs/commands/install.js.map +1 -1
  14. package/dist/cjs/commands/list.js.map +1 -1
  15. package/dist/cjs/commands/local.js.map +1 -1
  16. package/dist/cjs/commands/setup.d.cts +2 -3
  17. package/dist/cjs/commands/setup.d.ts +2 -3
  18. package/dist/cjs/commands/setup.js +9 -84
  19. package/dist/cjs/commands/setup.js.map +1 -1
  20. package/dist/cjs/commands/teardown.js.map +1 -1
  21. package/dist/cjs/commands/uninstall.js.map +1 -1
  22. package/dist/cjs/commands/which.js +15 -0
  23. package/dist/cjs/commands/which.js.map +1 -1
  24. package/dist/cjs/compat.d.cts +1 -0
  25. package/dist/cjs/compat.d.ts +1 -0
  26. package/dist/cjs/compat.js +17 -3
  27. package/dist/cjs/compat.js.map +1 -1
  28. package/dist/cjs/constants.js.map +1 -1
  29. package/dist/cjs/index.js.map +1 -1
  30. package/dist/cjs/lib/findInstalledVersions.js.map +1 -1
  31. package/dist/cjs/lib/loadNodeVersionInstall.js +1 -1
  32. package/dist/cjs/lib/loadNodeVersionInstall.js.map +1 -1
  33. package/dist/cjs/lib/resolveSystemBinary.d.cts +10 -0
  34. package/dist/cjs/lib/resolveSystemBinary.d.ts +10 -0
  35. package/dist/cjs/lib/resolveSystemBinary.js +96 -0
  36. package/dist/cjs/lib/resolveSystemBinary.js.map +1 -0
  37. package/dist/cjs/worker.js +53 -56
  38. package/dist/cjs/worker.js.map +1 -1
  39. package/dist/esm/assets/installBinaries.cjs +78 -18
  40. package/dist/esm/assets/installBinaries.cjs.map +1 -1
  41. package/dist/esm/assets/postinstall.cjs +16 -1
  42. package/dist/esm/assets/postinstall.cjs.map +1 -1
  43. package/dist/esm/cli.js.map +1 -1
  44. package/dist/esm/commands/default.js +30 -4
  45. package/dist/esm/commands/default.js.map +1 -1
  46. package/dist/esm/commands/index.js.map +1 -1
  47. package/dist/esm/commands/install.js.map +1 -1
  48. package/dist/esm/commands/list.js.map +1 -1
  49. package/dist/esm/commands/local.js.map +1 -1
  50. package/dist/esm/commands/setup.d.ts +2 -3
  51. package/dist/esm/commands/setup.js +9 -84
  52. package/dist/esm/commands/setup.js.map +1 -1
  53. package/dist/esm/commands/teardown.js.map +1 -1
  54. package/dist/esm/commands/uninstall.js.map +1 -1
  55. package/dist/esm/commands/which.js +15 -0
  56. package/dist/esm/commands/which.js.map +1 -1
  57. package/dist/esm/compat.d.ts +1 -0
  58. package/dist/esm/compat.js +16 -5
  59. package/dist/esm/compat.js.map +1 -1
  60. package/dist/esm/constants.js.map +1 -1
  61. package/dist/esm/index.js.map +1 -1
  62. package/dist/esm/lib/findInstalledVersions.js.map +1 -1
  63. package/dist/esm/lib/loadNodeVersionInstall.js +1 -1
  64. package/dist/esm/lib/loadNodeVersionInstall.js.map +1 -1
  65. package/dist/esm/lib/resolveSystemBinary.d.ts +10 -0
  66. package/dist/esm/lib/resolveSystemBinary.js +78 -0
  67. package/dist/esm/lib/resolveSystemBinary.js.map +1 -0
  68. package/dist/esm/types.js.map +1 -1
  69. package/dist/esm/worker.js +58 -11
  70. package/dist/esm/worker.js.map +1 -1
  71. package/package.json +3 -3
@@ -7,9 +7,10 @@ import Queue from 'queue-cb';
7
7
  import resolveBin from 'resolve-bin-sync';
8
8
  import spawnStreaming from 'spawn-streaming';
9
9
  import { createSession, formatArguments } from 'spawn-term';
10
- import { stringEndsWith } from './compat.js';
10
+ import { objectAssign, stringEndsWith } from './compat.js';
11
11
  import { storagePath } from './constants.js';
12
12
  import loadNodeVersionInstall from './lib/loadNodeVersionInstall.js';
13
+ import { getPathWithoutNvuBin, resolveSystemBinary } from './lib/resolveSystemBinary.js';
13
14
  const isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);
14
15
  const NODE = isWindows ? 'node.exe' : 'node';
15
16
  // Parse npm-generated .cmd wrapper to extract the JS script path
@@ -43,9 +44,8 @@ function resolveCommand(command, args) {
43
44
  return {
44
45
  command: NODE,
45
46
  args: [
46
- scriptPath,
47
- ...args
48
- ]
47
+ scriptPath
48
+ ].concat(args)
49
49
  };
50
50
  }
51
51
  }
@@ -55,9 +55,8 @@ function resolveCommand(command, args) {
55
55
  return {
56
56
  command: NODE,
57
57
  args: [
58
- binPath,
59
- ...args
60
- ]
58
+ binPath
59
+ ].concat(args)
61
60
  };
62
61
  } catch (_e) {
63
62
  // Not an npm package bin, use original command
@@ -68,6 +67,11 @@ function resolveCommand(command, args) {
68
67
  };
69
68
  }
70
69
  export default function worker(versionExpression, command, args, options, callback) {
70
+ // Handle "system" as a special version that uses system binaries directly
71
+ if (versionExpression === 'system') {
72
+ runWithSystemBinaries(command, args, options, callback);
73
+ return;
74
+ }
71
75
  // Load node-version-install lazily
72
76
  loadNodeVersionInstall((loadErr, installVersion)=>{
73
77
  if (loadErr) return callback(loadErr);
@@ -77,10 +81,9 @@ export default function worker(versionExpression, command, args, options, callba
77
81
  callback(new Error(`No versions found from expression: ${versionExpression}`));
78
82
  return;
79
83
  }
80
- const installOptions = {
81
- storagePath,
82
- ...options
83
- };
84
+ const installOptions = objectAssign({
85
+ storagePath: storagePath
86
+ }, options);
84
87
  const streamingOptions = options;
85
88
  const results = [];
86
89
  const queue = new Queue(1);
@@ -153,3 +156,47 @@ export default function worker(versionExpression, command, args, options, callba
153
156
  });
154
157
  });
155
158
  }
159
+ /**
160
+ * Run command using system binaries (bypassing nvu version management)
161
+ * This handles the "system" version specifier
162
+ */ function runWithSystemBinaries(command, args, options, callback) {
163
+ // Find the system binary for the command
164
+ const systemBinary = resolveSystemBinary(command);
165
+ if (!systemBinary) {
166
+ callback(new Error(`System ${command} not found in PATH`));
167
+ return;
168
+ }
169
+ // Create spawn options with PATH excluding ~/.nvu/bin
170
+ // This ensures any child processes also use system binaries
171
+ const cleanPath = getPathWithoutNvuBin();
172
+ const spawnOptions = objectAssign({}, options);
173
+ spawnOptions.env = objectAssign({}, process.env);
174
+ spawnOptions.env.PATH = cleanPath;
175
+ spawnOptions.stdio = options.stdio || 'inherit';
176
+ // On Windows, resolve npm bin commands to bypass .cmd wrappers
177
+ const resolved = resolveCommand(command, args);
178
+ // For system, use the resolved system binary path
179
+ const finalCommand = resolved.command === command ? systemBinary : resolved.command;
180
+ const finalArgs = resolved.command === command ? args : resolved.args;
181
+ if (!options.silent) {
182
+ console.log(`$ ${formatArguments([
183
+ finalCommand
184
+ ].concat(finalArgs)).join(' ')}`);
185
+ }
186
+ spawn(finalCommand, finalArgs, spawnOptions, (err, res)=>{
187
+ if (err && err.message && err.message.indexOf('ExperimentalWarning') >= 0) {
188
+ res = err;
189
+ err = null;
190
+ }
191
+ const result = {
192
+ install: null,
193
+ command,
194
+ version: 'system',
195
+ error: err,
196
+ result: res
197
+ };
198
+ callback(err, [
199
+ result
200
+ ]);
201
+ });
202
+ }
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/_later/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): void {\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) return callback(err);\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?): void {\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":"AAAA,OAAOA,WAAkC,iBAAiB;AAC1D,OAAOC,QAAQ,KAAK;AACpB,OAAOC,qBAA8C,wBAAwB;AAE7E,SAASC,gBAAgBC,kBAAkB,QAAQ,qBAAqB;AACxE,OAAOC,UAAU,OAAO;AACxB,OAAOC,WAAW,WAAW;AAC7B,OAAOC,gBAAgB,mBAAmB;AAC1C,OAAOC,oBAAoB,kBAAkB;AAC7C,SAASC,aAAa,EAAEC,eAAe,QAAQ,aAAa;AAC5D,SAASC,cAAc,QAAQ,cAAc;AAC7C,SAASC,WAAW,QAAQ,iBAAiB;AAC7C,OAAOC,4BAA4B,kCAAkC;AAIrE,MAAMC,YAAYC,QAAQC,QAAQ,KAAK,WAAW,kBAAkBC,IAAI,CAACF,QAAQG,GAAG,CAACC,MAAM;AAC3F,MAAMC,OAAON,YAAY,aAAa;AAEtC,iEAAiE;AACjE,SAASO,mBAAmBC,OAAe;IACzC,IAAI;QACF,MAAMC,UAAUtB,GAAGuB,YAAY,CAACF,SAAS;QACzC,uDAAuD;QACvD,8CAA8C;QAC9C,MAAMG,QAAQF,QAAQE,KAAK,CAAC;QAC5B,IAAIA,OAAO;YACT,MAAMC,eAAeD,KAAK,CAAC,EAAE;YAC7B,MAAME,SAAStB,KAAKuB,OAAO,CAACN;YAC5B,OAAOjB,KAAKwB,IAAI,CAACF,QAAQD;QAC3B;IACF,EAAE,OAAOI,IAAI;IACX,SAAS;IACX;IACA,OAAO;AACT;AAEA,wFAAwF;AACxF,yFAAyF;AACzF,SAASC,eAAeC,OAAe,EAAEC,IAAc;IACrD,IAAI,CAACnB,WAAW,OAAO;QAAEkB;QAASC;IAAK;IAEvC,sCAAsC;IACtC,IAAItB,eAAeqB,QAAQE,WAAW,IAAI,SAAS;QACjD,MAAMC,aAAad,mBAAmBW;QACtC,IAAIG,YAAY;YACd,OAAO;gBAAEH,SAASZ;gBAAMa,MAAM;oBAACE;uBAAeF;iBAAK;YAAC;QACtD;IACF;IAEA,6EAA6E;IAC7E,IAAI;QACF,MAAMG,UAAU7B,WAAWyB;QAC3B,OAAO;YAAEA,SAASZ;YAAMa,MAAM;gBAACG;mBAAYH;aAAK;QAAC;IACnD,EAAE,OAAOH,IAAI;IACX,+CAA+C;IACjD;IAEA,OAAO;QAAEE;QAASC;IAAK;AACzB;AAEA,eAAe,SAASI,OAAOC,iBAAyB,EAAEN,OAAe,EAAEC,IAAc,EAAEM,OAAmB,EAAEC,QAAqB;IACnI,mCAAmC;IACnC3B,uBAAuB,CAAC4B,SAASC;QAC/B,IAAID,SAAS,OAAOD,SAASC;QAE7BvC,gBAAgBoC,mBAAmBC,SAA2B,CAACI,KAAaC;YAC1E,IAAID,KAAK,OAAOH,SAASG;YACzB,IAAI,CAACC,SAASC,MAAM,EAAE;gBACpBL,SAAS,IAAIM,MAAM,CAAC,mCAAmC,EAAER,mBAAmB;gBAC5E;YACF;YAEA,MAAMS,iBAAiB;gBAAEnC;gBAAa,GAAG2B,OAAO;YAAC;YACjD,MAAMS,mBAAmBT;YACzB,MAAMU,UAAuB,EAAE;YAC/B,MAAMC,QAAQ,IAAI5C,MAAM;YAExB,oEAAoE;YACpE,MAAM6C,cAAcZ,QAAQY,WAAW,KAAK;YAC5C,MAAMC,UAAUR,SAASC,MAAM,IAAI,KAAKpC,iBAAiB,CAACuC,iBAAiBK,SAAS,GAAG5C,cAAc;gBAAE6C,QAAQ,GAAGtB,QAAQ,CAAC,EAAEC,KAAKJ,IAAI,CAAC,MAAM;gBAAE0B,eAAe;gBAAMJ;YAAY,KAAK;YAErLP,SAASY,OAAO,CAAC,CAACC;gBAChBP,MAAMQ,KAAK,CAAC,CAACC;oBACXjB,eAAee,SAASV,gBAAgB,CAACJ,KAAKiB;wBAC5C,MAAMC,UAAUD,YAAYA,SAASf,MAAM,KAAK,IAAIe,QAAQ,CAAC,EAAE,GAAG;wBAClE,IAAIjB,OAAO,CAACkB,SAAS;4BACnB,MAAMC,QAAQnB,OAAO,IAAIG,MAAM,CAAC,uCAAuC,EAAEW,QAAQ,UAAU,EAAEM,KAAKC,SAAS,CAACJ,WAAW;4BACvHX,QAAQgB,IAAI,CAAC;gCAAEJ;gCAAS7B;gCAASyB;gCAASK;gCAAOI,QAAQ;4BAAK;4BAC9D,OAAOP;wBACT;wBACA,MAAMxD,eAAeC,mBAAmByD,QAAQM,WAAW,EAAE5B;wBAC7D,MAAM6B,SAASP,QAAQJ,OAAO;wBAE9B,SAASY,KAAK1B,GAAI,EAAE2B,GAAI;4BACtB,IAAI3B,OAAOA,IAAI4B,OAAO,CAACC,OAAO,CAAC,0BAA0B,GAAG;gCAC1DF,MAAM3B;gCACNA,MAAM;4BACR;4BACAM,QAAQgB,IAAI,CAAC;gCAAEJ;gCAAS7B;gCAASyB;gCAASK,OAAOnB;gCAAKuB,QAAQI;4BAAI;4BAClEX;wBACF;wBAEA,+DAA+D;wBAC/D,MAAMc,WAAW1C,eAAeC,SAASC;wBAEzC,IAAIW,SAASC,MAAM,GAAG,GAAG;4BACvB,gFAAgF;4BAChF,IAAI,CAACN,QAAQmC,MAAM,EAAEC,QAAQC,GAAG,CAAC,CAAC,EAAE,EAAElE,gBAAgB;gCAAC+D,SAASzC,OAAO;6BAAC,CAAC6C,MAAM,CAACJ,SAASxC,IAAI,GAAGJ,IAAI,CAAC,MAAM;4BAC3G,OAAO7B,MAAMyE,SAASzC,OAAO,EAAEyC,SAASxC,IAAI,EAAE9B,cAAckE;wBAC9D;wBACA,IAAIjB,SAASA,QAAQpD,KAAK,CAACyE,SAASzC,OAAO,EAAEyC,SAASxC,IAAI,EAAE9B,cAAc;4BAAE2E,OAAOV;4BAAQW,UAAU/B,iBAAiB+B,QAAQ;wBAAC,GAAGV;6BAC7H7D,eAAeiE,SAASzC,OAAO,EAAEyC,SAASxC,IAAI,EAAE9B,cAAc;4BAAEiE;wBAAO,GAAGC;oBACjF;gBACF;YACF;YACAnB,MAAM8B,KAAK,CAAC,CAACrC;gBACX,IAAIS,SAAS;oBACXA,QAAQ6B,YAAY,CAAC;wBACnBtC,MAAMH,SAASG,OAAOH,SAAS,MAAMS;oBACvC;gBACF,OAAO;oBACLN,MAAMH,SAASG,OAAOH,SAAS,MAAMS;gBACvC;YACF;QACF;IACF;AACF"}
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 { objectAssign, stringEndsWith } from './compat.ts';\nimport { storagePath } from './constants.ts';\nimport loadNodeVersionInstall from './lib/loadNodeVersionInstall.ts';\nimport { getPathWithoutNvuBin, resolveSystemBinary } from './lib/resolveSystemBinary.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].concat(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].concat(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): void {\n // Handle \"system\" as a special version that uses system binaries directly\n if (versionExpression === 'system') {\n runWithSystemBinaries(command, args, options, callback);\n return;\n }\n\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) return callback(err);\n if (!versions.length) {\n callback(new Error(`No versions found from expression: ${versionExpression}`));\n return;\n }\n\n const installOptions = objectAssign({ storagePath: 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?): void {\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\n/**\n * Run command using system binaries (bypassing nvu version management)\n * This handles the \"system\" version specifier\n */\nfunction runWithSystemBinaries(command: string, args: string[], options: UseOptions, callback: UseCallback): void {\n // Find the system binary for the command\n const systemBinary = resolveSystemBinary(command);\n if (!systemBinary) {\n callback(new Error(`System ${command} not found in PATH`));\n return;\n }\n\n // Create spawn options with PATH excluding ~/.nvu/bin\n // This ensures any child processes also use system binaries\n const cleanPath = getPathWithoutNvuBin();\n const spawnOptions: SpawnOptions = objectAssign({}, options as SpawnOptions);\n spawnOptions.env = objectAssign({}, process.env);\n spawnOptions.env.PATH = cleanPath;\n spawnOptions.stdio = options.stdio || 'inherit';\n\n // On Windows, resolve npm bin commands to bypass .cmd wrappers\n const resolved = resolveCommand(command, args);\n\n // For system, use the resolved system binary path\n const finalCommand = resolved.command === command ? systemBinary : resolved.command;\n const finalArgs = resolved.command === command ? args : resolved.args;\n\n if (!options.silent) {\n console.log(`$ ${formatArguments([finalCommand].concat(finalArgs)).join(' ')}`);\n }\n\n spawn(finalCommand, finalArgs, spawnOptions, (err?, res?) => {\n if (err && err.message && err.message.indexOf('ExperimentalWarning') >= 0) {\n res = err;\n err = null;\n }\n\n const result: UseResult = {\n install: null,\n command,\n version: 'system',\n error: err,\n result: res,\n };\n\n callback(err, [result]);\n });\n}\n"],"names":["spawn","fs","resolveVersions","spawnOptions","createSpawnOptions","path","Queue","resolveBin","spawnStreaming","createSession","formatArguments","objectAssign","stringEndsWith","storagePath","loadNodeVersionInstall","getPathWithoutNvuBin","resolveSystemBinary","isWindows","process","platform","test","env","OSTYPE","NODE","parseNpmCmdWrapper","cmdPath","content","readFileSync","match","relativePath","cmdDir","dirname","join","_e","resolveCommand","command","args","toLowerCase","scriptPath","concat","binPath","worker","versionExpression","options","callback","runWithSystemBinaries","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","group","expanded","await","waitAndClose","systemBinary","cleanPath","PATH","stdio","finalCommand","finalArgs"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-version-use",
3
- "version": "2.4.0",
3
+ "version": "2.4.2",
4
4
  "description": "Cross-platform solution for using multiple versions of node. Useful for compatibility testing",
5
5
  "keywords": [
6
6
  "node",
@@ -49,7 +49,6 @@
49
49
  },
50
50
  "dependencies": {
51
51
  "cross-spawn-cb": "^3.0.0",
52
- "env-path-key": "^1.0.0",
53
52
  "exit-compat": "^1.0.0",
54
53
  "fs-remove-compat": "^1.0.0",
55
54
  "get-file-compat": "^2.0.0",
@@ -72,6 +71,7 @@
72
71
  "@types/mocha": "*",
73
72
  "@types/node": "*",
74
73
  "cr": "^0.1.0",
74
+ "env-path-key": "^1.1.8",
75
75
  "fs-copy-compat": "^1.0.0",
76
76
  "fs-remove-compat": "^1.0.0",
77
77
  "is-version": "^1.0.9",
@@ -85,5 +85,5 @@
85
85
  "engines": {
86
86
  "node": ">=0.8"
87
87
  },
88
- "binaryVersion": "1.0.0"
88
+ "binaryVersion": "1.1.0"
89
89
  }