node-version-use 2.1.6 → 2.1.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.
Files changed (40) hide show
  1. package/assets/installBinaries.cjs +284 -0
  2. package/assets/postinstall.cjs +11 -404
  3. package/dist/cjs/assets/installBinaries.cjs +284 -0
  4. package/dist/cjs/assets/installBinaries.cjs.map +1 -0
  5. package/dist/cjs/assets/installBinaries.d.cts +1 -0
  6. package/dist/cjs/assets/postinstall.cjs +11 -404
  7. package/dist/cjs/assets/postinstall.cjs.map +1 -1
  8. package/dist/cjs/commands/index.js +2 -3
  9. package/dist/cjs/commands/index.js.map +1 -1
  10. package/dist/cjs/commands/setup.js +23 -41
  11. package/dist/cjs/commands/setup.js.map +1 -1
  12. package/dist/cjs/commands/teardown.js +2 -1
  13. package/dist/cjs/commands/teardown.js.map +1 -1
  14. package/dist/cjs/compat.d.cts +1 -0
  15. package/dist/cjs/compat.d.ts +1 -0
  16. package/dist/cjs/compat.js +11 -4
  17. package/dist/cjs/compat.js.map +1 -1
  18. package/dist/cjs/lib/loadNodeVersionInstall.js +2 -2
  19. package/dist/cjs/lib/loadNodeVersionInstall.js.map +1 -1
  20. package/dist/cjs/worker.js +1 -1
  21. package/dist/cjs/worker.js.map +1 -1
  22. package/dist/esm/assets/installBinaries.cjs +282 -0
  23. package/dist/esm/assets/installBinaries.cjs.map +1 -0
  24. package/dist/esm/assets/installBinaries.d.cts +1 -0
  25. package/dist/esm/assets/postinstall.cjs +11 -404
  26. package/dist/esm/assets/postinstall.cjs.map +1 -1
  27. package/dist/esm/commands/index.js +2 -3
  28. package/dist/esm/commands/index.js.map +1 -1
  29. package/dist/esm/commands/setup.js +24 -42
  30. package/dist/esm/commands/setup.js.map +1 -1
  31. package/dist/esm/commands/teardown.js +2 -1
  32. package/dist/esm/commands/teardown.js.map +1 -1
  33. package/dist/esm/compat.d.ts +1 -0
  34. package/dist/esm/compat.js +8 -4
  35. package/dist/esm/compat.js.map +1 -1
  36. package/dist/esm/lib/loadNodeVersionInstall.js +2 -2
  37. package/dist/esm/lib/loadNodeVersionInstall.js.map +1 -1
  38. package/dist/esm/worker.js +1 -1
  39. package/dist/esm/worker.js.map +1 -1
  40. package/package.json +27 -22
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/commands/setup.ts"],"sourcesContent":["import { execSync } from 'child_process';\nimport exit from 'exit-compat';\nimport fs from 'fs';\nimport path from 'path';\nimport url from 'url';\nimport { mkdirpSync, readdirWithTypes } from '../compat.ts';\nimport { storagePath } from '../constants.ts';\nimport { findInstalledVersions } from '../lib/findInstalledVersions.ts';\n\nconst __dirname = path.dirname(typeof __filename !== 'undefined' ? __filename : url.fileURLToPath(import.meta.url));\n\n/**\n * nvu setup [--shims]\n *\n * Install/reinstall nvu binaries to ~/.nvu/bin\n * With --shims: create shims for existing global packages\n */\nexport default function setupCmd(args: string[]): void {\n const binDir = path.join(storagePath, 'bin');\n\n // Create directories\n if (!fs.existsSync(storagePath)) {\n mkdirpSync(storagePath);\n }\n if (!fs.existsSync(binDir)) {\n mkdirpSync(binDir);\n }\n\n // Check for --shims flag\n let hasShimsFlag = false;\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--shims') {\n hasShimsFlag = true;\n break;\n }\n }\n\n if (hasShimsFlag) {\n createShimsForGlobalPackages(binDir);\n return;\n }\n\n // Find the postinstall script relative to this module\n const postinstallPath = path.join(__dirname, '..', '..', '..', 'scripts', 'postinstall.cjs');\n\n if (fs.existsSync(postinstallPath)) {\n // Run the postinstall script\n try {\n execSync(`node \"${postinstallPath}\"`, { stdio: 'inherit' });\n } catch (_err) {\n // postinstall handles its own errors gracefully\n }\n } else {\n console.log('Setup script not found.');\n console.log('Try reinstalling: npm install -g node-version-use');\n exit(1);\n }\n}\n\n/**\n * Create shims for all global packages in the default Node version\n */\nfunction createShimsForGlobalPackages(binDir: string): void {\n // Read default version\n const defaultPath = path.join(storagePath, 'default');\n if (!fs.existsSync(defaultPath)) {\n console.log('No default Node version set.');\n console.log('Set one with: nvu default <version>');\n exit(1);\n return;\n }\n\n const defaultVersion = fs.readFileSync(defaultPath, 'utf8').trim();\n const versionsDir = path.join(storagePath, 'installed');\n\n // Resolve to exact version\n const matches = findInstalledVersions(versionsDir, defaultVersion);\n if (matches.length === 0) {\n console.log(`Default version ${defaultVersion} is not installed.`);\n exit(1);\n return;\n }\n\n const resolvedVersion = matches[matches.length - 1];\n const nodeBinDir = path.join(versionsDir, resolvedVersion, 'bin');\n\n if (!fs.existsSync(nodeBinDir)) {\n console.log(`No bin directory found for ${resolvedVersion}`);\n exit(1);\n return;\n }\n\n // Get the node shim to copy from\n const nodeShim = path.join(binDir, 'node');\n if (!fs.existsSync(nodeShim)) {\n console.log('Node shim not found. Run: nvu setup');\n exit(1);\n return;\n }\n\n // Scan binaries in Node's bin directory\n const entries = readdirWithTypes(nodeBinDir);\n let created = 0;\n let skipped = 0;\n\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n const name = entry.name;\n\n // Skip our routing shims (node/npm/npx) - don't overwrite them\n if (name === 'node' || name === 'npm' || name === 'npx') {\n continue;\n }\n\n const shimPath = path.join(binDir, name);\n\n // Skip if shim already exists\n if (fs.existsSync(shimPath)) {\n skipped++;\n continue;\n }\n\n // Copy the node shim\n try {\n const shimContent = fs.readFileSync(nodeShim);\n fs.writeFileSync(shimPath, shimContent);\n fs.chmodSync(shimPath, 493); // 0755\n console.log(`Created shim: ${name}`);\n created++;\n } catch (err) {\n console.error(`Failed to create shim for ${name}: ${(err as Error).message}`);\n }\n }\n\n console.log('');\n console.log(`Done. Created ${created} shims, skipped ${skipped} (already exist).`);\n exit(0);\n}\n"],"names":["setupCmd","__dirname","path","dirname","__filename","url","fileURLToPath","args","binDir","join","storagePath","fs","existsSync","mkdirpSync","hasShimsFlag","i","length","createShimsForGlobalPackages","postinstallPath","execSync","stdio","_err","console","log","exit","defaultPath","defaultVersion","readFileSync","trim","versionsDir","matches","findInstalledVersions","resolvedVersion","nodeBinDir","nodeShim","entries","readdirWithTypes","created","skipped","entry","name","shimPath","shimContent","writeFileSync","chmodSync","err","error","message"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/commands/setup.ts"],"sourcesContent":["import exit from 'exit-compat';\nimport fs from 'fs';\nimport getopts from 'getopts-compat';\nimport Module from 'module';\nimport path from 'path';\nimport { readdirWithTypes } from '../compat.ts';\nimport { storagePath } from '../constants.ts';\nimport { findInstalledVersions } from '../lib/findInstalledVersions.ts';\n\nconst _require = typeof require === 'undefined' ? Module.createRequire(import.meta.url) : require;\nconst { installBinaries, printInstructions } = _require('../assets/installBinaries.cjs');\n\n/**\n * nvu setup [--shims]\n *\n * Install/reinstall nvu binaries to ~/.nvu/bin\n * With --shims: create shims for existing global packages\n */\nexport default function setupCmd(args: string[]): void {\n const options = getopts(args, { boolean: ['force'] });\n\n installBinaries(options, (err, installed) => {\n if (err) {\n console.error(`Setup failed: ${err.message || err}`);\n exit(1);\n return;\n }\n\n printInstructions();\n if (!installed) console.log('Use --force to reinstall.');\n\n if (options.force) {\n const binDir = path.join(storagePath, 'bin');\n createShimsForGlobalPackages(binDir);\n return;\n }\n });\n}\n\n/**\n * Create shims for all global packages in the default Node version\n */\nfunction createShimsForGlobalPackages(binDir: string): void {\n // Read default version\n const defaultPath = path.join(storagePath, 'default');\n if (!fs.existsSync(defaultPath)) {\n console.log('No default Node version set.');\n console.log('Set one with: nvu default <version>');\n exit(1);\n return;\n }\n\n const defaultVersion = fs.readFileSync(defaultPath, 'utf8').trim();\n const versionsDir = path.join(storagePath, 'installed');\n\n // Resolve to exact version\n const matches = findInstalledVersions(versionsDir, defaultVersion);\n if (matches.length === 0) {\n console.log(`Default version ${defaultVersion} is not installed.`);\n exit(1);\n return;\n }\n\n const resolvedVersion = matches[matches.length - 1];\n const nodeBinDir = path.join(versionsDir, resolvedVersion, 'bin');\n\n if (!fs.existsSync(nodeBinDir)) {\n console.log(`No bin directory found for ${resolvedVersion}`);\n exit(1);\n return;\n }\n\n // Get the node shim to copy from\n const nodeShim = path.join(binDir, 'node');\n if (!fs.existsSync(nodeShim)) {\n console.log('Node shim not found. Run: nvu setup');\n exit(1);\n return;\n }\n\n // Scan binaries in Node's bin directory\n const entries = readdirWithTypes(nodeBinDir);\n let created = 0;\n let skipped = 0;\n\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n const name = entry.name;\n\n // Skip our routing shims (node/npm/npx) - don't overwrite them\n if (name === 'node' || name === 'npm' || name === 'npx') continue;\n const shimPath = path.join(binDir, name);\n\n // Skip if shim already exists\n if (fs.existsSync(shimPath)) {\n skipped++;\n continue;\n }\n\n // Copy the node shim\n try {\n const shimContent = fs.readFileSync(nodeShim);\n fs.writeFileSync(shimPath, shimContent);\n fs.chmodSync(shimPath, 493); // 0755\n console.log(`Created shim: ${name}`);\n created++;\n } catch (err) {\n console.error(`Failed to create shim for ${name}: ${(err as Error).message}`);\n }\n }\n\n console.log('');\n console.log(`Done. Created ${created} shims, skipped ${skipped} (already exists).`);\n exit(0);\n}\n"],"names":["setupCmd","_require","require","Module","createRequire","installBinaries","printInstructions","args","options","getopts","boolean","err","installed","console","error","message","exit","log","force","binDir","path","join","storagePath","createShimsForGlobalPackages","defaultPath","fs","existsSync","defaultVersion","readFileSync","trim","versionsDir","matches","findInstalledVersions","length","resolvedVersion","nodeBinDir","nodeShim","entries","readdirWithTypes","created","skipped","i","entry","name","shimPath","shimContent","writeFileSync","chmodSync"],"mappings":"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"}
@@ -22,6 +22,7 @@ function _interop_require_default(obj) {
22
22
  default: obj
23
23
  };
24
24
  }
25
+ var isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);
25
26
  function teardownCmd(_args) {
26
27
  var binDir = _path.default.join(_constantsts.storagePath, 'bin');
27
28
  var binaries = [
@@ -29,7 +30,7 @@ function teardownCmd(_args) {
29
30
  'npm',
30
31
  'npx'
31
32
  ];
32
- var ext = process.platform === 'win32' ? '.exe' : '';
33
+ var ext = isWindows ? '.exe' : '';
33
34
  var removed = 0;
34
35
  for(var i = 0; i < binaries.length; i++){
35
36
  var binaryPath = _path.default.join(binDir, binaries[i] + ext);
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/commands/teardown.ts"],"sourcesContent":["import exit from 'exit-compat';\nimport fs from 'fs';\nimport { rmSync } from 'fs-remove-compat';\nimport path from 'path';\nimport { storagePath } from '../constants.ts';\n\n/**\n * nvu teardown\n *\n * Remove nvu binaries from ~/.nvu/bin\n */\nexport default function teardownCmd(_args: string[]): void {\n const binDir = path.join(storagePath, 'bin');\n\n const binaries = ['node', 'npm', 'npx'];\n const ext = process.platform === 'win32' ? '.exe' : '';\n\n let removed = 0;\n for (let i = 0; i < binaries.length; i++) {\n const binaryPath = path.join(binDir, binaries[i] + ext);\n if (fs.existsSync(binaryPath)) {\n rmSync(binaryPath, { force: true });\n removed++;\n }\n }\n\n if (removed > 0) {\n console.log(`Removed ${removed} binary(s) from ${binDir}`);\n console.log('');\n console.log('You may also want to remove ~/.nvu/bin from your PATH.');\n } else {\n console.log('No binaries found to remove.');\n }\n\n exit(0);\n}\n"],"names":["teardownCmd","_args","binDir","path","join","storagePath","binaries","ext","process","platform","removed","i","length","binaryPath","fs","existsSync","rmSync","force","console","log","exit"],"mappings":";;;;+BAMA;;;;CAIC,GACD;;;eAAwBA;;;iEAXP;yDACF;8BACQ;2DACN;2BACW;;;;;;AAOb,SAASA,YAAYC,KAAe;IACjD,IAAMC,SAASC,aAAI,CAACC,IAAI,CAACC,wBAAW,EAAE;IAEtC,IAAMC,WAAW;QAAC;QAAQ;QAAO;KAAM;IACvC,IAAMC,MAAMC,QAAQC,QAAQ,KAAK,UAAU,SAAS;IAEpD,IAAIC,UAAU;IACd,IAAK,IAAIC,IAAI,GAAGA,IAAIL,SAASM,MAAM,EAAED,IAAK;QACxC,IAAME,aAAaV,aAAI,CAACC,IAAI,CAACF,QAAQI,QAAQ,CAACK,EAAE,GAAGJ;QACnD,IAAIO,WAAE,CAACC,UAAU,CAACF,aAAa;YAC7BG,IAAAA,sBAAM,EAACH,YAAY;gBAAEI,OAAO;YAAK;YACjCP;QACF;IACF;IAEA,IAAIA,UAAU,GAAG;QACfQ,QAAQC,GAAG,CAAC,AAAC,WAAoCjB,OAA1BQ,SAAQ,oBAAyB,OAAPR;QACjDgB,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG,CAAC;IACd,OAAO;QACLD,QAAQC,GAAG,CAAC;IACd;IAEAC,IAAAA,mBAAI,EAAC;AACP"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/commands/teardown.ts"],"sourcesContent":["import exit from 'exit-compat';\nimport fs from 'fs';\nimport { rmSync } from 'fs-remove-compat';\nimport path from 'path';\nimport { storagePath } from '../constants.ts';\n\nconst isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\n\n/**\n * nvu teardown\n *\n * Remove nvu binaries from ~/.nvu/bin\n */\nexport default function teardownCmd(_args: string[]): void {\n const binDir = path.join(storagePath, 'bin');\n\n const binaries = ['node', 'npm', 'npx'];\n const ext = isWindows ? '.exe' : '';\n\n let removed = 0;\n for (let i = 0; i < binaries.length; i++) {\n const binaryPath = path.join(binDir, binaries[i] + ext);\n if (fs.existsSync(binaryPath)) {\n rmSync(binaryPath, { force: true });\n removed++;\n }\n }\n\n if (removed > 0) {\n console.log(`Removed ${removed} binary(s) from ${binDir}`);\n console.log('');\n console.log('You may also want to remove ~/.nvu/bin from your PATH.');\n } else {\n console.log('No binaries found to remove.');\n }\n\n exit(0);\n}\n"],"names":["teardownCmd","isWindows","process","platform","test","env","OSTYPE","_args","binDir","path","join","storagePath","binaries","ext","removed","i","length","binaryPath","fs","existsSync","rmSync","force","console","log","exit"],"mappings":";;;;+BAQA;;;;CAIC,GACD;;;eAAwBA;;;iEAbP;yDACF;8BACQ;2DACN;2BACW;;;;;;AAE5B,IAAMC,YAAYC,QAAQC,QAAQ,KAAK,WAAW,kBAAkBC,IAAI,CAACF,QAAQG,GAAG,CAACC,MAAM;AAO5E,SAASN,YAAYO,KAAe;IACjD,IAAMC,SAASC,aAAI,CAACC,IAAI,CAACC,wBAAW,EAAE;IAEtC,IAAMC,WAAW;QAAC;QAAQ;QAAO;KAAM;IACvC,IAAMC,MAAMZ,YAAY,SAAS;IAEjC,IAAIa,UAAU;IACd,IAAK,IAAIC,IAAI,GAAGA,IAAIH,SAASI,MAAM,EAAED,IAAK;QACxC,IAAME,aAAaR,aAAI,CAACC,IAAI,CAACF,QAAQI,QAAQ,CAACG,EAAE,GAAGF;QACnD,IAAIK,WAAE,CAACC,UAAU,CAACF,aAAa;YAC7BG,IAAAA,sBAAM,EAACH,YAAY;gBAAEI,OAAO;YAAK;YACjCP;QACF;IACF;IAEA,IAAIA,UAAU,GAAG;QACfQ,QAAQC,GAAG,CAAC,AAAC,WAAoCf,OAA1BM,SAAQ,oBAAyB,OAAPN;QACjDc,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG,CAAC;IACd,OAAO;QACLD,QAAQC,GAAG,CAAC;IACd;IAEAC,IAAAA,mBAAI,EAAC;AACP"}
@@ -1,4 +1,5 @@
1
1
  export declare function homedir(): string;
2
+ export declare function tmpdir(): string;
2
3
  export declare function stringEndsWith(str: string, search: string, position?: number): boolean;
3
4
  /**
4
5
  * Recursive mkdir for Node.js 0.8+
@@ -1,4 +1,5 @@
1
1
  export declare function homedir(): string;
2
+ export declare function tmpdir(): string;
2
3
  export declare function stringEndsWith(str: string, search: string, position?: number): boolean;
3
4
  /**
4
5
  * Recursive mkdir for Node.js 0.8+
@@ -26,6 +26,9 @@ _export(exports, {
26
26
  },
27
27
  get stringEndsWith () {
28
28
  return stringEndsWith;
29
+ },
30
+ get tmpdir () {
31
+ return tmpdir;
29
32
  }
30
33
  });
31
34
  var _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
@@ -41,12 +44,16 @@ function _interop_require_default(obj) {
41
44
  var _require = typeof require === 'undefined' ? _module.default.createRequire(require("url").pathToFileURL(__filename).toString()) : require;
42
45
  var hasHomedir = typeof _os.default.homedir === 'function';
43
46
  function homedir() {
44
- if (hasHomedir) {
45
- return _os.default.homedir();
46
- }
47
- var home = _require('homedir-polyfill');
47
+ if (hasHomedir) return _os.default.homedir();
48
+ var home = require('homedir-polyfill');
48
49
  return home();
49
50
  }
51
+ var hasTmpdir = typeof _os.default.tmpdir === 'function';
52
+ function tmpdir() {
53
+ if (hasTmpdir) return _os.default.tmpdir();
54
+ var osShim = require('os-shim');
55
+ return osShim.tmpdir();
56
+ }
50
57
  /**
51
58
  * String.prototype.endsWith wrapper for Node.js 0.8+
52
59
  * - Uses native endsWith on Node 4.0+ / ES2015+
@@ -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 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+)\nconst _require = typeof require === 'undefined' ? _Module.createRequire(import.meta.url) : require;\n\nconst hasHomedir = typeof os.homedir === 'function';\n\nexport function homedir(): string {\n if (hasHomedir) {\n return os.homedir();\n }\n const 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 */\nconst 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 const 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 const 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 const 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 const names = fs.readdirSync(dir);\n return names.map((name) => {\n const fullPath = path.join(dir, name);\n let 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":["homedir","mkdirpSync","readdirWithTypes","rmSync","stringEndsWith","_require","require","_Module","createRequire","hasHomedir","os","home","hasEndsWith","String","prototype","endsWith","str","search","position","len","undefined","length","lastIndexOf","dir","mkdirp","sync","safeRmSync","names","fs","readdirSync","map","name","fullPath","path","join","stat","statSync","_e","isDirectory"],"mappings":"AAAA;;;CAGC;;;;;;;;;;;QAWeA;eAAAA;;QA0BAC;eAAAA;;QAsBAC;eAAAA;;QAdAC;eAAAA;;QAnBAC;eAAAA;;;yDAzBD;6DACK;yDACL;2DACE;;;;;;AAEjB,oEAAoE;AACpE,IAAMC,WAAW,OAAOC,YAAY,cAAcC,eAAO,CAACC,aAAa,CAAC,uDAAmBF;AAE3F,IAAMG,aAAa,OAAOC,WAAE,CAACV,OAAO,KAAK;AAElC,SAASA;IACd,IAAIS,YAAY;QACd,OAAOC,WAAE,CAACV,OAAO;IACnB;IACA,IAAMW,OAAON,SAAS;IACtB,OAAOM;AACT;AAEA;;;;CAIC,GACD,IAAMC,cAAc,OAAOC,OAAOC,SAAS,CAACC,QAAQ,KAAK;AAElD,SAASX,eAAeY,GAAW,EAAEC,MAAc,EAAEC,QAAiB;IAC3E,IAAIN,aAAa;QACf,OAAOI,IAAID,QAAQ,CAACE,QAAQC;IAC9B;IACA,IAAMC,MAAMD,aAAaE,YAAYJ,IAAIK,MAAM,GAAGH;IAClD,OAAOF,IAAIM,WAAW,CAACL,YAAYE,MAAMF,OAAOI,MAAM;AACxD;AAKO,SAASpB,WAAWsB,GAAW;IACpC,IAAMC,SAASnB,SAAS;IACxBmB,OAAOC,IAAI,CAACF;AACd;AAKO,SAASpB,OAAOoB,GAAW;IAChC,IAAMG,aAAarB,SAAS,oBAAoBqB,UAAU;IAC1DA,WAAWH;AACb;AAWO,SAASrB,iBAAiBqB,GAAW;IAC1C,IAAMI,QAAQC,WAAE,CAACC,WAAW,CAACN;IAC7B,OAAOI,MAAMG,GAAG,CAAC,SAACC;QAChB,IAAMC,WAAWC,aAAI,CAACC,IAAI,CAACX,KAAKQ;QAChC,IAAII;QACJ,IAAI;YACFA,OAAOP,WAAE,CAACQ,QAAQ,CAACJ;QACrB,EAAE,OAAOK,IAAI;YACX,wCAAwC;YACxC,OAAO;gBAAEN,MAAMA;gBAAMO,aAAa;2BAAM;;YAAM;QAChD;QACA,OAAO;YACLP,MAAMA;YACNO,aAAa;uBAAMH,KAAKG,WAAW;;QACrC;IACF;AACF"}
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+)\nconst _require = typeof require === 'undefined' ? _Module.createRequire(import.meta.url) : require;\n\nconst hasHomedir = typeof os.homedir === 'function';\nexport function homedir(): string {\n if (hasHomedir) return os.homedir();\n const home = require('homedir-polyfill');\n return home();\n}\n\nconst hasTmpdir = typeof os.tmpdir === 'function';\nexport function tmpdir(): string {\n if (hasTmpdir) return os.tmpdir();\n const osShim = require('os-shim');\n return osShim.tmpdir();\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 */\nconst 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 const 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 const 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 const 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 const names = fs.readdirSync(dir);\n return names.map((name) => {\n const fullPath = path.join(dir, name);\n let 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":["homedir","mkdirpSync","readdirWithTypes","rmSync","stringEndsWith","tmpdir","_require","require","_Module","createRequire","hasHomedir","os","home","hasTmpdir","osShim","hasEndsWith","String","prototype","endsWith","str","search","position","len","undefined","length","lastIndexOf","dir","mkdirp","sync","safeRmSync","names","fs","readdirSync","map","name","fullPath","path","join","stat","statSync","_e","isDirectory"],"mappings":"AAAA;;;CAGC;;;;;;;;;;;QAUeA;eAAAA;;QA+BAC;eAAAA;;QAsBAC;eAAAA;;QAdAC;eAAAA;;QAnBAC;eAAAA;;QAbAC;eAAAA;;;yDAhBD;6DACK;yDACL;2DACE;;;;;;AAEjB,oEAAoE;AACpE,IAAMC,WAAW,OAAOC,YAAY,cAAcC,eAAO,CAACC,aAAa,CAAC,uDAAmBF;AAE3F,IAAMG,aAAa,OAAOC,WAAE,CAACX,OAAO,KAAK;AAClC,SAASA;IACd,IAAIU,YAAY,OAAOC,WAAE,CAACX,OAAO;IACjC,IAAMY,OAAOL,QAAQ;IACrB,OAAOK;AACT;AAEA,IAAMC,YAAY,OAAOF,WAAE,CAACN,MAAM,KAAK;AAChC,SAASA;IACd,IAAIQ,WAAW,OAAOF,WAAE,CAACN,MAAM;IAC/B,IAAMS,SAASP,QAAQ;IACvB,OAAOO,OAAOT,MAAM;AACtB;AAEA;;;;CAIC,GACD,IAAMU,cAAc,OAAOC,OAAOC,SAAS,CAACC,QAAQ,KAAK;AAElD,SAASd,eAAee,GAAW,EAAEC,MAAc,EAAEC,QAAiB;IAC3E,IAAIN,aAAa;QACf,OAAOI,IAAID,QAAQ,CAACE,QAAQC;IAC9B;IACA,IAAMC,MAAMD,aAAaE,YAAYJ,IAAIK,MAAM,GAAGH;IAClD,OAAOF,IAAIM,WAAW,CAACL,YAAYE,MAAMF,OAAOI,MAAM;AACxD;AAKO,SAASvB,WAAWyB,GAAW;IACpC,IAAMC,SAASrB,SAAS;IACxBqB,OAAOC,IAAI,CAACF;AACd;AAKO,SAASvB,OAAOuB,GAAW;IAChC,IAAMG,aAAavB,SAAS,oBAAoBuB,UAAU;IAC1DA,WAAWH;AACb;AAWO,SAASxB,iBAAiBwB,GAAW;IAC1C,IAAMI,QAAQC,WAAE,CAACC,WAAW,CAACN;IAC7B,OAAOI,MAAMG,GAAG,CAAC,SAACC;QAChB,IAAMC,WAAWC,aAAI,CAACC,IAAI,CAACX,KAAKQ;QAChC,IAAII;QACJ,IAAI;YACFA,OAAOP,WAAE,CAACQ,QAAQ,CAACJ;QACrB,EAAE,OAAOK,IAAI;YACX,wCAAwC;YACxC,OAAO;gBAAEN,MAAMA;gBAAMO,aAAa;2BAAM;;YAAM;QAChD;QACA,OAAO;YACLP,MAAMA;YACNO,aAAa;uBAAMH,KAAKG,WAAW;;QACrC;IACF;AACF"}
@@ -66,8 +66,8 @@ function loadModule(moduleName, callback) {
66
66
  Promise.resolve(moduleName).then(function(p) {
67
67
  return /*#__PURE__*/ _interop_require_wildcard(require(p));
68
68
  }).then(function(mod) {
69
- var _mod_default;
70
- callback(null, (_mod_default = mod === null || mod === void 0 ? void 0 : mod.default) !== null && _mod_default !== void 0 ? _mod_default : null);
69
+ var _ref;
70
+ callback(null, (_ref = mod === null || mod === void 0 ? void 0 : mod.default) !== null && _ref !== void 0 ? _ref : null);
71
71
  }).catch(callback);
72
72
  } else {
73
73
  try {
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/lib/loadNodeVersionInstall.ts"],"sourcesContent":["import installModule from 'install-module-linked';\nimport type { InstallOptions, InstallResult } from 'node-version-install';\nimport path from 'path';\nimport url from 'url';\n\nconst _dirname = path.dirname(typeof __dirname !== 'undefined' ? __dirname : url.fileURLToPath(import.meta.url));\nconst nodeModules = path.join(_dirname, '..', '..', '..', 'node_modules');\nconst moduleName = 'node-version-install';\n\ntype InstallCallback = (err?: Error, results?: InstallResult[]) => void;\ntype InstallVersionFn = (version: string, options: InstallOptions, callback: InstallCallback) => void;\n\nlet cached: InstallVersionFn | undefined;\n\nfunction loadModule(moduleName, callback) {\n if (typeof require === 'undefined') {\n import(moduleName)\n .then((mod) => {\n callback(null, mod?.default ?? null);\n })\n .catch(callback);\n } else {\n try {\n callback(null, require(moduleName));\n } catch (err) {\n callback(err, null);\n }\n }\n}\n\nexport default function loadNodeVersionInstall(callback: (err: Error | null, installVersion: InstallVersionFn) => void): void {\n if (cached !== undefined) {\n callback(null, cached);\n return;\n }\n\n installModule(moduleName, nodeModules, {}, (err) => {\n if (err) return callback(err, null);\n loadModule(moduleName, (err, _cached: InstallVersionFn) => {\n if (err) return callback(err, null);\n cached = _cached;\n callback(null, cached);\n });\n });\n}\n"],"names":["loadNodeVersionInstall","_dirname","path","dirname","__dirname","url","fileURLToPath","nodeModules","join","moduleName","cached","loadModule","callback","require","then","mod","default","catch","err","undefined","installModule","_cached"],"mappings":";;;;+BA8BA;;;eAAwBA;;;0EA9BE;2DAET;0DACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEhB,IAAMC,WAAWC,aAAI,CAACC,OAAO,CAAC,OAAOC,cAAc,cAAcA,YAAYC,YAAG,CAACC,aAAa,CAAC;AAC/F,IAAMC,cAAcL,aAAI,CAACM,IAAI,CAACP,UAAU,MAAM,MAAM,MAAM;AAC1D,IAAMQ,aAAa;AAKnB,IAAIC;AAEJ,SAASC,WAAWF,UAAU,EAAEG,QAAQ;IACtC,IAAI,OAAOC,YAAY,aAAa;QAClC,gBAAOJ;2DAAP;WACGK,IAAI,CAAC,SAACC;gBACUA;YAAfH,SAAS,MAAMG,CAAAA,eAAAA,gBAAAA,0BAAAA,IAAKC,OAAO,cAAZD,0BAAAA,eAAgB;QACjC,GACCE,KAAK,CAACL;IACX,OAAO;QACL,IAAI;YACFA,SAAS,MAAMC,QAAQJ;QACzB,EAAE,OAAOS,KAAK;YACZN,SAASM,KAAK;QAChB;IACF;AACF;AAEe,SAASlB,uBAAuBY,QAAuE;IACpH,IAAIF,WAAWS,WAAW;QACxBP,SAAS,MAAMF;QACf;IACF;IAEAU,IAAAA,4BAAa,EAACX,YAAYF,aAAa,CAAC,GAAG,SAACW;QAC1C,IAAIA,KAAK,OAAON,SAASM,KAAK;QAC9BP,WAAWF,YAAY,SAACS,KAAKG;YAC3B,IAAIH,KAAK,OAAON,SAASM,KAAK;YAC9BR,SAASW;YACTT,SAAS,MAAMF;QACjB;IACF;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/lib/loadNodeVersionInstall.ts"],"sourcesContent":["import installModule from 'install-module-linked';\nimport type { InstallOptions, InstallResult } from 'node-version-install';\nimport path from 'path';\nimport url from 'url';\n\nconst _dirname = path.dirname(typeof __dirname !== 'undefined' ? __dirname : url.fileURLToPath(import.meta.url));\nconst nodeModules = path.join(_dirname, '..', '..', '..', 'node_modules');\nconst moduleName = 'node-version-install';\n\ntype InstallCallback = (err?: Error, results?: InstallResult[]) => void;\ntype InstallVersionFn = (version: string, options: InstallOptions, callback: InstallCallback) => void;\n\nlet cached: InstallVersionFn | undefined;\n\nfunction loadModule(moduleName, callback) {\n if (typeof require === 'undefined') {\n import(moduleName)\n .then((mod) => {\n callback(null, mod?.default ?? null);\n })\n .catch(callback);\n } else {\n try {\n callback(null, require(moduleName));\n } catch (err) {\n callback(err, null);\n }\n }\n}\n\nexport default function loadNodeVersionInstall(callback: (err: Error | null, installVersion: InstallVersionFn) => void): void {\n if (cached !== undefined) {\n callback(null, cached);\n return;\n }\n\n installModule(moduleName, nodeModules, {}, (err) => {\n if (err) return callback(err, null);\n loadModule(moduleName, (err, _cached: InstallVersionFn) => {\n if (err) return callback(err, null);\n cached = _cached;\n callback(null, cached);\n });\n });\n}\n"],"names":["loadNodeVersionInstall","_dirname","path","dirname","__dirname","url","fileURLToPath","nodeModules","join","moduleName","cached","loadModule","callback","require","then","mod","default","catch","err","undefined","installModule","_cached"],"mappings":";;;;+BA8BA;;;eAAwBA;;;0EA9BE;2DAET;0DACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEhB,IAAMC,WAAWC,aAAI,CAACC,OAAO,CAAC,OAAOC,cAAc,cAAcA,YAAYC,YAAG,CAACC,aAAa,CAAC;AAC/F,IAAMC,cAAcL,aAAI,CAACM,IAAI,CAACP,UAAU,MAAM,MAAM,MAAM;AAC1D,IAAMQ,aAAa;AAKnB,IAAIC;AAEJ,SAASC,WAAWF,UAAU,EAAEG,QAAQ;IACtC,IAAI,OAAOC,YAAY,aAAa;QAClC,gBAAOJ;2DAAP;WACGK,IAAI,CAAC,SAACC;;YACLH,SAAS,cAAMG,gBAAAA,0BAAAA,IAAKC,OAAO,uCAAI;QACjC,GACCC,KAAK,CAACL;IACX,OAAO;QACL,IAAI;YACFA,SAAS,MAAMC,QAAQJ;QACzB,EAAE,OAAOS,KAAK;YACZN,SAASM,KAAK;QAChB;IACF;AACF;AAEe,SAASlB,uBAAuBY,QAAuE;IACpH,IAAIF,WAAWS,WAAW;QACxBP,SAAS,MAAMF;QACf;IACF;IAEAU,IAAAA,4BAAa,EAACX,YAAYF,aAAa,CAAC,GAAG,SAACW;QAC1C,IAAIA,KAAK,OAAON,SAASM,KAAK;QAC9BP,WAAWF,YAAY,SAACS,KAAKG;YAC3B,IAAIH,KAAK,OAAON,SAASM,KAAK;YAC9BR,SAASW;YACTT,SAAS,MAAMF;QACjB;IACF;AACF"}
@@ -185,7 +185,7 @@ function worker(versionExpression, command, args, options, callback) {
185
185
  error: new Error("Unexpected version results for version ".concat(version, ". Install ").concat(JSON.stringify(installs))),
186
186
  result: null
187
187
  });
188
- return callback();
188
+ return cb();
189
189
  }
190
190
  var spawnOptions = (0, _nodeversionutils.spawnOptions)(install.installPath, options);
191
191
  var prefix = install.version;
@@ -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 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":["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 (!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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"}
@@ -0,0 +1,282 @@
1
+ const envPathKey = require('env-path-key');
2
+ const fs = require('fs');
3
+ const { safeRmSync } = require('fs-remove-compat');
4
+ const getFile = require('get-file-compat');
5
+ const mkdirp = require('mkdirp-classic');
6
+ const os = require('os');
7
+ const path = require('path');
8
+ const Queue = require('queue-cb');
9
+ const moduleRoot = require('module-root-sync');
10
+ const root = moduleRoot(__dirname);
11
+ // Configuration
12
+ const GITHUB_REPO = 'kmalakoff/node-version-use';
13
+ const BINARY_VERSION = require(path.join(root, 'package.json')).binaryVersion;
14
+ const isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);
15
+ const hasHomedir = typeof os.homedir === 'function';
16
+ function homedir() {
17
+ if (hasHomedir) return os.homedir();
18
+ const home = require('homedir-polyfill');
19
+ return home();
20
+ }
21
+ // Allow NVU_HOME override for testing
22
+ const storagePath = process.env.NVU_HOME || path.join(homedir(), '.nvu');
23
+ const hasTmpdir = typeof os.tmpdir === 'function';
24
+ function tmpdir() {
25
+ if (hasTmpdir) return os.tmpdir();
26
+ const osShim = require('os-shim');
27
+ return osShim.tmpdir();
28
+ }
29
+ function removeIfExistsSync(filePath) {
30
+ if (fs.existsSync(filePath)) {
31
+ try {
32
+ fs.unlinkSync(filePath);
33
+ } catch (_e) {
34
+ // ignore cleanup errors
35
+ }
36
+ }
37
+ }
38
+ /**
39
+ * Get the platform-specific archive base name (without extension)
40
+ */ function getArchiveBaseName() {
41
+ const { platform, arch } = process;
42
+ const platformMap = {
43
+ darwin: 'darwin',
44
+ linux: 'linux',
45
+ win32: 'win32'
46
+ };
47
+ const archMap = {
48
+ x64: 'x64',
49
+ arm64: 'arm64',
50
+ amd64: 'x64'
51
+ };
52
+ const platformName = platformMap[platform];
53
+ const archName = archMap[arch];
54
+ if (!platformName || !archName) return null;
55
+ return `nvu-binary-${platformName}-${archName}`;
56
+ }
57
+ /**
58
+ * Copy file
59
+ */ function copyFileSync(src, dest) {
60
+ const content = fs.readFileSync(src);
61
+ fs.writeFileSync(dest, content);
62
+ }
63
+ /**
64
+ * Atomic rename with fallback to copy+delete for cross-device moves
65
+ */ function atomicRename(src, dest, callback) {
66
+ fs.rename(src, dest, (err)=>{
67
+ if (!err) {
68
+ callback(null);
69
+ return;
70
+ }
71
+ // Cross-device link error - fall back to copy + delete
72
+ if (err.code === 'EXDEV') {
73
+ try {
74
+ copyFileSync(src, dest);
75
+ fs.unlinkSync(src);
76
+ callback(null);
77
+ } catch (copyErr) {
78
+ callback(copyErr);
79
+ }
80
+ return;
81
+ }
82
+ callback(err);
83
+ });
84
+ }
85
+ /**
86
+ * Extract archive to a directory (callback-based)
87
+ */ function extractArchive(archivePath, dest, callback) {
88
+ const Iterator = isWindows ? require('zip-iterator') : require('tar-iterator');
89
+ const stream = isWindows ? fs.createReadStream(archivePath) : fs.createReadStream(archivePath).pipe(require('zlib').createGunzip());
90
+ let iterator = new Iterator(stream);
91
+ // one by one
92
+ const links = [];
93
+ iterator.forEach((entry, callback)=>{
94
+ if (entry.type === 'link') {
95
+ links.unshift(entry);
96
+ callback();
97
+ } else if (entry.type === 'symlink') {
98
+ links.push(entry);
99
+ callback();
100
+ } else entry.create(dest, callback);
101
+ }, {
102
+ callbacks: true,
103
+ concurrency: 1
104
+ }, (_err)=>{
105
+ // create links after directories and files
106
+ const queue = new Queue();
107
+ for(let index = 0; index < links.length; index++){
108
+ const entry = links[index];
109
+ queue.defer(entry.create.bind(entry, dest));
110
+ }
111
+ queue.await((err)=>{
112
+ iterator.destroy();
113
+ iterator = null;
114
+ callback(err);
115
+ });
116
+ });
117
+ }
118
+ /**
119
+ * Install binaries using atomic rename pattern
120
+ * 1. Extract to temp directory
121
+ * 2. Copy binary to temp files in destination directory
122
+ * 3. Atomic rename temp files to final names
123
+ */ function extractAndInstall(archivePath, destDir, binaryName, callback) {
124
+ const ext = isWindows ? '.exe' : '';
125
+ // Create temp extraction directory
126
+ const tempExtractDir = path.join(tmpdir(), `nvu-extract-${Date.now()}`);
127
+ mkdirp.sync(tempExtractDir);
128
+ extractArchive(archivePath, tempExtractDir, (err)=>{
129
+ if (err) {
130
+ safeRmSync(tempExtractDir);
131
+ callback(err);
132
+ return;
133
+ }
134
+ const extractedPath = path.join(tempExtractDir, binaryName);
135
+ if (!fs.existsSync(extractedPath)) {
136
+ safeRmSync(tempExtractDir);
137
+ callback(new Error(`Extracted binary not found: ${binaryName}. ${archivePath} ${tempExtractDir}`));
138
+ return;
139
+ }
140
+ // Binary names to install
141
+ const binaries = [
142
+ 'node',
143
+ 'npm',
144
+ 'npx',
145
+ 'corepack'
146
+ ];
147
+ const timestamp = Date.now();
148
+ let installError = null;
149
+ // Step 1: Copy extracted binary to temp files in destination directory
150
+ // This ensures the temp files are on the same filesystem for atomic rename
151
+ for(let i = 0; i < binaries.length; i++){
152
+ const name = binaries[i];
153
+ const tempDest = path.join(destDir, `${name}.tmp-${timestamp}${ext}`);
154
+ try {
155
+ // Copy to temp file in destination directory
156
+ copyFileSync(extractedPath, tempDest);
157
+ // Set permissions on Unix
158
+ if (!isWindows) fs.chmodSync(tempDest, 0o755);
159
+ } catch (err) {
160
+ installError = err;
161
+ break;
162
+ }
163
+ }
164
+ if (installError) {
165
+ // Clean up any temp files we created
166
+ for(let j = 0; j < binaries.length; j++){
167
+ const tempPath = path.join(destDir, `${binaries[j]}.tmp-${timestamp}${ext}`);
168
+ removeIfExistsSync(tempPath);
169
+ }
170
+ safeRmSync(tempExtractDir);
171
+ callback(installError);
172
+ return;
173
+ }
174
+ // Step 2: Atomic rename temp files to final names
175
+ let renameError = null;
176
+ function doRename(index) {
177
+ if (index >= binaries.length) {
178
+ // All renames complete
179
+ safeRmSync(tempExtractDir);
180
+ callback(renameError);
181
+ return;
182
+ }
183
+ const name = binaries[index];
184
+ const tempDest = path.join(destDir, `${name}.tmp-${timestamp}${ext}`);
185
+ const finalDest = path.join(destDir, `${name}${ext}`);
186
+ // Remove existing file if present (for atomic replacement)
187
+ removeIfExistsSync(finalDest);
188
+ atomicRename(tempDest, finalDest, (err)=>{
189
+ if (err && !renameError) {
190
+ renameError = err;
191
+ }
192
+ doRename(index + 1);
193
+ });
194
+ }
195
+ doRename(0);
196
+ });
197
+ }
198
+ /**
199
+ * Print setup instructions
200
+ */ module.exports.printInstructions = function printInstructions() {
201
+ const nvuBinPath = path.join(storagePath, 'bin');
202
+ console.log('nvu binaries installed in ~/.nvu/bin/');
203
+ const pathKey = envPathKey();
204
+ const envPath = process.env[pathKey] || '';
205
+ if (envPath.indexOf('.nvu/bin') >= 0) return; // path exists
206
+ // provide instructions for path setup
207
+ console.log('');
208
+ console.log('============================================================');
209
+ console.log(' Global node setup');
210
+ console.log('============================================================');
211
+ console.log('');
212
+ if (isWindows) {
213
+ console.log(' PowerShell (add to $PROFILE):');
214
+ console.log(` $env:PATH = "${nvuBinPath};$env:PATH"`);
215
+ console.log('');
216
+ console.log(' CMD (run as administrator):');
217
+ console.log(` setx PATH "${nvuBinPath};%PATH%"`);
218
+ } else {
219
+ console.log(' # For bash (~/.bashrc):');
220
+ console.log(' echo \'export PATH="$HOME/.nvu/bin:$PATH"\' >> ~/.bashrc');
221
+ console.log('');
222
+ console.log(' # For zsh (~/.zshrc):');
223
+ console.log(' echo \'export PATH="$HOME/.nvu/bin:$PATH"\' >> ~/.zshrc');
224
+ console.log('');
225
+ console.log(' # For fish (~/.config/fish/config.fish):');
226
+ console.log(" echo 'set -gx PATH $HOME/.nvu/bin $PATH' >> ~/.config/fish/config.fish");
227
+ }
228
+ console.log('');
229
+ console.log('Then restart your terminal or source your shell profile.');
230
+ console.log('');
231
+ console.log("Without this, 'nvu 18 npm test' still works - you just won't have");
232
+ console.log("transparent 'node' command override.");
233
+ console.log('============================================================');
234
+ };
235
+ /**
236
+ * Main installation function
237
+ */ module.exports.installBinaries = function installBinaries(options, callback) {
238
+ const archiveBaseName = getArchiveBaseName();
239
+ if (!archiveBaseName) {
240
+ callback(new Error('Unsupported platform/architecture for binary.'));
241
+ return;
242
+ }
243
+ const extractedBinaryName = `${archiveBaseName}${isWindows ? '.exe' : ''}`;
244
+ const binDir = path.join(storagePath, 'bin');
245
+ // check if we need to upgrade
246
+ if (!options.force) {
247
+ try {
248
+ // already installed
249
+ if (fs.statSync(binDir)) {
250
+ if (fs.readFileSync(path.join(binDir, 'version.txt'), 'utf8') === BINARY_VERSION) {
251
+ callback(null, false);
252
+ return;
253
+ }
254
+ }
255
+ } catch (_err) {}
256
+ }
257
+ // Create directories
258
+ mkdirp.sync(storagePath);
259
+ mkdirp.sync(binDir);
260
+ const downloadUrl = `https://github.com/${GITHUB_REPO}/releases/download/binary-v${BINARY_VERSION}/${archiveBaseName}${isWindows ? '.zip' : '.tar.gz'}`;
261
+ const tempPath = path.join(tmpdir(), `nvu-binary-${Date.now()}${isWindows ? '.zip' : '.tar.gz'}`);
262
+ console.log(`Downloading binary for ${process.platform}-${process.arch}...`);
263
+ getFile(downloadUrl, tempPath, (err)=>{
264
+ if (err) {
265
+ removeIfExistsSync(tempPath);
266
+ callback(new Error(`No prebuilt binary available for ${process.platform}-${process.arch}. Download: ${downloadUrl}. Error: ${err.message}`));
267
+ return;
268
+ }
269
+ console.log('Extracting binary...');
270
+ extractAndInstall(tempPath, binDir, extractedBinaryName, (err)=>{
271
+ removeIfExistsSync(tempPath);
272
+ if (err) {
273
+ callback(err);
274
+ return;
275
+ }
276
+ // save binary version for upgrade checks
277
+ fs.writeFileSync(path.join(binDir, 'version.txt'), BINARY_VERSION, 'utf8');
278
+ console.log('Binary installed successfully!');
279
+ callback(null, true);
280
+ });
281
+ });
282
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/assets/installBinaries.cts"],"sourcesContent":["const envPathKey = require('env-path-key');\nconst fs = require('fs');\nconst { safeRmSync } = require('fs-remove-compat');\nconst getFile = require('get-file-compat');\nconst mkdirp = require('mkdirp-classic');\nconst os = require('os');\nconst path = require('path');\nconst Queue = require('queue-cb');\nconst moduleRoot = require('module-root-sync');\n\nconst root = moduleRoot(__dirname);\n\n// Configuration\nconst GITHUB_REPO = 'kmalakoff/node-version-use';\nconst BINARY_VERSION = require(path.join(root, 'package.json')).binaryVersion;\n\nconst isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\n\ntype Callback = (err?: Error | null) => void;\n\ninterface PlatformMap {\n [key: string]: string;\n}\n\nconst hasHomedir = typeof os.homedir === 'function';\nfunction homedir(): string {\n if (hasHomedir) return os.homedir();\n const home = require('homedir-polyfill');\n return home();\n}\n\n// Allow NVU_HOME override for testing\nconst storagePath = (process.env.NVU_HOME || path.join(homedir(), '.nvu')) as string;\n\nconst hasTmpdir = typeof os.tmpdir === 'function';\nfunction tmpdir(): string {\n if (hasTmpdir) return os.tmpdir();\n const osShim = require('os-shim');\n return osShim.tmpdir();\n}\n\nfunction removeIfExistsSync(filePath: string): void {\n if (fs.existsSync(filePath)) {\n try {\n fs.unlinkSync(filePath);\n } catch (_e) {\n // ignore cleanup errors\n }\n }\n}\n\n/**\n * Get the platform-specific archive base name (without extension)\n */\nfunction getArchiveBaseName(): string | null {\n const { platform, arch } = process;\n\n const platformMap: PlatformMap = {\n darwin: 'darwin',\n linux: 'linux',\n win32: 'win32',\n };\n\n const archMap: PlatformMap = {\n x64: 'x64',\n arm64: 'arm64',\n amd64: 'x64',\n };\n\n const platformName = platformMap[platform];\n const archName = archMap[arch];\n\n if (!platformName || !archName) return null;\n return `nvu-binary-${platformName}-${archName}`;\n}\n\n/**\n * Copy file\n */\nfunction copyFileSync(src: string, dest: string): void {\n const content = fs.readFileSync(src);\n fs.writeFileSync(dest, content);\n}\n\n/**\n * Atomic rename with fallback to copy+delete for cross-device moves\n */\nfunction atomicRename(src: string, dest: string, callback: Callback): void {\n fs.rename(src, dest, (err) => {\n if (!err) {\n callback(null);\n return;\n }\n\n // Cross-device link error - fall back to copy + delete\n if ((err as NodeJS.ErrnoException).code === 'EXDEV') {\n try {\n copyFileSync(src, dest);\n fs.unlinkSync(src);\n callback(null);\n } catch (copyErr) {\n callback(copyErr as Error);\n }\n return;\n }\n\n callback(err);\n });\n}\n\n/**\n * Extract archive to a directory (callback-based)\n */\nfunction extractArchive(archivePath: string, dest: string, callback: Callback): void {\n const Iterator = isWindows ? require('zip-iterator') : require('tar-iterator');\n const stream = isWindows ? fs.createReadStream(archivePath) : fs.createReadStream(archivePath).pipe(require('zlib').createGunzip());\n let iterator = new Iterator(stream);\n\n // one by one\n const links = [];\n iterator.forEach(\n (entry, callback) => {\n if (entry.type === 'link') {\n links.unshift(entry);\n callback();\n } else if (entry.type === 'symlink') {\n links.push(entry);\n callback();\n } else entry.create(dest, callback);\n },\n { callbacks: true, concurrency: 1 },\n (_err) => {\n // create links after directories and files\n const queue = new Queue();\n for (let index = 0; index < links.length; index++) {\n const entry = links[index];\n queue.defer(entry.create.bind(entry, dest));\n }\n queue.await((err) => {\n iterator.destroy();\n iterator = null;\n callback(err);\n });\n }\n );\n}\n\n/**\n * Install binaries using atomic rename pattern\n * 1. Extract to temp directory\n * 2. Copy binary to temp files in destination directory\n * 3. Atomic rename temp files to final names\n */\nfunction extractAndInstall(archivePath: string, destDir: string, binaryName: string, callback: Callback): void {\n const ext = isWindows ? '.exe' : '';\n\n // Create temp extraction directory\n const tempExtractDir = path.join(tmpdir(), `nvu-extract-${Date.now()}`);\n mkdirp.sync(tempExtractDir);\n\n extractArchive(archivePath, tempExtractDir, (err) => {\n if (err) {\n safeRmSync(tempExtractDir);\n callback(err);\n return;\n }\n\n const extractedPath = path.join(tempExtractDir, binaryName);\n if (!fs.existsSync(extractedPath)) {\n safeRmSync(tempExtractDir);\n callback(new Error(`Extracted binary not found: ${binaryName}. ${archivePath} ${tempExtractDir}`));\n return;\n }\n\n // Binary names to install\n const binaries = ['node', 'npm', 'npx', 'corepack'];\n const timestamp = Date.now();\n let installError: Error | null = null;\n\n // Step 1: Copy extracted binary to temp files in destination directory\n // This ensures the temp files are on the same filesystem for atomic rename\n for (let i = 0; i < binaries.length; i++) {\n const name = binaries[i];\n const tempDest = path.join(destDir, `${name}.tmp-${timestamp}${ext}`);\n\n try {\n // Copy to temp file in destination directory\n copyFileSync(extractedPath, tempDest);\n\n // Set permissions on Unix\n if (!isWindows) fs.chmodSync(tempDest, 0o755);\n } catch (err) {\n installError = err as Error;\n break;\n }\n }\n\n if (installError) {\n // Clean up any temp files we created\n for (let j = 0; j < binaries.length; j++) {\n const tempPath = path.join(destDir, `${binaries[j]}.tmp-${timestamp}${ext}`);\n removeIfExistsSync(tempPath);\n }\n safeRmSync(tempExtractDir);\n callback(installError);\n return;\n }\n\n // Step 2: Atomic rename temp files to final names\n let renameError: Error | null = null;\n\n function doRename(index: number): void {\n if (index >= binaries.length) {\n // All renames complete\n safeRmSync(tempExtractDir);\n callback(renameError);\n return;\n }\n\n const name = binaries[index];\n const tempDest = path.join(destDir, `${name}.tmp-${timestamp}${ext}`);\n const finalDest = path.join(destDir, `${name}${ext}`);\n\n // Remove existing file if present (for atomic replacement)\n removeIfExistsSync(finalDest);\n\n atomicRename(tempDest, finalDest, (err) => {\n if (err && !renameError) {\n renameError = err;\n }\n doRename(index + 1);\n });\n }\n\n doRename(0);\n });\n}\n\n/**\n * Print setup instructions\n */\nmodule.exports.printInstructions = function printInstructions(): void {\n const nvuBinPath = path.join(storagePath, 'bin');\n\n console.log('nvu binaries installed in ~/.nvu/bin/');\n\n const pathKey = envPathKey();\n const envPath = process.env[pathKey] || '';\n if (envPath.indexOf('.nvu/bin') >= 0) return; // path exists\n\n // provide instructions for path setup\n console.log('');\n console.log('============================================================');\n console.log(' Global node setup');\n console.log('============================================================');\n console.log('');\n if (isWindows) {\n console.log(' PowerShell (add to $PROFILE):');\n console.log(` $env:PATH = \"${nvuBinPath};$env:PATH\"`);\n console.log('');\n console.log(' CMD (run as administrator):');\n console.log(` setx PATH \"${nvuBinPath};%PATH%\"`);\n } else {\n console.log(' # For bash (~/.bashrc):');\n console.log(' echo \\'export PATH=\"$HOME/.nvu/bin:$PATH\"\\' >> ~/.bashrc');\n console.log('');\n console.log(' # For zsh (~/.zshrc):');\n console.log(' echo \\'export PATH=\"$HOME/.nvu/bin:$PATH\"\\' >> ~/.zshrc');\n console.log('');\n console.log(' # For fish (~/.config/fish/config.fish):');\n console.log(\" echo 'set -gx PATH $HOME/.nvu/bin $PATH' >> ~/.config/fish/config.fish\");\n }\n\n console.log('');\n console.log('Then restart your terminal or source your shell profile.');\n console.log('');\n console.log(\"Without this, 'nvu 18 npm test' still works - you just won't have\");\n console.log(\"transparent 'node' command override.\");\n console.log('============================================================');\n};\n\n/**\n * Main installation function\n */\nmodule.exports.installBinaries = function installBinaries(options, callback): void {\n const archiveBaseName = getArchiveBaseName();\n\n if (!archiveBaseName) {\n callback(new Error('Unsupported platform/architecture for binary.'));\n return;\n }\n\n const extractedBinaryName = `${archiveBaseName}${isWindows ? '.exe' : ''}`;\n const binDir = path.join(storagePath, 'bin');\n\n // check if we need to upgrade\n if (!options.force) {\n try {\n // already installed\n if (fs.statSync(binDir)) {\n if (fs.readFileSync(path.join(binDir, 'version.txt'), 'utf8') === BINARY_VERSION) {\n callback(null, false);\n return;\n }\n }\n } catch (_err) {}\n }\n\n // Create directories\n mkdirp.sync(storagePath);\n mkdirp.sync(binDir);\n\n const downloadUrl = `https://github.com/${GITHUB_REPO}/releases/download/binary-v${BINARY_VERSION}/${archiveBaseName}${isWindows ? '.zip' : '.tar.gz'}`;\n const tempPath = path.join(tmpdir(), `nvu-binary-${Date.now()}${isWindows ? '.zip' : '.tar.gz'}`);\n\n console.log(`Downloading binary for ${process.platform}-${process.arch}...`);\n\n getFile(downloadUrl, tempPath, (err) => {\n if (err) {\n removeIfExistsSync(tempPath);\n callback(new Error(`No prebuilt binary available for ${process.platform}-${process.arch}. Download: ${downloadUrl}. Error: ${err.message}`));\n return;\n }\n\n console.log('Extracting binary...');\n\n extractAndInstall(tempPath, binDir, extractedBinaryName, (err) => {\n removeIfExistsSync(tempPath);\n if (err) {\n callback(err);\n return;\n }\n\n // save binary version for upgrade checks\n fs.writeFileSync(path.join(binDir, 'version.txt'), BINARY_VERSION, 'utf8');\n console.log('Binary installed successfully!');\n callback(null, true);\n });\n });\n};\n"],"names":["envPathKey","require","fs","safeRmSync","getFile","mkdirp","os","path","Queue","moduleRoot","root","__dirname","GITHUB_REPO","BINARY_VERSION","join","binaryVersion","isWindows","process","platform","test","env","OSTYPE","hasHomedir","homedir","home","storagePath","NVU_HOME","hasTmpdir","tmpdir","osShim","removeIfExistsSync","filePath","existsSync","unlinkSync","_e","getArchiveBaseName","arch","platformMap","darwin","linux","win32","archMap","x64","arm64","amd64","platformName","archName","copyFileSync","src","dest","content","readFileSync","writeFileSync","atomicRename","callback","rename","err","code","copyErr","extractArchive","archivePath","Iterator","stream","createReadStream","pipe","createGunzip","iterator","links","forEach","entry","type","unshift","push","create","callbacks","concurrency","_err","queue","index","length","defer","bind","await","destroy","extractAndInstall","destDir","binaryName","ext","tempExtractDir","Date","now","sync","extractedPath","Error","binaries","timestamp","installError","i","name","tempDest","chmodSync","j","tempPath","renameError","doRename","finalDest","module","exports","printInstructions","nvuBinPath","console","log","pathKey","envPath","indexOf","installBinaries","options","archiveBaseName","extractedBinaryName","binDir","force","statSync","downloadUrl","message"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};