node-version-use 2.4.2 → 2.4.4

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.
@@ -8,6 +8,7 @@ var os = require('os');
8
8
  var path = require('path');
9
9
  var Queue = require('queue-cb');
10
10
  var moduleRoot = require('module-root-sync');
11
+ var cpuArch = require('cpu-arch');
11
12
  var root = moduleRoot(__dirname);
12
13
  // Configuration
13
14
  var GITHUB_REPO = 'kmalakoff/node-version-use';
@@ -95,7 +96,8 @@ function removeIfExistsSync(filePath) {
95
96
  /**
96
97
  * Get the platform-specific archive base name (without extension)
97
98
  */ function getArchiveBaseName() {
98
- var platform = process.platform, arch = process.arch;
99
+ var platform = process.platform;
100
+ var arch = cpuArch();
99
101
  var platformMap = {
100
102
  darwin: 'darwin',
101
103
  linux: 'linux',
@@ -224,6 +226,13 @@ function removeIfExistsSync(filePath) {
224
226
  * 2. Copy binary to temp files in destination directory
225
227
  * 3. Atomic rename temp files to final names
226
228
  */ function extractAndInstall(archivePath, destDir, binaryName, callback) {
229
+ var binaries = [
230
+ 'nvu',
231
+ 'node',
232
+ 'npm',
233
+ 'npx',
234
+ 'corepack'
235
+ ];
227
236
  var ext = isWindows ? '.exe' : '';
228
237
  // Create temp extraction directory
229
238
  var tempExtractDir = path.join(tmpdir(), "nvu-extract-".concat(Date.now()));
@@ -241,12 +250,6 @@ function removeIfExistsSync(filePath) {
241
250
  return;
242
251
  }
243
252
  // Binary names to install
244
- var binaries = [
245
- 'node',
246
- 'npm',
247
- 'npx',
248
- 'corepack'
249
- ];
250
253
  var timestamp = Date.now();
251
254
  var installError = null;
252
255
  // Step 1: Copy extracted binary to temp files in destination directory
@@ -303,7 +306,7 @@ function removeIfExistsSync(filePath) {
303
306
  */ module.exports.printInstructions = function printInstructions() {
304
307
  var _nvuBinPath = path.join(storagePath, 'bin');
305
308
  console.log('nvu binaries installed in ~/.nvu/bin/');
306
- var pathKey = envPathKey();
309
+ var pathKey = envPathKey(); // PATH or Path or similar
307
310
  var envPath = process.env[pathKey] || '';
308
311
  if (envPath.indexOf('.nvu/bin') >= 0) return; // path exists
309
312
  // provide instructions for path setup
@@ -384,12 +387,12 @@ function removeIfExistsSync(filePath) {
384
387
  return;
385
388
  }
386
389
  // Download to temp file
387
- console.log("Downloading binary for ".concat(process.platform, "-").concat(process.arch, "..."));
390
+ console.log("Downloading binary for ".concat(archiveBaseName, "..."));
388
391
  var tempPath = path.join(tmpdir(), "nvu-binary-".concat(Date.now()).concat(isWindows ? '.zip' : '.tar.gz'));
389
392
  getFile(downloadUrl, tempPath, function(err) {
390
393
  if (err) {
391
394
  removeIfExistsSync(tempPath);
392
- callback(new Error("No prebuilt binary available for ".concat(process.platform, "-").concat(process.arch, ". Download: ").concat(downloadUrl, ". Error: ").concat(err.message)));
395
+ callback(new Error("No prebuilt binary available for ".concat(archiveBaseName, ". Download: ").concat(downloadUrl, ". Error: ").concat(err.message)));
393
396
  return;
394
397
  }
395
398
  // Copy to cache for future use
@@ -8,6 +8,7 @@ var os = require('os');
8
8
  var path = require('path');
9
9
  var Queue = require('queue-cb');
10
10
  var moduleRoot = require('module-root-sync');
11
+ var cpuArch = require('cpu-arch');
11
12
  var root = moduleRoot(__dirname);
12
13
  // Configuration
13
14
  var GITHUB_REPO = 'kmalakoff/node-version-use';
@@ -95,7 +96,8 @@ function removeIfExistsSync(filePath) {
95
96
  /**
96
97
  * Get the platform-specific archive base name (without extension)
97
98
  */ function getArchiveBaseName() {
98
- var platform = process.platform, arch = process.arch;
99
+ var platform = process.platform;
100
+ var arch = cpuArch();
99
101
  var platformMap = {
100
102
  darwin: 'darwin',
101
103
  linux: 'linux',
@@ -224,6 +226,13 @@ function removeIfExistsSync(filePath) {
224
226
  * 2. Copy binary to temp files in destination directory
225
227
  * 3. Atomic rename temp files to final names
226
228
  */ function extractAndInstall(archivePath, destDir, binaryName, callback) {
229
+ var binaries = [
230
+ 'nvu',
231
+ 'node',
232
+ 'npm',
233
+ 'npx',
234
+ 'corepack'
235
+ ];
227
236
  var ext = isWindows ? '.exe' : '';
228
237
  // Create temp extraction directory
229
238
  var tempExtractDir = path.join(tmpdir(), "nvu-extract-".concat(Date.now()));
@@ -241,12 +250,6 @@ function removeIfExistsSync(filePath) {
241
250
  return;
242
251
  }
243
252
  // Binary names to install
244
- var binaries = [
245
- 'node',
246
- 'npm',
247
- 'npx',
248
- 'corepack'
249
- ];
250
253
  var timestamp = Date.now();
251
254
  var installError = null;
252
255
  // Step 1: Copy extracted binary to temp files in destination directory
@@ -303,7 +306,7 @@ function removeIfExistsSync(filePath) {
303
306
  */ module.exports.printInstructions = function printInstructions() {
304
307
  var _nvuBinPath = path.join(storagePath, 'bin');
305
308
  console.log('nvu binaries installed in ~/.nvu/bin/');
306
- var pathKey = envPathKey();
309
+ var pathKey = envPathKey(); // PATH or Path or similar
307
310
  var envPath = process.env[pathKey] || '';
308
311
  if (envPath.indexOf('.nvu/bin') >= 0) return; // path exists
309
312
  // provide instructions for path setup
@@ -384,12 +387,12 @@ function removeIfExistsSync(filePath) {
384
387
  return;
385
388
  }
386
389
  // Download to temp file
387
- console.log("Downloading binary for ".concat(process.platform, "-").concat(process.arch, "..."));
390
+ console.log("Downloading binary for ".concat(archiveBaseName, "..."));
388
391
  var tempPath = path.join(tmpdir(), "nvu-binary-".concat(Date.now()).concat(isWindows ? '.zip' : '.tar.gz'));
389
392
  getFile(downloadUrl, tempPath, function(err) {
390
393
  if (err) {
391
394
  removeIfExistsSync(tempPath);
392
- callback(new Error("No prebuilt binary available for ".concat(process.platform, "-").concat(process.arch, ". Download: ").concat(downloadUrl, ". Error: ").concat(err.message)));
395
+ callback(new Error("No prebuilt binary available for ".concat(archiveBaseName, ". Download: ").concat(downloadUrl, ". Error: ").concat(err.message)));
393
396
  return;
394
397
  }
395
398
  // Copy to cache for future use
@@ -1 +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 * Move a file out of the way (works even if running on Windows)\n * First tries to unlink; if that fails (Windows locked), rename to .old-timestamp\n */\nfunction moveOutOfWay(filePath: string): void {\n if (!fs.existsSync(filePath)) return;\n\n // First try to unlink (works on Unix, fails on Windows if running)\n try {\n fs.unlinkSync(filePath);\n return;\n } catch (_e) {\n // Unlink failed (likely Windows locked file), try rename\n }\n\n // Rename to .old-timestamp as fallback\n const timestamp = Date.now();\n const oldPath = `${filePath}.old-${timestamp}`;\n\n try {\n fs.renameSync(filePath, oldPath);\n } catch (_e2) {\n // Both unlink and rename failed - will fail on atomic rename instead\n }\n}\n\n/**\n * Clean up old .old-* files from previous installs\n */\nfunction cleanupOldFiles(dir: string): void {\n try {\n const entries = fs.readdirSync(dir);\n for (const entry of entries) {\n if (entry.includes('.old-')) {\n try {\n fs.unlinkSync(path.join(dir, entry));\n } catch (_e) {\n // ignore - file may still be in use\n }\n }\n }\n } catch (_e) {\n // ignore if dir doesn't exist\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 * Sync all shims by copying the nvu binary to all other files in the bin directory\n * All shims (node, npm, npx, corepack, eslint, etc.) are copies of the same binary\n */\nmodule.exports.syncAllShims = function syncAllShims(binDir: string): void {\n const isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\n const ext = isWindows ? '.exe' : '';\n\n // Source: nvu binary\n const nvuSource = path.join(binDir, `nvu${ext}`);\n if (!fs.existsSync(nvuSource)) return;\n\n try {\n const entries = fs.readdirSync(binDir);\n for (const name of entries) {\n // Skip nvu itself and nvu.json\n if (name === `nvu${ext}` || name === 'nvu.json') continue;\n\n // On Windows, only process .exe files\n if (isWindows && !name.endsWith('.exe')) continue;\n\n const shimPath = path.join(binDir, name);\n const stat = fs.statSync(shimPath);\n if (!stat.isFile()) continue;\n\n // Move existing file out of the way (Windows compatibility)\n moveOutOfWay(shimPath);\n\n // Copy nvu binary to shim\n copyFileSync(nvuSource, shimPath);\n\n // Make executable on Unix\n if (!isWindows) {\n fs.chmodSync(shimPath, 0o755);\n }\n }\n } catch (_e) {\n // Ignore errors - shim sync is best effort\n }\n};\n\n/**\n * Atomic rename with fallback to copy+delete for cross-device moves\n */\nfunction atomicRename(src: string, dest: string, callback: Callback) {\n fs.rename(src, dest, (err) => {\n if (!err) return callback(null);\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) {\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) {\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 // Move existing file out of the way (works even if running on Windows)\n moveOutOfWay(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(' # Edit your PowerShell profile');\n console.log(' # Open with: notepad $PROFILE');\n console.log(' # Add this line:');\n console.log(' $env:PATH = \"$HOME\\\\.nvu\\\\bin;$env:APPDATA\\\\npm;$env:PATH\"');\n console.log('');\n console.log(' # This adds:');\n console.log(' # ~/.nvu/bin - node/npm version switching shims');\n console.log(' # %APPDATA%/npm - globally installed npm packages (like nvu)');\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 const nvuJsonPath = path.join(binDir, 'nvu.json');\n\n // check if we need to upgrade\n if (!options.force) {\n try {\n // already installed - read nvu.json\n const nvuJson = JSON.parse(fs.readFileSync(nvuJsonPath, 'utf8'));\n if (nvuJson.binaryVersion === BINARY_VERSION) {\n callback(null, false);\n return;\n }\n } catch (_err) {}\n }\n\n // Create directories\n mkdirp.sync(storagePath);\n mkdirp.sync(binDir);\n mkdirp.sync(path.join(storagePath, 'cache'));\n\n // Clean up old .old-* files from previous installs\n cleanupOldFiles(binDir);\n\n const downloadUrl = `https://github.com/${GITHUB_REPO}/releases/download/binary-v${BINARY_VERSION}/${archiveBaseName}${isWindows ? '.zip' : '.tar.gz'}`;\n const cachePath = path.join(storagePath, 'cache', `${archiveBaseName}${isWindows ? '.zip' : '.tar.gz'}`);\n\n // Check cache first\n if (fs.existsSync(cachePath)) {\n console.log('Using cached binary...');\n\n // Use cached file\n extractAndInstall(cachePath, binDir, extractedBinaryName, (err) => {\n if (err) return callback(err);\n\n // save binary version for upgrade checks\n fs.writeFileSync(nvuJsonPath, JSON.stringify({ binaryVersion: BINARY_VERSION }, null, 2), 'utf8');\n console.log('Binary installed successfully!');\n callback(null, true);\n });\n return;\n }\n\n // Download to temp file\n console.log(`Downloading binary for ${process.platform}-${process.arch}...`);\n const tempPath = path.join(tmpdir(), `nvu-binary-${Date.now()}${isWindows ? '.zip' : '.tar.gz'}`);\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 // Copy to cache for future use\n try {\n copyFileSync(tempPath, cachePath);\n } catch (_e) {\n // Cache write failed, continue anyway\n }\n\n extractAndInstall(tempPath, binDir, extractedBinaryName, (err) => {\n removeIfExistsSync(tempPath);\n if (err) return callback(err);\n\n // save binary version for upgrade checks\n fs.writeFileSync(nvuJsonPath, JSON.stringify({ binaryVersion: BINARY_VERSION }, null, 2), '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","moveOutOfWay","timestamp","Date","now","oldPath","renameSync","_e2","cleanupOldFiles","dir","entries","readdirSync","entry","includes","getArchiveBaseName","arch","platformMap","darwin","linux","win32","archMap","x64","arm64","amd64","platformName","archName","copyFileSync","src","dest","content","readFileSync","writeFileSync","module","exports","syncAllShims","binDir","ext","nvuSource","name","endsWith","shimPath","stat","statSync","isFile","chmodSync","atomicRename","callback","rename","err","code","copyErr","extractArchive","archivePath","Iterator","stream","createReadStream","pipe","createGunzip","iterator","links","forEach","type","unshift","push","create","callbacks","concurrency","_err","queue","index","length","defer","bind","await","destroy","extractAndInstall","destDir","binaryName","tempExtractDir","sync","extractedPath","Error","binaries","installError","i","tempDest","j","tempPath","renameError","doRename","finalDest","printInstructions","_nvuBinPath","console","log","pathKey","envPath","indexOf","installBinaries","options","archiveBaseName","extractedBinaryName","nvuJsonPath","force","nvuJson","JSON","parse","downloadUrl","cachePath","stringify","message"],"mappings":"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"}
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');\nconst cpuArch = require('cpu-arch');\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 * Move a file out of the way (works even if running on Windows)\n * First tries to unlink; if that fails (Windows locked), rename to .old-timestamp\n */\nfunction moveOutOfWay(filePath: string): void {\n if (!fs.existsSync(filePath)) return;\n\n // First try to unlink (works on Unix, fails on Windows if running)\n try {\n fs.unlinkSync(filePath);\n return;\n } catch (_e) {\n // Unlink failed (likely Windows locked file), try rename\n }\n\n // Rename to .old-timestamp as fallback\n const timestamp = Date.now();\n const oldPath = `${filePath}.old-${timestamp}`;\n\n try {\n fs.renameSync(filePath, oldPath);\n } catch (_e2) {\n // Both unlink and rename failed - will fail on atomic rename instead\n }\n}\n\n/**\n * Clean up old .old-* files from previous installs\n */\nfunction cleanupOldFiles(dir: string): void {\n try {\n const entries = fs.readdirSync(dir);\n for (const entry of entries) {\n if (entry.includes('.old-')) {\n try {\n fs.unlinkSync(path.join(dir, entry));\n } catch (_e) {\n // ignore - file may still be in use\n }\n }\n }\n } catch (_e) {\n // ignore if dir doesn't exist\n }\n}\n\n/**\n * Get the platform-specific archive base name (without extension)\n */\nfunction getArchiveBaseName(): string | null {\n const { platform } = process;\n const arch = cpuArch();\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 * Sync all shims by copying the nvu binary to all other files in the bin directory\n * All shims (node, npm, npx, corepack, eslint, etc.) are copies of the same binary\n */\nmodule.exports.syncAllShims = function syncAllShims(binDir: string): void {\n const isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\n const ext = isWindows ? '.exe' : '';\n\n // Source: nvu binary\n const nvuSource = path.join(binDir, `nvu${ext}`);\n if (!fs.existsSync(nvuSource)) return;\n\n try {\n const entries = fs.readdirSync(binDir);\n for (const name of entries) {\n // Skip nvu itself and nvu.json\n if (name === `nvu${ext}` || name === 'nvu.json') continue;\n\n // On Windows, only process .exe files\n if (isWindows && !name.endsWith('.exe')) continue;\n\n const shimPath = path.join(binDir, name);\n const stat = fs.statSync(shimPath);\n if (!stat.isFile()) continue;\n\n // Move existing file out of the way (Windows compatibility)\n moveOutOfWay(shimPath);\n\n // Copy nvu binary to shim\n copyFileSync(nvuSource, shimPath);\n\n // Make executable on Unix\n if (!isWindows) {\n fs.chmodSync(shimPath, 0o755);\n }\n }\n } catch (_e) {\n // Ignore errors - shim sync is best effort\n }\n};\n\n/**\n * Atomic rename with fallback to copy+delete for cross-device moves\n */\nfunction atomicRename(src: string, dest: string, callback: Callback) {\n fs.rename(src, dest, (err) => {\n if (!err) return callback(null);\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) {\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) {\n const binaries = ['nvu', 'node', 'npm', 'npx', 'corepack'];\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 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 // Move existing file out of the way (works even if running on Windows)\n moveOutOfWay(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(); // PATH or Path or similar\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(' # Edit your PowerShell profile');\n console.log(' # Open with: notepad $PROFILE');\n console.log(' # Add this line:');\n console.log(' $env:PATH = \"$HOME\\\\.nvu\\\\bin;$env:APPDATA\\\\npm;$env:PATH\"');\n console.log('');\n console.log(' # This adds:');\n console.log(' # ~/.nvu/bin - node/npm version switching shims');\n console.log(' # %APPDATA%/npm - globally installed npm packages (like nvu)');\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 const nvuJsonPath = path.join(binDir, 'nvu.json');\n\n // check if we need to upgrade\n if (!options.force) {\n try {\n // already installed - read nvu.json\n const nvuJson = JSON.parse(fs.readFileSync(nvuJsonPath, 'utf8'));\n if (nvuJson.binaryVersion === BINARY_VERSION) {\n callback(null, false);\n return;\n }\n } catch (_err) {}\n }\n\n // Create directories\n mkdirp.sync(storagePath);\n mkdirp.sync(binDir);\n mkdirp.sync(path.join(storagePath, 'cache'));\n\n // Clean up old .old-* files from previous installs\n cleanupOldFiles(binDir);\n\n const downloadUrl = `https://github.com/${GITHUB_REPO}/releases/download/binary-v${BINARY_VERSION}/${archiveBaseName}${isWindows ? '.zip' : '.tar.gz'}`;\n const cachePath = path.join(storagePath, 'cache', `${archiveBaseName}${isWindows ? '.zip' : '.tar.gz'}`);\n\n // Check cache first\n if (fs.existsSync(cachePath)) {\n console.log('Using cached binary...');\n\n // Use cached file\n extractAndInstall(cachePath, binDir, extractedBinaryName, (err) => {\n if (err) return callback(err);\n\n // save binary version for upgrade checks\n fs.writeFileSync(nvuJsonPath, JSON.stringify({ binaryVersion: BINARY_VERSION }, null, 2), 'utf8');\n console.log('Binary installed successfully!');\n callback(null, true);\n });\n return;\n }\n\n // Download to temp file\n console.log(`Downloading binary for ${archiveBaseName}...`);\n const tempPath = path.join(tmpdir(), `nvu-binary-${Date.now()}${isWindows ? '.zip' : '.tar.gz'}`);\n\n getFile(downloadUrl, tempPath, (err) => {\n if (err) {\n removeIfExistsSync(tempPath);\n callback(new Error(`No prebuilt binary available for ${archiveBaseName}. Download: ${downloadUrl}. Error: ${err.message}`));\n return;\n }\n\n // Copy to cache for future use\n try {\n copyFileSync(tempPath, cachePath);\n } catch (_e) {\n // Cache write failed, continue anyway\n }\n\n extractAndInstall(tempPath, binDir, extractedBinaryName, (err) => {\n removeIfExistsSync(tempPath);\n if (err) return callback(err);\n\n // save binary version for upgrade checks\n fs.writeFileSync(nvuJsonPath, JSON.stringify({ binaryVersion: BINARY_VERSION }, null, 2), '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","cpuArch","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","moveOutOfWay","timestamp","Date","now","oldPath","renameSync","_e2","cleanupOldFiles","dir","entries","readdirSync","entry","includes","getArchiveBaseName","arch","platformMap","darwin","linux","win32","archMap","x64","arm64","amd64","platformName","archName","copyFileSync","src","dest","content","readFileSync","writeFileSync","module","exports","syncAllShims","binDir","ext","nvuSource","name","endsWith","shimPath","stat","statSync","isFile","chmodSync","atomicRename","callback","rename","err","code","copyErr","extractArchive","archivePath","Iterator","stream","createReadStream","pipe","createGunzip","iterator","links","forEach","type","unshift","push","create","callbacks","concurrency","_err","queue","index","length","defer","bind","await","destroy","extractAndInstall","destDir","binaryName","binaries","tempExtractDir","sync","extractedPath","Error","installError","i","tempDest","j","tempPath","renameError","doRename","finalDest","printInstructions","_nvuBinPath","console","log","pathKey","envPath","indexOf","installBinaries","options","archiveBaseName","extractedBinaryName","nvuJsonPath","force","nvuJson","JSON","parse","downloadUrl","cachePath","stringify","message"],"mappings":"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"}
@@ -26,9 +26,11 @@ var isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.e
26
26
  function teardownCmd(_args) {
27
27
  var binDir = _path.default.join(_constantsts.storagePath, 'bin');
28
28
  var binaries = [
29
+ 'nvu',
29
30
  'node',
30
31
  'npm',
31
- 'npx'
32
+ 'npx',
33
+ 'corepack'
32
34
  ];
33
35
  var ext = isWindows ? '.exe' : '';
34
36
  var removed = 0;
@@ -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\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
+ {"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 const binaries = ['nvu', 'node', 'npm', 'npx', 'corepack'];\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;IACtC,IAAMC,WAAW;QAAC;QAAO;QAAQ;QAAO;QAAO;KAAW;IAC1D,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"}
@@ -19,6 +19,7 @@ _export(exports, {
19
19
  return resolveSystemBinary;
20
20
  }
21
21
  });
22
+ var _envpathkey = /*#__PURE__*/ _interop_require_default(require("env-path-key"));
22
23
  var _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
23
24
  var _path = /*#__PURE__*/ _interop_require_default(require("path"));
24
25
  var _compatts = require("../compat.js");
@@ -29,12 +30,12 @@ function _interop_require_default(obj) {
29
30
  }
30
31
  var isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);
31
32
  var nvuBinDir = _path.default.join((0, _compatts.homedir)(), '.nvu', 'bin');
33
+ var pathKey = (0, _envpathkey.default)(); // PATH or Path or similar
34
+ var pathDelimiter = _path.default.delimiter ? _path.default.delimiter : isWindows ? ';' : ':';
32
35
  /**
33
36
  * Check if two paths are equal (case-insensitive on Windows)
34
37
  */ function pathsEqual(a, b) {
35
- if (isWindows) {
36
- return a.toLowerCase() === b.toLowerCase();
37
- }
38
+ if (isWindows) return a.toLowerCase() === b.toLowerCase();
38
39
  return a === b;
39
40
  }
40
41
  /**
@@ -48,9 +49,8 @@ var nvuBinDir = _path.default.join((0, _compatts.homedir)(), '.nvu', 'bin');
48
49
  }
49
50
  }
50
51
  function resolveSystemBinary(name) {
51
- var pathEnv = process.env.PATH || '';
52
- var pathSep = isWindows ? ';' : ':';
53
- var dirs = pathEnv.split(pathSep);
52
+ var pathEnv = process.env[pathKey] || '';
53
+ var dirs = pathEnv.split(pathDelimiter);
54
54
  for(var i = 0; i < dirs.length; i++){
55
55
  var dir = dirs[i];
56
56
  if (!dir) continue;
@@ -80,9 +80,8 @@ function resolveSystemBinary(name) {
80
80
  return null;
81
81
  }
82
82
  function getPathWithoutNvuBin() {
83
- var pathEnv = process.env.PATH || '';
84
- var pathSep = isWindows ? ';' : ':';
85
- var dirs = pathEnv.split(pathSep);
83
+ var pathEnv = process.env[pathKey] || '';
84
+ var dirs = pathEnv.split(pathDelimiter);
86
85
  var filtered = [];
87
86
  for(var i = 0; i < dirs.length; i++){
88
87
  var dir = dirs[i];
@@ -91,6 +90,6 @@ function getPathWithoutNvuBin() {
91
90
  if (dir.indexOf(_path.default.join('.nvu', 'bin')) >= 0) continue;
92
91
  filtered.push(dir);
93
92
  }
94
- return filtered.join(pathSep);
93
+ return filtered.join(pathDelimiter);
95
94
  }
96
95
  /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/lib/resolveSystemBinary.ts"],"sourcesContent":["/**\n * Resolve system binaries by searching PATH while excluding ~/.nvu/bin\n * This mirrors the Go binary's findSystemBinary() function\n */\nimport fs from 'fs';\nimport path from 'path';\nimport { homedir } from '../compat.ts';\n\nconst isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\nconst nvuBinDir = path.join(homedir(), '.nvu', 'bin');\n\n/**\n * Check if two paths are equal (case-insensitive on Windows)\n */\nfunction pathsEqual(a: string, b: string): boolean {\n if (isWindows) {\n return a.toLowerCase() === b.toLowerCase();\n }\n return a === b;\n}\n\n/**\n * Check if a path is within the nvu bin directory\n */\nfunction isInNvuBin(filePath: string): boolean {\n try {\n const realPath = fs.realpathSync(filePath);\n return realPath.indexOf(path.join('.nvu', 'bin')) >= 0 || pathsEqual(path.dirname(realPath), nvuBinDir);\n } catch (_e) {\n return false;\n }\n}\n\n/**\n * Find a system binary by searching PATH, excluding ~/.nvu/bin\n * Returns the full path to the binary, or null if not found\n */\nexport function resolveSystemBinary(name: string): string | null {\n const pathEnv = process.env.PATH || '';\n const pathSep = isWindows ? ';' : ':';\n const dirs = pathEnv.split(pathSep);\n\n for (let i = 0; i < dirs.length; i++) {\n const dir = dirs[i];\n if (!dir) continue;\n\n // Skip ~/.nvu/bin\n if (pathsEqual(dir, nvuBinDir)) continue;\n\n // Build candidate path with appropriate extension\n const candidates = isWindows ? [path.join(dir, `${name}.exe`), path.join(dir, `${name}.cmd`), path.join(dir, name)] : [path.join(dir, name)];\n\n for (let j = 0; j < candidates.length; j++) {\n const candidate = candidates[j];\n try {\n const stat = fs.statSync(candidate);\n if (!stat.isFile()) continue;\n\n // Make sure it's not in ~/.nvu/bin (via symlink)\n if (isInNvuBin(candidate)) continue;\n\n return candidate;\n } catch (_e) {\n // File doesn't exist, continue\n }\n }\n }\n\n return null;\n}\n\n/**\n * Get PATH with ~/.nvu/bin removed\n * Used to create an environment for spawning system commands\n */\nexport function getPathWithoutNvuBin(): string {\n const pathEnv = process.env.PATH || '';\n const pathSep = isWindows ? ';' : ':';\n const dirs = pathEnv.split(pathSep);\n\n const filtered: string[] = [];\n for (let i = 0; i < dirs.length; i++) {\n const dir = dirs[i];\n if (!dir) continue;\n if (pathsEqual(dir, nvuBinDir)) continue;\n if (dir.indexOf(path.join('.nvu', 'bin')) >= 0) continue;\n filtered.push(dir);\n }\n\n return filtered.join(pathSep);\n}\n"],"names":["getPathWithoutNvuBin","resolveSystemBinary","isWindows","process","platform","test","env","OSTYPE","nvuBinDir","path","join","homedir","pathsEqual","a","b","toLowerCase","isInNvuBin","filePath","realPath","fs","realpathSync","indexOf","dirname","_e","name","pathEnv","PATH","pathSep","dirs","split","i","length","dir","candidates","j","candidate","stat","statSync","isFile","filtered","push"],"mappings":"AAAA;;;CAGC;;;;;;;;;;;QAwEeA;eAAAA;;QAtCAC;eAAAA;;;yDAjCD;2DACE;wBACO;;;;;;AAExB,IAAMC,YAAYC,QAAQC,QAAQ,KAAK,WAAW,kBAAkBC,IAAI,CAACF,QAAQG,GAAG,CAACC,MAAM;AAC3F,IAAMC,YAAYC,aAAI,CAACC,IAAI,CAACC,IAAAA,iBAAO,KAAI,QAAQ;AAE/C;;CAEC,GACD,SAASC,WAAWC,CAAS,EAAEC,CAAS;IACtC,IAAIZ,WAAW;QACb,OAAOW,EAAEE,WAAW,OAAOD,EAAEC,WAAW;IAC1C;IACA,OAAOF,MAAMC;AACf;AAEA;;CAEC,GACD,SAASE,WAAWC,QAAgB;IAClC,IAAI;QACF,IAAMC,WAAWC,WAAE,CAACC,YAAY,CAACH;QACjC,OAAOC,SAASG,OAAO,CAACZ,aAAI,CAACC,IAAI,CAAC,QAAQ,WAAW,KAAKE,WAAWH,aAAI,CAACa,OAAO,CAACJ,WAAWV;IAC/F,EAAE,OAAOe,IAAI;QACX,OAAO;IACT;AACF;AAMO,SAAStB,oBAAoBuB,IAAY;IAC9C,IAAMC,UAAUtB,QAAQG,GAAG,CAACoB,IAAI,IAAI;IACpC,IAAMC,UAAUzB,YAAY,MAAM;IAClC,IAAM0B,OAAOH,QAAQI,KAAK,CAACF;IAE3B,IAAK,IAAIG,IAAI,GAAGA,IAAIF,KAAKG,MAAM,EAAED,IAAK;QACpC,IAAME,MAAMJ,IAAI,CAACE,EAAE;QACnB,IAAI,CAACE,KAAK;QAEV,kBAAkB;QAClB,IAAIpB,WAAWoB,KAAKxB,YAAY;QAEhC,kDAAkD;QAClD,IAAMyB,aAAa/B,YAAY;YAACO,aAAI,CAACC,IAAI,CAACsB,KAAK,AAAC,GAAO,OAALR,MAAK;YAAQf,aAAI,CAACC,IAAI,CAACsB,KAAK,AAAC,GAAO,OAALR,MAAK;YAAQf,aAAI,CAACC,IAAI,CAACsB,KAAKR;SAAM,GAAG;YAACf,aAAI,CAACC,IAAI,CAACsB,KAAKR;SAAM;QAE5I,IAAK,IAAIU,IAAI,GAAGA,IAAID,WAAWF,MAAM,EAAEG,IAAK;YAC1C,IAAMC,YAAYF,UAAU,CAACC,EAAE;YAC/B,IAAI;gBACF,IAAME,OAAOjB,WAAE,CAACkB,QAAQ,CAACF;gBACzB,IAAI,CAACC,KAAKE,MAAM,IAAI;gBAEpB,iDAAiD;gBACjD,IAAItB,WAAWmB,YAAY;gBAE3B,OAAOA;YACT,EAAE,OAAOZ,IAAI;YACX,+BAA+B;YACjC;QACF;IACF;IAEA,OAAO;AACT;AAMO,SAASvB;IACd,IAAMyB,UAAUtB,QAAQG,GAAG,CAACoB,IAAI,IAAI;IACpC,IAAMC,UAAUzB,YAAY,MAAM;IAClC,IAAM0B,OAAOH,QAAQI,KAAK,CAACF;IAE3B,IAAMY,WAAqB,EAAE;IAC7B,IAAK,IAAIT,IAAI,GAAGA,IAAIF,KAAKG,MAAM,EAAED,IAAK;QACpC,IAAME,MAAMJ,IAAI,CAACE,EAAE;QACnB,IAAI,CAACE,KAAK;QACV,IAAIpB,WAAWoB,KAAKxB,YAAY;QAChC,IAAIwB,IAAIX,OAAO,CAACZ,aAAI,CAACC,IAAI,CAAC,QAAQ,WAAW,GAAG;QAChD6B,SAASC,IAAI,CAACR;IAChB;IAEA,OAAOO,SAAS7B,IAAI,CAACiB;AACvB"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/lib/resolveSystemBinary.ts"],"sourcesContent":["/**\n * Resolve system binaries by searching PATH while excluding ~/.nvu/bin\n * This mirrors the Go binary's findSystemBinary() function\n */\nimport envPathKey from 'env-path-key';\nimport fs from 'fs';\nimport path from 'path';\nimport { homedir } from '../compat.ts';\n\nconst isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\nconst nvuBinDir = path.join(homedir(), '.nvu', 'bin');\nconst pathKey = envPathKey(); // PATH or Path or similar\nconst pathDelimiter = path.delimiter ? path.delimiter : isWindows ? ';' : ':';\n\n/**\n * Check if two paths are equal (case-insensitive on Windows)\n */\nfunction pathsEqual(a: string, b: string): boolean {\n if (isWindows) return a.toLowerCase() === b.toLowerCase();\n return a === b;\n}\n\n/**\n * Check if a path is within the nvu bin directory\n */\nfunction isInNvuBin(filePath: string): boolean {\n try {\n const realPath = fs.realpathSync(filePath);\n return realPath.indexOf(path.join('.nvu', 'bin')) >= 0 || pathsEqual(path.dirname(realPath), nvuBinDir);\n } catch (_e) {\n return false;\n }\n}\n\n/**\n * Find a system binary by searching PATH, excluding ~/.nvu/bin\n * Returns the full path to the binary, or null if not found\n */\nexport function resolveSystemBinary(name: string): string | null {\n const pathEnv = process.env[pathKey] || '';\n const dirs = pathEnv.split(pathDelimiter);\n\n for (let i = 0; i < dirs.length; i++) {\n const dir = dirs[i];\n if (!dir) continue;\n\n // Skip ~/.nvu/bin\n if (pathsEqual(dir, nvuBinDir)) continue;\n\n // Build candidate path with appropriate extension\n const candidates = isWindows ? [path.join(dir, `${name}.exe`), path.join(dir, `${name}.cmd`), path.join(dir, name)] : [path.join(dir, name)];\n\n for (let j = 0; j < candidates.length; j++) {\n const candidate = candidates[j];\n try {\n const stat = fs.statSync(candidate);\n if (!stat.isFile()) continue;\n\n // Make sure it's not in ~/.nvu/bin (via symlink)\n if (isInNvuBin(candidate)) continue;\n\n return candidate;\n } catch (_e) {\n // File doesn't exist, continue\n }\n }\n }\n\n return null;\n}\n\n/**\n * Get PATH with ~/.nvu/bin removed\n * Used to create an environment for spawning system commands\n */\nexport function getPathWithoutNvuBin(): string {\n const pathEnv = process.env[pathKey] || '';\n const dirs = pathEnv.split(pathDelimiter);\n\n const filtered: string[] = [];\n for (let i = 0; i < dirs.length; i++) {\n const dir = dirs[i];\n if (!dir) continue;\n if (pathsEqual(dir, nvuBinDir)) continue;\n if (dir.indexOf(path.join('.nvu', 'bin')) >= 0) continue;\n filtered.push(dir);\n }\n\n return filtered.join(pathDelimiter);\n}\n"],"names":["getPathWithoutNvuBin","resolveSystemBinary","isWindows","process","platform","test","env","OSTYPE","nvuBinDir","path","join","homedir","pathKey","envPathKey","pathDelimiter","delimiter","pathsEqual","a","b","toLowerCase","isInNvuBin","filePath","realPath","fs","realpathSync","indexOf","dirname","_e","name","pathEnv","dirs","split","i","length","dir","candidates","j","candidate","stat","statSync","isFile","filtered","push"],"mappings":"AAAA;;;CAGC;;;;;;;;;;;QAwEeA;eAAAA;;QArCAC;eAAAA;;;iEAlCO;yDACR;2DACE;wBACO;;;;;;AAExB,IAAMC,YAAYC,QAAQC,QAAQ,KAAK,WAAW,kBAAkBC,IAAI,CAACF,QAAQG,GAAG,CAACC,MAAM;AAC3F,IAAMC,YAAYC,aAAI,CAACC,IAAI,CAACC,IAAAA,iBAAO,KAAI,QAAQ;AAC/C,IAAMC,UAAUC,IAAAA,mBAAU,KAAI,0BAA0B;AACxD,IAAMC,gBAAgBL,aAAI,CAACM,SAAS,GAAGN,aAAI,CAACM,SAAS,GAAGb,YAAY,MAAM;AAE1E;;CAEC,GACD,SAASc,WAAWC,CAAS,EAAEC,CAAS;IACtC,IAAIhB,WAAW,OAAOe,EAAEE,WAAW,OAAOD,EAAEC,WAAW;IACvD,OAAOF,MAAMC;AACf;AAEA;;CAEC,GACD,SAASE,WAAWC,QAAgB;IAClC,IAAI;QACF,IAAMC,WAAWC,WAAE,CAACC,YAAY,CAACH;QACjC,OAAOC,SAASG,OAAO,CAAChB,aAAI,CAACC,IAAI,CAAC,QAAQ,WAAW,KAAKM,WAAWP,aAAI,CAACiB,OAAO,CAACJ,WAAWd;IAC/F,EAAE,OAAOmB,IAAI;QACX,OAAO;IACT;AACF;AAMO,SAAS1B,oBAAoB2B,IAAY;IAC9C,IAAMC,UAAU1B,QAAQG,GAAG,CAACM,QAAQ,IAAI;IACxC,IAAMkB,OAAOD,QAAQE,KAAK,CAACjB;IAE3B,IAAK,IAAIkB,IAAI,GAAGA,IAAIF,KAAKG,MAAM,EAAED,IAAK;QACpC,IAAME,MAAMJ,IAAI,CAACE,EAAE;QACnB,IAAI,CAACE,KAAK;QAEV,kBAAkB;QAClB,IAAIlB,WAAWkB,KAAK1B,YAAY;QAEhC,kDAAkD;QAClD,IAAM2B,aAAajC,YAAY;YAACO,aAAI,CAACC,IAAI,CAACwB,KAAK,AAAC,GAAO,OAALN,MAAK;YAAQnB,aAAI,CAACC,IAAI,CAACwB,KAAK,AAAC,GAAO,OAALN,MAAK;YAAQnB,aAAI,CAACC,IAAI,CAACwB,KAAKN;SAAM,GAAG;YAACnB,aAAI,CAACC,IAAI,CAACwB,KAAKN;SAAM;QAE5I,IAAK,IAAIQ,IAAI,GAAGA,IAAID,WAAWF,MAAM,EAAEG,IAAK;YAC1C,IAAMC,YAAYF,UAAU,CAACC,EAAE;YAC/B,IAAI;gBACF,IAAME,OAAOf,WAAE,CAACgB,QAAQ,CAACF;gBACzB,IAAI,CAACC,KAAKE,MAAM,IAAI;gBAEpB,iDAAiD;gBACjD,IAAIpB,WAAWiB,YAAY;gBAE3B,OAAOA;YACT,EAAE,OAAOV,IAAI;YACX,+BAA+B;YACjC;QACF;IACF;IAEA,OAAO;AACT;AAMO,SAAS3B;IACd,IAAM6B,UAAU1B,QAAQG,GAAG,CAACM,QAAQ,IAAI;IACxC,IAAMkB,OAAOD,QAAQE,KAAK,CAACjB;IAE3B,IAAM2B,WAAqB,EAAE;IAC7B,IAAK,IAAIT,IAAI,GAAGA,IAAIF,KAAKG,MAAM,EAAED,IAAK;QACpC,IAAME,MAAMJ,IAAI,CAACE,EAAE;QACnB,IAAI,CAACE,KAAK;QACV,IAAIlB,WAAWkB,KAAK1B,YAAY;QAChC,IAAI0B,IAAIT,OAAO,CAAChB,aAAI,CAACC,IAAI,CAAC,QAAQ,WAAW,GAAG;QAChD+B,SAASC,IAAI,CAACR;IAChB;IAEA,OAAOO,SAAS/B,IAAI,CAACI;AACvB"}
@@ -7,6 +7,7 @@ const os = require('os');
7
7
  const path = require('path');
8
8
  const Queue = require('queue-cb');
9
9
  const moduleRoot = require('module-root-sync');
10
+ const cpuArch = require('cpu-arch');
10
11
  const root = moduleRoot(__dirname);
11
12
  // Configuration
12
13
  const GITHUB_REPO = 'kmalakoff/node-version-use';
@@ -77,7 +78,8 @@ function removeIfExistsSync(filePath) {
77
78
  /**
78
79
  * Get the platform-specific archive base name (without extension)
79
80
  */ function getArchiveBaseName() {
80
- const { platform, arch } = process;
81
+ const { platform } = process;
82
+ const arch = cpuArch();
81
83
  const platformMap = {
82
84
  darwin: 'darwin',
83
85
  linux: 'linux',
@@ -189,6 +191,13 @@ function removeIfExistsSync(filePath) {
189
191
  * 2. Copy binary to temp files in destination directory
190
192
  * 3. Atomic rename temp files to final names
191
193
  */ function extractAndInstall(archivePath, destDir, binaryName, callback) {
194
+ const binaries = [
195
+ 'nvu',
196
+ 'node',
197
+ 'npm',
198
+ 'npx',
199
+ 'corepack'
200
+ ];
192
201
  const ext = isWindows ? '.exe' : '';
193
202
  // Create temp extraction directory
194
203
  const tempExtractDir = path.join(tmpdir(), `nvu-extract-${Date.now()}`);
@@ -206,12 +215,6 @@ function removeIfExistsSync(filePath) {
206
215
  return;
207
216
  }
208
217
  // Binary names to install
209
- const binaries = [
210
- 'node',
211
- 'npm',
212
- 'npx',
213
- 'corepack'
214
- ];
215
218
  const timestamp = Date.now();
216
219
  let installError = null;
217
220
  // Step 1: Copy extracted binary to temp files in destination directory
@@ -268,7 +271,7 @@ function removeIfExistsSync(filePath) {
268
271
  */ module.exports.printInstructions = function printInstructions() {
269
272
  const _nvuBinPath = path.join(storagePath, 'bin');
270
273
  console.log('nvu binaries installed in ~/.nvu/bin/');
271
- const pathKey = envPathKey();
274
+ const pathKey = envPathKey(); // PATH or Path or similar
272
275
  const envPath = process.env[pathKey] || '';
273
276
  if (envPath.indexOf('.nvu/bin') >= 0) return; // path exists
274
277
  // provide instructions for path setup
@@ -349,12 +352,12 @@ function removeIfExistsSync(filePath) {
349
352
  return;
350
353
  }
351
354
  // Download to temp file
352
- console.log(`Downloading binary for ${process.platform}-${process.arch}...`);
355
+ console.log(`Downloading binary for ${archiveBaseName}...`);
353
356
  const tempPath = path.join(tmpdir(), `nvu-binary-${Date.now()}${isWindows ? '.zip' : '.tar.gz'}`);
354
357
  getFile(downloadUrl, tempPath, (err)=>{
355
358
  if (err) {
356
359
  removeIfExistsSync(tempPath);
357
- callback(new Error(`No prebuilt binary available for ${process.platform}-${process.arch}. Download: ${downloadUrl}. Error: ${err.message}`));
360
+ callback(new Error(`No prebuilt binary available for ${archiveBaseName}. Download: ${downloadUrl}. Error: ${err.message}`));
358
361
  return;
359
362
  }
360
363
  // Copy to cache for future use
@@ -1 +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 * Move a file out of the way (works even if running on Windows)\n * First tries to unlink; if that fails (Windows locked), rename to .old-timestamp\n */\nfunction moveOutOfWay(filePath: string): void {\n if (!fs.existsSync(filePath)) return;\n\n // First try to unlink (works on Unix, fails on Windows if running)\n try {\n fs.unlinkSync(filePath);\n return;\n } catch (_e) {\n // Unlink failed (likely Windows locked file), try rename\n }\n\n // Rename to .old-timestamp as fallback\n const timestamp = Date.now();\n const oldPath = `${filePath}.old-${timestamp}`;\n\n try {\n fs.renameSync(filePath, oldPath);\n } catch (_e2) {\n // Both unlink and rename failed - will fail on atomic rename instead\n }\n}\n\n/**\n * Clean up old .old-* files from previous installs\n */\nfunction cleanupOldFiles(dir: string): void {\n try {\n const entries = fs.readdirSync(dir);\n for (const entry of entries) {\n if (entry.includes('.old-')) {\n try {\n fs.unlinkSync(path.join(dir, entry));\n } catch (_e) {\n // ignore - file may still be in use\n }\n }\n }\n } catch (_e) {\n // ignore if dir doesn't exist\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 * Sync all shims by copying the nvu binary to all other files in the bin directory\n * All shims (node, npm, npx, corepack, eslint, etc.) are copies of the same binary\n */\nmodule.exports.syncAllShims = function syncAllShims(binDir: string): void {\n const isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\n const ext = isWindows ? '.exe' : '';\n\n // Source: nvu binary\n const nvuSource = path.join(binDir, `nvu${ext}`);\n if (!fs.existsSync(nvuSource)) return;\n\n try {\n const entries = fs.readdirSync(binDir);\n for (const name of entries) {\n // Skip nvu itself and nvu.json\n if (name === `nvu${ext}` || name === 'nvu.json') continue;\n\n // On Windows, only process .exe files\n if (isWindows && !name.endsWith('.exe')) continue;\n\n const shimPath = path.join(binDir, name);\n const stat = fs.statSync(shimPath);\n if (!stat.isFile()) continue;\n\n // Move existing file out of the way (Windows compatibility)\n moveOutOfWay(shimPath);\n\n // Copy nvu binary to shim\n copyFileSync(nvuSource, shimPath);\n\n // Make executable on Unix\n if (!isWindows) {\n fs.chmodSync(shimPath, 0o755);\n }\n }\n } catch (_e) {\n // Ignore errors - shim sync is best effort\n }\n};\n\n/**\n * Atomic rename with fallback to copy+delete for cross-device moves\n */\nfunction atomicRename(src: string, dest: string, callback: Callback) {\n fs.rename(src, dest, (err) => {\n if (!err) return callback(null);\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) {\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) {\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 // Move existing file out of the way (works even if running on Windows)\n moveOutOfWay(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(' # Edit your PowerShell profile');\n console.log(' # Open with: notepad $PROFILE');\n console.log(' # Add this line:');\n console.log(' $env:PATH = \"$HOME\\\\.nvu\\\\bin;$env:APPDATA\\\\npm;$env:PATH\"');\n console.log('');\n console.log(' # This adds:');\n console.log(' # ~/.nvu/bin - node/npm version switching shims');\n console.log(' # %APPDATA%/npm - globally installed npm packages (like nvu)');\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 const nvuJsonPath = path.join(binDir, 'nvu.json');\n\n // check if we need to upgrade\n if (!options.force) {\n try {\n // already installed - read nvu.json\n const nvuJson = JSON.parse(fs.readFileSync(nvuJsonPath, 'utf8'));\n if (nvuJson.binaryVersion === BINARY_VERSION) {\n callback(null, false);\n return;\n }\n } catch (_err) {}\n }\n\n // Create directories\n mkdirp.sync(storagePath);\n mkdirp.sync(binDir);\n mkdirp.sync(path.join(storagePath, 'cache'));\n\n // Clean up old .old-* files from previous installs\n cleanupOldFiles(binDir);\n\n const downloadUrl = `https://github.com/${GITHUB_REPO}/releases/download/binary-v${BINARY_VERSION}/${archiveBaseName}${isWindows ? '.zip' : '.tar.gz'}`;\n const cachePath = path.join(storagePath, 'cache', `${archiveBaseName}${isWindows ? '.zip' : '.tar.gz'}`);\n\n // Check cache first\n if (fs.existsSync(cachePath)) {\n console.log('Using cached binary...');\n\n // Use cached file\n extractAndInstall(cachePath, binDir, extractedBinaryName, (err) => {\n if (err) return callback(err);\n\n // save binary version for upgrade checks\n fs.writeFileSync(nvuJsonPath, JSON.stringify({ binaryVersion: BINARY_VERSION }, null, 2), 'utf8');\n console.log('Binary installed successfully!');\n callback(null, true);\n });\n return;\n }\n\n // Download to temp file\n console.log(`Downloading binary for ${process.platform}-${process.arch}...`);\n const tempPath = path.join(tmpdir(), `nvu-binary-${Date.now()}${isWindows ? '.zip' : '.tar.gz'}`);\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 // Copy to cache for future use\n try {\n copyFileSync(tempPath, cachePath);\n } catch (_e) {\n // Cache write failed, continue anyway\n }\n\n extractAndInstall(tempPath, binDir, extractedBinaryName, (err) => {\n removeIfExistsSync(tempPath);\n if (err) return callback(err);\n\n // save binary version for upgrade checks\n fs.writeFileSync(nvuJsonPath, JSON.stringify({ binaryVersion: BINARY_VERSION }, null, 2), '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","moveOutOfWay","timestamp","Date","now","oldPath","renameSync","_e2","cleanupOldFiles","dir","entries","readdirSync","entry","includes","getArchiveBaseName","arch","platformMap","darwin","linux","win32","archMap","x64","arm64","amd64","platformName","archName","copyFileSync","src","dest","content","readFileSync","writeFileSync","module","exports","syncAllShims","binDir","ext","nvuSource","name","endsWith","shimPath","stat","statSync","isFile","chmodSync","atomicRename","callback","rename","err","code","copyErr","extractArchive","archivePath","Iterator","stream","createReadStream","pipe","createGunzip","iterator","links","forEach","type","unshift","push","create","callbacks","concurrency","_err","queue","index","length","defer","bind","await","destroy","extractAndInstall","destDir","binaryName","tempExtractDir","sync","extractedPath","Error","binaries","installError","i","tempDest","j","tempPath","renameError","doRename","finalDest","printInstructions","_nvuBinPath","console","log","pathKey","envPath","indexOf","installBinaries","options","archiveBaseName","extractedBinaryName","nvuJsonPath","force","nvuJson","JSON","parse","downloadUrl","cachePath","stringify","message"],"mappings":"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"}
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');\nconst cpuArch = require('cpu-arch');\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 * Move a file out of the way (works even if running on Windows)\n * First tries to unlink; if that fails (Windows locked), rename to .old-timestamp\n */\nfunction moveOutOfWay(filePath: string): void {\n if (!fs.existsSync(filePath)) return;\n\n // First try to unlink (works on Unix, fails on Windows if running)\n try {\n fs.unlinkSync(filePath);\n return;\n } catch (_e) {\n // Unlink failed (likely Windows locked file), try rename\n }\n\n // Rename to .old-timestamp as fallback\n const timestamp = Date.now();\n const oldPath = `${filePath}.old-${timestamp}`;\n\n try {\n fs.renameSync(filePath, oldPath);\n } catch (_e2) {\n // Both unlink and rename failed - will fail on atomic rename instead\n }\n}\n\n/**\n * Clean up old .old-* files from previous installs\n */\nfunction cleanupOldFiles(dir: string): void {\n try {\n const entries = fs.readdirSync(dir);\n for (const entry of entries) {\n if (entry.includes('.old-')) {\n try {\n fs.unlinkSync(path.join(dir, entry));\n } catch (_e) {\n // ignore - file may still be in use\n }\n }\n }\n } catch (_e) {\n // ignore if dir doesn't exist\n }\n}\n\n/**\n * Get the platform-specific archive base name (without extension)\n */\nfunction getArchiveBaseName(): string | null {\n const { platform } = process;\n const arch = cpuArch();\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 * Sync all shims by copying the nvu binary to all other files in the bin directory\n * All shims (node, npm, npx, corepack, eslint, etc.) are copies of the same binary\n */\nmodule.exports.syncAllShims = function syncAllShims(binDir: string): void {\n const isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\n const ext = isWindows ? '.exe' : '';\n\n // Source: nvu binary\n const nvuSource = path.join(binDir, `nvu${ext}`);\n if (!fs.existsSync(nvuSource)) return;\n\n try {\n const entries = fs.readdirSync(binDir);\n for (const name of entries) {\n // Skip nvu itself and nvu.json\n if (name === `nvu${ext}` || name === 'nvu.json') continue;\n\n // On Windows, only process .exe files\n if (isWindows && !name.endsWith('.exe')) continue;\n\n const shimPath = path.join(binDir, name);\n const stat = fs.statSync(shimPath);\n if (!stat.isFile()) continue;\n\n // Move existing file out of the way (Windows compatibility)\n moveOutOfWay(shimPath);\n\n // Copy nvu binary to shim\n copyFileSync(nvuSource, shimPath);\n\n // Make executable on Unix\n if (!isWindows) {\n fs.chmodSync(shimPath, 0o755);\n }\n }\n } catch (_e) {\n // Ignore errors - shim sync is best effort\n }\n};\n\n/**\n * Atomic rename with fallback to copy+delete for cross-device moves\n */\nfunction atomicRename(src: string, dest: string, callback: Callback) {\n fs.rename(src, dest, (err) => {\n if (!err) return callback(null);\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) {\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) {\n const binaries = ['nvu', 'node', 'npm', 'npx', 'corepack'];\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 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 // Move existing file out of the way (works even if running on Windows)\n moveOutOfWay(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(); // PATH or Path or similar\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(' # Edit your PowerShell profile');\n console.log(' # Open with: notepad $PROFILE');\n console.log(' # Add this line:');\n console.log(' $env:PATH = \"$HOME\\\\.nvu\\\\bin;$env:APPDATA\\\\npm;$env:PATH\"');\n console.log('');\n console.log(' # This adds:');\n console.log(' # ~/.nvu/bin - node/npm version switching shims');\n console.log(' # %APPDATA%/npm - globally installed npm packages (like nvu)');\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 const nvuJsonPath = path.join(binDir, 'nvu.json');\n\n // check if we need to upgrade\n if (!options.force) {\n try {\n // already installed - read nvu.json\n const nvuJson = JSON.parse(fs.readFileSync(nvuJsonPath, 'utf8'));\n if (nvuJson.binaryVersion === BINARY_VERSION) {\n callback(null, false);\n return;\n }\n } catch (_err) {}\n }\n\n // Create directories\n mkdirp.sync(storagePath);\n mkdirp.sync(binDir);\n mkdirp.sync(path.join(storagePath, 'cache'));\n\n // Clean up old .old-* files from previous installs\n cleanupOldFiles(binDir);\n\n const downloadUrl = `https://github.com/${GITHUB_REPO}/releases/download/binary-v${BINARY_VERSION}/${archiveBaseName}${isWindows ? '.zip' : '.tar.gz'}`;\n const cachePath = path.join(storagePath, 'cache', `${archiveBaseName}${isWindows ? '.zip' : '.tar.gz'}`);\n\n // Check cache first\n if (fs.existsSync(cachePath)) {\n console.log('Using cached binary...');\n\n // Use cached file\n extractAndInstall(cachePath, binDir, extractedBinaryName, (err) => {\n if (err) return callback(err);\n\n // save binary version for upgrade checks\n fs.writeFileSync(nvuJsonPath, JSON.stringify({ binaryVersion: BINARY_VERSION }, null, 2), 'utf8');\n console.log('Binary installed successfully!');\n callback(null, true);\n });\n return;\n }\n\n // Download to temp file\n console.log(`Downloading binary for ${archiveBaseName}...`);\n const tempPath = path.join(tmpdir(), `nvu-binary-${Date.now()}${isWindows ? '.zip' : '.tar.gz'}`);\n\n getFile(downloadUrl, tempPath, (err) => {\n if (err) {\n removeIfExistsSync(tempPath);\n callback(new Error(`No prebuilt binary available for ${archiveBaseName}. Download: ${downloadUrl}. Error: ${err.message}`));\n return;\n }\n\n // Copy to cache for future use\n try {\n copyFileSync(tempPath, cachePath);\n } catch (_e) {\n // Cache write failed, continue anyway\n }\n\n extractAndInstall(tempPath, binDir, extractedBinaryName, (err) => {\n removeIfExistsSync(tempPath);\n if (err) return callback(err);\n\n // save binary version for upgrade checks\n fs.writeFileSync(nvuJsonPath, JSON.stringify({ binaryVersion: BINARY_VERSION }, null, 2), '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","cpuArch","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","moveOutOfWay","timestamp","Date","now","oldPath","renameSync","_e2","cleanupOldFiles","dir","entries","readdirSync","entry","includes","getArchiveBaseName","arch","platformMap","darwin","linux","win32","archMap","x64","arm64","amd64","platformName","archName","copyFileSync","src","dest","content","readFileSync","writeFileSync","module","exports","syncAllShims","binDir","ext","nvuSource","name","endsWith","shimPath","stat","statSync","isFile","chmodSync","atomicRename","callback","rename","err","code","copyErr","extractArchive","archivePath","Iterator","stream","createReadStream","pipe","createGunzip","iterator","links","forEach","type","unshift","push","create","callbacks","concurrency","_err","queue","index","length","defer","bind","await","destroy","extractAndInstall","destDir","binaryName","binaries","tempExtractDir","sync","extractedPath","Error","installError","i","tempDest","j","tempPath","renameError","doRename","finalDest","printInstructions","_nvuBinPath","console","log","pathKey","envPath","indexOf","installBinaries","options","archiveBaseName","extractedBinaryName","nvuJsonPath","force","nvuJson","JSON","parse","downloadUrl","cachePath","stringify","message"],"mappings":"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"}
@@ -11,9 +11,11 @@ const isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process
11
11
  */ export default function teardownCmd(_args) {
12
12
  const binDir = path.join(storagePath, 'bin');
13
13
  const binaries = [
14
+ 'nvu',
14
15
  'node',
15
16
  'npm',
16
- 'npx'
17
+ 'npx',
18
+ 'corepack'
17
19
  ];
18
20
  const ext = isWindows ? '.exe' : '';
19
21
  let removed = 0;
@@ -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\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":["exit","fs","rmSync","path","storagePath","isWindows","process","platform","test","env","OSTYPE","teardownCmd","_args","binDir","join","binaries","ext","removed","i","length","binaryPath","existsSync","force","console","log"],"mappings":"AAAA,OAAOA,UAAU,cAAc;AAC/B,OAAOC,QAAQ,KAAK;AACpB,SAASC,MAAM,QAAQ,mBAAmB;AAC1C,OAAOC,UAAU,OAAO;AACxB,SAASC,WAAW,QAAQ,kBAAkB;AAE9C,MAAMC,YAAYC,QAAQC,QAAQ,KAAK,WAAW,kBAAkBC,IAAI,CAACF,QAAQG,GAAG,CAACC,MAAM;AAE3F;;;;CAIC,GACD,eAAe,SAASC,YAAYC,KAAe;IACjD,MAAMC,SAASV,KAAKW,IAAI,CAACV,aAAa;IAEtC,MAAMW,WAAW;QAAC;QAAQ;QAAO;KAAM;IACvC,MAAMC,MAAMX,YAAY,SAAS;IAEjC,IAAIY,UAAU;IACd,IAAK,IAAIC,IAAI,GAAGA,IAAIH,SAASI,MAAM,EAAED,IAAK;QACxC,MAAME,aAAajB,KAAKW,IAAI,CAACD,QAAQE,QAAQ,CAACG,EAAE,GAAGF;QACnD,IAAIf,GAAGoB,UAAU,CAACD,aAAa;YAC7BlB,OAAOkB,YAAY;gBAAEE,OAAO;YAAK;YACjCL;QACF;IACF;IAEA,IAAIA,UAAU,GAAG;QACfM,QAAQC,GAAG,CAAC,CAAC,QAAQ,EAAEP,QAAQ,gBAAgB,EAAEJ,QAAQ;QACzDU,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG,CAAC;IACd,OAAO;QACLD,QAAQC,GAAG,CAAC;IACd;IAEAxB,KAAK;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 const binaries = ['nvu', 'node', 'npm', 'npx', 'corepack'];\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":["exit","fs","rmSync","path","storagePath","isWindows","process","platform","test","env","OSTYPE","teardownCmd","_args","binDir","join","binaries","ext","removed","i","length","binaryPath","existsSync","force","console","log"],"mappings":"AAAA,OAAOA,UAAU,cAAc;AAC/B,OAAOC,QAAQ,KAAK;AACpB,SAASC,MAAM,QAAQ,mBAAmB;AAC1C,OAAOC,UAAU,OAAO;AACxB,SAASC,WAAW,QAAQ,kBAAkB;AAE9C,MAAMC,YAAYC,QAAQC,QAAQ,KAAK,WAAW,kBAAkBC,IAAI,CAACF,QAAQG,GAAG,CAACC,MAAM;AAE3F;;;;CAIC,GACD,eAAe,SAASC,YAAYC,KAAe;IACjD,MAAMC,SAASV,KAAKW,IAAI,CAACV,aAAa;IACtC,MAAMW,WAAW;QAAC;QAAO;QAAQ;QAAO;QAAO;KAAW;IAC1D,MAAMC,MAAMX,YAAY,SAAS;IAEjC,IAAIY,UAAU;IACd,IAAK,IAAIC,IAAI,GAAGA,IAAIH,SAASI,MAAM,EAAED,IAAK;QACxC,MAAME,aAAajB,KAAKW,IAAI,CAACD,QAAQE,QAAQ,CAACG,EAAE,GAAGF;QACnD,IAAIf,GAAGoB,UAAU,CAACD,aAAa;YAC7BlB,OAAOkB,YAAY;gBAAEE,OAAO;YAAK;YACjCL;QACF;IACF;IAEA,IAAIA,UAAU,GAAG;QACfM,QAAQC,GAAG,CAAC,CAAC,QAAQ,EAAEP,QAAQ,gBAAgB,EAAEJ,QAAQ;QACzDU,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG,CAAC;IACd,OAAO;QACLD,QAAQC,GAAG,CAAC;IACd;IAEAxB,KAAK;AACP"}
@@ -1,17 +1,18 @@
1
1
  /**
2
2
  * Resolve system binaries by searching PATH while excluding ~/.nvu/bin
3
3
  * This mirrors the Go binary's findSystemBinary() function
4
- */ import fs from 'fs';
4
+ */ import envPathKey from 'env-path-key';
5
+ import fs from 'fs';
5
6
  import path from 'path';
6
7
  import { homedir } from '../compat.js';
7
8
  const isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);
8
9
  const nvuBinDir = path.join(homedir(), '.nvu', 'bin');
10
+ const pathKey = envPathKey(); // PATH or Path or similar
11
+ const pathDelimiter = path.delimiter ? path.delimiter : isWindows ? ';' : ':';
9
12
  /**
10
13
  * Check if two paths are equal (case-insensitive on Windows)
11
14
  */ function pathsEqual(a, b) {
12
- if (isWindows) {
13
- return a.toLowerCase() === b.toLowerCase();
14
- }
15
+ if (isWindows) return a.toLowerCase() === b.toLowerCase();
15
16
  return a === b;
16
17
  }
17
18
  /**
@@ -28,9 +29,8 @@ const nvuBinDir = path.join(homedir(), '.nvu', 'bin');
28
29
  * Find a system binary by searching PATH, excluding ~/.nvu/bin
29
30
  * Returns the full path to the binary, or null if not found
30
31
  */ export function resolveSystemBinary(name) {
31
- const pathEnv = process.env.PATH || '';
32
- const pathSep = isWindows ? ';' : ':';
33
- const dirs = pathEnv.split(pathSep);
32
+ const pathEnv = process.env[pathKey] || '';
33
+ const dirs = pathEnv.split(pathDelimiter);
34
34
  for(let i = 0; i < dirs.length; i++){
35
35
  const dir = dirs[i];
36
36
  if (!dir) continue;
@@ -63,9 +63,8 @@ const nvuBinDir = path.join(homedir(), '.nvu', 'bin');
63
63
  * Get PATH with ~/.nvu/bin removed
64
64
  * Used to create an environment for spawning system commands
65
65
  */ export function getPathWithoutNvuBin() {
66
- const pathEnv = process.env.PATH || '';
67
- const pathSep = isWindows ? ';' : ':';
68
- const dirs = pathEnv.split(pathSep);
66
+ const pathEnv = process.env[pathKey] || '';
67
+ const dirs = pathEnv.split(pathDelimiter);
69
68
  const filtered = [];
70
69
  for(let i = 0; i < dirs.length; i++){
71
70
  const dir = dirs[i];
@@ -74,5 +73,5 @@ const nvuBinDir = path.join(homedir(), '.nvu', 'bin');
74
73
  if (dir.indexOf(path.join('.nvu', 'bin')) >= 0) continue;
75
74
  filtered.push(dir);
76
75
  }
77
- return filtered.join(pathSep);
76
+ return filtered.join(pathDelimiter);
78
77
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/lib/resolveSystemBinary.ts"],"sourcesContent":["/**\n * Resolve system binaries by searching PATH while excluding ~/.nvu/bin\n * This mirrors the Go binary's findSystemBinary() function\n */\nimport fs from 'fs';\nimport path from 'path';\nimport { homedir } from '../compat.ts';\n\nconst isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\nconst nvuBinDir = path.join(homedir(), '.nvu', 'bin');\n\n/**\n * Check if two paths are equal (case-insensitive on Windows)\n */\nfunction pathsEqual(a: string, b: string): boolean {\n if (isWindows) {\n return a.toLowerCase() === b.toLowerCase();\n }\n return a === b;\n}\n\n/**\n * Check if a path is within the nvu bin directory\n */\nfunction isInNvuBin(filePath: string): boolean {\n try {\n const realPath = fs.realpathSync(filePath);\n return realPath.indexOf(path.join('.nvu', 'bin')) >= 0 || pathsEqual(path.dirname(realPath), nvuBinDir);\n } catch (_e) {\n return false;\n }\n}\n\n/**\n * Find a system binary by searching PATH, excluding ~/.nvu/bin\n * Returns the full path to the binary, or null if not found\n */\nexport function resolveSystemBinary(name: string): string | null {\n const pathEnv = process.env.PATH || '';\n const pathSep = isWindows ? ';' : ':';\n const dirs = pathEnv.split(pathSep);\n\n for (let i = 0; i < dirs.length; i++) {\n const dir = dirs[i];\n if (!dir) continue;\n\n // Skip ~/.nvu/bin\n if (pathsEqual(dir, nvuBinDir)) continue;\n\n // Build candidate path with appropriate extension\n const candidates = isWindows ? [path.join(dir, `${name}.exe`), path.join(dir, `${name}.cmd`), path.join(dir, name)] : [path.join(dir, name)];\n\n for (let j = 0; j < candidates.length; j++) {\n const candidate = candidates[j];\n try {\n const stat = fs.statSync(candidate);\n if (!stat.isFile()) continue;\n\n // Make sure it's not in ~/.nvu/bin (via symlink)\n if (isInNvuBin(candidate)) continue;\n\n return candidate;\n } catch (_e) {\n // File doesn't exist, continue\n }\n }\n }\n\n return null;\n}\n\n/**\n * Get PATH with ~/.nvu/bin removed\n * Used to create an environment for spawning system commands\n */\nexport function getPathWithoutNvuBin(): string {\n const pathEnv = process.env.PATH || '';\n const pathSep = isWindows ? ';' : ':';\n const dirs = pathEnv.split(pathSep);\n\n const filtered: string[] = [];\n for (let i = 0; i < dirs.length; i++) {\n const dir = dirs[i];\n if (!dir) continue;\n if (pathsEqual(dir, nvuBinDir)) continue;\n if (dir.indexOf(path.join('.nvu', 'bin')) >= 0) continue;\n filtered.push(dir);\n }\n\n return filtered.join(pathSep);\n}\n"],"names":["fs","path","homedir","isWindows","process","platform","test","env","OSTYPE","nvuBinDir","join","pathsEqual","a","b","toLowerCase","isInNvuBin","filePath","realPath","realpathSync","indexOf","dirname","_e","resolveSystemBinary","name","pathEnv","PATH","pathSep","dirs","split","i","length","dir","candidates","j","candidate","stat","statSync","isFile","getPathWithoutNvuBin","filtered","push"],"mappings":"AAAA;;;CAGC,GACD,OAAOA,QAAQ,KAAK;AACpB,OAAOC,UAAU,OAAO;AACxB,SAASC,OAAO,QAAQ,eAAe;AAEvC,MAAMC,YAAYC,QAAQC,QAAQ,KAAK,WAAW,kBAAkBC,IAAI,CAACF,QAAQG,GAAG,CAACC,MAAM;AAC3F,MAAMC,YAAYR,KAAKS,IAAI,CAACR,WAAW,QAAQ;AAE/C;;CAEC,GACD,SAASS,WAAWC,CAAS,EAAEC,CAAS;IACtC,IAAIV,WAAW;QACb,OAAOS,EAAEE,WAAW,OAAOD,EAAEC,WAAW;IAC1C;IACA,OAAOF,MAAMC;AACf;AAEA;;CAEC,GACD,SAASE,WAAWC,QAAgB;IAClC,IAAI;QACF,MAAMC,WAAWjB,GAAGkB,YAAY,CAACF;QACjC,OAAOC,SAASE,OAAO,CAAClB,KAAKS,IAAI,CAAC,QAAQ,WAAW,KAAKC,WAAWV,KAAKmB,OAAO,CAACH,WAAWR;IAC/F,EAAE,OAAOY,IAAI;QACX,OAAO;IACT;AACF;AAEA;;;CAGC,GACD,OAAO,SAASC,oBAAoBC,IAAY;IAC9C,MAAMC,UAAUpB,QAAQG,GAAG,CAACkB,IAAI,IAAI;IACpC,MAAMC,UAAUvB,YAAY,MAAM;IAClC,MAAMwB,OAAOH,QAAQI,KAAK,CAACF;IAE3B,IAAK,IAAIG,IAAI,GAAGA,IAAIF,KAAKG,MAAM,EAAED,IAAK;QACpC,MAAME,MAAMJ,IAAI,CAACE,EAAE;QACnB,IAAI,CAACE,KAAK;QAEV,kBAAkB;QAClB,IAAIpB,WAAWoB,KAAKtB,YAAY;QAEhC,kDAAkD;QAClD,MAAMuB,aAAa7B,YAAY;YAACF,KAAKS,IAAI,CAACqB,KAAK,GAAGR,KAAK,IAAI,CAAC;YAAGtB,KAAKS,IAAI,CAACqB,KAAK,GAAGR,KAAK,IAAI,CAAC;YAAGtB,KAAKS,IAAI,CAACqB,KAAKR;SAAM,GAAG;YAACtB,KAAKS,IAAI,CAACqB,KAAKR;SAAM;QAE5I,IAAK,IAAIU,IAAI,GAAGA,IAAID,WAAWF,MAAM,EAAEG,IAAK;YAC1C,MAAMC,YAAYF,UAAU,CAACC,EAAE;YAC/B,IAAI;gBACF,MAAME,OAAOnC,GAAGoC,QAAQ,CAACF;gBACzB,IAAI,CAACC,KAAKE,MAAM,IAAI;gBAEpB,iDAAiD;gBACjD,IAAItB,WAAWmB,YAAY;gBAE3B,OAAOA;YACT,EAAE,OAAOb,IAAI;YACX,+BAA+B;YACjC;QACF;IACF;IAEA,OAAO;AACT;AAEA;;;CAGC,GACD,OAAO,SAASiB;IACd,MAAMd,UAAUpB,QAAQG,GAAG,CAACkB,IAAI,IAAI;IACpC,MAAMC,UAAUvB,YAAY,MAAM;IAClC,MAAMwB,OAAOH,QAAQI,KAAK,CAACF;IAE3B,MAAMa,WAAqB,EAAE;IAC7B,IAAK,IAAIV,IAAI,GAAGA,IAAIF,KAAKG,MAAM,EAAED,IAAK;QACpC,MAAME,MAAMJ,IAAI,CAACE,EAAE;QACnB,IAAI,CAACE,KAAK;QACV,IAAIpB,WAAWoB,KAAKtB,YAAY;QAChC,IAAIsB,IAAIZ,OAAO,CAAClB,KAAKS,IAAI,CAAC,QAAQ,WAAW,GAAG;QAChD6B,SAASC,IAAI,CAACT;IAChB;IAEA,OAAOQ,SAAS7B,IAAI,CAACgB;AACvB"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/lib/resolveSystemBinary.ts"],"sourcesContent":["/**\n * Resolve system binaries by searching PATH while excluding ~/.nvu/bin\n * This mirrors the Go binary's findSystemBinary() function\n */\nimport envPathKey from 'env-path-key';\nimport fs from 'fs';\nimport path from 'path';\nimport { homedir } from '../compat.ts';\n\nconst isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\nconst nvuBinDir = path.join(homedir(), '.nvu', 'bin');\nconst pathKey = envPathKey(); // PATH or Path or similar\nconst pathDelimiter = path.delimiter ? path.delimiter : isWindows ? ';' : ':';\n\n/**\n * Check if two paths are equal (case-insensitive on Windows)\n */\nfunction pathsEqual(a: string, b: string): boolean {\n if (isWindows) return a.toLowerCase() === b.toLowerCase();\n return a === b;\n}\n\n/**\n * Check if a path is within the nvu bin directory\n */\nfunction isInNvuBin(filePath: string): boolean {\n try {\n const realPath = fs.realpathSync(filePath);\n return realPath.indexOf(path.join('.nvu', 'bin')) >= 0 || pathsEqual(path.dirname(realPath), nvuBinDir);\n } catch (_e) {\n return false;\n }\n}\n\n/**\n * Find a system binary by searching PATH, excluding ~/.nvu/bin\n * Returns the full path to the binary, or null if not found\n */\nexport function resolveSystemBinary(name: string): string | null {\n const pathEnv = process.env[pathKey] || '';\n const dirs = pathEnv.split(pathDelimiter);\n\n for (let i = 0; i < dirs.length; i++) {\n const dir = dirs[i];\n if (!dir) continue;\n\n // Skip ~/.nvu/bin\n if (pathsEqual(dir, nvuBinDir)) continue;\n\n // Build candidate path with appropriate extension\n const candidates = isWindows ? [path.join(dir, `${name}.exe`), path.join(dir, `${name}.cmd`), path.join(dir, name)] : [path.join(dir, name)];\n\n for (let j = 0; j < candidates.length; j++) {\n const candidate = candidates[j];\n try {\n const stat = fs.statSync(candidate);\n if (!stat.isFile()) continue;\n\n // Make sure it's not in ~/.nvu/bin (via symlink)\n if (isInNvuBin(candidate)) continue;\n\n return candidate;\n } catch (_e) {\n // File doesn't exist, continue\n }\n }\n }\n\n return null;\n}\n\n/**\n * Get PATH with ~/.nvu/bin removed\n * Used to create an environment for spawning system commands\n */\nexport function getPathWithoutNvuBin(): string {\n const pathEnv = process.env[pathKey] || '';\n const dirs = pathEnv.split(pathDelimiter);\n\n const filtered: string[] = [];\n for (let i = 0; i < dirs.length; i++) {\n const dir = dirs[i];\n if (!dir) continue;\n if (pathsEqual(dir, nvuBinDir)) continue;\n if (dir.indexOf(path.join('.nvu', 'bin')) >= 0) continue;\n filtered.push(dir);\n }\n\n return filtered.join(pathDelimiter);\n}\n"],"names":["envPathKey","fs","path","homedir","isWindows","process","platform","test","env","OSTYPE","nvuBinDir","join","pathKey","pathDelimiter","delimiter","pathsEqual","a","b","toLowerCase","isInNvuBin","filePath","realPath","realpathSync","indexOf","dirname","_e","resolveSystemBinary","name","pathEnv","dirs","split","i","length","dir","candidates","j","candidate","stat","statSync","isFile","getPathWithoutNvuBin","filtered","push"],"mappings":"AAAA;;;CAGC,GACD,OAAOA,gBAAgB,eAAe;AACtC,OAAOC,QAAQ,KAAK;AACpB,OAAOC,UAAU,OAAO;AACxB,SAASC,OAAO,QAAQ,eAAe;AAEvC,MAAMC,YAAYC,QAAQC,QAAQ,KAAK,WAAW,kBAAkBC,IAAI,CAACF,QAAQG,GAAG,CAACC,MAAM;AAC3F,MAAMC,YAAYR,KAAKS,IAAI,CAACR,WAAW,QAAQ;AAC/C,MAAMS,UAAUZ,cAAc,0BAA0B;AACxD,MAAMa,gBAAgBX,KAAKY,SAAS,GAAGZ,KAAKY,SAAS,GAAGV,YAAY,MAAM;AAE1E;;CAEC,GACD,SAASW,WAAWC,CAAS,EAAEC,CAAS;IACtC,IAAIb,WAAW,OAAOY,EAAEE,WAAW,OAAOD,EAAEC,WAAW;IACvD,OAAOF,MAAMC;AACf;AAEA;;CAEC,GACD,SAASE,WAAWC,QAAgB;IAClC,IAAI;QACF,MAAMC,WAAWpB,GAAGqB,YAAY,CAACF;QACjC,OAAOC,SAASE,OAAO,CAACrB,KAAKS,IAAI,CAAC,QAAQ,WAAW,KAAKI,WAAWb,KAAKsB,OAAO,CAACH,WAAWX;IAC/F,EAAE,OAAOe,IAAI;QACX,OAAO;IACT;AACF;AAEA;;;CAGC,GACD,OAAO,SAASC,oBAAoBC,IAAY;IAC9C,MAAMC,UAAUvB,QAAQG,GAAG,CAACI,QAAQ,IAAI;IACxC,MAAMiB,OAAOD,QAAQE,KAAK,CAACjB;IAE3B,IAAK,IAAIkB,IAAI,GAAGA,IAAIF,KAAKG,MAAM,EAAED,IAAK;QACpC,MAAME,MAAMJ,IAAI,CAACE,EAAE;QACnB,IAAI,CAACE,KAAK;QAEV,kBAAkB;QAClB,IAAIlB,WAAWkB,KAAKvB,YAAY;QAEhC,kDAAkD;QAClD,MAAMwB,aAAa9B,YAAY;YAACF,KAAKS,IAAI,CAACsB,KAAK,GAAGN,KAAK,IAAI,CAAC;YAAGzB,KAAKS,IAAI,CAACsB,KAAK,GAAGN,KAAK,IAAI,CAAC;YAAGzB,KAAKS,IAAI,CAACsB,KAAKN;SAAM,GAAG;YAACzB,KAAKS,IAAI,CAACsB,KAAKN;SAAM;QAE5I,IAAK,IAAIQ,IAAI,GAAGA,IAAID,WAAWF,MAAM,EAAEG,IAAK;YAC1C,MAAMC,YAAYF,UAAU,CAACC,EAAE;YAC/B,IAAI;gBACF,MAAME,OAAOpC,GAAGqC,QAAQ,CAACF;gBACzB,IAAI,CAACC,KAAKE,MAAM,IAAI;gBAEpB,iDAAiD;gBACjD,IAAIpB,WAAWiB,YAAY;gBAE3B,OAAOA;YACT,EAAE,OAAOX,IAAI;YACX,+BAA+B;YACjC;QACF;IACF;IAEA,OAAO;AACT;AAEA;;;CAGC,GACD,OAAO,SAASe;IACd,MAAMZ,UAAUvB,QAAQG,GAAG,CAACI,QAAQ,IAAI;IACxC,MAAMiB,OAAOD,QAAQE,KAAK,CAACjB;IAE3B,MAAM4B,WAAqB,EAAE;IAC7B,IAAK,IAAIV,IAAI,GAAGA,IAAIF,KAAKG,MAAM,EAAED,IAAK;QACpC,MAAME,MAAMJ,IAAI,CAACE,EAAE;QACnB,IAAI,CAACE,KAAK;QACV,IAAIlB,WAAWkB,KAAKvB,YAAY;QAChC,IAAIuB,IAAIV,OAAO,CAACrB,KAAKS,IAAI,CAAC,QAAQ,WAAW,GAAG;QAChD8B,SAASC,IAAI,CAACT;IAChB;IAEA,OAAOQ,SAAS9B,IAAI,CAACE;AACvB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-version-use",
3
- "version": "2.4.2",
3
+ "version": "2.4.4",
4
4
  "description": "Cross-platform solution for using multiple versions of node. Useful for compatibility testing",
5
5
  "keywords": [
6
6
  "node",
@@ -48,6 +48,7 @@
48
48
  "version": "tsds version"
49
49
  },
50
50
  "dependencies": {
51
+ "cpu-arch": "^1.1.1",
51
52
  "cross-spawn-cb": "^3.0.0",
52
53
  "exit-compat": "^1.0.0",
53
54
  "fs-remove-compat": "^1.0.0",
package/assets/bin/node DELETED
Binary file