node-version-use 2.1.4 → 2.1.6
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.
- package/{dist/cjs/scripts/postinstall.js → assets/postinstall.cjs} +73 -76
- package/dist/cjs/assets/postinstall.cjs +425 -0
- package/dist/cjs/assets/postinstall.cjs.map +1 -0
- package/dist/cjs/commands/default.js.map +1 -1
- package/dist/cjs/commands/list.js.map +1 -1
- package/dist/cjs/commands/setup.js.map +1 -1
- package/dist/cjs/commands/uninstall.js.map +1 -1
- package/dist/cjs/commands/which.js.map +1 -1
- package/dist/cjs/compat.js.map +1 -1
- package/dist/cjs/lib/findInstalledVersions.js.map +1 -1
- package/dist/esm/{scripts/postinstall.js → assets/postinstall.cjs} +18 -13
- package/dist/esm/assets/postinstall.cjs.map +1 -0
- package/dist/esm/commands/default.js +8 -8
- package/dist/esm/commands/default.js.map +1 -1
- package/dist/esm/commands/list.js +3 -3
- package/dist/esm/commands/list.js.map +1 -1
- package/dist/esm/commands/setup.js +20 -20
- package/dist/esm/commands/setup.js.map +1 -1
- package/dist/esm/commands/uninstall.js +12 -12
- package/dist/esm/commands/uninstall.js.map +1 -1
- package/dist/esm/commands/which.js +5 -5
- package/dist/esm/commands/which.js.map +1 -1
- package/dist/esm/compat.js +10 -10
- package/dist/esm/compat.js.map +1 -1
- package/dist/esm/lib/findInstalledVersions.js +19 -19
- package/dist/esm/lib/findInstalledVersions.js.map +1 -1
- package/package.json +19 -19
- package/dist/cjs/scripts/postinstall.js.map +0 -1
- package/dist/esm/scripts/postinstall.d.ts +0 -12
- package/dist/esm/scripts/postinstall.js.map +0 -1
- package/scripts/ensure-test-binaries.ts +0 -27
- package/scripts/postinstall.cjs +0 -9
- /package/dist/cjs/{scripts → assets}/postinstall.d.cts +0 -0
- /package/dist/{cjs/scripts/postinstall.d.ts → esm/assets/postinstall.d.cts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/commands/which.ts"],"sourcesContent":["import exit from 'exit-compat';\nimport fs from 'fs';\nimport path from 'path';\nimport { storagePath } from '../constants.ts';\nimport { findInstalledVersions } from '../lib/findInstalledVersions.ts';\n\n/**\n * nvu which\n *\n * Show which Node binary would be used based on current directory.\n * This simulates what the nvu binary would do.\n */\nexport default function whichCmd(_args: string[]): void {\n const cwd = process.cwd();\n\n // Resolve version using the same logic as the nvu binary\n const version = resolveVersion(cwd);\n\n if (!version) {\n console.log('No Node version configured for this directory.');\n console.log('');\n console.log('To configure a version:');\n console.log(' nvu local <version> - Set version for this project');\n console.log(' nvu default <version> - Set global default');\n exit(1);\n return;\n }\n\n // Resolve partial version to exact installed version\n
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/commands/which.ts"],"sourcesContent":["import exit from 'exit-compat';\nimport fs from 'fs';\nimport path from 'path';\nimport { storagePath } from '../constants.ts';\nimport { findInstalledVersions } from '../lib/findInstalledVersions.ts';\n\n/**\n * nvu which\n *\n * Show which Node binary would be used based on current directory.\n * This simulates what the nvu binary would do.\n */\nexport default function whichCmd(_args: string[]): void {\n const cwd = process.cwd();\n\n // Resolve version using the same logic as the nvu binary\n const version = resolveVersion(cwd);\n\n if (!version) {\n console.log('No Node version configured for this directory.');\n console.log('');\n console.log('To configure a version:');\n console.log(' nvu local <version> - Set version for this project');\n console.log(' nvu default <version> - Set global default');\n exit(1);\n return;\n }\n\n // Resolve partial version to exact installed version\n const versionsPath = path.join(storagePath, 'installed');\n const matches = findInstalledVersions(versionsPath, version);\n const resolvedVersion = matches.length > 0 ? matches[matches.length - 1] : null;\n\n // Display version (show resolution if different)\n if (resolvedVersion && resolvedVersion !== version && resolvedVersion !== `v${version}`) {\n console.log(`Version: ${version} \\u2192 ${resolvedVersion}`);\n } else {\n console.log(`Version: ${resolvedVersion || version}`);\n }\n console.log(`Source: ${getVersionSource(cwd)}`);\n\n if (resolvedVersion) {\n const actualVersionPath = path.join(versionsPath, resolvedVersion);\n const nodePath = path.join(actualVersionPath, 'bin', 'node');\n console.log(`Binary: ${nodePath}`);\n if (fs.existsSync(nodePath)) {\n console.log('Status: Installed');\n } else {\n console.log('Status: Directory exists but binary not found');\n }\n } else {\n console.log(`Status: Not installed (run: nvu install ${version})`);\n }\n\n exit(0);\n}\n\n/**\n * Resolve version from config files (mirrors nvu binary logic)\n */\nfunction resolveVersion(cwd: string): string | null {\n // Walk up directories looking for .nvurc or .nvmrc\n let dir = cwd;\n while (true) {\n // Check .nvurc first\n const nvurcPath = path.join(dir, '.nvurc');\n if (fs.existsSync(nvurcPath)) {\n return fs.readFileSync(nvurcPath, 'utf8').trim();\n }\n\n // Check .nvmrc\n const nvmrcPath = path.join(dir, '.nvmrc');\n if (fs.existsSync(nvmrcPath)) {\n return fs.readFileSync(nvmrcPath, 'utf8').trim();\n }\n\n // Move to parent\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n // Check global default\n const defaultPath = path.join(storagePath, 'default');\n if (fs.existsSync(defaultPath)) {\n return fs.readFileSync(defaultPath, 'utf8').trim();\n }\n\n return null;\n}\n\n/**\n * Determine the source of the version (for display)\n */\nfunction getVersionSource(cwd: string): string {\n let dir = cwd;\n while (true) {\n const nvurcPath = path.join(dir, '.nvurc');\n if (fs.existsSync(nvurcPath)) {\n return nvurcPath;\n }\n\n const nvmrcPath = path.join(dir, '.nvmrc');\n if (fs.existsSync(nvmrcPath)) {\n return nvmrcPath;\n }\n\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n const defaultPath = path.join(storagePath, 'default');\n if (fs.existsSync(defaultPath)) {\n return `${defaultPath} (global default)`;\n }\n\n return 'none';\n}\n"],"names":["whichCmd","_args","cwd","process","version","resolveVersion","console","log","exit","versionsPath","path","join","storagePath","matches","findInstalledVersions","resolvedVersion","length","getVersionSource","actualVersionPath","nodePath","fs","existsSync","dir","nvurcPath","readFileSync","trim","nvmrcPath","parent","dirname","defaultPath"],"mappings":"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"}
|
package/dist/cjs/compat.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/compat.ts"],"sourcesContent":["/**\n * Compatibility Layer for Node.js 0.8+\n * Local to this package - contains only needed functions.\n */\nimport fs from 'fs';\nimport _Module from 'module';\nimport os from 'os';\nimport path from 'path';\n\n// Use existing require in CJS, or createRequire in ESM (Node 12.2+)\
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/compat.ts"],"sourcesContent":["/**\n * Compatibility Layer for Node.js 0.8+\n * Local to this package - contains only needed functions.\n */\nimport fs from 'fs';\nimport _Module from 'module';\nimport os from 'os';\nimport path from 'path';\n\n// Use existing require in CJS, or createRequire in ESM (Node 12.2+)\nconst _require = typeof require === 'undefined' ? _Module.createRequire(import.meta.url) : require;\n\nconst hasHomedir = typeof os.homedir === 'function';\n\nexport function homedir(): string {\n if (hasHomedir) {\n return os.homedir();\n }\n const home = _require('homedir-polyfill');\n return home();\n}\n\n/**\n * String.prototype.endsWith wrapper for Node.js 0.8+\n * - Uses native endsWith on Node 4.0+ / ES2015+\n * - Falls back to lastIndexOf on Node 0.8-3.x\n */\nconst hasEndsWith = typeof String.prototype.endsWith === 'function';\n\nexport function stringEndsWith(str: string, search: string, position?: number): boolean {\n if (hasEndsWith) {\n return str.endsWith(search, position);\n }\n const len = position === undefined ? str.length : position;\n return str.lastIndexOf(search) === len - search.length;\n}\n\n/**\n * Recursive mkdir for Node.js 0.8+\n */\nexport function mkdirpSync(dir: string): void {\n const mkdirp = _require('mkdirp-classic');\n mkdirp.sync(dir);\n}\n\n/**\n * Recursive rm for Node.js 0.8+\n */\nexport function rmSync(dir: string): void {\n const safeRmSync = _require('fs-remove-compat').safeRmSync;\n safeRmSync(dir);\n}\n\n/**\n * Read directory entries with types for Node.js 0.8+\n * Returns array of {name, isDirectory()}\n */\nexport interface DirEntry {\n name: string;\n isDirectory(): boolean;\n}\n\nexport function readdirWithTypes(dir: string): DirEntry[] {\n const names = fs.readdirSync(dir);\n return names.map((name) => {\n const fullPath = path.join(dir, name);\n let stat: fs.Stats;\n try {\n stat = fs.statSync(fullPath);\n } catch (_e) {\n // If stat fails, treat as non-directory\n return { name: name, isDirectory: () => false };\n }\n return {\n name: name,\n isDirectory: () => stat.isDirectory(),\n };\n });\n}\n"],"names":["homedir","mkdirpSync","readdirWithTypes","rmSync","stringEndsWith","_require","require","_Module","createRequire","hasHomedir","os","home","hasEndsWith","String","prototype","endsWith","str","search","position","len","undefined","length","lastIndexOf","dir","mkdirp","sync","safeRmSync","names","fs","readdirSync","map","name","fullPath","path","join","stat","statSync","_e","isDirectory"],"mappings":"AAAA;;;CAGC;;;;;;;;;;;QAWeA;eAAAA;;QA0BAC;eAAAA;;QAsBAC;eAAAA;;QAdAC;eAAAA;;QAnBAC;eAAAA;;;yDAzBD;6DACK;yDACL;2DACE;;;;;;AAEjB,oEAAoE;AACpE,IAAMC,WAAW,OAAOC,YAAY,cAAcC,eAAO,CAACC,aAAa,CAAC,uDAAmBF;AAE3F,IAAMG,aAAa,OAAOC,WAAE,CAACV,OAAO,KAAK;AAElC,SAASA;IACd,IAAIS,YAAY;QACd,OAAOC,WAAE,CAACV,OAAO;IACnB;IACA,IAAMW,OAAON,SAAS;IACtB,OAAOM;AACT;AAEA;;;;CAIC,GACD,IAAMC,cAAc,OAAOC,OAAOC,SAAS,CAACC,QAAQ,KAAK;AAElD,SAASX,eAAeY,GAAW,EAAEC,MAAc,EAAEC,QAAiB;IAC3E,IAAIN,aAAa;QACf,OAAOI,IAAID,QAAQ,CAACE,QAAQC;IAC9B;IACA,IAAMC,MAAMD,aAAaE,YAAYJ,IAAIK,MAAM,GAAGH;IAClD,OAAOF,IAAIM,WAAW,CAACL,YAAYE,MAAMF,OAAOI,MAAM;AACxD;AAKO,SAASpB,WAAWsB,GAAW;IACpC,IAAMC,SAASnB,SAAS;IACxBmB,OAAOC,IAAI,CAACF;AACd;AAKO,SAASpB,OAAOoB,GAAW;IAChC,IAAMG,aAAarB,SAAS,oBAAoBqB,UAAU;IAC1DA,WAAWH;AACb;AAWO,SAASrB,iBAAiBqB,GAAW;IAC1C,IAAMI,QAAQC,WAAE,CAACC,WAAW,CAACN;IAC7B,OAAOI,MAAMG,GAAG,CAAC,SAACC;QAChB,IAAMC,WAAWC,aAAI,CAACC,IAAI,CAACX,KAAKQ;QAChC,IAAII;QACJ,IAAI;YACFA,OAAOP,WAAE,CAACQ,QAAQ,CAACJ;QACrB,EAAE,OAAOK,IAAI;YACX,wCAAwC;YACxC,OAAO;gBAAEN,MAAMA;gBAAMO,aAAa;2BAAM;;YAAM;QAChD;QACA,OAAO;YACLP,MAAMA;YACNO,aAAa;uBAAMH,KAAKG,WAAW;;QACrC;IACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/lib/findInstalledVersions.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { readdirWithTypes } from '../compat.ts';\n\n/**\n * Compare two semver version strings (e.g., \"20.19.0\" vs \"20.9.1\")\n * Returns: negative if a < b, positive if a > b, 0 if equal\n */\nfunction compareVersions(a: string, b: string): number {\n
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/lib/findInstalledVersions.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { readdirWithTypes } from '../compat.ts';\n\n/**\n * Compare two semver version strings (e.g., \"20.19.0\" vs \"20.9.1\")\n * Returns: negative if a < b, positive if a > b, 0 if equal\n */\nfunction compareVersions(a: string, b: string): number {\n const aParts = a.replace(/^v/, '').split('.');\n const bParts = b.replace(/^v/, '').split('.');\n const len = Math.max(aParts.length, bParts.length);\n\n for (let i = 0; i < len; i++) {\n const aNum = parseInt(aParts[i], 10) || 0;\n const bNum = parseInt(bParts[i], 10) || 0;\n if (aNum !== bNum) {\n return aNum - bNum;\n }\n }\n return 0;\n}\n\n/**\n * Find all installed versions matching the given version string\n * Results are sorted in ascending semver order (lowest first, highest last)\n */\nexport function findInstalledVersions(versionsPath: string, version: string): string[] {\n if (!fs.existsSync(versionsPath)) {\n return [];\n }\n\n const normalizedVersion = version.replace(/^v/, '');\n const matches: string[] = [];\n\n // Try exact matches first\n const exactMatches = [version, `v${normalizedVersion}`, normalizedVersion];\n for (let i = 0; i < exactMatches.length; i++) {\n const v = exactMatches[i];\n const versionPath = path.join(versionsPath, v);\n if (fs.existsSync(versionPath) && fs.statSync(versionPath).isDirectory()) {\n if (matches.indexOf(v) === -1) {\n matches.push(v);\n }\n }\n }\n\n // If we have an exact match, return just that\n if (matches.length > 0) {\n return matches;\n }\n\n // Try partial match (e.g., \"20\" matches \"v20.19.6\")\n const entries = readdirWithTypes(versionsPath);\n for (let j = 0; j < entries.length; j++) {\n const entry = entries[j];\n if (!entry.isDirectory()) continue;\n const dirVersion = entry.name.replace(/^v/, '');\n if (dirVersion.indexOf(`${normalizedVersion}.`) === 0) {\n matches.push(entry.name);\n }\n }\n\n // Sort by semver (ascending) so highest version is last\n matches.sort(compareVersions);\n\n return matches;\n}\n\n/**\n * Get all installed versions\n */\nexport function getAllInstalledVersions(versionsPath: string): string[] {\n if (!fs.existsSync(versionsPath)) {\n return [];\n }\n\n const entries = readdirWithTypes(versionsPath);\n const versions: string[] = [];\n for (let i = 0; i < entries.length; i++) {\n if (entries[i].isDirectory()) {\n versions.push(entries[i].name);\n }\n }\n\n return versions;\n}\n"],"names":["findInstalledVersions","getAllInstalledVersions","compareVersions","a","b","aParts","replace","split","bParts","len","Math","max","length","i","aNum","parseInt","bNum","versionsPath","version","fs","existsSync","normalizedVersion","matches","exactMatches","v","versionPath","path","join","statSync","isDirectory","indexOf","push","entries","readdirWithTypes","j","entry","dirVersion","name","sort","versions"],"mappings":";;;;;;;;;;;QA2BgBA;eAAAA;;QA6CAC;eAAAA;;;yDAxED;2DACE;wBACgB;;;;;;AAEjC;;;CAGC,GACD,SAASC,gBAAgBC,CAAS,EAAEC,CAAS;IAC3C,IAAMC,SAASF,EAAEG,OAAO,CAAC,MAAM,IAAIC,KAAK,CAAC;IACzC,IAAMC,SAASJ,EAAEE,OAAO,CAAC,MAAM,IAAIC,KAAK,CAAC;IACzC,IAAME,MAAMC,KAAKC,GAAG,CAACN,OAAOO,MAAM,EAAEJ,OAAOI,MAAM;IAEjD,IAAK,IAAIC,IAAI,GAAGA,IAAIJ,KAAKI,IAAK;QAC5B,IAAMC,OAAOC,SAASV,MAAM,CAACQ,EAAE,EAAE,OAAO;QACxC,IAAMG,OAAOD,SAASP,MAAM,CAACK,EAAE,EAAE,OAAO;QACxC,IAAIC,SAASE,MAAM;YACjB,OAAOF,OAAOE;QAChB;IACF;IACA,OAAO;AACT;AAMO,SAAShB,sBAAsBiB,YAAoB,EAAEC,OAAe;IACzE,IAAI,CAACC,WAAE,CAACC,UAAU,CAACH,eAAe;QAChC,OAAO,EAAE;IACX;IAEA,IAAMI,oBAAoBH,QAAQZ,OAAO,CAAC,MAAM;IAChD,IAAMgB,UAAoB,EAAE;IAE5B,0BAA0B;IAC1B,IAAMC,eAAe;QAACL;QAAU,IAAqB,OAAlBG;QAAqBA;KAAkB;IAC1E,IAAK,IAAIR,IAAI,GAAGA,IAAIU,aAAaX,MAAM,EAAEC,IAAK;QAC5C,IAAMW,IAAID,YAAY,CAACV,EAAE;QACzB,IAAMY,cAAcC,aAAI,CAACC,IAAI,CAACV,cAAcO;QAC5C,IAAIL,WAAE,CAACC,UAAU,CAACK,gBAAgBN,WAAE,CAACS,QAAQ,CAACH,aAAaI,WAAW,IAAI;YACxE,IAAIP,QAAQQ,OAAO,CAACN,OAAO,CAAC,GAAG;gBAC7BF,QAAQS,IAAI,CAACP;YACf;QACF;IACF;IAEA,8CAA8C;IAC9C,IAAIF,QAAQV,MAAM,GAAG,GAAG;QACtB,OAAOU;IACT;IAEA,oDAAoD;IACpD,IAAMU,UAAUC,IAAAA,0BAAgB,EAAChB;IACjC,IAAK,IAAIiB,IAAI,GAAGA,IAAIF,QAAQpB,MAAM,EAAEsB,IAAK;QACvC,IAAMC,QAAQH,OAAO,CAACE,EAAE;QACxB,IAAI,CAACC,MAAMN,WAAW,IAAI;QAC1B,IAAMO,aAAaD,MAAME,IAAI,CAAC/B,OAAO,CAAC,MAAM;QAC5C,IAAI8B,WAAWN,OAAO,CAAC,AAAC,GAAoB,OAAlBT,mBAAkB,UAAQ,GAAG;YACrDC,QAAQS,IAAI,CAACI,MAAME,IAAI;QACzB;IACF;IAEA,wDAAwD;IACxDf,QAAQgB,IAAI,CAACpC;IAEb,OAAOoB;AACT;AAKO,SAASrB,wBAAwBgB,YAAoB;IAC1D,IAAI,CAACE,WAAE,CAACC,UAAU,CAACH,eAAe;QAChC,OAAO,EAAE;IACX;IAEA,IAAMe,UAAUC,IAAAA,0BAAgB,EAAChB;IACjC,IAAMsB,WAAqB,EAAE;IAC7B,IAAK,IAAI1B,IAAI,GAAGA,IAAImB,QAAQpB,MAAM,EAAEC,IAAK;QACvC,IAAImB,OAAO,CAACnB,EAAE,CAACgB,WAAW,IAAI;YAC5BU,SAASR,IAAI,CAACC,OAAO,CAACnB,EAAE,CAACwB,IAAI;QAC/B;IACF;IAEA,OAAOE;AACT"}
|
|
@@ -8,22 +8,27 @@
|
|
|
8
8
|
* 1. Download to temp file
|
|
9
9
|
* 2. Extract to temp directory
|
|
10
10
|
* 3. Atomic rename to final location
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
11
|
+
*/ const { spawn } = require('child_process');
|
|
12
|
+
const exit = require('exit-compat');
|
|
13
|
+
const fs = require('fs');
|
|
14
|
+
const mkdirp = require('mkdirp-classic');
|
|
15
|
+
const os = require('os');
|
|
16
|
+
const path = require('path');
|
|
17
|
+
const hasHomedir = typeof os.homedir === 'function';
|
|
18
|
+
function homedir() {
|
|
19
|
+
if (hasHomedir) {
|
|
20
|
+
return os.homedir();
|
|
21
|
+
}
|
|
22
|
+
var home = require('homedir-polyfill');
|
|
23
|
+
return home();
|
|
24
|
+
}
|
|
25
|
+
module.exports = {
|
|
26
|
+
homedir
|
|
27
|
+
};
|
|
23
28
|
// Configuration
|
|
24
29
|
const GITHUB_REPO = 'kmalakoff/node-version-use';
|
|
25
30
|
// Path is relative to dist/cjs/scripts/ at runtime
|
|
26
|
-
const BINARY_VERSION =
|
|
31
|
+
const BINARY_VERSION = require(path.join(__dirname, '..', 'package.json')).binaryVersion;
|
|
27
32
|
/**
|
|
28
33
|
* Get the platform-specific archive base name (without extension)
|
|
29
34
|
*/ function getArchiveBaseName() {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/assets/postinstall.cts"],"sourcesContent":["/**\n * Postinstall script for node-version-use\n *\n * Downloads the platform-specific binary and installs it to ~/.nvu/bin/\n * This enables transparent Node version switching.\n *\n * Uses safe atomic download pattern:\n * 1. Download to temp file\n * 2. Extract to temp directory\n * 3. Atomic rename to final location\n */\n\nconst { spawn } = require('child_process');\nconst exit = require('exit-compat');\nconst fs = require('fs');\nconst mkdirp = require('mkdirp-classic');\nconst os = require('os');\nconst path = require('path');\n\nconst hasHomedir = typeof os.homedir === 'function';\nfunction homedir(): string {\n if (hasHomedir) {\n return os.homedir();\n }\n var home = require('homedir-polyfill');\n return home();\n}\n\nmodule.exports = { homedir };\n\n// Configuration\nconst GITHUB_REPO = 'kmalakoff/node-version-use';\n// Path is relative to dist/cjs/scripts/ at runtime\nconst BINARY_VERSION = require(path.join(__dirname, '..', 'package.json')).binaryVersion;\n\ntype Callback = (err?: Error | null) => void;\n\ninterface PlatformMap {\n [key: string]: string;\n}\n\n/**\n * Get the platform-specific archive base name (without extension)\n */\nfunction getArchiveBaseName(): string | null {\n const platform = os.platform();\n const arch = os.arch();\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) {\n return null;\n }\n\n return `nvu-binary-${platformName}-${archName}`;\n}\n\n/**\n * Get the extracted binary name (includes .exe on Windows)\n */\nfunction getExtractedBinaryName(archiveBaseName: string): string {\n const ext = os.platform() === 'win32' ? '.exe' : '';\n return archiveBaseName + ext;\n}\n\n/**\n * Get the download URL for the binary archive\n */\nfunction getDownloadUrl(archiveBaseName: string): string {\n const ext = os.platform() === 'win32' ? '.zip' : '.tar.gz';\n return `https://github.com/${GITHUB_REPO}/releases/download/binary-v${BINARY_VERSION}/${archiveBaseName}${ext}`;\n}\n\n/**\n * Copy file\n */\nfunction copyFileSync(src: string, dest: string): void {\n const content = fs.readFileSync(src);\n fs.writeFileSync(dest, content);\n}\n\n/**\n * Atomic rename with fallback to copy+delete for cross-device moves\n */\nfunction atomicRename(src: string, dest: string, callback: Callback): void {\n fs.rename(src, dest, (err) => {\n if (!err) {\n callback(null);\n return;\n }\n\n // Cross-device link error - fall back to copy + delete\n if ((err as NodeJS.ErrnoException).code === 'EXDEV') {\n try {\n copyFileSync(src, dest);\n fs.unlinkSync(src);\n callback(null);\n } catch (copyErr) {\n callback(copyErr as Error);\n }\n return;\n }\n\n callback(err);\n });\n}\n\n/**\n * Remove directory recursively\n */\nfunction rmRecursive(dir: string): void {\n if (!fs.existsSync(dir)) return;\n\n const files = fs.readdirSync(dir);\n for (let i = 0; i < files.length; i++) {\n const filePath = path.join(dir, files[i]);\n const stat = fs.statSync(filePath);\n if (stat.isDirectory()) {\n rmRecursive(filePath);\n } else {\n fs.unlinkSync(filePath);\n }\n }\n fs.rmdirSync(dir);\n}\n\n/**\n * Get temp directory\n */\nfunction getTmpDir(): string {\n return typeof os.tmpdir === 'function' ? os.tmpdir() : process.env.TMPDIR || process.env.TMP || process.env.TEMP || '/tmp';\n}\n\n/**\n * Download using curl (macOS, Linux, Windows 10+)\n */\nfunction downloadWithCurl(downloadUrl: string, destPath: string, callback: Callback): void {\n const curl = spawn('curl', ['-L', '-f', '-s', '-o', destPath, downloadUrl]);\n\n curl.on('close', (code) => {\n if (code !== 0) {\n // curl exit codes: 22 = HTTP error (4xx/5xx), 56 = receive error (often 404 with -f)\n if (code === 22 || code === 56) {\n callback(new Error('HTTP 404'));\n } else {\n callback(new Error(`curl failed with exit code ${code}`));\n }\n return;\n }\n callback(null);\n });\n\n curl.on('error', (err) => {\n callback(err);\n });\n}\n\n/**\n * Download using PowerShell (Windows 7+ fallback)\n */\nfunction downloadWithPowerShell(downloadUrl: string, destPath: string, callback: Callback): void {\n const psCommand = `Invoke-WebRequest -Uri \"${downloadUrl}\" -OutFile \"${destPath}\" -UseBasicParsing`;\n const ps = spawn('powershell', ['-NoProfile', '-Command', psCommand]);\n\n ps.on('close', (code) => {\n if (code !== 0) {\n callback(new Error(`PowerShell download failed with exit code ${code}`));\n return;\n }\n callback(null);\n });\n\n ps.on('error', (err) => {\n callback(err);\n });\n}\n\n/**\n * Download a file - tries curl first, falls back to PowerShell on Windows\n * Node 0.8's OpenSSL doesn't support TLS 1.2+ required by GitHub\n */\nfunction downloadFile(downloadUrl: string, destPath: string, callback: Callback): void {\n downloadWithCurl(downloadUrl, destPath, (err) => {\n if (!err) {\n callback(null);\n return;\n }\n\n // If curl failed and we're on Windows, try PowerShell\n if (os.platform() === 'win32' && err?.message?.indexOf('ENOENT') >= 0) {\n downloadWithPowerShell(downloadUrl, destPath, callback);\n return;\n }\n\n callback(err);\n });\n}\n\n/**\n * Extract archive to a directory (callback-based)\n */\nfunction extractArchive(archivePath: string, destDir: string, callback: Callback): void {\n const platform = os.platform();\n\n if (platform === 'win32') {\n // Windows: extract zip using PowerShell\n const ps = spawn('powershell', ['-Command', `Expand-Archive -Path '${archivePath}' -DestinationPath '${destDir}' -Force`]);\n ps.on('close', (code) => {\n if (code !== 0) {\n callback(new Error('Failed to extract archive'));\n return;\n }\n callback(null);\n });\n } else {\n // Unix: extract tar.gz\n const tar = spawn('tar', ['-xzf', archivePath, '-C', destDir]);\n tar.on('close', (code) => {\n if (code !== 0) {\n callback(new Error('Failed to extract archive'));\n return;\n }\n callback(null);\n });\n }\n}\n\n/**\n * Install binaries using atomic rename pattern\n * 1. Extract to temp directory\n * 2. Copy binary to temp files in destination directory\n * 3. Atomic rename temp files to final names\n */\nfunction extractAndInstall(archivePath: string, destDir: string, binaryName: string, callback: Callback): void {\n const platform = os.platform();\n const isWindows = platform === 'win32';\n const ext = isWindows ? '.exe' : '';\n\n // Create temp extraction directory\n const tempExtractDir = path.join(getTmpDir(), `nvu-extract-${Date.now()}`);\n mkdirp.sync(tempExtractDir);\n\n extractArchive(archivePath, tempExtractDir, (extractErr) => {\n if (extractErr) {\n rmRecursive(tempExtractDir);\n callback(extractErr);\n return;\n }\n\n const extractedPath = path.join(tempExtractDir, binaryName);\n if (!fs.existsSync(extractedPath)) {\n rmRecursive(tempExtractDir);\n callback(new Error(`Extracted binary not found: ${binaryName}`));\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) {\n fs.chmodSync(tempDest, 0o755);\n }\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 if (fs.existsSync(tempPath)) {\n try {\n fs.unlinkSync(tempPath);\n } catch (_e) {\n // ignore cleanup errors\n }\n }\n }\n rmRecursive(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 rmRecursive(tempExtractDir);\n callback(renameError);\n return;\n }\n\n const name = binaries[index];\n const tempDest = path.join(destDir, `${name}.tmp-${timestamp}${ext}`);\n const finalDest = path.join(destDir, `${name}${ext}`);\n\n // Remove existing file if present (for atomic replacement)\n if (fs.existsSync(finalDest)) {\n try {\n fs.unlinkSync(finalDest);\n } catch (_e) {\n // ignore cleanup errors\n }\n }\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 */\nfunction printInstructions(installed: boolean): void {\n const homedirPath = homedir();\n const nvuBinPath = path.join(homedirPath, '.nvu', 'bin');\n const platform = os.platform();\n\n console.log('');\n console.log('============================================================');\n if (installed) {\n console.log(' nvu binaries installed to ~/.nvu/bin/');\n } else {\n console.log(' nvu installed (binaries not yet available)');\n }\n console.log('============================================================');\n console.log('');\n console.log('To enable transparent Node version switching, add to your shell profile:');\n console.log('');\n\n if (platform === 'win32') {\n console.log(' PowerShell (add to $PROFILE):');\n console.log(` $env:PATH = \"${nvuBinPath};$env:PATH\"`);\n console.log('');\n console.log(' CMD (run as administrator):');\n console.log(` setx PATH \"${nvuBinPath};%PATH%\"`);\n } else {\n console.log(' # For bash (~/.bashrc):');\n console.log(' export PATH=\"$HOME/.nvu/bin:$PATH\"');\n console.log('');\n console.log(' # For zsh (~/.zshrc):');\n console.log(' export PATH=\"$HOME/.nvu/bin:$PATH\"');\n console.log('');\n console.log(' # For fish (~/.config/fish/config.fish):');\n console.log(' set -gx PATH $HOME/.nvu/bin $PATH');\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 */\nfunction main(): void {\n const archiveBaseName = getArchiveBaseName();\n\n if (!archiveBaseName) {\n console.log('postinstall: Unsupported platform/architecture for binary.');\n console.log(`Platform: ${os.platform()}, Arch: ${os.arch()}`);\n console.log('Binary not installed. You can still use nvu with explicit versions: nvu 18 npm test');\n exit(0);\n return;\n }\n\n const extractedBinaryName = getExtractedBinaryName(archiveBaseName);\n\n const homedirPath = homedir();\n const nvuDir = path.join(homedirPath, '.nvu');\n const binDir = path.join(nvuDir, 'bin');\n\n // Create directories\n mkdirp.sync(nvuDir);\n mkdirp.sync(binDir);\n\n const downloadUrl = getDownloadUrl(archiveBaseName);\n const ext = os.platform() === 'win32' ? '.zip' : '.tar.gz';\n const tempPath = path.join(getTmpDir(), `nvu-binary-${Date.now()}${ext}`);\n\n console.log(`postinstall: Downloading binary for ${os.platform()}-${os.arch()}...`);\n\n downloadFile(downloadUrl, tempPath, (downloadErr) => {\n if (downloadErr) {\n // Clean up temp file if it exists\n if (fs.existsSync(tempPath)) {\n try {\n fs.unlinkSync(tempPath);\n } catch (_e) {\n // ignore cleanup errors\n }\n }\n\n if (downloadErr.message?.indexOf('404') >= 0) {\n console.log('postinstall: Binaries not yet published to GitHub releases.');\n console.log('');\n console.log('To build and install binaries locally:');\n console.log(' cd node_modules/node-version-use/binary');\n console.log(' make install');\n console.log('');\n console.log('Or wait for the next release which will include pre-built binaries.');\n } else {\n console.log(`postinstall warning: Failed to install binary: ${downloadErr.message || downloadErr}`);\n console.log('You can still use nvu with explicit versions: nvu 18 npm test');\n console.log('To install binaries manually: cd node_modules/node-version-use/binary && make install');\n }\n printInstructions(false);\n exit(0);\n return;\n }\n\n console.log('postinstall: Extracting binary...');\n\n extractAndInstall(tempPath, binDir, extractedBinaryName, (extractErr) => {\n // Clean up temp file\n if (fs.existsSync(tempPath)) {\n try {\n fs.unlinkSync(tempPath);\n } catch (_e) {\n // ignore cleanup errors\n }\n }\n\n if (extractErr) {\n console.log(`postinstall warning: Failed to extract binary: ${extractErr.message || extractErr}`);\n console.log('You can still use nvu with explicit versions: nvu 18 npm test');\n printInstructions(false);\n exit(0);\n return;\n }\n\n console.log('postinstall: Binary installed successfully!');\n printInstructions(true);\n exit(0);\n });\n });\n}\n\nmain();\n"],"names":["spawn","require","exit","fs","mkdirp","os","path","hasHomedir","homedir","home","module","exports","GITHUB_REPO","BINARY_VERSION","join","__dirname","binaryVersion","getArchiveBaseName","platform","arch","platformMap","darwin","linux","win32","archMap","x64","arm64","amd64","platformName","archName","getExtractedBinaryName","archiveBaseName","ext","getDownloadUrl","copyFileSync","src","dest","content","readFileSync","writeFileSync","atomicRename","callback","rename","err","code","unlinkSync","copyErr","rmRecursive","dir","existsSync","files","readdirSync","i","length","filePath","stat","statSync","isDirectory","rmdirSync","getTmpDir","tmpdir","process","env","TMPDIR","TMP","TEMP","downloadWithCurl","downloadUrl","destPath","curl","on","Error","downloadWithPowerShell","psCommand","ps","downloadFile","message","indexOf","extractArchive","archivePath","destDir","tar","extractAndInstall","binaryName","isWindows","tempExtractDir","Date","now","sync","extractErr","extractedPath","binaries","timestamp","installError","name","tempDest","chmodSync","j","tempPath","_e","renameError","doRename","index","finalDest","printInstructions","installed","homedirPath","nvuBinPath","console","log","main","extractedBinaryName","nvuDir","binDir","downloadErr"],"mappings":"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"}
|
|
@@ -11,12 +11,12 @@ import loadNodeVersionInstall from '../lib/loadNodeVersionInstall.js';
|
|
|
11
11
|
* Set or display the global default Node version.
|
|
12
12
|
* This is used when no .nvmrc or .nvurc is found in the project.
|
|
13
13
|
*/ export default function defaultCmd(args) {
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
const defaultFilePath = path.join(storagePath, 'default');
|
|
15
|
+
const versionsPath = path.join(storagePath, 'installed');
|
|
16
16
|
// If no version provided, display current default
|
|
17
17
|
if (args.length === 0) {
|
|
18
18
|
if (fs.existsSync(defaultFilePath)) {
|
|
19
|
-
|
|
19
|
+
const currentVersion = fs.readFileSync(defaultFilePath, 'utf8').trim();
|
|
20
20
|
console.log(`Current default: ${currentVersion}`);
|
|
21
21
|
} else {
|
|
22
22
|
console.log('No default version set.');
|
|
@@ -25,7 +25,7 @@ import loadNodeVersionInstall from '../lib/loadNodeVersionInstall.js';
|
|
|
25
25
|
exit(0);
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
28
|
-
|
|
28
|
+
const version = args[0].trim();
|
|
29
29
|
// Validate version format (basic check, indexOf for Node 0.8+ compat)
|
|
30
30
|
if (!version || version.indexOf('-') === 0) {
|
|
31
31
|
console.log('Usage: nvu default <version>');
|
|
@@ -38,7 +38,7 @@ import loadNodeVersionInstall from '../lib/loadNodeVersionInstall.js';
|
|
|
38
38
|
mkdirpSync(storagePath);
|
|
39
39
|
}
|
|
40
40
|
// Check if any installed versions match
|
|
41
|
-
|
|
41
|
+
const matches = findInstalledVersions(versionsPath, version);
|
|
42
42
|
if (matches.length > 0) {
|
|
43
43
|
// Version is installed - resolve to exact and set default
|
|
44
44
|
setDefaultToExact(defaultFilePath, matches);
|
|
@@ -52,7 +52,7 @@ import loadNodeVersionInstall from '../lib/loadNodeVersionInstall.js';
|
|
|
52
52
|
* Set the default to the highest matching installed version
|
|
53
53
|
*/ function setDefaultToExact(defaultFilePath, matches) {
|
|
54
54
|
// matches are sorted by findInstalledVersions, take the last (highest)
|
|
55
|
-
|
|
55
|
+
let exactVersion = matches[matches.length - 1];
|
|
56
56
|
// Ensure it has v prefix for consistency
|
|
57
57
|
if (exactVersion.indexOf('v') !== 0) {
|
|
58
58
|
exactVersion = `v${exactVersion}`;
|
|
@@ -80,12 +80,12 @@ import loadNodeVersionInstall from '../lib/loadNodeVersionInstall.js';
|
|
|
80
80
|
return;
|
|
81
81
|
}
|
|
82
82
|
// Get the installed version from results
|
|
83
|
-
|
|
83
|
+
let installedVersion;
|
|
84
84
|
if (results && results.length > 0) {
|
|
85
85
|
installedVersion = results[0].version;
|
|
86
86
|
} else {
|
|
87
87
|
// Fallback: re-scan installed versions
|
|
88
|
-
|
|
88
|
+
const matches = findInstalledVersions(versionsPath, version);
|
|
89
89
|
if (matches.length === 0) {
|
|
90
90
|
console.error('Installation completed but version not found');
|
|
91
91
|
exit(1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/commands/default.ts"],"sourcesContent":["import exit from 'exit-compat';\nimport fs from 'fs';\nimport path from 'path';\nimport { mkdirpSync } from '../compat.ts';\nimport { storagePath } from '../constants.ts';\nimport { findInstalledVersions } from '../lib/findInstalledVersions.ts';\nimport loadNodeVersionInstall from '../lib/loadNodeVersionInstall.ts';\n\n/**\n * nvu default [version]\n *\n * Set or display the global default Node version.\n * This is used when no .nvmrc or .nvurc is found in the project.\n */\nexport default function defaultCmd(args: string[]): void {\n
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/commands/default.ts"],"sourcesContent":["import exit from 'exit-compat';\nimport fs from 'fs';\nimport path from 'path';\nimport { mkdirpSync } from '../compat.ts';\nimport { storagePath } from '../constants.ts';\nimport { findInstalledVersions } from '../lib/findInstalledVersions.ts';\nimport loadNodeVersionInstall from '../lib/loadNodeVersionInstall.ts';\n\n/**\n * nvu default [version]\n *\n * Set or display the global default Node version.\n * This is used when no .nvmrc or .nvurc is found in the project.\n */\nexport default function defaultCmd(args: string[]): void {\n const defaultFilePath = path.join(storagePath, 'default');\n const versionsPath = path.join(storagePath, 'installed');\n\n // If no version provided, display current default\n if (args.length === 0) {\n if (fs.existsSync(defaultFilePath)) {\n const currentVersion = fs.readFileSync(defaultFilePath, 'utf8').trim();\n console.log(`Current default: ${currentVersion}`);\n } else {\n console.log('No default version set.');\n console.log('Usage: nvu default <version>');\n }\n exit(0);\n return;\n }\n\n const version = args[0].trim();\n\n // Validate version format (basic check, indexOf for Node 0.8+ compat)\n if (!version || version.indexOf('-') === 0) {\n console.log('Usage: nvu default <version>');\n console.log('Example: nvu default 20');\n exit(1);\n return;\n }\n\n // Ensure storage directory exists\n if (!fs.existsSync(storagePath)) {\n mkdirpSync(storagePath);\n }\n\n // Check if any installed versions match\n const matches = findInstalledVersions(versionsPath, version);\n\n if (matches.length > 0) {\n // Version is installed - resolve to exact and set default\n setDefaultToExact(defaultFilePath, matches);\n } else {\n // Version not installed - auto-install it\n console.log(`Node ${version} is not installed. Installing...`);\n autoInstallAndSetDefault(version, versionsPath, defaultFilePath);\n }\n}\n\n/**\n * Set the default to the highest matching installed version\n */\nfunction setDefaultToExact(defaultFilePath: string, matches: string[]): void {\n // matches are sorted by findInstalledVersions, take the last (highest)\n let exactVersion = matches[matches.length - 1];\n\n // Ensure it has v prefix for consistency\n if (exactVersion.indexOf('v') !== 0) {\n exactVersion = `v${exactVersion}`;\n }\n\n // Write the exact version\n fs.writeFileSync(defaultFilePath, `${exactVersion}\\n`, 'utf8');\n console.log(`Default Node version set to: ${exactVersion}`);\n\n exit(0);\n}\n\n/**\n * Auto-install the version and then set it as default\n */\nfunction autoInstallAndSetDefault(version: string, versionsPath: string, defaultFilePath: string): void {\n loadNodeVersionInstall((err, nodeVersionInstall) => {\n if (err || !nodeVersionInstall) {\n console.error('Failed to load node-version-install:', err ? err.message : 'Module not available');\n exit(1);\n return;\n }\n\n nodeVersionInstall(\n version,\n {\n installPath: versionsPath,\n },\n (installErr, results) => {\n if (installErr) {\n console.error(`Failed to install Node ${version}:`, installErr.message);\n exit(1);\n return;\n }\n\n // Get the installed version from results\n let installedVersion: string;\n if (results && results.length > 0) {\n installedVersion = results[0].version;\n } else {\n // Fallback: re-scan installed versions\n const matches = findInstalledVersions(versionsPath, version);\n if (matches.length === 0) {\n console.error('Installation completed but version not found');\n exit(1);\n return;\n }\n installedVersion = matches[matches.length - 1];\n }\n\n // Ensure it has v prefix for consistency\n if (installedVersion.indexOf('v') !== 0) {\n installedVersion = `v${installedVersion}`;\n }\n\n // Write the exact version\n fs.writeFileSync(defaultFilePath, `${installedVersion}\\n`, 'utf8');\n console.log(`Node ${installedVersion} installed successfully.`);\n console.log(`Default Node version set to: ${installedVersion}`);\n\n exit(0);\n }\n );\n });\n}\n"],"names":["exit","fs","path","mkdirpSync","storagePath","findInstalledVersions","loadNodeVersionInstall","defaultCmd","args","defaultFilePath","join","versionsPath","length","existsSync","currentVersion","readFileSync","trim","console","log","version","indexOf","matches","setDefaultToExact","autoInstallAndSetDefault","exactVersion","writeFileSync","err","nodeVersionInstall","error","message","installPath","installErr","results","installedVersion"],"mappings":"AAAA,OAAOA,UAAU,cAAc;AAC/B,OAAOC,QAAQ,KAAK;AACpB,OAAOC,UAAU,OAAO;AACxB,SAASC,UAAU,QAAQ,eAAe;AAC1C,SAASC,WAAW,QAAQ,kBAAkB;AAC9C,SAASC,qBAAqB,QAAQ,kCAAkC;AACxE,OAAOC,4BAA4B,mCAAmC;AAEtE;;;;;CAKC,GACD,eAAe,SAASC,WAAWC,IAAc;IAC/C,MAAMC,kBAAkBP,KAAKQ,IAAI,CAACN,aAAa;IAC/C,MAAMO,eAAeT,KAAKQ,IAAI,CAACN,aAAa;IAE5C,kDAAkD;IAClD,IAAII,KAAKI,MAAM,KAAK,GAAG;QACrB,IAAIX,GAAGY,UAAU,CAACJ,kBAAkB;YAClC,MAAMK,iBAAiBb,GAAGc,YAAY,CAACN,iBAAiB,QAAQO,IAAI;YACpEC,QAAQC,GAAG,CAAC,CAAC,iBAAiB,EAAEJ,gBAAgB;QAClD,OAAO;YACLG,QAAQC,GAAG,CAAC;YACZD,QAAQC,GAAG,CAAC;QACd;QACAlB,KAAK;QACL;IACF;IAEA,MAAMmB,UAAUX,IAAI,CAAC,EAAE,CAACQ,IAAI;IAE5B,sEAAsE;IACtE,IAAI,CAACG,WAAWA,QAAQC,OAAO,CAAC,SAAS,GAAG;QAC1CH,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG,CAAC;QACZlB,KAAK;QACL;IACF;IAEA,kCAAkC;IAClC,IAAI,CAACC,GAAGY,UAAU,CAACT,cAAc;QAC/BD,WAAWC;IACb;IAEA,wCAAwC;IACxC,MAAMiB,UAAUhB,sBAAsBM,cAAcQ;IAEpD,IAAIE,QAAQT,MAAM,GAAG,GAAG;QACtB,0DAA0D;QAC1DU,kBAAkBb,iBAAiBY;IACrC,OAAO;QACL,0CAA0C;QAC1CJ,QAAQC,GAAG,CAAC,CAAC,KAAK,EAAEC,QAAQ,gCAAgC,CAAC;QAC7DI,yBAAyBJ,SAASR,cAAcF;IAClD;AACF;AAEA;;CAEC,GACD,SAASa,kBAAkBb,eAAuB,EAAEY,OAAiB;IACnE,uEAAuE;IACvE,IAAIG,eAAeH,OAAO,CAACA,QAAQT,MAAM,GAAG,EAAE;IAE9C,yCAAyC;IACzC,IAAIY,aAAaJ,OAAO,CAAC,SAAS,GAAG;QACnCI,eAAe,CAAC,CAAC,EAAEA,cAAc;IACnC;IAEA,0BAA0B;IAC1BvB,GAAGwB,aAAa,CAAChB,iBAAiB,GAAGe,aAAa,EAAE,CAAC,EAAE;IACvDP,QAAQC,GAAG,CAAC,CAAC,6BAA6B,EAAEM,cAAc;IAE1DxB,KAAK;AACP;AAEA;;CAEC,GACD,SAASuB,yBAAyBJ,OAAe,EAAER,YAAoB,EAAEF,eAAuB;IAC9FH,uBAAuB,CAACoB,KAAKC;QAC3B,IAAID,OAAO,CAACC,oBAAoB;YAC9BV,QAAQW,KAAK,CAAC,wCAAwCF,MAAMA,IAAIG,OAAO,GAAG;YAC1E7B,KAAK;YACL;QACF;QAEA2B,mBACER,SACA;YACEW,aAAanB;QACf,GACA,CAACoB,YAAYC;YACX,IAAID,YAAY;gBACdd,QAAQW,KAAK,CAAC,CAAC,uBAAuB,EAAET,QAAQ,CAAC,CAAC,EAAEY,WAAWF,OAAO;gBACtE7B,KAAK;gBACL;YACF;YAEA,yCAAyC;YACzC,IAAIiC;YACJ,IAAID,WAAWA,QAAQpB,MAAM,GAAG,GAAG;gBACjCqB,mBAAmBD,OAAO,CAAC,EAAE,CAACb,OAAO;YACvC,OAAO;gBACL,uCAAuC;gBACvC,MAAME,UAAUhB,sBAAsBM,cAAcQ;gBACpD,IAAIE,QAAQT,MAAM,KAAK,GAAG;oBACxBK,QAAQW,KAAK,CAAC;oBACd5B,KAAK;oBACL;gBACF;gBACAiC,mBAAmBZ,OAAO,CAACA,QAAQT,MAAM,GAAG,EAAE;YAChD;YAEA,yCAAyC;YACzC,IAAIqB,iBAAiBb,OAAO,CAAC,SAAS,GAAG;gBACvCa,mBAAmB,CAAC,CAAC,EAAEA,kBAAkB;YAC3C;YAEA,0BAA0B;YAC1BhC,GAAGwB,aAAa,CAAChB,iBAAiB,GAAGwB,iBAAiB,EAAE,CAAC,EAAE;YAC3DhB,QAAQC,GAAG,CAAC,CAAC,KAAK,EAAEe,iBAAiB,wBAAwB,CAAC;YAC9DhB,QAAQC,GAAG,CAAC,CAAC,6BAA6B,EAAEe,kBAAkB;YAE9DjC,KAAK;QACP;IAEJ;AACF"}
|
|
@@ -8,7 +8,7 @@ import { storagePath } from '../constants.js';
|
|
|
8
8
|
*
|
|
9
9
|
* List all installed Node versions.
|
|
10
10
|
*/ export default function listCmd(_args) {
|
|
11
|
-
|
|
11
|
+
const versionsPath = path.join(storagePath, 'installed');
|
|
12
12
|
// Check if versions directory exists
|
|
13
13
|
if (!fs.existsSync(versionsPath)) {
|
|
14
14
|
console.log('No Node versions installed.');
|
|
@@ -17,8 +17,8 @@ import { storagePath } from '../constants.js';
|
|
|
17
17
|
return;
|
|
18
18
|
}
|
|
19
19
|
// Read all directories in versions folder
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
const entries = readdirWithTypes(versionsPath);
|
|
21
|
+
const versions = entries.filter((entry)=>entry.isDirectory()).map((entry)=>entry.name);
|
|
22
22
|
if (versions.length === 0) {
|
|
23
23
|
console.log('No Node versions installed.');
|
|
24
24
|
console.log('Install a version: nvu install <version>');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/commands/list.ts"],"sourcesContent":["import exit from 'exit-compat';\nimport fs from 'fs';\nimport path from 'path';\nimport { readdirWithTypes } from '../compat.ts';\nimport { storagePath } from '../constants.ts';\n\n/**\n * nvu list\n *\n * List all installed Node versions.\n */\nexport default function listCmd(_args: string[]): void {\n
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/commands/list.ts"],"sourcesContent":["import exit from 'exit-compat';\nimport fs from 'fs';\nimport path from 'path';\nimport { readdirWithTypes } from '../compat.ts';\nimport { storagePath } from '../constants.ts';\n\n/**\n * nvu list\n *\n * List all installed Node versions.\n */\nexport default function listCmd(_args: string[]): void {\n const versionsPath = path.join(storagePath, 'installed');\n\n // Check if versions directory exists\n if (!fs.existsSync(versionsPath)) {\n console.log('No Node versions installed.');\n console.log('Install a version: nvu install <version>');\n exit(0);\n return;\n }\n\n // Read all directories in versions folder\n const entries = readdirWithTypes(versionsPath);\n const versions = entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);\n\n if (versions.length === 0) {\n console.log('No Node versions installed.');\n console.log('Install a version: nvu install <version>');\n exit(0);\n return;\n }\n\n // Get the current default\n const defaultFilePath = path.join(storagePath, 'default');\n let defaultVersion = '';\n if (fs.existsSync(defaultFilePath)) {\n defaultVersion = fs.readFileSync(defaultFilePath, 'utf8').trim();\n }\n\n // Sort versions (simple string sort, could be improved with semver)\n versions.sort((a, b) => {\n const aParts = a.split('.').map((n) => parseInt(n, 10) || 0);\n const bParts = b.split('.').map((n) => parseInt(n, 10) || 0);\n for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {\n const aVal = aParts[i] || 0;\n const bVal = bParts[i] || 0;\n if (aVal !== bVal) return bVal - aVal; // Descending order\n }\n return 0;\n });\n\n console.log('Installed Node versions:');\n for (let i = 0; i < versions.length; i++) {\n const version = versions[i];\n const isDefault = version === defaultVersion || `v${version}` === defaultVersion || version === `v${defaultVersion}`;\n const marker = isDefault ? ' (default)' : '';\n console.log(` ${version}${marker}`);\n }\n exit(0);\n}\n"],"names":["exit","fs","path","readdirWithTypes","storagePath","listCmd","_args","versionsPath","join","existsSync","console","log","entries","versions","filter","entry","isDirectory","map","name","length","defaultFilePath","defaultVersion","readFileSync","trim","sort","a","b","aParts","split","n","parseInt","bParts","i","Math","max","aVal","bVal","version","isDefault","marker"],"mappings":"AAAA,OAAOA,UAAU,cAAc;AAC/B,OAAOC,QAAQ,KAAK;AACpB,OAAOC,UAAU,OAAO;AACxB,SAASC,gBAAgB,QAAQ,eAAe;AAChD,SAASC,WAAW,QAAQ,kBAAkB;AAE9C;;;;CAIC,GACD,eAAe,SAASC,QAAQC,KAAe;IAC7C,MAAMC,eAAeL,KAAKM,IAAI,CAACJ,aAAa;IAE5C,qCAAqC;IACrC,IAAI,CAACH,GAAGQ,UAAU,CAACF,eAAe;QAChCG,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG,CAAC;QACZX,KAAK;QACL;IACF;IAEA,0CAA0C;IAC1C,MAAMY,UAAUT,iBAAiBI;IACjC,MAAMM,WAAWD,QAAQE,MAAM,CAAC,CAACC,QAAUA,MAAMC,WAAW,IAAIC,GAAG,CAAC,CAACF,QAAUA,MAAMG,IAAI;IAEzF,IAAIL,SAASM,MAAM,KAAK,GAAG;QACzBT,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG,CAAC;QACZX,KAAK;QACL;IACF;IAEA,0BAA0B;IAC1B,MAAMoB,kBAAkBlB,KAAKM,IAAI,CAACJ,aAAa;IAC/C,IAAIiB,iBAAiB;IACrB,IAAIpB,GAAGQ,UAAU,CAACW,kBAAkB;QAClCC,iBAAiBpB,GAAGqB,YAAY,CAACF,iBAAiB,QAAQG,IAAI;IAChE;IAEA,oEAAoE;IACpEV,SAASW,IAAI,CAAC,CAACC,GAAGC;QAChB,MAAMC,SAASF,EAAEG,KAAK,CAAC,KAAKX,GAAG,CAAC,CAACY,IAAMC,SAASD,GAAG,OAAO;QAC1D,MAAME,SAASL,EAAEE,KAAK,CAAC,KAAKX,GAAG,CAAC,CAACY,IAAMC,SAASD,GAAG,OAAO;QAC1D,IAAK,IAAIG,IAAI,GAAGA,IAAIC,KAAKC,GAAG,CAACP,OAAOR,MAAM,EAAEY,OAAOZ,MAAM,GAAGa,IAAK;YAC/D,MAAMG,OAAOR,MAAM,CAACK,EAAE,IAAI;YAC1B,MAAMI,OAAOL,MAAM,CAACC,EAAE,IAAI;YAC1B,IAAIG,SAASC,MAAM,OAAOA,OAAOD,MAAM,mBAAmB;QAC5D;QACA,OAAO;IACT;IAEAzB,QAAQC,GAAG,CAAC;IACZ,IAAK,IAAIqB,IAAI,GAAGA,IAAInB,SAASM,MAAM,EAAEa,IAAK;QACxC,MAAMK,UAAUxB,QAAQ,CAACmB,EAAE;QAC3B,MAAMM,YAAYD,YAAYhB,kBAAkB,CAAC,CAAC,EAAEgB,SAAS,KAAKhB,kBAAkBgB,YAAY,CAAC,CAAC,EAAEhB,gBAAgB;QACpH,MAAMkB,SAASD,YAAY,eAAe;QAC1C5B,QAAQC,GAAG,CAAC,CAAC,EAAE,EAAE0B,UAAUE,QAAQ;IACrC;IACAvC,KAAK;AACP"}
|
|
@@ -6,14 +6,14 @@ import url from 'url';
|
|
|
6
6
|
import { mkdirpSync, readdirWithTypes } from '../compat.js';
|
|
7
7
|
import { storagePath } from '../constants.js';
|
|
8
8
|
import { findInstalledVersions } from '../lib/findInstalledVersions.js';
|
|
9
|
-
|
|
9
|
+
const __dirname = path.dirname(typeof __filename !== 'undefined' ? __filename : url.fileURLToPath(import.meta.url));
|
|
10
10
|
/**
|
|
11
11
|
* nvu setup [--shims]
|
|
12
12
|
*
|
|
13
13
|
* Install/reinstall nvu binaries to ~/.nvu/bin
|
|
14
14
|
* With --shims: create shims for existing global packages
|
|
15
15
|
*/ export default function setupCmd(args) {
|
|
16
|
-
|
|
16
|
+
const binDir = path.join(storagePath, 'bin');
|
|
17
17
|
// Create directories
|
|
18
18
|
if (!fs.existsSync(storagePath)) {
|
|
19
19
|
mkdirpSync(storagePath);
|
|
@@ -22,8 +22,8 @@ var __dirname = path.dirname(typeof __filename !== 'undefined' ? __filename : ur
|
|
|
22
22
|
mkdirpSync(binDir);
|
|
23
23
|
}
|
|
24
24
|
// Check for --shims flag
|
|
25
|
-
|
|
26
|
-
for(
|
|
25
|
+
let hasShimsFlag = false;
|
|
26
|
+
for(let i = 0; i < args.length; i++){
|
|
27
27
|
if (args[i] === '--shims') {
|
|
28
28
|
hasShimsFlag = true;
|
|
29
29
|
break;
|
|
@@ -34,7 +34,7 @@ var __dirname = path.dirname(typeof __filename !== 'undefined' ? __filename : ur
|
|
|
34
34
|
return;
|
|
35
35
|
}
|
|
36
36
|
// Find the postinstall script relative to this module
|
|
37
|
-
|
|
37
|
+
const postinstallPath = path.join(__dirname, '..', '..', '..', 'scripts', 'postinstall.cjs');
|
|
38
38
|
if (fs.existsSync(postinstallPath)) {
|
|
39
39
|
// Run the postinstall script
|
|
40
40
|
try {
|
|
@@ -54,48 +54,48 @@ var __dirname = path.dirname(typeof __filename !== 'undefined' ? __filename : ur
|
|
|
54
54
|
* Create shims for all global packages in the default Node version
|
|
55
55
|
*/ function createShimsForGlobalPackages(binDir) {
|
|
56
56
|
// Read default version
|
|
57
|
-
|
|
57
|
+
const defaultPath = path.join(storagePath, 'default');
|
|
58
58
|
if (!fs.existsSync(defaultPath)) {
|
|
59
59
|
console.log('No default Node version set.');
|
|
60
60
|
console.log('Set one with: nvu default <version>');
|
|
61
61
|
exit(1);
|
|
62
62
|
return;
|
|
63
63
|
}
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
const defaultVersion = fs.readFileSync(defaultPath, 'utf8').trim();
|
|
65
|
+
const versionsDir = path.join(storagePath, 'installed');
|
|
66
66
|
// Resolve to exact version
|
|
67
|
-
|
|
67
|
+
const matches = findInstalledVersions(versionsDir, defaultVersion);
|
|
68
68
|
if (matches.length === 0) {
|
|
69
69
|
console.log(`Default version ${defaultVersion} is not installed.`);
|
|
70
70
|
exit(1);
|
|
71
71
|
return;
|
|
72
72
|
}
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
const resolvedVersion = matches[matches.length - 1];
|
|
74
|
+
const nodeBinDir = path.join(versionsDir, resolvedVersion, 'bin');
|
|
75
75
|
if (!fs.existsSync(nodeBinDir)) {
|
|
76
76
|
console.log(`No bin directory found for ${resolvedVersion}`);
|
|
77
77
|
exit(1);
|
|
78
78
|
return;
|
|
79
79
|
}
|
|
80
80
|
// Get the node shim to copy from
|
|
81
|
-
|
|
81
|
+
const nodeShim = path.join(binDir, 'node');
|
|
82
82
|
if (!fs.existsSync(nodeShim)) {
|
|
83
83
|
console.log('Node shim not found. Run: nvu setup');
|
|
84
84
|
exit(1);
|
|
85
85
|
return;
|
|
86
86
|
}
|
|
87
87
|
// Scan binaries in Node's bin directory
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
for(
|
|
92
|
-
|
|
93
|
-
|
|
88
|
+
const entries = readdirWithTypes(nodeBinDir);
|
|
89
|
+
let created = 0;
|
|
90
|
+
let skipped = 0;
|
|
91
|
+
for(let i = 0; i < entries.length; i++){
|
|
92
|
+
const entry = entries[i];
|
|
93
|
+
const name = entry.name;
|
|
94
94
|
// Skip our routing shims (node/npm/npx) - don't overwrite them
|
|
95
95
|
if (name === 'node' || name === 'npm' || name === 'npx') {
|
|
96
96
|
continue;
|
|
97
97
|
}
|
|
98
|
-
|
|
98
|
+
const shimPath = path.join(binDir, name);
|
|
99
99
|
// Skip if shim already exists
|
|
100
100
|
if (fs.existsSync(shimPath)) {
|
|
101
101
|
skipped++;
|
|
@@ -103,7 +103,7 @@ var __dirname = path.dirname(typeof __filename !== 'undefined' ? __filename : ur
|
|
|
103
103
|
}
|
|
104
104
|
// Copy the node shim
|
|
105
105
|
try {
|
|
106
|
-
|
|
106
|
+
const shimContent = fs.readFileSync(nodeShim);
|
|
107
107
|
fs.writeFileSync(shimPath, shimContent);
|
|
108
108
|
fs.chmodSync(shimPath, 493); // 0755
|
|
109
109
|
console.log(`Created shim: ${name}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/commands/setup.ts"],"sourcesContent":["import { execSync } from 'child_process';\nimport exit from 'exit-compat';\nimport fs from 'fs';\nimport path from 'path';\nimport url from 'url';\nimport { mkdirpSync, readdirWithTypes } from '../compat.ts';\nimport { storagePath } from '../constants.ts';\nimport { findInstalledVersions } from '../lib/findInstalledVersions.ts';\n\
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/commands/setup.ts"],"sourcesContent":["import { execSync } from 'child_process';\nimport exit from 'exit-compat';\nimport fs from 'fs';\nimport path from 'path';\nimport url from 'url';\nimport { mkdirpSync, readdirWithTypes } from '../compat.ts';\nimport { storagePath } from '../constants.ts';\nimport { findInstalledVersions } from '../lib/findInstalledVersions.ts';\n\nconst __dirname = path.dirname(typeof __filename !== 'undefined' ? __filename : url.fileURLToPath(import.meta.url));\n\n/**\n * nvu setup [--shims]\n *\n * Install/reinstall nvu binaries to ~/.nvu/bin\n * With --shims: create shims for existing global packages\n */\nexport default function setupCmd(args: string[]): void {\n const binDir = path.join(storagePath, 'bin');\n\n // Create directories\n if (!fs.existsSync(storagePath)) {\n mkdirpSync(storagePath);\n }\n if (!fs.existsSync(binDir)) {\n mkdirpSync(binDir);\n }\n\n // Check for --shims flag\n let hasShimsFlag = false;\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--shims') {\n hasShimsFlag = true;\n break;\n }\n }\n\n if (hasShimsFlag) {\n createShimsForGlobalPackages(binDir);\n return;\n }\n\n // Find the postinstall script relative to this module\n const postinstallPath = path.join(__dirname, '..', '..', '..', 'scripts', 'postinstall.cjs');\n\n if (fs.existsSync(postinstallPath)) {\n // Run the postinstall script\n try {\n execSync(`node \"${postinstallPath}\"`, { stdio: 'inherit' });\n } catch (_err) {\n // postinstall handles its own errors gracefully\n }\n } else {\n console.log('Setup script not found.');\n console.log('Try reinstalling: npm install -g node-version-use');\n exit(1);\n }\n}\n\n/**\n * Create shims for all global packages in the default Node version\n */\nfunction createShimsForGlobalPackages(binDir: string): void {\n // Read default version\n const defaultPath = path.join(storagePath, 'default');\n if (!fs.existsSync(defaultPath)) {\n console.log('No default Node version set.');\n console.log('Set one with: nvu default <version>');\n exit(1);\n return;\n }\n\n const defaultVersion = fs.readFileSync(defaultPath, 'utf8').trim();\n const versionsDir = path.join(storagePath, 'installed');\n\n // Resolve to exact version\n const matches = findInstalledVersions(versionsDir, defaultVersion);\n if (matches.length === 0) {\n console.log(`Default version ${defaultVersion} is not installed.`);\n exit(1);\n return;\n }\n\n const resolvedVersion = matches[matches.length - 1];\n const nodeBinDir = path.join(versionsDir, resolvedVersion, 'bin');\n\n if (!fs.existsSync(nodeBinDir)) {\n console.log(`No bin directory found for ${resolvedVersion}`);\n exit(1);\n return;\n }\n\n // Get the node shim to copy from\n const nodeShim = path.join(binDir, 'node');\n if (!fs.existsSync(nodeShim)) {\n console.log('Node shim not found. Run: nvu setup');\n exit(1);\n return;\n }\n\n // Scan binaries in Node's bin directory\n const entries = readdirWithTypes(nodeBinDir);\n let created = 0;\n let skipped = 0;\n\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n const name = entry.name;\n\n // Skip our routing shims (node/npm/npx) - don't overwrite them\n if (name === 'node' || name === 'npm' || name === 'npx') {\n continue;\n }\n\n const shimPath = path.join(binDir, name);\n\n // Skip if shim already exists\n if (fs.existsSync(shimPath)) {\n skipped++;\n continue;\n }\n\n // Copy the node shim\n try {\n const shimContent = fs.readFileSync(nodeShim);\n fs.writeFileSync(shimPath, shimContent);\n fs.chmodSync(shimPath, 493); // 0755\n console.log(`Created shim: ${name}`);\n created++;\n } catch (err) {\n console.error(`Failed to create shim for ${name}: ${(err as Error).message}`);\n }\n }\n\n console.log('');\n console.log(`Done. Created ${created} shims, skipped ${skipped} (already exist).`);\n exit(0);\n}\n"],"names":["execSync","exit","fs","path","url","mkdirpSync","readdirWithTypes","storagePath","findInstalledVersions","__dirname","dirname","__filename","fileURLToPath","setupCmd","args","binDir","join","existsSync","hasShimsFlag","i","length","createShimsForGlobalPackages","postinstallPath","stdio","_err","console","log","defaultPath","defaultVersion","readFileSync","trim","versionsDir","matches","resolvedVersion","nodeBinDir","nodeShim","entries","created","skipped","entry","name","shimPath","shimContent","writeFileSync","chmodSync","err","error","message"],"mappings":"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"}
|
|
@@ -16,10 +16,10 @@ import { findInstalledVersions, getAllInstalledVersions } from '../lib/findInsta
|
|
|
16
16
|
exit(1);
|
|
17
17
|
return;
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
const version = args[0].trim();
|
|
20
|
+
const versionsPath = path.join(storagePath, 'installed');
|
|
21
21
|
// Find all matching installed versions
|
|
22
|
-
|
|
22
|
+
const matches = findInstalledVersions(versionsPath, version);
|
|
23
23
|
if (matches.length === 0) {
|
|
24
24
|
console.log(`Node ${version} is not installed.`);
|
|
25
25
|
console.log('');
|
|
@@ -30,7 +30,7 @@ import { findInstalledVersions, getAllInstalledVersions } from '../lib/findInsta
|
|
|
30
30
|
}
|
|
31
31
|
if (matches.length > 1) {
|
|
32
32
|
console.log(`Multiple versions match "${version}":`);
|
|
33
|
-
for(
|
|
33
|
+
for(let i = 0; i < matches.length; i++){
|
|
34
34
|
console.log(` ${matches[i]}`);
|
|
35
35
|
}
|
|
36
36
|
console.log('');
|
|
@@ -38,15 +38,15 @@ import { findInstalledVersions, getAllInstalledVersions } from '../lib/findInsta
|
|
|
38
38
|
exit(1);
|
|
39
39
|
return;
|
|
40
40
|
}
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
const installedVersion = matches[0];
|
|
42
|
+
const versionPath = path.join(versionsPath, installedVersion);
|
|
43
43
|
// Check if this is the current default (exact match since we store exact versions)
|
|
44
|
-
|
|
44
|
+
const defaultPath = path.join(storagePath, 'default');
|
|
45
45
|
if (fs.existsSync(defaultPath)) {
|
|
46
|
-
|
|
46
|
+
const defaultVersion = fs.readFileSync(defaultPath, 'utf8').trim();
|
|
47
47
|
// Normalize both for comparison
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
const normalizedDefault = defaultVersion.replace(/^v/, '');
|
|
49
|
+
const normalizedInstalled = installedVersion.replace(/^v/, '');
|
|
50
50
|
if (normalizedInstalled === normalizedDefault) {
|
|
51
51
|
console.error(`Cannot uninstall default version ${installedVersion}.`);
|
|
52
52
|
console.error('');
|
|
@@ -70,11 +70,11 @@ import { findInstalledVersions, getAllInstalledVersions } from '../lib/findInsta
|
|
|
70
70
|
/**
|
|
71
71
|
* List installed versions for user reference
|
|
72
72
|
*/ function listInstalledVersions(versionsPath) {
|
|
73
|
-
|
|
73
|
+
const versions = getAllInstalledVersions(versionsPath);
|
|
74
74
|
if (versions.length === 0) {
|
|
75
75
|
console.log(' (none)');
|
|
76
76
|
} else {
|
|
77
|
-
for(
|
|
77
|
+
for(let i = 0; i < versions.length; i++){
|
|
78
78
|
console.log(` ${versions[i]}`);
|
|
79
79
|
}
|
|
80
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/commands/uninstall.ts"],"sourcesContent":["import exit from 'exit-compat';\nimport fs from 'fs';\nimport path from 'path';\nimport { rmSync } from '../compat.ts';\nimport { storagePath } from '../constants.ts';\nimport { findInstalledVersions, getAllInstalledVersions } from '../lib/findInstalledVersions.ts';\n\n/**\n * nvu uninstall <version>\n *\n * Remove an installed Node version.\n */\nexport default function uninstallCmd(args: string[]): void {\n if (args.length === 0) {\n console.log('Usage: nvu uninstall <version>');\n console.log('Example: nvu uninstall 20');\n console.log(' nvu uninstall v20.19.6');\n exit(1);\n return;\n }\n\n
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/commands/uninstall.ts"],"sourcesContent":["import exit from 'exit-compat';\nimport fs from 'fs';\nimport path from 'path';\nimport { rmSync } from '../compat.ts';\nimport { storagePath } from '../constants.ts';\nimport { findInstalledVersions, getAllInstalledVersions } from '../lib/findInstalledVersions.ts';\n\n/**\n * nvu uninstall <version>\n *\n * Remove an installed Node version.\n */\nexport default function uninstallCmd(args: string[]): void {\n if (args.length === 0) {\n console.log('Usage: nvu uninstall <version>');\n console.log('Example: nvu uninstall 20');\n console.log(' nvu uninstall v20.19.6');\n exit(1);\n return;\n }\n\n const version = args[0].trim();\n const versionsPath = path.join(storagePath, 'installed');\n\n // Find all matching installed versions\n const matches = findInstalledVersions(versionsPath, version);\n\n if (matches.length === 0) {\n console.log(`Node ${version} is not installed.`);\n console.log('');\n console.log('Installed versions:');\n listInstalledVersions(versionsPath);\n exit(1);\n return;\n }\n\n if (matches.length > 1) {\n console.log(`Multiple versions match \"${version}\":`);\n for (let i = 0; i < matches.length; i++) {\n console.log(` ${matches[i]}`);\n }\n console.log('');\n console.log('Please specify the exact version to uninstall.');\n exit(1);\n return;\n }\n\n const installedVersion = matches[0];\n const versionPath = path.join(versionsPath, installedVersion);\n\n // Check if this is the current default (exact match since we store exact versions)\n const defaultPath = path.join(storagePath, 'default');\n if (fs.existsSync(defaultPath)) {\n const defaultVersion = fs.readFileSync(defaultPath, 'utf8').trim();\n\n // Normalize both for comparison\n const normalizedDefault = defaultVersion.replace(/^v/, '');\n const normalizedInstalled = installedVersion.replace(/^v/, '');\n\n if (normalizedInstalled === normalizedDefault) {\n console.error(`Cannot uninstall default version ${installedVersion}.`);\n console.error('');\n console.error('Change your default first:');\n console.error(' nvu default <version>');\n exit(1);\n return;\n }\n }\n\n // Remove the version directory\n try {\n rmSync(versionPath);\n console.log(`Removed Node ${installedVersion}`);\n } catch (err) {\n console.error(`Failed to remove Node ${installedVersion}:`, (err as Error).message);\n exit(1);\n return;\n }\n\n exit(0);\n}\n\n/**\n * List installed versions for user reference\n */\nfunction listInstalledVersions(versionsPath: string): void {\n const versions = getAllInstalledVersions(versionsPath);\n\n if (versions.length === 0) {\n console.log(' (none)');\n } else {\n for (let i = 0; i < versions.length; i++) {\n console.log(` ${versions[i]}`);\n }\n }\n}\n"],"names":["exit","fs","path","rmSync","storagePath","findInstalledVersions","getAllInstalledVersions","uninstallCmd","args","length","console","log","version","trim","versionsPath","join","matches","listInstalledVersions","i","installedVersion","versionPath","defaultPath","existsSync","defaultVersion","readFileSync","normalizedDefault","replace","normalizedInstalled","error","err","message","versions"],"mappings":"AAAA,OAAOA,UAAU,cAAc;AAC/B,OAAOC,QAAQ,KAAK;AACpB,OAAOC,UAAU,OAAO;AACxB,SAASC,MAAM,QAAQ,eAAe;AACtC,SAASC,WAAW,QAAQ,kBAAkB;AAC9C,SAASC,qBAAqB,EAAEC,uBAAuB,QAAQ,kCAAkC;AAEjG;;;;CAIC,GACD,eAAe,SAASC,aAAaC,IAAc;IACjD,IAAIA,KAAKC,MAAM,KAAK,GAAG;QACrBC,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG,CAAC;QACZX,KAAK;QACL;IACF;IAEA,MAAMY,UAAUJ,IAAI,CAAC,EAAE,CAACK,IAAI;IAC5B,MAAMC,eAAeZ,KAAKa,IAAI,CAACX,aAAa;IAE5C,uCAAuC;IACvC,MAAMY,UAAUX,sBAAsBS,cAAcF;IAEpD,IAAII,QAAQP,MAAM,KAAK,GAAG;QACxBC,QAAQC,GAAG,CAAC,CAAC,KAAK,EAAEC,QAAQ,kBAAkB,CAAC;QAC/CF,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG,CAAC;QACZM,sBAAsBH;QACtBd,KAAK;QACL;IACF;IAEA,IAAIgB,QAAQP,MAAM,GAAG,GAAG;QACtBC,QAAQC,GAAG,CAAC,CAAC,yBAAyB,EAAEC,QAAQ,EAAE,CAAC;QACnD,IAAK,IAAIM,IAAI,GAAGA,IAAIF,QAAQP,MAAM,EAAES,IAAK;YACvCR,QAAQC,GAAG,CAAC,CAAC,EAAE,EAAEK,OAAO,CAACE,EAAE,EAAE;QAC/B;QACAR,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG,CAAC;QACZX,KAAK;QACL;IACF;IAEA,MAAMmB,mBAAmBH,OAAO,CAAC,EAAE;IACnC,MAAMI,cAAclB,KAAKa,IAAI,CAACD,cAAcK;IAE5C,mFAAmF;IACnF,MAAME,cAAcnB,KAAKa,IAAI,CAACX,aAAa;IAC3C,IAAIH,GAAGqB,UAAU,CAACD,cAAc;QAC9B,MAAME,iBAAiBtB,GAAGuB,YAAY,CAACH,aAAa,QAAQR,IAAI;QAEhE,gCAAgC;QAChC,MAAMY,oBAAoBF,eAAeG,OAAO,CAAC,MAAM;QACvD,MAAMC,sBAAsBR,iBAAiBO,OAAO,CAAC,MAAM;QAE3D,IAAIC,wBAAwBF,mBAAmB;YAC7Cf,QAAQkB,KAAK,CAAC,CAAC,iCAAiC,EAAET,iBAAiB,CAAC,CAAC;YACrET,QAAQkB,KAAK,CAAC;YACdlB,QAAQkB,KAAK,CAAC;YACdlB,QAAQkB,KAAK,CAAC;YACd5B,KAAK;YACL;QACF;IACF;IAEA,+BAA+B;IAC/B,IAAI;QACFG,OAAOiB;QACPV,QAAQC,GAAG,CAAC,CAAC,aAAa,EAAEQ,kBAAkB;IAChD,EAAE,OAAOU,KAAK;QACZnB,QAAQkB,KAAK,CAAC,CAAC,sBAAsB,EAAET,iBAAiB,CAAC,CAAC,EAAE,AAACU,IAAcC,OAAO;QAClF9B,KAAK;QACL;IACF;IAEAA,KAAK;AACP;AAEA;;CAEC,GACD,SAASiB,sBAAsBH,YAAoB;IACjD,MAAMiB,WAAWzB,wBAAwBQ;IAEzC,IAAIiB,SAAStB,MAAM,KAAK,GAAG;QACzBC,QAAQC,GAAG,CAAC;IACd,OAAO;QACL,IAAK,IAAIO,IAAI,GAAGA,IAAIa,SAAStB,MAAM,EAAES,IAAK;YACxCR,QAAQC,GAAG,CAAC,CAAC,EAAE,EAAEoB,QAAQ,CAACb,EAAE,EAAE;QAChC;IACF;AACF"}
|