node-version-use 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -37,8 +37,8 @@ function removeIfExistsSync(filePath) {
37
37
  }
38
38
  }
39
39
  /**
40
- * On Windows, rename a file out of the way instead of deleting
41
- * This works even if the file is currently running
40
+ * On Windows, rename a file out of the way instead of deleting.
41
+ * This works even if the file is currently running.
42
42
  */ function moveOutOfWay(filePath) {
43
43
  if (!fs.existsSync(filePath)) return;
44
44
  var timestamp = Date.now();
@@ -46,7 +46,7 @@ function removeIfExistsSync(filePath) {
46
46
  try {
47
47
  fs.renameSync(filePath, oldPath);
48
48
  } catch (_e) {
49
- // If rename fails, try delete as fallback
49
+ // If rename fails, try delete as fallback (works on Unix)
50
50
  try {
51
51
  fs.unlinkSync(filePath);
52
52
  } catch (_e2) {
@@ -234,7 +234,7 @@ function removeIfExistsSync(filePath) {
234
234
  var name = binaries[index];
235
235
  var tempDest = path.join(destDir, "".concat(name, ".tmp-").concat(timestamp).concat(ext));
236
236
  var finalDest = path.join(destDir, "".concat(name).concat(ext));
237
- // Move existing file out of the way (works even if file is running on Windows)
237
+ // Move existing file out of the way (works even if running on Windows)
238
238
  moveOutOfWay(finalDest);
239
239
  atomicRename(tempDest, finalDest, function(err) {
240
240
  if (err && !renameError) {
@@ -37,8 +37,8 @@ function removeIfExistsSync(filePath) {
37
37
  }
38
38
  }
39
39
  /**
40
- * On Windows, rename a file out of the way instead of deleting
41
- * This works even if the file is currently running
40
+ * On Windows, rename a file out of the way instead of deleting.
41
+ * This works even if the file is currently running.
42
42
  */ function moveOutOfWay(filePath) {
43
43
  if (!fs.existsSync(filePath)) return;
44
44
  var timestamp = Date.now();
@@ -46,7 +46,7 @@ function removeIfExistsSync(filePath) {
46
46
  try {
47
47
  fs.renameSync(filePath, oldPath);
48
48
  } catch (_e) {
49
- // If rename fails, try delete as fallback
49
+ // If rename fails, try delete as fallback (works on Unix)
50
50
  try {
51
51
  fs.unlinkSync(filePath);
52
52
  } catch (_e2) {
@@ -234,7 +234,7 @@ function removeIfExistsSync(filePath) {
234
234
  var name = binaries[index];
235
235
  var tempDest = path.join(destDir, "".concat(name, ".tmp-").concat(timestamp).concat(ext));
236
236
  var finalDest = path.join(destDir, "".concat(name).concat(ext));
237
- // Move existing file out of the way (works even if file is running on Windows)
237
+ // Move existing file out of the way (works even if running on Windows)
238
238
  moveOutOfWay(finalDest);
239
239
  atomicRename(tempDest, finalDest, function(err) {
240
240
  if (err && !renameError) {
@@ -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 * On Windows, rename a file out of the way instead of deleting\n * This works even if the file is currently running\n */\nfunction moveOutOfWay(filePath: string): void {\n if (!fs.existsSync(filePath)) return;\n\n const timestamp = Date.now();\n const oldPath = `${filePath}.old-${timestamp}`;\n\n try {\n fs.renameSync(filePath, oldPath);\n } catch (_e) {\n // If rename fails, try delete as fallback\n try {\n fs.unlinkSync(filePath);\n } catch (_e2) {\n // ignore - will fail on atomic rename instead\n }\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 * 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 file is 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\n // check if we need to upgrade\n if (!options.force) {\n try {\n // already installed\n if (fs.statSync(binDir)) {\n if (fs.readFileSync(path.join(binDir, 'version.txt'), 'utf8') === BINARY_VERSION) {\n callback(null, false);\n return;\n }\n }\n } catch (_err) {}\n }\n\n // Create directories\n mkdirp.sync(storagePath);\n mkdirp.sync(binDir);\n\n // 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 tempPath = path.join(tmpdir(), `nvu-binary-${Date.now()}${isWindows ? '.zip' : '.tar.gz'}`);\n\n console.log(`Downloading binary for ${process.platform}-${process.arch}...`);\n\n getFile(downloadUrl, tempPath, (err) => {\n if (err) {\n removeIfExistsSync(tempPath);\n callback(new Error(`No prebuilt binary available for ${process.platform}-${process.arch}. Download: ${downloadUrl}. Error: ${err.message}`));\n return;\n }\n\n console.log('Extracting binary...');\n\n extractAndInstall(tempPath, binDir, extractedBinaryName, (err) => {\n removeIfExistsSync(tempPath);\n if (err) return callback(err);\n\n // save binary version for upgrade checks\n fs.writeFileSync(path.join(binDir, 'version.txt'), BINARY_VERSION, 'utf8');\n console.log('Binary installed successfully!');\n callback(null, true);\n });\n });\n};\n"],"names":["envPathKey","require","fs","safeRmSync","getFile","mkdirp","os","path","Queue","moduleRoot","root","__dirname","GITHUB_REPO","BINARY_VERSION","join","binaryVersion","isWindows","process","platform","test","env","OSTYPE","hasHomedir","homedir","home","storagePath","NVU_HOME","hasTmpdir","tmpdir","osShim","removeIfExistsSync","filePath","existsSync","unlinkSync","_e","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","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","ext","tempExtractDir","sync","extractedPath","Error","binaries","installError","i","name","tempDest","chmodSync","j","tempPath","renameError","doRename","finalDest","module","exports","printInstructions","_nvuBinPath","console","log","pathKey","envPath","indexOf","installBinaries","options","archiveBaseName","extractedBinaryName","binDir","force","statSync","downloadUrl","message"],"mappings":"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"}
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 * On Windows, rename a file out of the way instead of deleting.\n * This works even if the file is currently running.\n */\nfunction moveOutOfWay(filePath: string): void {\n if (!fs.existsSync(filePath)) return;\n\n const timestamp = Date.now();\n const oldPath = `${filePath}.old-${timestamp}`;\n\n try {\n fs.renameSync(filePath, oldPath);\n } catch (_e) {\n // If rename fails, try delete as fallback (works on Unix)\n try {\n fs.unlinkSync(filePath);\n } catch (_e2) {\n // ignore - will fail on atomic rename instead\n }\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 * 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\n // check if we need to upgrade\n if (!options.force) {\n try {\n // already installed\n if (fs.statSync(binDir)) {\n if (fs.readFileSync(path.join(binDir, 'version.txt'), 'utf8') === BINARY_VERSION) {\n callback(null, false);\n return;\n }\n }\n } catch (_err) {}\n }\n\n // Create directories\n mkdirp.sync(storagePath);\n mkdirp.sync(binDir);\n\n // 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 tempPath = path.join(tmpdir(), `nvu-binary-${Date.now()}${isWindows ? '.zip' : '.tar.gz'}`);\n\n console.log(`Downloading binary for ${process.platform}-${process.arch}...`);\n\n getFile(downloadUrl, tempPath, (err) => {\n if (err) {\n removeIfExistsSync(tempPath);\n callback(new Error(`No prebuilt binary available for ${process.platform}-${process.arch}. Download: ${downloadUrl}. Error: ${err.message}`));\n return;\n }\n\n console.log('Extracting binary...');\n\n extractAndInstall(tempPath, binDir, extractedBinaryName, (err) => {\n removeIfExistsSync(tempPath);\n if (err) return callback(err);\n\n // save binary version for upgrade checks\n fs.writeFileSync(path.join(binDir, 'version.txt'), BINARY_VERSION, 'utf8');\n console.log('Binary installed successfully!');\n callback(null, true);\n });\n });\n};\n"],"names":["envPathKey","require","fs","safeRmSync","getFile","mkdirp","os","path","Queue","moduleRoot","root","__dirname","GITHUB_REPO","BINARY_VERSION","join","binaryVersion","isWindows","process","platform","test","env","OSTYPE","hasHomedir","homedir","home","storagePath","NVU_HOME","hasTmpdir","tmpdir","osShim","removeIfExistsSync","filePath","existsSync","unlinkSync","_e","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","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","ext","tempExtractDir","sync","extractedPath","Error","binaries","installError","i","name","tempDest","chmodSync","j","tempPath","renameError","doRename","finalDest","module","exports","printInstructions","_nvuBinPath","console","log","pathKey","envPath","indexOf","installBinaries","options","archiveBaseName","extractedBinaryName","binDir","force","statSync","downloadUrl","message"],"mappings":"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"}
@@ -36,8 +36,8 @@ function removeIfExistsSync(filePath) {
36
36
  }
37
37
  }
38
38
  /**
39
- * On Windows, rename a file out of the way instead of deleting
40
- * This works even if the file is currently running
39
+ * On Windows, rename a file out of the way instead of deleting.
40
+ * This works even if the file is currently running.
41
41
  */ function moveOutOfWay(filePath) {
42
42
  if (!fs.existsSync(filePath)) return;
43
43
  const timestamp = Date.now();
@@ -45,7 +45,7 @@ function removeIfExistsSync(filePath) {
45
45
  try {
46
46
  fs.renameSync(filePath, oldPath);
47
47
  } catch (_e) {
48
- // If rename fails, try delete as fallback
48
+ // If rename fails, try delete as fallback (works on Unix)
49
49
  try {
50
50
  fs.unlinkSync(filePath);
51
51
  } catch (_e2) {
@@ -216,7 +216,7 @@ function removeIfExistsSync(filePath) {
216
216
  const name = binaries[index];
217
217
  const tempDest = path.join(destDir, `${name}.tmp-${timestamp}${ext}`);
218
218
  const finalDest = path.join(destDir, `${name}${ext}`);
219
- // Move existing file out of the way (works even if file is running on Windows)
219
+ // Move existing file out of the way (works even if running on Windows)
220
220
  moveOutOfWay(finalDest);
221
221
  atomicRename(tempDest, finalDest, (err)=>{
222
222
  if (err && !renameError) {
@@ -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 * On Windows, rename a file out of the way instead of deleting\n * This works even if the file is currently running\n */\nfunction moveOutOfWay(filePath: string): void {\n if (!fs.existsSync(filePath)) return;\n\n const timestamp = Date.now();\n const oldPath = `${filePath}.old-${timestamp}`;\n\n try {\n fs.renameSync(filePath, oldPath);\n } catch (_e) {\n // If rename fails, try delete as fallback\n try {\n fs.unlinkSync(filePath);\n } catch (_e2) {\n // ignore - will fail on atomic rename instead\n }\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 * 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 file is 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\n // check if we need to upgrade\n if (!options.force) {\n try {\n // already installed\n if (fs.statSync(binDir)) {\n if (fs.readFileSync(path.join(binDir, 'version.txt'), 'utf8') === BINARY_VERSION) {\n callback(null, false);\n return;\n }\n }\n } catch (_err) {}\n }\n\n // Create directories\n mkdirp.sync(storagePath);\n mkdirp.sync(binDir);\n\n // 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 tempPath = path.join(tmpdir(), `nvu-binary-${Date.now()}${isWindows ? '.zip' : '.tar.gz'}`);\n\n console.log(`Downloading binary for ${process.platform}-${process.arch}...`);\n\n getFile(downloadUrl, tempPath, (err) => {\n if (err) {\n removeIfExistsSync(tempPath);\n callback(new Error(`No prebuilt binary available for ${process.platform}-${process.arch}. Download: ${downloadUrl}. Error: ${err.message}`));\n return;\n }\n\n console.log('Extracting binary...');\n\n extractAndInstall(tempPath, binDir, extractedBinaryName, (err) => {\n removeIfExistsSync(tempPath);\n if (err) return callback(err);\n\n // save binary version for upgrade checks\n fs.writeFileSync(path.join(binDir, 'version.txt'), BINARY_VERSION, 'utf8');\n console.log('Binary installed successfully!');\n callback(null, true);\n });\n });\n};\n"],"names":["envPathKey","require","fs","safeRmSync","getFile","mkdirp","os","path","Queue","moduleRoot","root","__dirname","GITHUB_REPO","BINARY_VERSION","join","binaryVersion","isWindows","process","platform","test","env","OSTYPE","hasHomedir","homedir","home","storagePath","NVU_HOME","hasTmpdir","tmpdir","osShim","removeIfExistsSync","filePath","existsSync","unlinkSync","_e","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","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","ext","tempExtractDir","sync","extractedPath","Error","binaries","installError","i","name","tempDest","chmodSync","j","tempPath","renameError","doRename","finalDest","module","exports","printInstructions","_nvuBinPath","console","log","pathKey","envPath","indexOf","installBinaries","options","archiveBaseName","extractedBinaryName","binDir","force","statSync","downloadUrl","message"],"mappings":"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"}
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 * On Windows, rename a file out of the way instead of deleting.\n * This works even if the file is currently running.\n */\nfunction moveOutOfWay(filePath: string): void {\n if (!fs.existsSync(filePath)) return;\n\n const timestamp = Date.now();\n const oldPath = `${filePath}.old-${timestamp}`;\n\n try {\n fs.renameSync(filePath, oldPath);\n } catch (_e) {\n // If rename fails, try delete as fallback (works on Unix)\n try {\n fs.unlinkSync(filePath);\n } catch (_e2) {\n // ignore - will fail on atomic rename instead\n }\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 * 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\n // check if we need to upgrade\n if (!options.force) {\n try {\n // already installed\n if (fs.statSync(binDir)) {\n if (fs.readFileSync(path.join(binDir, 'version.txt'), 'utf8') === BINARY_VERSION) {\n callback(null, false);\n return;\n }\n }\n } catch (_err) {}\n }\n\n // Create directories\n mkdirp.sync(storagePath);\n mkdirp.sync(binDir);\n\n // 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 tempPath = path.join(tmpdir(), `nvu-binary-${Date.now()}${isWindows ? '.zip' : '.tar.gz'}`);\n\n console.log(`Downloading binary for ${process.platform}-${process.arch}...`);\n\n getFile(downloadUrl, tempPath, (err) => {\n if (err) {\n removeIfExistsSync(tempPath);\n callback(new Error(`No prebuilt binary available for ${process.platform}-${process.arch}. Download: ${downloadUrl}. Error: ${err.message}`));\n return;\n }\n\n console.log('Extracting binary...');\n\n extractAndInstall(tempPath, binDir, extractedBinaryName, (err) => {\n removeIfExistsSync(tempPath);\n if (err) return callback(err);\n\n // save binary version for upgrade checks\n fs.writeFileSync(path.join(binDir, 'version.txt'), BINARY_VERSION, 'utf8');\n console.log('Binary installed successfully!');\n callback(null, true);\n });\n });\n};\n"],"names":["envPathKey","require","fs","safeRmSync","getFile","mkdirp","os","path","Queue","moduleRoot","root","__dirname","GITHUB_REPO","BINARY_VERSION","join","binaryVersion","isWindows","process","platform","test","env","OSTYPE","hasHomedir","homedir","home","storagePath","NVU_HOME","hasTmpdir","tmpdir","osShim","removeIfExistsSync","filePath","existsSync","unlinkSync","_e","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","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","ext","tempExtractDir","sync","extractedPath","Error","binaries","installError","i","name","tempDest","chmodSync","j","tempPath","renameError","doRename","finalDest","module","exports","printInstructions","_nvuBinPath","console","log","pathKey","envPath","indexOf","installBinaries","options","archiveBaseName","extractedBinaryName","binDir","force","statSync","downloadUrl","message"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-version-use",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "description": "Cross-platform solution for using multiple versions of node. Useful for compatibility testing",
5
5
  "keywords": [
6
6
  "node",