node-version-use 1.9.9 → 2.1.0

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 (93) hide show
  1. package/README.md +121 -23
  2. package/dist/cjs/cli.js +37 -33
  3. package/dist/cjs/cli.js.map +1 -1
  4. package/dist/cjs/commands/default.d.cts +7 -0
  5. package/dist/cjs/commands/default.d.ts +7 -0
  6. package/dist/cjs/commands/default.js +57 -0
  7. package/dist/cjs/commands/default.js.map +1 -0
  8. package/dist/cjs/commands/index.d.cts +3 -0
  9. package/dist/cjs/commands/index.d.ts +3 -0
  10. package/dist/cjs/commands/index.js +54 -0
  11. package/dist/cjs/commands/index.js.map +1 -0
  12. package/dist/cjs/commands/install.d.cts +6 -0
  13. package/dist/cjs/commands/install.d.ts +6 -0
  14. package/dist/cjs/commands/install.js +69 -0
  15. package/dist/cjs/commands/install.js.map +1 -0
  16. package/dist/cjs/commands/list.d.cts +6 -0
  17. package/dist/cjs/commands/list.d.ts +6 -0
  18. package/dist/cjs/commands/list.js +77 -0
  19. package/dist/cjs/commands/list.js.map +1 -0
  20. package/dist/cjs/commands/local.d.cts +7 -0
  21. package/dist/cjs/commands/local.d.ts +7 -0
  22. package/dist/cjs/commands/local.js +69 -0
  23. package/dist/cjs/commands/local.js.map +1 -0
  24. package/dist/cjs/commands/setup.d.cts +7 -0
  25. package/dist/cjs/commands/setup.d.ts +7 -0
  26. package/dist/cjs/commands/setup.js +55 -0
  27. package/dist/cjs/commands/setup.js.map +1 -0
  28. package/dist/cjs/commands/teardown.d.cts +6 -0
  29. package/dist/cjs/commands/teardown.d.ts +6 -0
  30. package/dist/cjs/commands/teardown.js +52 -0
  31. package/dist/cjs/commands/teardown.js.map +1 -0
  32. package/dist/cjs/commands/uninstall.d.cts +6 -0
  33. package/dist/cjs/commands/uninstall.d.ts +6 -0
  34. package/dist/cjs/commands/uninstall.js +148 -0
  35. package/dist/cjs/commands/uninstall.js.map +1 -0
  36. package/dist/cjs/commands/which.d.cts +7 -0
  37. package/dist/cjs/commands/which.d.ts +7 -0
  38. package/dist/cjs/commands/which.js +117 -0
  39. package/dist/cjs/commands/which.js.map +1 -0
  40. package/dist/cjs/compat.d.cts +17 -0
  41. package/dist/cjs/compat.d.ts +17 -0
  42. package/dist/cjs/compat.js +47 -1
  43. package/dist/cjs/compat.js.map +1 -1
  44. package/dist/cjs/constants.js +1 -1
  45. package/dist/cjs/constants.js.map +1 -1
  46. package/dist/cjs/worker.js +5 -26
  47. package/dist/cjs/worker.js.map +1 -1
  48. package/dist/esm/cli.js +35 -29
  49. package/dist/esm/cli.js.map +1 -1
  50. package/dist/esm/commands/default.d.ts +7 -0
  51. package/dist/esm/commands/default.js +41 -0
  52. package/dist/esm/commands/default.js.map +1 -0
  53. package/dist/esm/commands/index.d.ts +3 -0
  54. package/dist/esm/commands/index.js +27 -0
  55. package/dist/esm/commands/index.js.map +1 -0
  56. package/dist/esm/commands/install.d.ts +6 -0
  57. package/dist/esm/commands/install.js +53 -0
  58. package/dist/esm/commands/install.js.map +1 -0
  59. package/dist/esm/commands/list.d.ts +6 -0
  60. package/dist/esm/commands/list.js +53 -0
  61. package/dist/esm/commands/list.js.map +1 -0
  62. package/dist/esm/commands/local.d.ts +7 -0
  63. package/dist/esm/commands/local.js +51 -0
  64. package/dist/esm/commands/local.js.map +1 -0
  65. package/dist/esm/commands/setup.d.ts +7 -0
  66. package/dist/esm/commands/setup.js +39 -0
  67. package/dist/esm/commands/setup.js.map +1 -0
  68. package/dist/esm/commands/teardown.d.ts +6 -0
  69. package/dist/esm/commands/teardown.js +36 -0
  70. package/dist/esm/commands/teardown.js.map +1 -0
  71. package/dist/esm/commands/uninstall.d.ts +6 -0
  72. package/dist/esm/commands/uninstall.js +132 -0
  73. package/dist/esm/commands/uninstall.js.map +1 -0
  74. package/dist/esm/commands/which.d.ts +7 -0
  75. package/dist/esm/commands/which.js +101 -0
  76. package/dist/esm/commands/which.js.map +1 -0
  77. package/dist/esm/compat.d.ts +17 -0
  78. package/dist/esm/compat.js +39 -2
  79. package/dist/esm/compat.js.map +1 -1
  80. package/dist/esm/constants.js +2 -1
  81. package/dist/esm/constants.js.map +1 -1
  82. package/dist/esm/worker.js +3 -16
  83. package/dist/esm/worker.js.map +1 -1
  84. package/package.json +17 -7
  85. package/scripts/ensure-test-binaries.ts +27 -0
  86. package/scripts/postinstall.cjs +462 -0
  87. package/dist/cjs/lib/loadSpawnTerm.d.cts +0 -19
  88. package/dist/cjs/lib/loadSpawnTerm.d.ts +0 -19
  89. package/dist/cjs/lib/loadSpawnTerm.js +0 -103
  90. package/dist/cjs/lib/loadSpawnTerm.js.map +0 -1
  91. package/dist/esm/lib/loadSpawnTerm.d.ts +0 -19
  92. package/dist/esm/lib/loadSpawnTerm.js +0 -42
  93. package/dist/esm/lib/loadSpawnTerm.js.map +0 -1
@@ -1,2 +1,19 @@
1
1
  export declare function homedir(): string;
2
2
  export declare function stringEndsWith(str: string, search: string, position?: number): boolean;
3
+ /**
4
+ * Recursive mkdir for Node.js 0.8+
5
+ */
6
+ export declare function mkdirpSync(dir: string): void;
7
+ /**
8
+ * Recursive rm for Node.js 0.8+
9
+ */
10
+ export declare function rmSync(dir: string): void;
11
+ /**
12
+ * Read directory entries with types for Node.js 0.8+
13
+ * Returns array of {name, isDirectory()}
14
+ */
15
+ export interface DirEntry {
16
+ name: string;
17
+ isDirectory(): boolean;
18
+ }
19
+ export declare function readdirWithTypes(dir: string): DirEntry[];
@@ -1,13 +1,18 @@
1
1
  /**
2
2
  * Compatibility Layer for Node.js 0.8+
3
3
  * Local to this package - contains only needed functions.
4
- */ import os from 'os';
4
+ */ import fs from 'fs';
5
+ import _Module from 'module';
6
+ import os from 'os';
7
+ import path from 'path';
8
+ // Use existing require in CJS, or createRequire in ESM (Node 12.2+)
9
+ var _require = typeof require === 'undefined' ? _Module.createRequire(import.meta.url) : require;
5
10
  var hasHomedir = typeof os.homedir === 'function';
6
11
  export function homedir() {
7
12
  if (hasHomedir) {
8
13
  return os.homedir();
9
14
  }
10
- var home = require('homedir-polyfill');
15
+ var home = _require('homedir-polyfill');
11
16
  return home();
12
17
  }
13
18
  /**
@@ -22,3 +27,35 @@ export function stringEndsWith(str, search, position) {
22
27
  var len = position === undefined ? str.length : position;
23
28
  return str.lastIndexOf(search) === len - search.length;
24
29
  }
30
+ /**
31
+ * Recursive mkdir for Node.js 0.8+
32
+ */ export function mkdirpSync(dir) {
33
+ var mkdirp = _require('mkdirp-classic');
34
+ mkdirp.sync(dir);
35
+ }
36
+ /**
37
+ * Recursive rm for Node.js 0.8+
38
+ */ export function rmSync(dir) {
39
+ var safeRmSync = _require('fs-remove-compat').safeRmSync;
40
+ safeRmSync(dir);
41
+ }
42
+ export function readdirWithTypes(dir) {
43
+ var names = fs.readdirSync(dir);
44
+ return names.map((name)=>{
45
+ var fullPath = path.join(dir, name);
46
+ var stat;
47
+ try {
48
+ stat = fs.statSync(fullPath);
49
+ } catch (_e) {
50
+ // If stat fails, treat as non-directory
51
+ return {
52
+ name: name,
53
+ isDirectory: ()=>false
54
+ };
55
+ }
56
+ return {
57
+ name: name,
58
+ isDirectory: ()=>stat.isDirectory()
59
+ };
60
+ });
61
+ }
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/compat.ts"],"sourcesContent":["/**\n * Compatibility Layer for Node.js 0.8+\n * Local to this package - contains only needed functions.\n */\nimport os from 'os';\n\nvar hasHomedir = typeof os.homedir === 'function';\n\nexport function homedir(): string {\n if (hasHomedir) {\n return os.homedir();\n }\n var home = require('homedir-polyfill');\n return home();\n}\n\n/**\n * String.prototype.endsWith wrapper for Node.js 0.8+\n * - Uses native endsWith on Node 4.0+ / ES2015+\n * - Falls back to lastIndexOf on Node 0.8-3.x\n */\nvar hasEndsWith = typeof String.prototype.endsWith === 'function';\n\nexport function stringEndsWith(str: string, search: string, position?: number): boolean {\n if (hasEndsWith) {\n return str.endsWith(search, position);\n }\n var len = position === undefined ? str.length : position;\n return str.lastIndexOf(search) === len - search.length;\n}\n"],"names":["os","hasHomedir","homedir","home","require","hasEndsWith","String","prototype","endsWith","stringEndsWith","str","search","position","len","undefined","length","lastIndexOf"],"mappings":"AAAA;;;CAGC,GACD,OAAOA,QAAQ,KAAK;AAEpB,IAAIC,aAAa,OAAOD,GAAGE,OAAO,KAAK;AAEvC,OAAO,SAASA;IACd,IAAID,YAAY;QACd,OAAOD,GAAGE,OAAO;IACnB;IACA,IAAIC,OAAOC,QAAQ;IACnB,OAAOD;AACT;AAEA;;;;CAIC,GACD,IAAIE,cAAc,OAAOC,OAAOC,SAAS,CAACC,QAAQ,KAAK;AAEvD,OAAO,SAASC,eAAeC,GAAW,EAAEC,MAAc,EAAEC,QAAiB;IAC3E,IAAIP,aAAa;QACf,OAAOK,IAAIF,QAAQ,CAACG,QAAQC;IAC9B;IACA,IAAIC,MAAMD,aAAaE,YAAYJ,IAAIK,MAAM,GAAGH;IAChD,OAAOF,IAAIM,WAAW,CAACL,YAAYE,MAAMF,OAAOI,MAAM;AACxD"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/compat.ts"],"sourcesContent":["/**\n * Compatibility Layer for Node.js 0.8+\n * Local to this package - contains only needed functions.\n */\nimport fs from 'fs';\nimport _Module from 'module';\nimport os from 'os';\nimport path from 'path';\n\n// Use existing require in CJS, or createRequire in ESM (Node 12.2+)\nvar _require = typeof require === 'undefined' ? _Module.createRequire(import.meta.url) : require;\n\nvar hasHomedir = typeof os.homedir === 'function';\n\nexport function homedir(): string {\n if (hasHomedir) {\n return os.homedir();\n }\n var home = _require('homedir-polyfill');\n return home();\n}\n\n/**\n * String.prototype.endsWith wrapper for Node.js 0.8+\n * - Uses native endsWith on Node 4.0+ / ES2015+\n * - Falls back to lastIndexOf on Node 0.8-3.x\n */\nvar hasEndsWith = typeof String.prototype.endsWith === 'function';\n\nexport function stringEndsWith(str: string, search: string, position?: number): boolean {\n if (hasEndsWith) {\n return str.endsWith(search, position);\n }\n var len = position === undefined ? str.length : position;\n return str.lastIndexOf(search) === len - search.length;\n}\n\n/**\n * Recursive mkdir for Node.js 0.8+\n */\nexport function mkdirpSync(dir: string): void {\n var mkdirp = _require('mkdirp-classic');\n mkdirp.sync(dir);\n}\n\n/**\n * Recursive rm for Node.js 0.8+\n */\nexport function rmSync(dir: string): void {\n var safeRmSync = _require('fs-remove-compat').safeRmSync;\n safeRmSync(dir);\n}\n\n/**\n * Read directory entries with types for Node.js 0.8+\n * Returns array of {name, isDirectory()}\n */\nexport interface DirEntry {\n name: string;\n isDirectory(): boolean;\n}\n\nexport function readdirWithTypes(dir: string): DirEntry[] {\n var names = fs.readdirSync(dir);\n return names.map((name) => {\n var fullPath = path.join(dir, name);\n var stat: fs.Stats;\n try {\n stat = fs.statSync(fullPath);\n } catch (_e) {\n // If stat fails, treat as non-directory\n return { name: name, isDirectory: () => false };\n }\n return {\n name: name,\n isDirectory: () => stat.isDirectory(),\n };\n });\n}\n"],"names":["fs","_Module","os","path","_require","require","createRequire","url","hasHomedir","homedir","home","hasEndsWith","String","prototype","endsWith","stringEndsWith","str","search","position","len","undefined","length","lastIndexOf","mkdirpSync","dir","mkdirp","sync","rmSync","safeRmSync","readdirWithTypes","names","readdirSync","map","name","fullPath","join","stat","statSync","_e","isDirectory"],"mappings":"AAAA;;;CAGC,GACD,OAAOA,QAAQ,KAAK;AACpB,OAAOC,aAAa,SAAS;AAC7B,OAAOC,QAAQ,KAAK;AACpB,OAAOC,UAAU,OAAO;AAExB,oEAAoE;AACpE,IAAIC,WAAW,OAAOC,YAAY,cAAcJ,QAAQK,aAAa,CAAC,YAAYC,GAAG,IAAIF;AAEzF,IAAIG,aAAa,OAAON,GAAGO,OAAO,KAAK;AAEvC,OAAO,SAASA;IACd,IAAID,YAAY;QACd,OAAON,GAAGO,OAAO;IACnB;IACA,IAAIC,OAAON,SAAS;IACpB,OAAOM;AACT;AAEA;;;;CAIC,GACD,IAAIC,cAAc,OAAOC,OAAOC,SAAS,CAACC,QAAQ,KAAK;AAEvD,OAAO,SAASC,eAAeC,GAAW,EAAEC,MAAc,EAAEC,QAAiB;IAC3E,IAAIP,aAAa;QACf,OAAOK,IAAIF,QAAQ,CAACG,QAAQC;IAC9B;IACA,IAAIC,MAAMD,aAAaE,YAAYJ,IAAIK,MAAM,GAAGH;IAChD,OAAOF,IAAIM,WAAW,CAACL,YAAYE,MAAMF,OAAOI,MAAM;AACxD;AAEA;;CAEC,GACD,OAAO,SAASE,WAAWC,GAAW;IACpC,IAAIC,SAASrB,SAAS;IACtBqB,OAAOC,IAAI,CAACF;AACd;AAEA;;CAEC,GACD,OAAO,SAASG,OAAOH,GAAW;IAChC,IAAII,aAAaxB,SAAS,oBAAoBwB,UAAU;IACxDA,WAAWJ;AACb;AAWA,OAAO,SAASK,iBAAiBL,GAAW;IAC1C,IAAIM,QAAQ9B,GAAG+B,WAAW,CAACP;IAC3B,OAAOM,MAAME,GAAG,CAAC,CAACC;QAChB,IAAIC,WAAW/B,KAAKgC,IAAI,CAACX,KAAKS;QAC9B,IAAIG;QACJ,IAAI;YACFA,OAAOpC,GAAGqC,QAAQ,CAACH;QACrB,EAAE,OAAOI,IAAI;YACX,wCAAwC;YACxC,OAAO;gBAAEL,MAAMA;gBAAMM,aAAa,IAAM;YAAM;QAChD;QACA,OAAO;YACLN,MAAMA;YACNM,aAAa,IAAMH,KAAKG,WAAW;QACrC;IACF;AACF"}
@@ -1,3 +1,4 @@
1
1
  import path from 'path';
2
2
  import { homedir } from './compat.js';
3
- export const storagePath = path.join(homedir(), '.nvu');
3
+ // Allow NVU_HOME override for testing
4
+ export const storagePath = process.env.NVU_HOME || path.join(homedir(), '.nvu');
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/constants.ts"],"sourcesContent":["import path from 'path';\nimport { homedir } from './compat.ts';\n\nexport const storagePath = path.join(homedir(), '.nvu') as string;\n"],"names":["path","homedir","storagePath","join"],"mappings":"AAAA,OAAOA,UAAU,OAAO;AACxB,SAASC,OAAO,QAAQ,cAAc;AAEtC,OAAO,MAAMC,cAAcF,KAAKG,IAAI,CAACF,WAAW,QAAkB"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/constants.ts"],"sourcesContent":["import path from 'path';\nimport { homedir } from './compat.ts';\n\n// Allow NVU_HOME override for testing\nexport const storagePath = (process.env.NVU_HOME || path.join(homedir(), '.nvu')) as string;\n"],"names":["path","homedir","storagePath","process","env","NVU_HOME","join"],"mappings":"AAAA,OAAOA,UAAU,OAAO;AACxB,SAASC,OAAO,QAAQ,cAAc;AAEtC,sCAAsC;AACtC,OAAO,MAAMC,cAAeC,QAAQC,GAAG,CAACC,QAAQ,IAAIL,KAAKM,IAAI,CAACL,WAAW,QAAmB"}
@@ -6,10 +6,10 @@ import path from 'path';
6
6
  import Queue from 'queue-cb';
7
7
  import resolveBin from 'resolve-bin-sync';
8
8
  import spawnStreaming from 'spawn-streaming';
9
+ import { createSession, formatArguments } from 'spawn-term';
9
10
  import { stringEndsWith } from './compat.js';
10
11
  import { storagePath } from './constants.js';
11
12
  import loadNodeVersionInstall from './lib/loadNodeVersionInstall.js';
12
- import loadSpawnTerm from './lib/loadSpawnTerm.js';
13
13
  const isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);
14
14
  const NODE = isWindows ? 'node.exe' : 'node';
15
15
  // Parse npm-generated .cmd wrapper to extract the JS script path
@@ -68,21 +68,8 @@ function resolveCommand(command, args) {
68
68
  };
69
69
  }
70
70
  export default function worker(versionExpression, command, args, options, callback) {
71
- // Load lazy dependencies in parallel
72
- const loaderQueue = new Queue();
73
- let installVersion;
74
- let createSession;
75
- let formatArguments = (x)=>x;
76
- loaderQueue.defer((cb)=>loadNodeVersionInstall((err, fn)=>{
77
- installVersion = fn;
78
- cb(err);
79
- }));
80
- loaderQueue.defer((cb)=>loadSpawnTerm((err, mod)=>{
81
- createSession = mod === null || mod === void 0 ? void 0 : mod.createSession;
82
- formatArguments = (mod === null || mod === void 0 ? void 0 : mod.formatArguments) || ((x)=>x);
83
- cb(err);
84
- }));
85
- loaderQueue.await((loadErr)=>{
71
+ // Load node-version-install lazily
72
+ loadNodeVersionInstall((loadErr, installVersion)=>{
86
73
  if (loadErr) return callback(loadErr);
87
74
  resolveVersions(versionExpression, options, (err, versions)=>{
88
75
  if (err) {
@@ -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 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, 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","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","silent","console","log","concat","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 } 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 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, 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","_err","installs","install","push","error","JSON","stringify","result","installPath","prefix","next","res","message","indexOf","resolved","silent","console","log","concat","group","expanded","await","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.9",
3
+ "version": "2.1.0",
4
4
  "description": "Cross-platform solution for using multiple versions of node. Useful for compatibility testing",
5
5
  "keywords": [
6
6
  "node",
@@ -32,12 +32,17 @@
32
32
  "nvu": "bin/cli.js"
33
33
  },
34
34
  "files": [
35
- "dist"
35
+ "bin",
36
+ "dist",
37
+ "scripts"
36
38
  ],
37
39
  "scripts": {
38
40
  "build": "tsds build",
41
+ "clean": "rm -rf .tmp dist",
39
42
  "format": "tsds format",
43
+ "postinstall": "node scripts/postinstall.cjs",
40
44
  "prepublishOnly": "tsds validate",
45
+ "pretest": "node scripts/ensure-test-binaries.ts",
41
46
  "test": "tsds test:node --no-timeouts",
42
47
  "test:engines": "nvu engines tsds test:node --no-timeouts",
43
48
  "version": "tsds version"
@@ -45,30 +50,35 @@
45
50
  "dependencies": {
46
51
  "cross-spawn-cb": "^2.4.10",
47
52
  "exit": "^0.1.2",
53
+ "fs-remove-compat": "^0.2.1",
48
54
  "getopts-compat": "^2.2.6",
49
55
  "homedir-polyfill": "^1.0.3",
50
- "install-module-linked": "^1.3.10",
56
+ "install-module-linked": "^1.3.11",
57
+ "mkdirp-classic": "^0.5.3",
51
58
  "node-resolve-versions": "^1.3.11",
52
59
  "node-version-utils": "^1.3.15",
53
60
  "queue-cb": "^1.6.1",
54
61
  "resolve-bin-sync": "^1.0.10",
55
- "spawn-streaming": "^1.1.13"
62
+ "spawn-streaming": "^1.1.13",
63
+ "spawn-term": "^3.3.2"
56
64
  },
57
65
  "devDependencies": {
58
66
  "@types/mocha": "^10.0.10",
59
- "@types/node": "^24.10.1",
67
+ "@types/node": "^25.0.0",
60
68
  "cr": "^0.1.0",
61
69
  "fs-copy-compat": "^0.1.3",
62
70
  "fs-remove-compat": "^0.2.1",
63
71
  "is-version": "^1.0.7",
64
72
  "mkdirp-classic": "^0.5.3",
65
73
  "node-version-install": "^1.4.18",
66
- "node-version-use": "^1.9.7",
74
+ "node-version-use": "^2.0.0",
75
+ "os-shim": "^0.1.3",
67
76
  "pinkie-promise": "^2.0.1",
68
77
  "ts-dev-stack": "^1.21.2",
69
78
  "tsds-config": "^0.2.0"
70
79
  },
71
80
  "engines": {
72
81
  "node": ">=0.8"
73
- }
82
+ },
83
+ "binaryVersion": "1.0.0"
74
84
  }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Validates that binaries were downloaded by postinstall.
3
+ * Called as pretest hook - fails if binaries are missing.
4
+ */
5
+ import fs from 'fs';
6
+ import path from 'path';
7
+ import { storagePath } from '../src/constants.ts';
8
+
9
+ var BIN_DIR = path.join(storagePath, 'bin');
10
+
11
+ // Check for platform-specific binary name
12
+ var BINARY_NAME = process.platform === 'win32' ? 'node.exe' : 'node';
13
+ var NODE_BINARY = path.join(BIN_DIR, BINARY_NAME);
14
+
15
+ function main(): void {
16
+ if (!fs.existsSync(NODE_BINARY)) {
17
+ console.error('Error: nvu binaries not found at', BIN_DIR);
18
+ console.error('');
19
+ console.error('Binaries should have been downloaded by postinstall.');
20
+ console.error('Try running: npm install');
21
+ process.exit(1);
22
+ }
23
+
24
+ console.log('Binaries found at', BIN_DIR);
25
+ }
26
+
27
+ main();