node-version-use 1.9.8 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +121 -23
- package/dist/cjs/cli.js +25 -6
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/commands/default.d.cts +7 -0
- package/dist/cjs/commands/default.d.ts +7 -0
- package/dist/cjs/commands/default.js +57 -0
- package/dist/cjs/commands/default.js.map +1 -0
- package/dist/cjs/commands/index.d.cts +3 -0
- package/dist/cjs/commands/index.d.ts +3 -0
- package/dist/cjs/commands/index.js +54 -0
- package/dist/cjs/commands/index.js.map +1 -0
- package/dist/cjs/commands/install.d.cts +6 -0
- package/dist/cjs/commands/install.d.ts +6 -0
- package/dist/cjs/commands/install.js +69 -0
- package/dist/cjs/commands/install.js.map +1 -0
- package/dist/cjs/commands/list.d.cts +6 -0
- package/dist/cjs/commands/list.d.ts +6 -0
- package/dist/cjs/commands/list.js +93 -0
- package/dist/cjs/commands/list.js.map +1 -0
- package/dist/cjs/commands/local.d.cts +7 -0
- package/dist/cjs/commands/local.d.ts +7 -0
- package/dist/cjs/commands/local.js +69 -0
- package/dist/cjs/commands/local.js.map +1 -0
- package/dist/cjs/commands/setup.d.cts +7 -0
- package/dist/cjs/commands/setup.d.ts +7 -0
- package/dist/cjs/commands/setup.js +55 -0
- package/dist/cjs/commands/setup.js.map +1 -0
- package/dist/cjs/commands/teardown.d.cts +6 -0
- package/dist/cjs/commands/teardown.d.ts +6 -0
- package/dist/cjs/commands/teardown.js +66 -0
- package/dist/cjs/commands/teardown.js.map +1 -0
- package/dist/cjs/commands/uninstall.d.cts +6 -0
- package/dist/cjs/commands/uninstall.d.ts +6 -0
- package/dist/cjs/commands/uninstall.js +148 -0
- package/dist/cjs/commands/uninstall.js.map +1 -0
- package/dist/cjs/commands/which.d.cts +7 -0
- package/dist/cjs/commands/which.d.ts +7 -0
- package/dist/cjs/commands/which.js +117 -0
- package/dist/cjs/commands/which.js.map +1 -0
- package/dist/cjs/compat.d.cts +17 -0
- package/dist/cjs/compat.d.ts +17 -0
- package/dist/cjs/compat.js +47 -1
- package/dist/cjs/compat.js.map +1 -1
- package/dist/cjs/constants.js +1 -1
- package/dist/cjs/constants.js.map +1 -1
- package/dist/cjs/types.d.cts +1 -0
- package/dist/cjs/types.d.ts +1 -0
- package/dist/cjs/worker.js +2 -2
- package/dist/cjs/worker.js.map +1 -1
- package/dist/esm/cli.js +23 -4
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/commands/default.d.ts +7 -0
- package/dist/esm/commands/default.js +41 -0
- package/dist/esm/commands/default.js.map +1 -0
- package/dist/esm/commands/index.d.ts +3 -0
- package/dist/esm/commands/index.js +27 -0
- package/dist/esm/commands/index.js.map +1 -0
- package/dist/esm/commands/install.d.ts +6 -0
- package/dist/esm/commands/install.js +53 -0
- package/dist/esm/commands/install.js.map +1 -0
- package/dist/esm/commands/list.d.ts +6 -0
- package/dist/esm/commands/list.js +52 -0
- package/dist/esm/commands/list.js.map +1 -0
- package/dist/esm/commands/local.d.ts +7 -0
- package/dist/esm/commands/local.js +51 -0
- package/dist/esm/commands/local.js.map +1 -0
- package/dist/esm/commands/setup.d.ts +7 -0
- package/dist/esm/commands/setup.js +39 -0
- package/dist/esm/commands/setup.js.map +1 -0
- package/dist/esm/commands/teardown.d.ts +6 -0
- package/dist/esm/commands/teardown.js +33 -0
- package/dist/esm/commands/teardown.js.map +1 -0
- package/dist/esm/commands/uninstall.d.ts +6 -0
- package/dist/esm/commands/uninstall.js +132 -0
- package/dist/esm/commands/uninstall.js.map +1 -0
- package/dist/esm/commands/which.d.ts +7 -0
- package/dist/esm/commands/which.js +101 -0
- package/dist/esm/commands/which.js.map +1 -0
- package/dist/esm/compat.d.ts +17 -0
- package/dist/esm/compat.js +39 -2
- package/dist/esm/compat.js.map +1 -1
- package/dist/esm/constants.js +2 -1
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/types.d.ts +1 -0
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/worker.js +2 -2
- package/dist/esm/worker.js.map +1 -1
- package/package.json +11 -4
- package/scripts/postinstall.cjs +273 -0
- package/shim/Makefile +58 -0
- package/shim/go.mod +3 -0
- package/shim/main.go +302 -0
package/dist/esm/worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/worker.ts"],"sourcesContent":["import spawn, { type SpawnOptions } from 'cross-spawn-cb';\nimport fs from 'fs';\nimport resolveVersions, { type VersionOptions } from 'node-resolve-versions';\nimport type { InstallOptions, InstallResult } from 'node-version-install';\nimport { spawnOptions as createSpawnOptions } from 'node-version-utils';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport resolveBin from 'resolve-bin-sync';\nimport spawnStreaming from 'spawn-streaming';\nimport { stringEndsWith } from './compat.ts';\nimport { storagePath } from './constants.ts';\nimport loadNodeVersionInstall from './lib/loadNodeVersionInstall.ts';\nimport loadSpawnTerm from './lib/loadSpawnTerm.ts';\n\nimport type { Options, UseCallback, UseOptions, UseResult } from './types.ts';\n\nconst isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\nconst NODE = isWindows ? 'node.exe' : 'node';\n\n// Parse npm-generated .cmd wrapper to extract the JS script path\nfunction parseNpmCmdWrapper(cmdPath: string): string | null {\n try {\n const content = fs.readFileSync(cmdPath, 'utf8');\n // Match: \"%_prog%\" \"%dp0%\\node_modules\\...\\cli.js\" %*\n // or: \"%_prog%\" \"%dp0%\\path\\to\\script.js\" %*\n const match = content.match(/\"%_prog%\"\\s+\"?%dp0%\\\\([^\"]+)\"?\\s+%\\*/);\n if (match) {\n const relativePath = match[1];\n const cmdDir = path.dirname(cmdPath);\n return path.join(cmdDir, relativePath);\n }\n } catch (_e) {\n // ignore\n }\n return null;\n}\n\n// On Windows, resolve npm bin commands to their JS entry points to bypass .cmd wrappers\n// This fixes issues with nvm-windows where .cmd wrappers use symlinked node.exe directly\nfunction resolveCommand(command: string, args: string[]): { command: string; args: string[] } {\n if (!isWindows) return { command, args };\n\n // Case 1: Command is a .cmd file path\n if (stringEndsWith(command.toLowerCase(), '.cmd')) {\n const scriptPath = parseNpmCmdWrapper(command);\n if (scriptPath) {\n return { command: NODE, args: [scriptPath, ...args] };\n }\n }\n\n // Case 2: Try to resolve the command as an npm package bin from node_modules\n try {\n const binPath = resolveBin(command);\n return { command: NODE, args: [binPath, ...args] };\n } catch (_e) {\n // Not an npm package bin, use original command\n }\n\n return { command, args };\n}\n\nexport default function worker(versionExpression: string, command: string, args: string[], options: UseOptions, callback: UseCallback): undefined {\n // Load lazy dependencies in parallel\n const loaderQueue = new Queue();\n let installVersion: (version: string, opts: InstallOptions, cb: (err?: Error, results?: InstallResult[]) => void) => void;\n let createSession:\n | ((options?: { header?: string; showStatusBar?: boolean; interactive?: boolean }) => {\n spawn: (command: string, args: string[], options: unknown, termOptions: unknown, callback: (err?: Error, res?: unknown) => void) => void;\n close: () => void;\n waitAndClose: (callback?: () => void) => void;\n })\n | undefined;\n let formatArguments: (args: string[]) => string[] = (x) => x;\n\n loaderQueue.defer((cb) =>\n loadNodeVersionInstall((err, fn) => {\n installVersion = fn;\n cb(err);\n })\n );\n loaderQueue.defer((cb) =>\n loadSpawnTerm((err, mod) => {\n createSession = mod?.createSession;\n formatArguments = mod?.formatArguments || ((x) => x);\n cb(err);\n })\n );\n\n loaderQueue.await((loadErr) => {\n if (loadErr) return callback(loadErr);\n\n resolveVersions(versionExpression, options as VersionOptions, (err?: Error, versions?: string[]) => {\n if (err) {\n callback(err);\n return;\n }\n if (!versions.length) {\n callback(new Error(`No versions found from expression: ${versionExpression}`));\n return;\n }\n\n const installOptions = { storagePath, ...options } as InstallOptions;\n const streamingOptions = options as Options;\n const results: UseResult[] = [];\n const queue = new Queue(1);\n\n // Create session once for all processes (only if multiple versions)\n const interactive = options.interactive !== false;\n const session = versions.length >= 2 && createSession && !streamingOptions.streaming ? createSession({ header: `${command} ${args.join(' ')}`, showStatusBar: true, interactive }) : null;\n\n versions.forEach((version: string) => {\n queue.defer((cb) => {\n installVersion(version, installOptions, (_err, installs) => {\n const install = installs && installs.length === 1 ? installs[0] : null;\n if (!install) {\n results.push({ install, command, version, error: new Error(`Unexpected version results for version ${version}. Install ${JSON.stringify(installs)}`), result: null });\n return callback();\n }\n const spawnOptions = createSpawnOptions(install.installPath, options as SpawnOptions);\n const prefix = install.version;\n\n function next(err?, res?): undefined {\n if (err && err.message.indexOf('ExperimentalWarning') >= 0) {\n res = err;\n err = null;\n }\n results.push({ install, command, version, error: err, result: res });\n cb();\n }\n\n // On Windows, resolve npm bin commands to bypass .cmd wrappers\n const resolved = resolveCommand(command, args);\n\n if (versions.length < 2) {\n // Show command when running single version (no terminal session)\n console.log(`$ ${formatArguments([resolved.command].concat(resolved.args)).join(' ')}`);\n return spawn(resolved.command, resolved.args, spawnOptions, next);\n }\n if (session) session.spawn(resolved.command, resolved.args, spawnOptions, { group: prefix, expanded: streamingOptions.expanded }, next);\n else spawnStreaming(resolved.command, resolved.args, spawnOptions, { prefix }, next);\n });\n });\n });\n queue.await((err) => {\n if (session) {\n session.waitAndClose(() => {\n err ? callback(err) : callback(null, results);\n });\n } else {\n err ? callback(err) : callback(null, results);\n }\n });\n });\n });\n}\n"],"names":["spawn","fs","resolveVersions","spawnOptions","createSpawnOptions","path","Queue","resolveBin","spawnStreaming","stringEndsWith","storagePath","loadNodeVersionInstall","loadSpawnTerm","isWindows","process","platform","test","env","OSTYPE","NODE","parseNpmCmdWrapper","cmdPath","content","readFileSync","match","relativePath","cmdDir","dirname","join","_e","resolveCommand","command","args","toLowerCase","scriptPath","binPath","worker","versionExpression","options","callback","loaderQueue","installVersion","createSession","formatArguments","x","defer","cb","err","fn","mod","await","loadErr","versions","length","Error","installOptions","streamingOptions","results","queue","interactive","session","streaming","header","showStatusBar","forEach","version","_err","installs","install","push","error","JSON","stringify","result","installPath","prefix","next","res","message","indexOf","resolved","console","log","concat","group","expanded","waitAndClose"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-version-use/src/worker.ts"],"sourcesContent":["import spawn, { type SpawnOptions } from 'cross-spawn-cb';\nimport fs from 'fs';\nimport resolveVersions, { type VersionOptions } from 'node-resolve-versions';\nimport type { InstallOptions, InstallResult } from 'node-version-install';\nimport { spawnOptions as createSpawnOptions } from 'node-version-utils';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport resolveBin from 'resolve-bin-sync';\nimport spawnStreaming from 'spawn-streaming';\nimport { stringEndsWith } from './compat.ts';\nimport { storagePath } from './constants.ts';\nimport loadNodeVersionInstall from './lib/loadNodeVersionInstall.ts';\nimport loadSpawnTerm from './lib/loadSpawnTerm.ts';\n\nimport type { Options, UseCallback, UseOptions, UseResult } from './types.ts';\n\nconst isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE);\nconst NODE = isWindows ? 'node.exe' : 'node';\n\n// Parse npm-generated .cmd wrapper to extract the JS script path\nfunction parseNpmCmdWrapper(cmdPath: string): string | null {\n try {\n const content = fs.readFileSync(cmdPath, 'utf8');\n // Match: \"%_prog%\" \"%dp0%\\node_modules\\...\\cli.js\" %*\n // or: \"%_prog%\" \"%dp0%\\path\\to\\script.js\" %*\n const match = content.match(/\"%_prog%\"\\s+\"?%dp0%\\\\([^\"]+)\"?\\s+%\\*/);\n if (match) {\n const relativePath = match[1];\n const cmdDir = path.dirname(cmdPath);\n return path.join(cmdDir, relativePath);\n }\n } catch (_e) {\n // ignore\n }\n return null;\n}\n\n// On Windows, resolve npm bin commands to their JS entry points to bypass .cmd wrappers\n// This fixes issues with nvm-windows where .cmd wrappers use symlinked node.exe directly\nfunction resolveCommand(command: string, args: string[]): { command: string; args: string[] } {\n if (!isWindows) return { command, args };\n\n // Case 1: Command is a .cmd file path\n if (stringEndsWith(command.toLowerCase(), '.cmd')) {\n const scriptPath = parseNpmCmdWrapper(command);\n if (scriptPath) {\n return { command: NODE, args: [scriptPath, ...args] };\n }\n }\n\n // Case 2: Try to resolve the command as an npm package bin from node_modules\n try {\n const binPath = resolveBin(command);\n return { command: NODE, args: [binPath, ...args] };\n } catch (_e) {\n // Not an npm package bin, use original command\n }\n\n return { command, args };\n}\n\nexport default function worker(versionExpression: string, command: string, args: string[], options: UseOptions, callback: UseCallback): undefined {\n // Load lazy dependencies in parallel\n const loaderQueue = new Queue();\n let installVersion: (version: string, opts: InstallOptions, cb: (err?: Error, results?: InstallResult[]) => void) => void;\n let createSession:\n | ((options?: { header?: string; showStatusBar?: boolean; interactive?: boolean }) => {\n spawn: (command: string, args: string[], options: unknown, termOptions: unknown, callback: (err?: Error, res?: unknown) => void) => void;\n close: () => void;\n waitAndClose: (callback?: () => void) => void;\n })\n | undefined;\n let formatArguments: (args: string[]) => string[] = (x) => x;\n\n loaderQueue.defer((cb) =>\n loadNodeVersionInstall((err, fn) => {\n installVersion = fn;\n cb(err);\n })\n );\n loaderQueue.defer((cb) =>\n loadSpawnTerm((err, mod) => {\n createSession = mod?.createSession;\n formatArguments = mod?.formatArguments || ((x) => x);\n cb(err);\n })\n );\n\n loaderQueue.await((loadErr) => {\n if (loadErr) return callback(loadErr);\n\n resolveVersions(versionExpression, options as VersionOptions, (err?: Error, versions?: string[]) => {\n if (err) {\n callback(err);\n return;\n }\n if (!versions.length) {\n callback(new Error(`No versions found from expression: ${versionExpression}`));\n return;\n }\n\n const installOptions = { storagePath, ...options } as InstallOptions;\n const streamingOptions = options as Options;\n const results: UseResult[] = [];\n const queue = new Queue(1);\n\n // Create session once for all processes (only if multiple versions)\n const interactive = options.interactive !== false;\n const session = versions.length >= 2 && createSession && !streamingOptions.streaming ? createSession({ header: `${command} ${args.join(' ')}`, showStatusBar: true, interactive }) : null;\n\n versions.forEach((version: string) => {\n queue.defer((cb) => {\n installVersion(version, installOptions, (_err, installs) => {\n const install = installs && installs.length === 1 ? installs[0] : null;\n if (!install) {\n results.push({ install, command, version, error: new Error(`Unexpected version results for version ${version}. Install ${JSON.stringify(installs)}`), result: null });\n return callback();\n }\n const spawnOptions = createSpawnOptions(install.installPath, options as SpawnOptions);\n const prefix = install.version;\n\n function next(err?, res?): undefined {\n if (err && err.message.indexOf('ExperimentalWarning') >= 0) {\n res = err;\n err = null;\n }\n results.push({ install, command, version, error: err, result: res });\n cb();\n }\n\n // On Windows, resolve npm bin commands to bypass .cmd wrappers\n const resolved = resolveCommand(command, args);\n\n if (versions.length < 2) {\n // Show command when running single version (no terminal session, unless silent)\n if (!options.silent) console.log(`$ ${formatArguments([resolved.command].concat(resolved.args)).join(' ')}`);\n return spawn(resolved.command, resolved.args, spawnOptions, next);\n }\n if (session) session.spawn(resolved.command, resolved.args, spawnOptions, { group: prefix, expanded: streamingOptions.expanded }, next);\n else spawnStreaming(resolved.command, resolved.args, spawnOptions, { prefix }, next);\n });\n });\n });\n queue.await((err) => {\n if (session) {\n session.waitAndClose(() => {\n err ? callback(err) : callback(null, results);\n });\n } else {\n err ? callback(err) : callback(null, results);\n }\n });\n });\n });\n}\n"],"names":["spawn","fs","resolveVersions","spawnOptions","createSpawnOptions","path","Queue","resolveBin","spawnStreaming","stringEndsWith","storagePath","loadNodeVersionInstall","loadSpawnTerm","isWindows","process","platform","test","env","OSTYPE","NODE","parseNpmCmdWrapper","cmdPath","content","readFileSync","match","relativePath","cmdDir","dirname","join","_e","resolveCommand","command","args","toLowerCase","scriptPath","binPath","worker","versionExpression","options","callback","loaderQueue","installVersion","createSession","formatArguments","x","defer","cb","err","fn","mod","await","loadErr","versions","length","Error","installOptions","streamingOptions","results","queue","interactive","session","streaming","header","showStatusBar","forEach","version","_err","installs","install","push","error","JSON","stringify","result","installPath","prefix","next","res","message","indexOf","resolved","silent","console","log","concat","group","expanded","waitAndClose"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-version-use",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Cross-platform solution for using multiple versions of node. Useful for compatibility testing",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"node",
|
|
@@ -32,11 +32,15 @@
|
|
|
32
32
|
"nvu": "bin/cli.js"
|
|
33
33
|
},
|
|
34
34
|
"files": [
|
|
35
|
-
"
|
|
35
|
+
"bin",
|
|
36
|
+
"dist",
|
|
37
|
+
"scripts",
|
|
38
|
+
"shim"
|
|
36
39
|
],
|
|
37
40
|
"scripts": {
|
|
38
41
|
"build": "tsds build",
|
|
39
42
|
"format": "tsds format",
|
|
43
|
+
"postinstall": "node scripts/postinstall.cjs",
|
|
40
44
|
"prepublishOnly": "tsds validate",
|
|
41
45
|
"test": "tsds test:node --no-timeouts",
|
|
42
46
|
"test:engines": "nvu engines tsds test:node --no-timeouts",
|
|
@@ -45,9 +49,12 @@
|
|
|
45
49
|
"dependencies": {
|
|
46
50
|
"cross-spawn-cb": "^2.4.10",
|
|
47
51
|
"exit": "^0.1.2",
|
|
52
|
+
"fs-remove-compat": "^0.2.1",
|
|
53
|
+
"get-remote": "^2.2.8",
|
|
48
54
|
"getopts-compat": "^2.2.6",
|
|
49
55
|
"homedir-polyfill": "^1.0.3",
|
|
50
56
|
"install-module-linked": "^1.3.10",
|
|
57
|
+
"mkdirp-classic": "^0.5.3",
|
|
51
58
|
"node-resolve-versions": "^1.3.11",
|
|
52
59
|
"node-version-utils": "^1.3.15",
|
|
53
60
|
"queue-cb": "^1.6.1",
|
|
@@ -56,14 +63,14 @@
|
|
|
56
63
|
},
|
|
57
64
|
"devDependencies": {
|
|
58
65
|
"@types/mocha": "^10.0.10",
|
|
59
|
-
"@types/node": "^24.10.
|
|
66
|
+
"@types/node": "^24.10.2",
|
|
60
67
|
"cr": "^0.1.0",
|
|
61
68
|
"fs-copy-compat": "^0.1.3",
|
|
62
69
|
"fs-remove-compat": "^0.2.1",
|
|
63
70
|
"is-version": "^1.0.7",
|
|
64
71
|
"mkdirp-classic": "^0.5.3",
|
|
65
72
|
"node-version-install": "^1.4.18",
|
|
66
|
-
"node-version-use": "^1.9.
|
|
73
|
+
"node-version-use": "^1.9.9",
|
|
67
74
|
"pinkie-promise": "^2.0.1",
|
|
68
75
|
"ts-dev-stack": "^1.21.2",
|
|
69
76
|
"tsds-config": "^0.2.0"
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Postinstall script for node-version-use
|
|
3
|
+
*
|
|
4
|
+
* Downloads the platform-specific shim binary and installs it to ~/.nvu/bin/
|
|
5
|
+
* This enables transparent Node version switching via the shim.
|
|
6
|
+
*
|
|
7
|
+
* Compatible with Node.js 0.8+
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var fs = require('fs');
|
|
11
|
+
var path = require('path');
|
|
12
|
+
var os = require('os');
|
|
13
|
+
var exit = require('exit');
|
|
14
|
+
var getRemote = require('get-remote');
|
|
15
|
+
|
|
16
|
+
// Polyfills for old Node versions
|
|
17
|
+
var mkdirp = require('mkdirp-classic');
|
|
18
|
+
var homedir = typeof os.homedir === 'function' ? os.homedir() : require('homedir-polyfill')();
|
|
19
|
+
|
|
20
|
+
// execSync doesn't exist in Node 0.8, use spawn
|
|
21
|
+
var spawn = require('child_process').spawn;
|
|
22
|
+
|
|
23
|
+
// Configuration
|
|
24
|
+
var GITHUB_REPO = 'kmalakoff/node-version-use';
|
|
25
|
+
var SHIM_VERSION = '1.0.2';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Get the platform-specific binary name
|
|
29
|
+
*/
|
|
30
|
+
function getShimBinaryName() {
|
|
31
|
+
var platform = os.platform();
|
|
32
|
+
var arch = os.arch();
|
|
33
|
+
|
|
34
|
+
var platformMap = {
|
|
35
|
+
darwin: 'darwin',
|
|
36
|
+
linux: 'linux',
|
|
37
|
+
win32: 'win32',
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
var archMap = {
|
|
41
|
+
x64: 'x64',
|
|
42
|
+
arm64: 'arm64',
|
|
43
|
+
amd64: 'x64',
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
var platformName = platformMap[platform];
|
|
47
|
+
var archName = archMap[arch];
|
|
48
|
+
|
|
49
|
+
if (!platformName || !archName) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
var ext = platform === 'win32' ? '.exe' : '';
|
|
54
|
+
return 'nvu-shim-' + platformName + '-' + archName + ext;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Get the download URL for the shim binary
|
|
59
|
+
*/
|
|
60
|
+
function getDownloadUrl(binaryName) {
|
|
61
|
+
var ext = os.platform() === 'win32' ? '.zip' : '.tar.gz';
|
|
62
|
+
return 'https://github.com/' + GITHUB_REPO + '/releases/download/shim-v' + SHIM_VERSION + '/' + binaryName + ext;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Copy file (compatible with Node 0.8)
|
|
67
|
+
*/
|
|
68
|
+
function copyFileSync(src, dest) {
|
|
69
|
+
var content = fs.readFileSync(src);
|
|
70
|
+
fs.writeFileSync(dest, content);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Download a file from a URL (using get-remote for Node 0.8+ compatibility)
|
|
75
|
+
*/
|
|
76
|
+
function downloadFile(url, destPath, callback) {
|
|
77
|
+
var writeStream = fs.createWriteStream(destPath);
|
|
78
|
+
getRemote(url).pipe(writeStream, callback);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Extract archive and install shims (callback-based)
|
|
83
|
+
*/
|
|
84
|
+
function extractAndInstall(archivePath, destDir, binaryName, callback) {
|
|
85
|
+
var platform = os.platform();
|
|
86
|
+
|
|
87
|
+
if (platform === 'win32') {
|
|
88
|
+
// Windows: extract zip using PowerShell
|
|
89
|
+
var ps = spawn('powershell', ['-Command', "Expand-Archive -Path '" + archivePath + "' -DestinationPath '" + destDir + "' -Force"]);
|
|
90
|
+
ps.on('close', function (code) {
|
|
91
|
+
if (code !== 0) {
|
|
92
|
+
callback(new Error('Failed to extract archive'));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
var extractedPath = path.join(destDir, binaryName);
|
|
96
|
+
if (fs.existsSync(extractedPath)) {
|
|
97
|
+
try {
|
|
98
|
+
copyFileSync(extractedPath, path.join(destDir, 'node.exe'));
|
|
99
|
+
copyFileSync(extractedPath, path.join(destDir, 'npm.exe'));
|
|
100
|
+
copyFileSync(extractedPath, path.join(destDir, 'npx.exe'));
|
|
101
|
+
fs.unlinkSync(extractedPath);
|
|
102
|
+
} catch (err) {
|
|
103
|
+
callback(err);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
callback(null);
|
|
108
|
+
});
|
|
109
|
+
} else {
|
|
110
|
+
// Unix: extract tar.gz
|
|
111
|
+
var tar = spawn('tar', ['-xzf', archivePath, '-C', destDir]);
|
|
112
|
+
tar.on('close', function (code) {
|
|
113
|
+
if (code !== 0) {
|
|
114
|
+
callback(new Error('Failed to extract archive'));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
var extractedPath = path.join(destDir, binaryName);
|
|
118
|
+
if (fs.existsSync(extractedPath)) {
|
|
119
|
+
var nodePath = path.join(destDir, 'node');
|
|
120
|
+
var npmPath = path.join(destDir, 'npm');
|
|
121
|
+
var npxPath = path.join(destDir, 'npx');
|
|
122
|
+
|
|
123
|
+
try {
|
|
124
|
+
copyFileSync(extractedPath, nodePath);
|
|
125
|
+
copyFileSync(extractedPath, npmPath);
|
|
126
|
+
copyFileSync(extractedPath, npxPath);
|
|
127
|
+
|
|
128
|
+
fs.chmodSync(nodePath, 493); // 0755
|
|
129
|
+
fs.chmodSync(npmPath, 493);
|
|
130
|
+
fs.chmodSync(npxPath, 493);
|
|
131
|
+
|
|
132
|
+
fs.unlinkSync(extractedPath);
|
|
133
|
+
} catch (err) {
|
|
134
|
+
callback(err);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
callback(null);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Print setup instructions
|
|
145
|
+
*/
|
|
146
|
+
function printInstructions(installed) {
|
|
147
|
+
var nvuBinPath = path.join(homedir, '.nvu', 'bin');
|
|
148
|
+
var platform = os.platform();
|
|
149
|
+
|
|
150
|
+
console.log('');
|
|
151
|
+
console.log('============================================================');
|
|
152
|
+
if (installed) {
|
|
153
|
+
console.log(' nvu shims installed to ~/.nvu/bin/');
|
|
154
|
+
} else {
|
|
155
|
+
console.log(' nvu installed (shims not yet available)');
|
|
156
|
+
}
|
|
157
|
+
console.log('============================================================');
|
|
158
|
+
console.log('');
|
|
159
|
+
console.log('To enable transparent Node version switching, add to your shell profile:');
|
|
160
|
+
console.log('');
|
|
161
|
+
|
|
162
|
+
if (platform === 'win32') {
|
|
163
|
+
console.log(' PowerShell (add to $PROFILE):');
|
|
164
|
+
console.log(' $env:PATH = "' + nvuBinPath + ';$env:PATH"');
|
|
165
|
+
console.log('');
|
|
166
|
+
console.log(' CMD (run as administrator):');
|
|
167
|
+
console.log(' setx PATH "' + nvuBinPath + ';%PATH%"');
|
|
168
|
+
} else {
|
|
169
|
+
console.log(' # For bash (~/.bashrc):');
|
|
170
|
+
console.log(' export PATH="$HOME/.nvu/bin:$PATH"');
|
|
171
|
+
console.log('');
|
|
172
|
+
console.log(' # For zsh (~/.zshrc):');
|
|
173
|
+
console.log(' export PATH="$HOME/.nvu/bin:$PATH"');
|
|
174
|
+
console.log('');
|
|
175
|
+
console.log(' # For fish (~/.config/fish/config.fish):');
|
|
176
|
+
console.log(' set -gx PATH $HOME/.nvu/bin $PATH');
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
console.log('');
|
|
180
|
+
console.log('Then restart your terminal or source your shell profile.');
|
|
181
|
+
console.log('');
|
|
182
|
+
console.log("Without this, 'nvu 18 npm test' still works - you just won't have");
|
|
183
|
+
console.log("transparent 'node' command override.");
|
|
184
|
+
console.log('============================================================');
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Get temp directory (compatible with Node 0.8)
|
|
189
|
+
*/
|
|
190
|
+
function getTmpDir() {
|
|
191
|
+
return typeof os.tmpdir === 'function' ? os.tmpdir() : process.env.TMPDIR || process.env.TMP || process.env.TEMP || '/tmp';
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Main installation function
|
|
196
|
+
*/
|
|
197
|
+
function main() {
|
|
198
|
+
var binaryName = getShimBinaryName();
|
|
199
|
+
|
|
200
|
+
if (!binaryName) {
|
|
201
|
+
console.log('postinstall: Unsupported platform/architecture for shim binary.');
|
|
202
|
+
console.log('Platform: ' + os.platform() + ', Arch: ' + os.arch());
|
|
203
|
+
console.log('Shim not installed. You can still use nvu with explicit versions: nvu 18 npm test');
|
|
204
|
+
exit(0);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
var nvuDir = path.join(homedir, '.nvu');
|
|
209
|
+
var binDir = path.join(nvuDir, 'bin');
|
|
210
|
+
|
|
211
|
+
// Create directories
|
|
212
|
+
mkdirp.sync(nvuDir);
|
|
213
|
+
mkdirp.sync(binDir);
|
|
214
|
+
|
|
215
|
+
var downloadUrl = getDownloadUrl(binaryName);
|
|
216
|
+
var ext = os.platform() === 'win32' ? '.zip' : '.tar.gz';
|
|
217
|
+
var tempPath = path.join(getTmpDir(), 'nvu-shim-' + Date.now() + ext);
|
|
218
|
+
|
|
219
|
+
console.log('postinstall: Downloading shim binary for ' + os.platform() + '-' + os.arch() + '...');
|
|
220
|
+
|
|
221
|
+
downloadFile(downloadUrl, tempPath, function (downloadErr) {
|
|
222
|
+
if (downloadErr) {
|
|
223
|
+
// Clean up temp file if it exists
|
|
224
|
+
if (fs.existsSync(tempPath)) {
|
|
225
|
+
try {
|
|
226
|
+
fs.unlinkSync(tempPath);
|
|
227
|
+
} catch (_e) {}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (downloadErr.message && downloadErr.message.indexOf('404') >= 0) {
|
|
231
|
+
console.log('postinstall: Shim binaries not yet published to GitHub releases.');
|
|
232
|
+
console.log('');
|
|
233
|
+
console.log('To build and install shims locally:');
|
|
234
|
+
console.log(' cd node_modules/node-version-use/shim');
|
|
235
|
+
console.log(' make install');
|
|
236
|
+
console.log('');
|
|
237
|
+
console.log('Or wait for the next release which will include pre-built binaries.');
|
|
238
|
+
} else {
|
|
239
|
+
console.log('postinstall warning: Failed to install shim: ' + (downloadErr.message || downloadErr));
|
|
240
|
+
console.log('You can still use nvu with explicit versions: nvu 18 npm test');
|
|
241
|
+
console.log('To install shims manually: cd node_modules/node-version-use/shim && make install');
|
|
242
|
+
}
|
|
243
|
+
printInstructions(false);
|
|
244
|
+
exit(0);
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
console.log('postinstall: Extracting shim binary...');
|
|
249
|
+
|
|
250
|
+
extractAndInstall(tempPath, binDir, binaryName, function (extractErr) {
|
|
251
|
+
// Clean up temp file
|
|
252
|
+
if (fs.existsSync(tempPath)) {
|
|
253
|
+
try {
|
|
254
|
+
fs.unlinkSync(tempPath);
|
|
255
|
+
} catch (_e) {}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
if (extractErr) {
|
|
259
|
+
console.log('postinstall warning: Failed to extract shim: ' + (extractErr.message || extractErr));
|
|
260
|
+
console.log('You can still use nvu with explicit versions: nvu 18 npm test');
|
|
261
|
+
printInstructions(false);
|
|
262
|
+
exit(0);
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
console.log('postinstall: Shim installed successfully!');
|
|
267
|
+
printInstructions(true);
|
|
268
|
+
exit(0);
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
main();
|
package/shim/Makefile
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Makefile for building nvu shim binaries for all platforms
|
|
2
|
+
|
|
3
|
+
VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
|
|
4
|
+
BUILD_DIR := build
|
|
5
|
+
BINARY_NAME := nvu-shim
|
|
6
|
+
|
|
7
|
+
# Build flags for smaller binaries
|
|
8
|
+
LDFLAGS := -s -w -X main.version=$(VERSION)
|
|
9
|
+
|
|
10
|
+
.PHONY: all clean darwin-arm64 darwin-x64 linux-x64 linux-arm64 windows-x64 windows-arm64 local install release
|
|
11
|
+
|
|
12
|
+
all: darwin-arm64 darwin-x64 linux-x64 linux-arm64 windows-x64 windows-arm64
|
|
13
|
+
|
|
14
|
+
$(BUILD_DIR):
|
|
15
|
+
mkdir -p $(BUILD_DIR)
|
|
16
|
+
|
|
17
|
+
darwin-arm64: $(BUILD_DIR)
|
|
18
|
+
GOOS=darwin GOARCH=arm64 go build -ldflags="$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-darwin-arm64 .
|
|
19
|
+
|
|
20
|
+
darwin-x64: $(BUILD_DIR)
|
|
21
|
+
GOOS=darwin GOARCH=amd64 go build -ldflags="$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-darwin-x64 .
|
|
22
|
+
|
|
23
|
+
linux-x64: $(BUILD_DIR)
|
|
24
|
+
GOOS=linux GOARCH=amd64 go build -ldflags="$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-linux-x64 .
|
|
25
|
+
|
|
26
|
+
linux-arm64: $(BUILD_DIR)
|
|
27
|
+
GOOS=linux GOARCH=arm64 go build -ldflags="$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-linux-arm64 .
|
|
28
|
+
|
|
29
|
+
windows-x64: $(BUILD_DIR)
|
|
30
|
+
GOOS=windows GOARCH=amd64 go build -ldflags="$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-win32-x64.exe .
|
|
31
|
+
|
|
32
|
+
windows-arm64: $(BUILD_DIR)
|
|
33
|
+
GOOS=windows GOARCH=arm64 go build -ldflags="$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-win32-arm64.exe .
|
|
34
|
+
|
|
35
|
+
# Build for current platform (for local testing)
|
|
36
|
+
local: $(BUILD_DIR)
|
|
37
|
+
go build -ldflags="$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME) .
|
|
38
|
+
|
|
39
|
+
# Install shims to ~/.nvu/bin for local testing
|
|
40
|
+
install: local
|
|
41
|
+
mkdir -p $(HOME)/.nvu/bin
|
|
42
|
+
cp $(BUILD_DIR)/$(BINARY_NAME) $(HOME)/.nvu/bin/node
|
|
43
|
+
cp $(BUILD_DIR)/$(BINARY_NAME) $(HOME)/.nvu/bin/npm
|
|
44
|
+
cp $(BUILD_DIR)/$(BINARY_NAME) $(HOME)/.nvu/bin/npx
|
|
45
|
+
@echo "Shims installed to ~/.nvu/bin/"
|
|
46
|
+
@echo "Add to your PATH: export PATH=\"\$$HOME/.nvu/bin:\$$PATH\""
|
|
47
|
+
|
|
48
|
+
clean:
|
|
49
|
+
rm -rf $(BUILD_DIR)
|
|
50
|
+
|
|
51
|
+
# Create release archives
|
|
52
|
+
release: all
|
|
53
|
+
cd $(BUILD_DIR) && tar -czf $(BINARY_NAME)-darwin-arm64.tar.gz $(BINARY_NAME)-darwin-arm64
|
|
54
|
+
cd $(BUILD_DIR) && tar -czf $(BINARY_NAME)-darwin-x64.tar.gz $(BINARY_NAME)-darwin-x64
|
|
55
|
+
cd $(BUILD_DIR) && tar -czf $(BINARY_NAME)-linux-x64.tar.gz $(BINARY_NAME)-linux-x64
|
|
56
|
+
cd $(BUILD_DIR) && tar -czf $(BINARY_NAME)-linux-arm64.tar.gz $(BINARY_NAME)-linux-arm64
|
|
57
|
+
cd $(BUILD_DIR) && zip $(BINARY_NAME)-win32-x64.zip $(BINARY_NAME)-win32-x64.exe
|
|
58
|
+
cd $(BUILD_DIR) && zip $(BINARY_NAME)-win32-arm64.zip $(BINARY_NAME)-win32-arm64.exe
|
package/shim/go.mod
ADDED