node-version-use 2.1.1 → 2.1.2

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.
@@ -18,6 +18,8 @@ var _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
18
18
  var _path = /*#__PURE__*/ _interop_require_default(require("path"));
19
19
  var _compatts = require("../compat.js");
20
20
  var _constantsts = require("../constants.js");
21
+ var _findInstalledVersionsts = require("../lib/findInstalledVersions.js");
22
+ var _loadNodeVersionInstallts = /*#__PURE__*/ _interop_require_default(require("../lib/loadNodeVersionInstall.js"));
21
23
  function _interop_require_default(obj) {
22
24
  return obj && obj.__esModule ? obj : {
23
25
  default: obj
@@ -25,6 +27,7 @@ function _interop_require_default(obj) {
25
27
  }
26
28
  function defaultCmd(args) {
27
29
  var defaultFilePath = _path.default.join(_constantsts.storagePath, 'default');
30
+ var versionsPath = _path.default.join(_constantsts.storagePath, 'installed');
28
31
  // If no version provided, display current default
29
32
  if (args.length === 0) {
30
33
  if (_fs.default.existsSync(defaultFilePath)) {
@@ -49,9 +52,72 @@ function defaultCmd(args) {
49
52
  if (!_fs.default.existsSync(_constantsts.storagePath)) {
50
53
  (0, _compatts.mkdirpSync)(_constantsts.storagePath);
51
54
  }
52
- // Write the default version
53
- _fs.default.writeFileSync(defaultFilePath, "".concat(version, "\n"), 'utf8');
54
- console.log("Default Node version set to: ".concat(version));
55
+ // Check if any installed versions match
56
+ var matches = (0, _findInstalledVersionsts.findInstalledVersions)(versionsPath, version);
57
+ if (matches.length > 0) {
58
+ // Version is installed - resolve to exact and set default
59
+ setDefaultToExact(defaultFilePath, matches);
60
+ } else {
61
+ // Version not installed - auto-install it
62
+ console.log("Node ".concat(version, " is not installed. Installing..."));
63
+ autoInstallAndSetDefault(version, versionsPath, defaultFilePath);
64
+ }
65
+ }
66
+ /**
67
+ * Set the default to the highest matching installed version
68
+ */ function setDefaultToExact(defaultFilePath, matches) {
69
+ // matches are sorted by findInstalledVersions, take the last (highest)
70
+ var exactVersion = matches[matches.length - 1];
71
+ // Ensure it has v prefix for consistency
72
+ if (exactVersion.indexOf('v') !== 0) {
73
+ exactVersion = "v".concat(exactVersion);
74
+ }
75
+ // Write the exact version
76
+ _fs.default.writeFileSync(defaultFilePath, "".concat(exactVersion, "\n"), 'utf8');
77
+ console.log("Default Node version set to: ".concat(exactVersion));
55
78
  (0, _exitcompat.default)(0);
56
79
  }
80
+ /**
81
+ * Auto-install the version and then set it as default
82
+ */ function autoInstallAndSetDefault(version, versionsPath, defaultFilePath) {
83
+ (0, _loadNodeVersionInstallts.default)(function(err, nodeVersionInstall) {
84
+ if (err || !nodeVersionInstall) {
85
+ console.error('Failed to load node-version-install:', err ? err.message : 'Module not available');
86
+ (0, _exitcompat.default)(1);
87
+ return;
88
+ }
89
+ nodeVersionInstall(version, {
90
+ installPath: versionsPath
91
+ }, function(installErr, results) {
92
+ if (installErr) {
93
+ console.error("Failed to install Node ".concat(version, ":"), installErr.message);
94
+ (0, _exitcompat.default)(1);
95
+ return;
96
+ }
97
+ // Get the installed version from results
98
+ var installedVersion;
99
+ if (results && results.length > 0) {
100
+ installedVersion = results[0].version;
101
+ } else {
102
+ // Fallback: re-scan installed versions
103
+ var matches = (0, _findInstalledVersionsts.findInstalledVersions)(versionsPath, version);
104
+ if (matches.length === 0) {
105
+ console.error('Installation completed but version not found');
106
+ (0, _exitcompat.default)(1);
107
+ return;
108
+ }
109
+ installedVersion = matches[matches.length - 1];
110
+ }
111
+ // Ensure it has v prefix for consistency
112
+ if (installedVersion.indexOf('v') !== 0) {
113
+ installedVersion = "v".concat(installedVersion);
114
+ }
115
+ // Write the exact version
116
+ _fs.default.writeFileSync(defaultFilePath, "".concat(installedVersion, "\n"), 'utf8');
117
+ console.log("Node ".concat(installedVersion, " installed successfully."));
118
+ console.log("Default Node version set to: ".concat(installedVersion));
119
+ (0, _exitcompat.default)(0);
120
+ });
121
+ });
122
+ }
57
123
  /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/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';\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 var defaultFilePath = path.join(storagePath, 'default');\n\n // If no version provided, display current default\n if (args.length === 0) {\n if (fs.existsSync(defaultFilePath)) {\n var 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 var 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 // Write the default version\n fs.writeFileSync(defaultFilePath, `${version}\\n`, 'utf8');\n console.log(`Default Node version set to: ${version}`);\n exit(0);\n}\n"],"names":["defaultCmd","args","defaultFilePath","path","join","storagePath","length","fs","existsSync","currentVersion","readFileSync","trim","console","log","exit","version","indexOf","mkdirpSync","writeFileSync"],"mappings":";;;;+BAMA;;;;;CAKC,GACD;;;eAAwBA;;;iEAZP;yDACF;2DACE;wBACU;2BACC;;;;;;AAQb,SAASA,WAAWC,IAAc;IAC/C,IAAIC,kBAAkBC,aAAI,CAACC,IAAI,CAACC,wBAAW,EAAE;IAE7C,kDAAkD;IAClD,IAAIJ,KAAKK,MAAM,KAAK,GAAG;QACrB,IAAIC,WAAE,CAACC,UAAU,CAACN,kBAAkB;YAClC,IAAIO,iBAAiBF,WAAE,CAACG,YAAY,CAACR,iBAAiB,QAAQS,IAAI;YAClEC,QAAQC,GAAG,CAAC,AAAC,oBAAkC,OAAfJ;QAClC,OAAO;YACLG,QAAQC,GAAG,CAAC;YACZD,QAAQC,GAAG,CAAC;QACd;QACAC,IAAAA,mBAAI,EAAC;QACL;IACF;IAEA,IAAIC,UAAUd,IAAI,CAAC,EAAE,CAACU,IAAI;IAE1B,sEAAsE;IACtE,IAAI,CAACI,WAAWA,QAAQC,OAAO,CAAC,SAAS,GAAG;QAC1CJ,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG,CAAC;QACZC,IAAAA,mBAAI,EAAC;QACL;IACF;IAEA,kCAAkC;IAClC,IAAI,CAACP,WAAE,CAACC,UAAU,CAACH,wBAAW,GAAG;QAC/BY,IAAAA,oBAAU,EAACZ,wBAAW;IACxB;IAEA,4BAA4B;IAC5BE,WAAE,CAACW,aAAa,CAAChB,iBAAiB,AAAC,GAAU,OAARa,SAAQ,OAAK;IAClDH,QAAQC,GAAG,CAAC,AAAC,gCAAuC,OAARE;IAC5CD,IAAAA,mBAAI,EAAC;AACP"}
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 var defaultFilePath = path.join(storagePath, 'default');\n var 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 var 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 var 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 var 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 var 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 var installedVersion: string;\n if (results && results.length > 0) {\n installedVersion = results[0].version;\n } else {\n // Fallback: re-scan installed versions\n var 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":["defaultCmd","args","defaultFilePath","path","join","storagePath","versionsPath","length","fs","existsSync","currentVersion","readFileSync","trim","console","log","exit","version","indexOf","mkdirpSync","matches","findInstalledVersions","setDefaultToExact","autoInstallAndSetDefault","exactVersion","writeFileSync","loadNodeVersionInstall","err","nodeVersionInstall","error","message","installPath","installErr","results","installedVersion"],"mappings":"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"}
@@ -17,6 +17,7 @@ var _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
17
17
  var _path = /*#__PURE__*/ _interop_require_default(require("path"));
18
18
  var _compatts = require("../compat.js");
19
19
  var _constantsts = require("../constants.js");
20
+ var _findInstalledVersionsts = require("../lib/findInstalledVersions.js");
20
21
  function _interop_require_default(obj) {
21
22
  return obj && obj.__esModule ? obj : {
22
23
  default: obj
@@ -33,7 +34,7 @@ function uninstallCmd(args) {
33
34
  var version = args[0].trim();
34
35
  var versionsPath = _path.default.join(_constantsts.storagePath, 'installed');
35
36
  // Find all matching installed versions
36
- var matches = findInstalledVersions(versionsPath, version);
37
+ var matches = (0, _findInstalledVersionsts.findInstalledVersions)(versionsPath, version);
37
38
  if (matches.length === 0) {
38
39
  console.log("Node ".concat(version, " is not installed."));
39
40
  console.log('');
@@ -54,29 +55,26 @@ function uninstallCmd(args) {
54
55
  }
55
56
  var installedVersion = matches[0];
56
57
  var versionPath = _path.default.join(versionsPath, installedVersion);
57
- // Check if this is the current default
58
+ // Check if this is the current default (exact match since we store exact versions)
58
59
  var defaultPath = _path.default.join(_constantsts.storagePath, 'default');
59
- var isDefault = false;
60
60
  if (_fs.default.existsSync(defaultPath)) {
61
61
  var defaultVersion = _fs.default.readFileSync(defaultPath, 'utf8').trim();
62
+ // Normalize both for comparison
62
63
  var normalizedDefault = defaultVersion.replace(/^v/, '');
63
64
  var normalizedInstalled = installedVersion.replace(/^v/, '');
64
- // Check if default matches this version
65
- if (normalizedInstalled === normalizedDefault || normalizedInstalled.indexOf("".concat(normalizedDefault, ".")) === 0) {
66
- isDefault = true;
65
+ if (normalizedInstalled === normalizedDefault) {
66
+ console.error("Cannot uninstall default version ".concat(installedVersion, "."));
67
+ console.error('');
68
+ console.error('Change your default first:');
69
+ console.error(' nvu default <version>');
70
+ (0, _exitcompat.default)(1);
71
+ return;
67
72
  }
68
73
  }
69
74
  // Remove the version directory
70
75
  try {
71
76
  (0, _compatts.rmSync)(versionPath);
72
77
  console.log("Removed Node ".concat(installedVersion));
73
- if (isDefault) {
74
- // Clear the default since it's no longer installed
75
- _fs.default.unlinkSync(defaultPath);
76
- console.log('');
77
- console.log('Note: This was your default version. Set a new default with:');
78
- console.log(' nvu default <version>');
79
- }
80
78
  } catch (err) {
81
79
  console.error("Failed to remove Node ".concat(installedVersion, ":"), err.message);
82
80
  (0, _exitcompat.default)(1);
@@ -84,64 +82,15 @@ function uninstallCmd(args) {
84
82
  }
85
83
  (0, _exitcompat.default)(0);
86
84
  }
87
- /**
88
- * Find all installed versions matching the given version string
89
- */ function findInstalledVersions(versionsPath, version) {
90
- if (!_fs.default.existsSync(versionsPath)) {
91
- return [];
92
- }
93
- var normalizedVersion = version.replace(/^v/, '');
94
- var matches = [];
95
- // Try exact matches first
96
- var exactMatches = [
97
- version,
98
- "v".concat(normalizedVersion),
99
- normalizedVersion
100
- ];
101
- for(var i = 0; i < exactMatches.length; i++){
102
- var v = exactMatches[i];
103
- var versionPath = _path.default.join(versionsPath, v);
104
- if (_fs.default.existsSync(versionPath) && _fs.default.statSync(versionPath).isDirectory()) {
105
- if (matches.indexOf(v) === -1) {
106
- matches.push(v);
107
- }
108
- }
109
- }
110
- // If we have an exact match, return just that
111
- if (matches.length > 0) {
112
- return matches;
113
- }
114
- // Try partial match (e.g., "20" matches "v20.19.6")
115
- var entries = (0, _compatts.readdirWithTypes)(versionsPath);
116
- for(var j = 0; j < entries.length; j++){
117
- var entry = entries[j];
118
- if (!entry.isDirectory()) continue;
119
- var dirVersion = entry.name.replace(/^v/, '');
120
- if (dirVersion.indexOf("".concat(normalizedVersion, ".")) === 0) {
121
- matches.push(entry.name);
122
- }
123
- }
124
- return matches;
125
- }
126
85
  /**
127
86
  * List installed versions for user reference
128
87
  */ function listInstalledVersions(versionsPath) {
129
- if (!_fs.default.existsSync(versionsPath)) {
130
- console.log(' (none)');
131
- return;
132
- }
133
- var entries = (0, _compatts.readdirWithTypes)(versionsPath);
134
- var versions = [];
135
- for(var i = 0; i < entries.length; i++){
136
- if (entries[i].isDirectory()) {
137
- versions.push(entries[i].name);
138
- }
139
- }
88
+ var versions = (0, _findInstalledVersionsts.getAllInstalledVersions)(versionsPath);
140
89
  if (versions.length === 0) {
141
90
  console.log(' (none)');
142
91
  } else {
143
- for(var j = 0; j < versions.length; j++){
144
- console.log(" ".concat(versions[j]));
92
+ for(var i = 0; i < versions.length; i++){
93
+ console.log(" ".concat(versions[i]));
145
94
  }
146
95
  }
147
96
  }
@@ -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 { readdirWithTypes, rmSync } from '../compat.ts';\nimport { storagePath } from '../constants.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 var version = args[0].trim();\n var versionsPath = path.join(storagePath, 'installed');\n\n // Find all matching installed versions\n var 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 (var 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 var installedVersion = matches[0];\n var versionPath = path.join(versionsPath, installedVersion);\n\n // Check if this is the current default\n var defaultPath = path.join(storagePath, 'default');\n var isDefault = false;\n if (fs.existsSync(defaultPath)) {\n var defaultVersion = fs.readFileSync(defaultPath, 'utf8').trim();\n var normalizedDefault = defaultVersion.replace(/^v/, '');\n var normalizedInstalled = installedVersion.replace(/^v/, '');\n\n // Check if default matches this version\n if (normalizedInstalled === normalizedDefault || normalizedInstalled.indexOf(`${normalizedDefault}.`) === 0) {\n isDefault = true;\n }\n }\n\n // Remove the version directory\n try {\n rmSync(versionPath);\n console.log(`Removed Node ${installedVersion}`);\n\n if (isDefault) {\n // Clear the default since it's no longer installed\n fs.unlinkSync(defaultPath);\n console.log('');\n console.log('Note: This was your default version. Set a new default with:');\n console.log(' nvu default <version>');\n }\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 * Find all installed versions matching the given version string\n */\nfunction findInstalledVersions(versionsPath: string, version: string): string[] {\n if (!fs.existsSync(versionsPath)) {\n return [];\n }\n\n var normalizedVersion = version.replace(/^v/, '');\n var matches: string[] = [];\n\n // Try exact matches first\n var exactMatches = [version, `v${normalizedVersion}`, normalizedVersion];\n for (var i = 0; i < exactMatches.length; i++) {\n var v = exactMatches[i];\n var 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 var entries = readdirWithTypes(versionsPath);\n for (var j = 0; j < entries.length; j++) {\n var entry = entries[j];\n if (!entry.isDirectory()) continue;\n var dirVersion = entry.name.replace(/^v/, '');\n if (dirVersion.indexOf(`${normalizedVersion}.`) === 0) {\n matches.push(entry.name);\n }\n }\n\n return matches;\n}\n\n/**\n * List installed versions for user reference\n */\nfunction listInstalledVersions(versionsPath: string): void {\n if (!fs.existsSync(versionsPath)) {\n console.log(' (none)');\n return;\n }\n\n var entries = readdirWithTypes(versionsPath);\n var versions: string[] = [];\n for (var i = 0; i < entries.length; i++) {\n if (entries[i].isDirectory()) {\n versions.push(entries[i].name);\n }\n }\n\n if (versions.length === 0) {\n console.log(' (none)');\n } else {\n for (var j = 0; j < versions.length; j++) {\n console.log(` ${versions[j]}`);\n }\n }\n}\n"],"names":["uninstallCmd","args","length","console","log","exit","version","trim","versionsPath","path","join","storagePath","matches","findInstalledVersions","listInstalledVersions","i","installedVersion","versionPath","defaultPath","isDefault","fs","existsSync","defaultVersion","readFileSync","normalizedDefault","replace","normalizedInstalled","indexOf","rmSync","unlinkSync","err","error","message","normalizedVersion","exactMatches","v","statSync","isDirectory","push","entries","readdirWithTypes","j","entry","dirVersion","name","versions"],"mappings":"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"}
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 var version = args[0].trim();\n var versionsPath = path.join(storagePath, 'installed');\n\n // Find all matching installed versions\n var 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 (var 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 var installedVersion = matches[0];\n var versionPath = path.join(versionsPath, installedVersion);\n\n // Check if this is the current default (exact match since we store exact versions)\n var defaultPath = path.join(storagePath, 'default');\n if (fs.existsSync(defaultPath)) {\n var defaultVersion = fs.readFileSync(defaultPath, 'utf8').trim();\n\n // Normalize both for comparison\n var normalizedDefault = defaultVersion.replace(/^v/, '');\n var 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 var versions = getAllInstalledVersions(versionsPath);\n\n if (versions.length === 0) {\n console.log(' (none)');\n } else {\n for (var i = 0; i < versions.length; i++) {\n console.log(` ${versions[i]}`);\n }\n }\n}\n"],"names":["uninstallCmd","args","length","console","log","exit","version","trim","versionsPath","path","join","storagePath","matches","findInstalledVersions","listInstalledVersions","i","installedVersion","versionPath","defaultPath","fs","existsSync","defaultVersion","readFileSync","normalizedDefault","replace","normalizedInstalled","error","rmSync","err","message","versions","getAllInstalledVersions"],"mappings":";;;;+BAOA;;;;CAIC,GACD;;;eAAwBA;;;iEAZP;yDACF;2DACE;wBACM;2BACK;uCACmC;;;;;;AAOhD,SAASA,aAAaC,IAAc;IACjD,IAAIA,KAAKC,MAAM,KAAK,GAAG;QACrBC,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG,CAAC;QACZC,IAAAA,mBAAI,EAAC;QACL;IACF;IAEA,IAAIC,UAAUL,IAAI,CAAC,EAAE,CAACM,IAAI;IAC1B,IAAIC,eAAeC,aAAI,CAACC,IAAI,CAACC,wBAAW,EAAE;IAE1C,uCAAuC;IACvC,IAAIC,UAAUC,IAAAA,8CAAqB,EAACL,cAAcF;IAElD,IAAIM,QAAQV,MAAM,KAAK,GAAG;QACxBC,QAAQC,GAAG,CAAC,AAAC,QAAe,OAARE,SAAQ;QAC5BH,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG,CAAC;QACZU,sBAAsBN;QACtBH,IAAAA,mBAAI,EAAC;QACL;IACF;IAEA,IAAIO,QAAQV,MAAM,GAAG,GAAG;QACtBC,QAAQC,GAAG,CAAC,AAAC,4BAAmC,OAARE,SAAQ;QAChD,IAAK,IAAIS,IAAI,GAAGA,IAAIH,QAAQV,MAAM,EAAEa,IAAK;YACvCZ,QAAQC,GAAG,CAAC,AAAC,KAAe,OAAXQ,OAAO,CAACG,EAAE;QAC7B;QACAZ,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG,CAAC;QACZC,IAAAA,mBAAI,EAAC;QACL;IACF;IAEA,IAAIW,mBAAmBJ,OAAO,CAAC,EAAE;IACjC,IAAIK,cAAcR,aAAI,CAACC,IAAI,CAACF,cAAcQ;IAE1C,mFAAmF;IACnF,IAAIE,cAAcT,aAAI,CAACC,IAAI,CAACC,wBAAW,EAAE;IACzC,IAAIQ,WAAE,CAACC,UAAU,CAACF,cAAc;QAC9B,IAAIG,iBAAiBF,WAAE,CAACG,YAAY,CAACJ,aAAa,QAAQX,IAAI;QAE9D,gCAAgC;QAChC,IAAIgB,oBAAoBF,eAAeG,OAAO,CAAC,MAAM;QACrD,IAAIC,sBAAsBT,iBAAiBQ,OAAO,CAAC,MAAM;QAEzD,IAAIC,wBAAwBF,mBAAmB;YAC7CpB,QAAQuB,KAAK,CAAC,AAAC,oCAAoD,OAAjBV,kBAAiB;YACnEb,QAAQuB,KAAK,CAAC;YACdvB,QAAQuB,KAAK,CAAC;YACdvB,QAAQuB,KAAK,CAAC;YACdrB,IAAAA,mBAAI,EAAC;YACL;QACF;IACF;IAEA,+BAA+B;IAC/B,IAAI;QACFsB,IAAAA,gBAAM,EAACV;QACPd,QAAQC,GAAG,CAAC,AAAC,gBAAgC,OAAjBY;IAC9B,EAAE,OAAOY,KAAK;QACZzB,QAAQuB,KAAK,CAAC,AAAC,yBAAyC,OAAjBV,kBAAiB,MAAI,AAACY,IAAcC,OAAO;QAClFxB,IAAAA,mBAAI,EAAC;QACL;IACF;IAEAA,IAAAA,mBAAI,EAAC;AACP;AAEA;;CAEC,GACD,SAASS,sBAAsBN,YAAoB;IACjD,IAAIsB,WAAWC,IAAAA,gDAAuB,EAACvB;IAEvC,IAAIsB,SAAS5B,MAAM,KAAK,GAAG;QACzBC,QAAQC,GAAG,CAAC;IACd,OAAO;QACL,IAAK,IAAIW,IAAI,GAAGA,IAAIe,SAAS5B,MAAM,EAAEa,IAAK;YACxCZ,QAAQC,GAAG,CAAC,AAAC,KAAgB,OAAZ0B,QAAQ,CAACf,EAAE;QAC9B;IACF;AACF"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Find all installed versions matching the given version string
3
+ * Results are sorted in ascending semver order (lowest first, highest last)
4
+ */
5
+ export declare function findInstalledVersions(versionsPath: string, version: string): string[];
6
+ /**
7
+ * Get all installed versions
8
+ */
9
+ export declare function getAllInstalledVersions(versionsPath: string): string[];
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Find all installed versions matching the given version string
3
+ * Results are sorted in ascending semver order (lowest first, highest last)
4
+ */
5
+ export declare function findInstalledVersions(versionsPath: string, version: string): string[];
6
+ /**
7
+ * Get all installed versions
8
+ */
9
+ export declare function getAllInstalledVersions(versionsPath: string): string[];
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get findInstalledVersions () {
13
+ return findInstalledVersions;
14
+ },
15
+ get getAllInstalledVersions () {
16
+ return getAllInstalledVersions;
17
+ }
18
+ });
19
+ var _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
20
+ var _path = /*#__PURE__*/ _interop_require_default(require("path"));
21
+ var _compatts = require("../compat.js");
22
+ function _interop_require_default(obj) {
23
+ return obj && obj.__esModule ? obj : {
24
+ default: obj
25
+ };
26
+ }
27
+ /**
28
+ * Compare two semver version strings (e.g., "20.19.0" vs "20.9.1")
29
+ * Returns: negative if a < b, positive if a > b, 0 if equal
30
+ */ function compareVersions(a, b) {
31
+ var aParts = a.replace(/^v/, '').split('.');
32
+ var bParts = b.replace(/^v/, '').split('.');
33
+ var len = Math.max(aParts.length, bParts.length);
34
+ for(var i = 0; i < len; i++){
35
+ var aNum = parseInt(aParts[i], 10) || 0;
36
+ var bNum = parseInt(bParts[i], 10) || 0;
37
+ if (aNum !== bNum) {
38
+ return aNum - bNum;
39
+ }
40
+ }
41
+ return 0;
42
+ }
43
+ function findInstalledVersions(versionsPath, version) {
44
+ if (!_fs.default.existsSync(versionsPath)) {
45
+ return [];
46
+ }
47
+ var normalizedVersion = version.replace(/^v/, '');
48
+ var matches = [];
49
+ // Try exact matches first
50
+ var exactMatches = [
51
+ version,
52
+ "v".concat(normalizedVersion),
53
+ normalizedVersion
54
+ ];
55
+ for(var i = 0; i < exactMatches.length; i++){
56
+ var v = exactMatches[i];
57
+ var versionPath = _path.default.join(versionsPath, v);
58
+ if (_fs.default.existsSync(versionPath) && _fs.default.statSync(versionPath).isDirectory()) {
59
+ if (matches.indexOf(v) === -1) {
60
+ matches.push(v);
61
+ }
62
+ }
63
+ }
64
+ // If we have an exact match, return just that
65
+ if (matches.length > 0) {
66
+ return matches;
67
+ }
68
+ // Try partial match (e.g., "20" matches "v20.19.6")
69
+ var entries = (0, _compatts.readdirWithTypes)(versionsPath);
70
+ for(var j = 0; j < entries.length; j++){
71
+ var entry = entries[j];
72
+ if (!entry.isDirectory()) continue;
73
+ var dirVersion = entry.name.replace(/^v/, '');
74
+ if (dirVersion.indexOf("".concat(normalizedVersion, ".")) === 0) {
75
+ matches.push(entry.name);
76
+ }
77
+ }
78
+ // Sort by semver (ascending) so highest version is last
79
+ matches.sort(compareVersions);
80
+ return matches;
81
+ }
82
+ function getAllInstalledVersions(versionsPath) {
83
+ if (!_fs.default.existsSync(versionsPath)) {
84
+ return [];
85
+ }
86
+ var entries = (0, _compatts.readdirWithTypes)(versionsPath);
87
+ var versions = [];
88
+ for(var i = 0; i < entries.length; i++){
89
+ if (entries[i].isDirectory()) {
90
+ versions.push(entries[i].name);
91
+ }
92
+ }
93
+ return versions;
94
+ }
95
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -0,0 +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 var aParts = a.replace(/^v/, '').split('.');\n var bParts = b.replace(/^v/, '').split('.');\n var len = Math.max(aParts.length, bParts.length);\n\n for (var i = 0; i < len; i++) {\n var aNum = parseInt(aParts[i], 10) || 0;\n var 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 var normalizedVersion = version.replace(/^v/, '');\n var matches: string[] = [];\n\n // Try exact matches first\n var exactMatches = [version, `v${normalizedVersion}`, normalizedVersion];\n for (var i = 0; i < exactMatches.length; i++) {\n var v = exactMatches[i];\n var 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 var entries = readdirWithTypes(versionsPath);\n for (var j = 0; j < entries.length; j++) {\n var entry = entries[j];\n if (!entry.isDirectory()) continue;\n var 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 var entries = readdirWithTypes(versionsPath);\n var versions: string[] = [];\n for (var 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,IAAIC,SAASF,EAAEG,OAAO,CAAC,MAAM,IAAIC,KAAK,CAAC;IACvC,IAAIC,SAASJ,EAAEE,OAAO,CAAC,MAAM,IAAIC,KAAK,CAAC;IACvC,IAAIE,MAAMC,KAAKC,GAAG,CAACN,OAAOO,MAAM,EAAEJ,OAAOI,MAAM;IAE/C,IAAK,IAAIC,IAAI,GAAGA,IAAIJ,KAAKI,IAAK;QAC5B,IAAIC,OAAOC,SAASV,MAAM,CAACQ,EAAE,EAAE,OAAO;QACtC,IAAIG,OAAOD,SAASP,MAAM,CAACK,EAAE,EAAE,OAAO;QACtC,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,IAAII,oBAAoBH,QAAQZ,OAAO,CAAC,MAAM;IAC9C,IAAIgB,UAAoB,EAAE;IAE1B,0BAA0B;IAC1B,IAAIC,eAAe;QAACL;QAAU,IAAqB,OAAlBG;QAAqBA;KAAkB;IACxE,IAAK,IAAIR,IAAI,GAAGA,IAAIU,aAAaX,MAAM,EAAEC,IAAK;QAC5C,IAAIW,IAAID,YAAY,CAACV,EAAE;QACvB,IAAIY,cAAcC,aAAI,CAACC,IAAI,CAACV,cAAcO;QAC1C,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,IAAIU,UAAUC,IAAAA,0BAAgB,EAAChB;IAC/B,IAAK,IAAIiB,IAAI,GAAGA,IAAIF,QAAQpB,MAAM,EAAEsB,IAAK;QACvC,IAAIC,QAAQH,OAAO,CAACE,EAAE;QACtB,IAAI,CAACC,MAAMN,WAAW,IAAI;QAC1B,IAAIO,aAAaD,MAAME,IAAI,CAAC/B,OAAO,CAAC,MAAM;QAC1C,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,IAAIe,UAAUC,IAAAA,0BAAgB,EAAChB;IAC/B,IAAIsB,WAAqB,EAAE;IAC3B,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"}
@@ -3,6 +3,8 @@ import fs from 'fs';
3
3
  import path from 'path';
4
4
  import { mkdirpSync } from '../compat.js';
5
5
  import { storagePath } from '../constants.js';
6
+ import { findInstalledVersions } from '../lib/findInstalledVersions.js';
7
+ import loadNodeVersionInstall from '../lib/loadNodeVersionInstall.js';
6
8
  /**
7
9
  * nvu default [version]
8
10
  *
@@ -10,6 +12,7 @@ import { storagePath } from '../constants.js';
10
12
  * This is used when no .nvmrc or .nvurc is found in the project.
11
13
  */ export default function defaultCmd(args) {
12
14
  var defaultFilePath = path.join(storagePath, 'default');
15
+ var versionsPath = path.join(storagePath, 'installed');
13
16
  // If no version provided, display current default
14
17
  if (args.length === 0) {
15
18
  if (fs.existsSync(defaultFilePath)) {
@@ -34,8 +37,71 @@ import { storagePath } from '../constants.js';
34
37
  if (!fs.existsSync(storagePath)) {
35
38
  mkdirpSync(storagePath);
36
39
  }
37
- // Write the default version
38
- fs.writeFileSync(defaultFilePath, `${version}\n`, 'utf8');
39
- console.log(`Default Node version set to: ${version}`);
40
+ // Check if any installed versions match
41
+ var matches = findInstalledVersions(versionsPath, version);
42
+ if (matches.length > 0) {
43
+ // Version is installed - resolve to exact and set default
44
+ setDefaultToExact(defaultFilePath, matches);
45
+ } else {
46
+ // Version not installed - auto-install it
47
+ console.log(`Node ${version} is not installed. Installing...`);
48
+ autoInstallAndSetDefault(version, versionsPath, defaultFilePath);
49
+ }
50
+ }
51
+ /**
52
+ * Set the default to the highest matching installed version
53
+ */ function setDefaultToExact(defaultFilePath, matches) {
54
+ // matches are sorted by findInstalledVersions, take the last (highest)
55
+ var exactVersion = matches[matches.length - 1];
56
+ // Ensure it has v prefix for consistency
57
+ if (exactVersion.indexOf('v') !== 0) {
58
+ exactVersion = `v${exactVersion}`;
59
+ }
60
+ // Write the exact version
61
+ fs.writeFileSync(defaultFilePath, `${exactVersion}\n`, 'utf8');
62
+ console.log(`Default Node version set to: ${exactVersion}`);
40
63
  exit(0);
41
64
  }
65
+ /**
66
+ * Auto-install the version and then set it as default
67
+ */ function autoInstallAndSetDefault(version, versionsPath, defaultFilePath) {
68
+ loadNodeVersionInstall((err, nodeVersionInstall)=>{
69
+ if (err || !nodeVersionInstall) {
70
+ console.error('Failed to load node-version-install:', err ? err.message : 'Module not available');
71
+ exit(1);
72
+ return;
73
+ }
74
+ nodeVersionInstall(version, {
75
+ installPath: versionsPath
76
+ }, (installErr, results)=>{
77
+ if (installErr) {
78
+ console.error(`Failed to install Node ${version}:`, installErr.message);
79
+ exit(1);
80
+ return;
81
+ }
82
+ // Get the installed version from results
83
+ var installedVersion;
84
+ if (results && results.length > 0) {
85
+ installedVersion = results[0].version;
86
+ } else {
87
+ // Fallback: re-scan installed versions
88
+ var matches = findInstalledVersions(versionsPath, version);
89
+ if (matches.length === 0) {
90
+ console.error('Installation completed but version not found');
91
+ exit(1);
92
+ return;
93
+ }
94
+ installedVersion = matches[matches.length - 1];
95
+ }
96
+ // Ensure it has v prefix for consistency
97
+ if (installedVersion.indexOf('v') !== 0) {
98
+ installedVersion = `v${installedVersion}`;
99
+ }
100
+ // Write the exact version
101
+ fs.writeFileSync(defaultFilePath, `${installedVersion}\n`, 'utf8');
102
+ console.log(`Node ${installedVersion} installed successfully.`);
103
+ console.log(`Default Node version set to: ${installedVersion}`);
104
+ exit(0);
105
+ });
106
+ });
107
+ }
@@ -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';\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 var defaultFilePath = path.join(storagePath, 'default');\n\n // If no version provided, display current default\n if (args.length === 0) {\n if (fs.existsSync(defaultFilePath)) {\n var 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 var 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 // Write the default version\n fs.writeFileSync(defaultFilePath, `${version}\\n`, 'utf8');\n console.log(`Default Node version set to: ${version}`);\n exit(0);\n}\n"],"names":["exit","fs","path","mkdirpSync","storagePath","defaultCmd","args","defaultFilePath","join","length","existsSync","currentVersion","readFileSync","trim","console","log","version","indexOf","writeFileSync"],"mappings":"AAAA,OAAOA,UAAU,cAAc;AAC/B,OAAOC,QAAQ,KAAK;AACpB,OAAOC,UAAU,OAAO;AACxB,SAASC,UAAU,QAAQ,eAAe;AAC1C,SAASC,WAAW,QAAQ,kBAAkB;AAE9C;;;;;CAKC,GACD,eAAe,SAASC,WAAWC,IAAc;IAC/C,IAAIC,kBAAkBL,KAAKM,IAAI,CAACJ,aAAa;IAE7C,kDAAkD;IAClD,IAAIE,KAAKG,MAAM,KAAK,GAAG;QACrB,IAAIR,GAAGS,UAAU,CAACH,kBAAkB;YAClC,IAAII,iBAAiBV,GAAGW,YAAY,CAACL,iBAAiB,QAAQM,IAAI;YAClEC,QAAQC,GAAG,CAAC,CAAC,iBAAiB,EAAEJ,gBAAgB;QAClD,OAAO;YACLG,QAAQC,GAAG,CAAC;YACZD,QAAQC,GAAG,CAAC;QACd;QACAf,KAAK;QACL;IACF;IAEA,IAAIgB,UAAUV,IAAI,CAAC,EAAE,CAACO,IAAI;IAE1B,sEAAsE;IACtE,IAAI,CAACG,WAAWA,QAAQC,OAAO,CAAC,SAAS,GAAG;QAC1CH,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG,CAAC;QACZf,KAAK;QACL;IACF;IAEA,kCAAkC;IAClC,IAAI,CAACC,GAAGS,UAAU,CAACN,cAAc;QAC/BD,WAAWC;IACb;IAEA,4BAA4B;IAC5BH,GAAGiB,aAAa,CAACX,iBAAiB,GAAGS,QAAQ,EAAE,CAAC,EAAE;IAClDF,QAAQC,GAAG,CAAC,CAAC,6BAA6B,EAAEC,SAAS;IACrDhB,KAAK;AACP"}
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 var defaultFilePath = path.join(storagePath, 'default');\n var 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 var 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 var 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 var 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 var 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 var installedVersion: string;\n if (results && results.length > 0) {\n installedVersion = results[0].version;\n } else {\n // Fallback: re-scan installed versions\n var 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":"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"}
@@ -1,8 +1,9 @@
1
1
  import exit from 'exit-compat';
2
2
  import fs from 'fs';
3
3
  import path from 'path';
4
- import { readdirWithTypes, rmSync } from '../compat.js';
4
+ import { rmSync } from '../compat.js';
5
5
  import { storagePath } from '../constants.js';
6
+ import { findInstalledVersions, getAllInstalledVersions } from '../lib/findInstalledVersions.js';
6
7
  /**
7
8
  * nvu uninstall <version>
8
9
  *
@@ -39,29 +40,26 @@ import { storagePath } from '../constants.js';
39
40
  }
40
41
  var installedVersion = matches[0];
41
42
  var versionPath = path.join(versionsPath, installedVersion);
42
- // Check if this is the current default
43
+ // Check if this is the current default (exact match since we store exact versions)
43
44
  var defaultPath = path.join(storagePath, 'default');
44
- var isDefault = false;
45
45
  if (fs.existsSync(defaultPath)) {
46
46
  var defaultVersion = fs.readFileSync(defaultPath, 'utf8').trim();
47
+ // Normalize both for comparison
47
48
  var normalizedDefault = defaultVersion.replace(/^v/, '');
48
49
  var normalizedInstalled = installedVersion.replace(/^v/, '');
49
- // Check if default matches this version
50
- if (normalizedInstalled === normalizedDefault || normalizedInstalled.indexOf(`${normalizedDefault}.`) === 0) {
51
- isDefault = true;
50
+ if (normalizedInstalled === normalizedDefault) {
51
+ console.error(`Cannot uninstall default version ${installedVersion}.`);
52
+ console.error('');
53
+ console.error('Change your default first:');
54
+ console.error(' nvu default <version>');
55
+ exit(1);
56
+ return;
52
57
  }
53
58
  }
54
59
  // Remove the version directory
55
60
  try {
56
61
  rmSync(versionPath);
57
62
  console.log(`Removed Node ${installedVersion}`);
58
- if (isDefault) {
59
- // Clear the default since it's no longer installed
60
- fs.unlinkSync(defaultPath);
61
- console.log('');
62
- console.log('Note: This was your default version. Set a new default with:');
63
- console.log(' nvu default <version>');
64
- }
65
63
  } catch (err) {
66
64
  console.error(`Failed to remove Node ${installedVersion}:`, err.message);
67
65
  exit(1);
@@ -69,64 +67,15 @@ import { storagePath } from '../constants.js';
69
67
  }
70
68
  exit(0);
71
69
  }
72
- /**
73
- * Find all installed versions matching the given version string
74
- */ function findInstalledVersions(versionsPath, version) {
75
- if (!fs.existsSync(versionsPath)) {
76
- return [];
77
- }
78
- var normalizedVersion = version.replace(/^v/, '');
79
- var matches = [];
80
- // Try exact matches first
81
- var exactMatches = [
82
- version,
83
- `v${normalizedVersion}`,
84
- normalizedVersion
85
- ];
86
- for(var i = 0; i < exactMatches.length; i++){
87
- var v = exactMatches[i];
88
- var versionPath = path.join(versionsPath, v);
89
- if (fs.existsSync(versionPath) && fs.statSync(versionPath).isDirectory()) {
90
- if (matches.indexOf(v) === -1) {
91
- matches.push(v);
92
- }
93
- }
94
- }
95
- // If we have an exact match, return just that
96
- if (matches.length > 0) {
97
- return matches;
98
- }
99
- // Try partial match (e.g., "20" matches "v20.19.6")
100
- var entries = readdirWithTypes(versionsPath);
101
- for(var j = 0; j < entries.length; j++){
102
- var entry = entries[j];
103
- if (!entry.isDirectory()) continue;
104
- var dirVersion = entry.name.replace(/^v/, '');
105
- if (dirVersion.indexOf(`${normalizedVersion}.`) === 0) {
106
- matches.push(entry.name);
107
- }
108
- }
109
- return matches;
110
- }
111
70
  /**
112
71
  * List installed versions for user reference
113
72
  */ function listInstalledVersions(versionsPath) {
114
- if (!fs.existsSync(versionsPath)) {
115
- console.log(' (none)');
116
- return;
117
- }
118
- var entries = readdirWithTypes(versionsPath);
119
- var versions = [];
120
- for(var i = 0; i < entries.length; i++){
121
- if (entries[i].isDirectory()) {
122
- versions.push(entries[i].name);
123
- }
124
- }
73
+ var versions = getAllInstalledVersions(versionsPath);
125
74
  if (versions.length === 0) {
126
75
  console.log(' (none)');
127
76
  } else {
128
- for(var j = 0; j < versions.length; j++){
129
- console.log(` ${versions[j]}`);
77
+ for(var i = 0; i < versions.length; i++){
78
+ console.log(` ${versions[i]}`);
130
79
  }
131
80
  }
132
81
  }
@@ -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 { readdirWithTypes, rmSync } from '../compat.ts';\nimport { storagePath } from '../constants.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 var version = args[0].trim();\n var versionsPath = path.join(storagePath, 'installed');\n\n // Find all matching installed versions\n var 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 (var 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 var installedVersion = matches[0];\n var versionPath = path.join(versionsPath, installedVersion);\n\n // Check if this is the current default\n var defaultPath = path.join(storagePath, 'default');\n var isDefault = false;\n if (fs.existsSync(defaultPath)) {\n var defaultVersion = fs.readFileSync(defaultPath, 'utf8').trim();\n var normalizedDefault = defaultVersion.replace(/^v/, '');\n var normalizedInstalled = installedVersion.replace(/^v/, '');\n\n // Check if default matches this version\n if (normalizedInstalled === normalizedDefault || normalizedInstalled.indexOf(`${normalizedDefault}.`) === 0) {\n isDefault = true;\n }\n }\n\n // Remove the version directory\n try {\n rmSync(versionPath);\n console.log(`Removed Node ${installedVersion}`);\n\n if (isDefault) {\n // Clear the default since it's no longer installed\n fs.unlinkSync(defaultPath);\n console.log('');\n console.log('Note: This was your default version. Set a new default with:');\n console.log(' nvu default <version>');\n }\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 * Find all installed versions matching the given version string\n */\nfunction findInstalledVersions(versionsPath: string, version: string): string[] {\n if (!fs.existsSync(versionsPath)) {\n return [];\n }\n\n var normalizedVersion = version.replace(/^v/, '');\n var matches: string[] = [];\n\n // Try exact matches first\n var exactMatches = [version, `v${normalizedVersion}`, normalizedVersion];\n for (var i = 0; i < exactMatches.length; i++) {\n var v = exactMatches[i];\n var 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 var entries = readdirWithTypes(versionsPath);\n for (var j = 0; j < entries.length; j++) {\n var entry = entries[j];\n if (!entry.isDirectory()) continue;\n var dirVersion = entry.name.replace(/^v/, '');\n if (dirVersion.indexOf(`${normalizedVersion}.`) === 0) {\n matches.push(entry.name);\n }\n }\n\n return matches;\n}\n\n/**\n * List installed versions for user reference\n */\nfunction listInstalledVersions(versionsPath: string): void {\n if (!fs.existsSync(versionsPath)) {\n console.log(' (none)');\n return;\n }\n\n var entries = readdirWithTypes(versionsPath);\n var versions: string[] = [];\n for (var i = 0; i < entries.length; i++) {\n if (entries[i].isDirectory()) {\n versions.push(entries[i].name);\n }\n }\n\n if (versions.length === 0) {\n console.log(' (none)');\n } else {\n for (var j = 0; j < versions.length; j++) {\n console.log(` ${versions[j]}`);\n }\n }\n}\n"],"names":["exit","fs","path","readdirWithTypes","rmSync","storagePath","uninstallCmd","args","length","console","log","version","trim","versionsPath","join","matches","findInstalledVersions","listInstalledVersions","i","installedVersion","versionPath","defaultPath","isDefault","existsSync","defaultVersion","readFileSync","normalizedDefault","replace","normalizedInstalled","indexOf","unlinkSync","err","error","message","normalizedVersion","exactMatches","v","statSync","isDirectory","push","entries","j","entry","dirVersion","name","versions"],"mappings":"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"}
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 var version = args[0].trim();\n var versionsPath = path.join(storagePath, 'installed');\n\n // Find all matching installed versions\n var 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 (var 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 var installedVersion = matches[0];\n var versionPath = path.join(versionsPath, installedVersion);\n\n // Check if this is the current default (exact match since we store exact versions)\n var defaultPath = path.join(storagePath, 'default');\n if (fs.existsSync(defaultPath)) {\n var defaultVersion = fs.readFileSync(defaultPath, 'utf8').trim();\n\n // Normalize both for comparison\n var normalizedDefault = defaultVersion.replace(/^v/, '');\n var 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 var versions = getAllInstalledVersions(versionsPath);\n\n if (versions.length === 0) {\n console.log(' (none)');\n } else {\n for (var 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,IAAIY,UAAUJ,IAAI,CAAC,EAAE,CAACK,IAAI;IAC1B,IAAIC,eAAeZ,KAAKa,IAAI,CAACX,aAAa;IAE1C,uCAAuC;IACvC,IAAIY,UAAUX,sBAAsBS,cAAcF;IAElD,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,IAAImB,mBAAmBH,OAAO,CAAC,EAAE;IACjC,IAAII,cAAclB,KAAKa,IAAI,CAACD,cAAcK;IAE1C,mFAAmF;IACnF,IAAIE,cAAcnB,KAAKa,IAAI,CAACX,aAAa;IACzC,IAAIH,GAAGqB,UAAU,CAACD,cAAc;QAC9B,IAAIE,iBAAiBtB,GAAGuB,YAAY,CAACH,aAAa,QAAQR,IAAI;QAE9D,gCAAgC;QAChC,IAAIY,oBAAoBF,eAAeG,OAAO,CAAC,MAAM;QACrD,IAAIC,sBAAsBR,iBAAiBO,OAAO,CAAC,MAAM;QAEzD,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,IAAIiB,WAAWzB,wBAAwBQ;IAEvC,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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Find all installed versions matching the given version string
3
+ * Results are sorted in ascending semver order (lowest first, highest last)
4
+ */
5
+ export declare function findInstalledVersions(versionsPath: string, version: string): string[];
6
+ /**
7
+ * Get all installed versions
8
+ */
9
+ export declare function getAllInstalledVersions(versionsPath: string): string[];
@@ -0,0 +1,76 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { readdirWithTypes } from '../compat.js';
4
+ /**
5
+ * Compare two semver version strings (e.g., "20.19.0" vs "20.9.1")
6
+ * Returns: negative if a < b, positive if a > b, 0 if equal
7
+ */ function compareVersions(a, b) {
8
+ var aParts = a.replace(/^v/, '').split('.');
9
+ var bParts = b.replace(/^v/, '').split('.');
10
+ var len = Math.max(aParts.length, bParts.length);
11
+ for(var i = 0; i < len; i++){
12
+ var aNum = parseInt(aParts[i], 10) || 0;
13
+ var bNum = parseInt(bParts[i], 10) || 0;
14
+ if (aNum !== bNum) {
15
+ return aNum - bNum;
16
+ }
17
+ }
18
+ return 0;
19
+ }
20
+ /**
21
+ * Find all installed versions matching the given version string
22
+ * Results are sorted in ascending semver order (lowest first, highest last)
23
+ */ export function findInstalledVersions(versionsPath, version) {
24
+ if (!fs.existsSync(versionsPath)) {
25
+ return [];
26
+ }
27
+ var normalizedVersion = version.replace(/^v/, '');
28
+ var matches = [];
29
+ // Try exact matches first
30
+ var exactMatches = [
31
+ version,
32
+ `v${normalizedVersion}`,
33
+ normalizedVersion
34
+ ];
35
+ for(var i = 0; i < exactMatches.length; i++){
36
+ var v = exactMatches[i];
37
+ var versionPath = path.join(versionsPath, v);
38
+ if (fs.existsSync(versionPath) && fs.statSync(versionPath).isDirectory()) {
39
+ if (matches.indexOf(v) === -1) {
40
+ matches.push(v);
41
+ }
42
+ }
43
+ }
44
+ // If we have an exact match, return just that
45
+ if (matches.length > 0) {
46
+ return matches;
47
+ }
48
+ // Try partial match (e.g., "20" matches "v20.19.6")
49
+ var entries = readdirWithTypes(versionsPath);
50
+ for(var j = 0; j < entries.length; j++){
51
+ var entry = entries[j];
52
+ if (!entry.isDirectory()) continue;
53
+ var dirVersion = entry.name.replace(/^v/, '');
54
+ if (dirVersion.indexOf(`${normalizedVersion}.`) === 0) {
55
+ matches.push(entry.name);
56
+ }
57
+ }
58
+ // Sort by semver (ascending) so highest version is last
59
+ matches.sort(compareVersions);
60
+ return matches;
61
+ }
62
+ /**
63
+ * Get all installed versions
64
+ */ export function getAllInstalledVersions(versionsPath) {
65
+ if (!fs.existsSync(versionsPath)) {
66
+ return [];
67
+ }
68
+ var entries = readdirWithTypes(versionsPath);
69
+ var versions = [];
70
+ for(var i = 0; i < entries.length; i++){
71
+ if (entries[i].isDirectory()) {
72
+ versions.push(entries[i].name);
73
+ }
74
+ }
75
+ return versions;
76
+ }
@@ -0,0 +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 var aParts = a.replace(/^v/, '').split('.');\n var bParts = b.replace(/^v/, '').split('.');\n var len = Math.max(aParts.length, bParts.length);\n\n for (var i = 0; i < len; i++) {\n var aNum = parseInt(aParts[i], 10) || 0;\n var 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 var normalizedVersion = version.replace(/^v/, '');\n var matches: string[] = [];\n\n // Try exact matches first\n var exactMatches = [version, `v${normalizedVersion}`, normalizedVersion];\n for (var i = 0; i < exactMatches.length; i++) {\n var v = exactMatches[i];\n var 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 var entries = readdirWithTypes(versionsPath);\n for (var j = 0; j < entries.length; j++) {\n var entry = entries[j];\n if (!entry.isDirectory()) continue;\n var 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 var entries = readdirWithTypes(versionsPath);\n var versions: string[] = [];\n for (var 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":["fs","path","readdirWithTypes","compareVersions","a","b","aParts","replace","split","bParts","len","Math","max","length","i","aNum","parseInt","bNum","findInstalledVersions","versionsPath","version","existsSync","normalizedVersion","matches","exactMatches","v","versionPath","join","statSync","isDirectory","indexOf","push","entries","j","entry","dirVersion","name","sort","getAllInstalledVersions","versions"],"mappings":"AAAA,OAAOA,QAAQ,KAAK;AACpB,OAAOC,UAAU,OAAO;AACxB,SAASC,gBAAgB,QAAQ,eAAe;AAEhD;;;CAGC,GACD,SAASC,gBAAgBC,CAAS,EAAEC,CAAS;IAC3C,IAAIC,SAASF,EAAEG,OAAO,CAAC,MAAM,IAAIC,KAAK,CAAC;IACvC,IAAIC,SAASJ,EAAEE,OAAO,CAAC,MAAM,IAAIC,KAAK,CAAC;IACvC,IAAIE,MAAMC,KAAKC,GAAG,CAACN,OAAOO,MAAM,EAAEJ,OAAOI,MAAM;IAE/C,IAAK,IAAIC,IAAI,GAAGA,IAAIJ,KAAKI,IAAK;QAC5B,IAAIC,OAAOC,SAASV,MAAM,CAACQ,EAAE,EAAE,OAAO;QACtC,IAAIG,OAAOD,SAASP,MAAM,CAACK,EAAE,EAAE,OAAO;QACtC,IAAIC,SAASE,MAAM;YACjB,OAAOF,OAAOE;QAChB;IACF;IACA,OAAO;AACT;AAEA;;;CAGC,GACD,OAAO,SAASC,sBAAsBC,YAAoB,EAAEC,OAAe;IACzE,IAAI,CAACpB,GAAGqB,UAAU,CAACF,eAAe;QAChC,OAAO,EAAE;IACX;IAEA,IAAIG,oBAAoBF,QAAQb,OAAO,CAAC,MAAM;IAC9C,IAAIgB,UAAoB,EAAE;IAE1B,0BAA0B;IAC1B,IAAIC,eAAe;QAACJ;QAAS,CAAC,CAAC,EAAEE,mBAAmB;QAAEA;KAAkB;IACxE,IAAK,IAAIR,IAAI,GAAGA,IAAIU,aAAaX,MAAM,EAAEC,IAAK;QAC5C,IAAIW,IAAID,YAAY,CAACV,EAAE;QACvB,IAAIY,cAAczB,KAAK0B,IAAI,CAACR,cAAcM;QAC1C,IAAIzB,GAAGqB,UAAU,CAACK,gBAAgB1B,GAAG4B,QAAQ,CAACF,aAAaG,WAAW,IAAI;YACxE,IAAIN,QAAQO,OAAO,CAACL,OAAO,CAAC,GAAG;gBAC7BF,QAAQQ,IAAI,CAACN;YACf;QACF;IACF;IAEA,8CAA8C;IAC9C,IAAIF,QAAQV,MAAM,GAAG,GAAG;QACtB,OAAOU;IACT;IAEA,oDAAoD;IACpD,IAAIS,UAAU9B,iBAAiBiB;IAC/B,IAAK,IAAIc,IAAI,GAAGA,IAAID,QAAQnB,MAAM,EAAEoB,IAAK;QACvC,IAAIC,QAAQF,OAAO,CAACC,EAAE;QACtB,IAAI,CAACC,MAAML,WAAW,IAAI;QAC1B,IAAIM,aAAaD,MAAME,IAAI,CAAC7B,OAAO,CAAC,MAAM;QAC1C,IAAI4B,WAAWL,OAAO,CAAC,GAAGR,kBAAkB,CAAC,CAAC,MAAM,GAAG;YACrDC,QAAQQ,IAAI,CAACG,MAAME,IAAI;QACzB;IACF;IAEA,wDAAwD;IACxDb,QAAQc,IAAI,CAAClC;IAEb,OAAOoB;AACT;AAEA;;CAEC,GACD,OAAO,SAASe,wBAAwBnB,YAAoB;IAC1D,IAAI,CAACnB,GAAGqB,UAAU,CAACF,eAAe;QAChC,OAAO,EAAE;IACX;IAEA,IAAIa,UAAU9B,iBAAiBiB;IAC/B,IAAIoB,WAAqB,EAAE;IAC3B,IAAK,IAAIzB,IAAI,GAAGA,IAAIkB,QAAQnB,MAAM,EAAEC,IAAK;QACvC,IAAIkB,OAAO,CAAClB,EAAE,CAACe,WAAW,IAAI;YAC5BU,SAASR,IAAI,CAACC,OAAO,CAAClB,EAAE,CAACsB,IAAI;QAC/B;IACF;IAEA,OAAOG;AACT"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-version-use",
3
- "version": "2.1.1",
3
+ "version": "2.1.2",
4
4
  "description": "Cross-platform solution for using multiple versions of node. Useful for compatibility testing",
5
5
  "keywords": [
6
6
  "node",
@@ -70,11 +70,11 @@
70
70
  "fs-remove-compat": "^0.2.1",
71
71
  "is-version": "^1.0.7",
72
72
  "mkdirp-classic": "^0.5.3",
73
- "node-version-install": "^1.4.18",
74
- "node-version-use": "^2.1.0",
73
+ "node-version-install": "^1.5.0",
74
+ "node-version-use": "^2.1.1",
75
75
  "os-shim": "^0.1.3",
76
76
  "pinkie-promise": "^2.0.1",
77
- "ts-dev-stack": "^1.21.2",
77
+ "ts-dev-stack": "^1.21.3",
78
78
  "tsds-config": "^0.2.0"
79
79
  },
80
80
  "engines": {