node-install-release 1.14.12 → 1.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/cli.d.cts +1 -1
- package/dist/cjs/cli.d.ts +1 -1
- package/dist/cjs/cli.js +51 -7
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/installNPM/index.js +11 -2
- package/dist/cjs/installNPM/index.js.map +1 -1
- package/dist/cjs/installNPM/installLib.d.cts +1 -1
- package/dist/cjs/installNPM/installLib.d.ts +1 -1
- package/dist/cjs/installNPM/installLib.js +27 -1
- package/dist/cjs/installNPM/installLib.js.map +1 -1
- package/dist/cjs/installNode/index.js +18 -6
- package/dist/cjs/installNode/index.js.map +1 -1
- package/dist/cjs/installNode/installCompressed.d.cts +2 -2
- package/dist/cjs/installNode/installCompressed.d.ts +2 -2
- package/dist/cjs/installNode/installCompressed.js +8 -2
- package/dist/cjs/installNode/installCompressed.js.map +1 -1
- package/dist/cjs/installNode/installFilename.d.cts +2 -2
- package/dist/cjs/installNode/installFilename.d.ts +2 -2
- package/dist/cjs/installNode/installFilename.js +0 -5
- package/dist/cjs/installNode/installFilename.js.map +1 -1
- package/dist/cjs/installNode/validateDownload.d.cts +2 -2
- package/dist/cjs/installNode/validateDownload.d.ts +2 -2
- package/dist/cjs/installNode/validateDownload.js +8 -1
- package/dist/cjs/installNode/validateDownload.js.map +1 -1
- package/dist/cjs/types.d.cts +6 -0
- package/dist/cjs/types.d.ts +6 -0
- package/dist/esm/cli.d.ts +1 -1
- package/dist/esm/cli.js +51 -7
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/installNPM/index.js +11 -2
- package/dist/esm/installNPM/index.js.map +1 -1
- package/dist/esm/installNPM/installLib.d.ts +1 -1
- package/dist/esm/installNPM/installLib.js +25 -1
- package/dist/esm/installNPM/installLib.js.map +1 -1
- package/dist/esm/installNode/index.js +17 -5
- package/dist/esm/installNode/index.js.map +1 -1
- package/dist/esm/installNode/installCompressed.d.ts +2 -2
- package/dist/esm/installNode/installCompressed.js +8 -2
- package/dist/esm/installNode/installCompressed.js.map +1 -1
- package/dist/esm/installNode/installFilename.d.ts +2 -2
- package/dist/esm/installNode/installFilename.js +0 -5
- package/dist/esm/installNode/installFilename.js.map +1 -1
- package/dist/esm/installNode/validateDownload.d.ts +2 -2
- package/dist/esm/installNode/validateDownload.js +8 -1
- package/dist/esm/installNode/validateDownload.js.map +1 -1
- package/dist/esm/types.d.ts +6 -0
- package/dist/esm/types.js.map +1 -1
- package/package.json +6 -3
package/dist/cjs/cli.d.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const _default: (argv: string[]) => undefined;
|
|
1
|
+
declare const _default: (argv: string[], name?: string) => undefined;
|
|
2
2
|
export default _default;
|
package/dist/cjs/cli.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const _default: (argv: string[]) => undefined;
|
|
1
|
+
declare const _default: (argv: string[], name?: string) => undefined;
|
|
2
2
|
export default _default;
|
package/dist/cjs/cli.js
CHANGED
|
@@ -9,7 +9,10 @@ Object.defineProperty(exports, "default", {
|
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
11
|
var _exit = /*#__PURE__*/ _interop_require_default(require("exit"));
|
|
12
|
+
var _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
|
|
12
13
|
var _getoptscompat = /*#__PURE__*/ _interop_require_default(require("getopts-compat"));
|
|
14
|
+
var _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
|
15
|
+
var _url = /*#__PURE__*/ _interop_require_default(require("url"));
|
|
13
16
|
var _indexts = /*#__PURE__*/ _interop_require_default(require("./index.js"));
|
|
14
17
|
function _interop_require_default(obj) {
|
|
15
18
|
return obj && obj.__esModule ? obj : {
|
|
@@ -17,24 +20,65 @@ function _interop_require_default(obj) {
|
|
|
17
20
|
};
|
|
18
21
|
}
|
|
19
22
|
var ERROR_CODE = 9;
|
|
20
|
-
var
|
|
21
|
-
|
|
23
|
+
var __dirname = _path.default.dirname(typeof __filename !== 'undefined' ? __filename : _url.default.fileURLToPath(require("url").pathToFileURL(__filename).toString()));
|
|
24
|
+
function getPackageVersion() {
|
|
25
|
+
var packagePath = _path.default.join(__dirname, '..', '..', 'package.json');
|
|
26
|
+
var packageJson = JSON.parse(_fs.default.readFileSync(packagePath, 'utf8'));
|
|
27
|
+
return packageJson.version;
|
|
28
|
+
}
|
|
29
|
+
function printHelp(name) {
|
|
30
|
+
var version = getPackageVersion();
|
|
31
|
+
console.log("".concat(name, " v").concat(version));
|
|
32
|
+
console.log('');
|
|
33
|
+
console.log("Usage: ".concat(name, " <version> [options]"));
|
|
34
|
+
console.log('');
|
|
35
|
+
console.log('Arguments:');
|
|
36
|
+
console.log(' version Node.js version to install (e.g., 18.0.0, lts, stable)');
|
|
37
|
+
console.log('');
|
|
38
|
+
console.log('Options:');
|
|
39
|
+
console.log(' -p, --platform Target platform (default: current platform)');
|
|
40
|
+
console.log(' -a, --arch Target architecture (default: current architecture)');
|
|
41
|
+
console.log(' -f, --filename Specific filename to download');
|
|
42
|
+
console.log(' -i, --installPath Installation directory');
|
|
43
|
+
console.log(' -c, --storagePath Cache storage directory');
|
|
44
|
+
console.log(' -si, --silent Suppress output');
|
|
45
|
+
console.log(' -v, --version Show version number');
|
|
46
|
+
console.log(' -h, --help Show this help message');
|
|
47
|
+
}
|
|
48
|
+
var _default = function(argv, name) {
|
|
49
|
+
var cliName = name || 'nir';
|
|
50
|
+
var options = (0, _getoptscompat.default)(argv, {
|
|
22
51
|
alias: {
|
|
23
52
|
platform: 'p',
|
|
24
53
|
arch: 'a',
|
|
25
54
|
filename: 'f',
|
|
26
55
|
installPath: 'i',
|
|
27
56
|
storagePath: 'c',
|
|
28
|
-
silent: 'si'
|
|
57
|
+
silent: 'si',
|
|
58
|
+
version: 'v',
|
|
59
|
+
help: 'h'
|
|
29
60
|
},
|
|
30
61
|
boolean: [
|
|
31
|
-
'silent'
|
|
62
|
+
'silent',
|
|
63
|
+
'version',
|
|
64
|
+
'help'
|
|
32
65
|
]
|
|
33
66
|
});
|
|
34
|
-
|
|
67
|
+
if (options.version) {
|
|
68
|
+
console.log(getPackageVersion());
|
|
69
|
+
(0, _exit.default)(0);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (options.help) {
|
|
73
|
+
printHelp(cliName);
|
|
74
|
+
(0, _exit.default)(0);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
var args = options._;
|
|
35
78
|
if (args.length < 1) {
|
|
36
|
-
console.log(
|
|
37
|
-
|
|
79
|
+
console.log("Missing command. Example usage: ".concat(cliName, " <version> [directory]"));
|
|
80
|
+
(0, _exit.default)(ERROR_CODE);
|
|
81
|
+
return;
|
|
38
82
|
}
|
|
39
83
|
(0, _indexts.default)(args[0], options, function(err, result) {
|
|
40
84
|
if (!options.silent) {
|
package/dist/cjs/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/cli.ts"],"sourcesContent":["import exit from 'exit';\nimport getopts from 'getopts-compat';\nimport install, { type InstallOptions } from './index.ts';\n\nconst ERROR_CODE = 9;\n\nexport default (argv: string[]): undefined => {\n const options = getopts(argv
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/cli.ts"],"sourcesContent":["import exit from 'exit';\nimport fs from 'fs';\nimport getopts from 'getopts-compat';\nimport path from 'path';\nimport url from 'url';\nimport install, { type InstallOptions } from './index.ts';\n\nconst ERROR_CODE = 9;\nconst __dirname = path.dirname(typeof __filename !== 'undefined' ? __filename : url.fileURLToPath(import.meta.url));\n\nfunction getPackageVersion(): string {\n const packagePath = path.join(__dirname, '..', '..', 'package.json');\n const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf8'));\n return packageJson.version;\n}\n\nfunction printHelp(name: string): void {\n const version = getPackageVersion();\n console.log(`${name} v${version}`);\n console.log('');\n console.log(`Usage: ${name} <version> [options]`);\n console.log('');\n console.log('Arguments:');\n console.log(' version Node.js version to install (e.g., 18.0.0, lts, stable)');\n console.log('');\n console.log('Options:');\n console.log(' -p, --platform Target platform (default: current platform)');\n console.log(' -a, --arch Target architecture (default: current architecture)');\n console.log(' -f, --filename Specific filename to download');\n console.log(' -i, --installPath Installation directory');\n console.log(' -c, --storagePath Cache storage directory');\n console.log(' -si, --silent Suppress output');\n console.log(' -v, --version Show version number');\n console.log(' -h, --help Show this help message');\n}\n\nexport default (argv: string[], name?: string): undefined => {\n const cliName = name || 'nir';\n const options = getopts(argv, {\n alias: { platform: 'p', arch: 'a', filename: 'f', installPath: 'i', storagePath: 'c', silent: 'si', version: 'v', help: 'h' },\n boolean: ['silent', 'version', 'help'],\n });\n\n if (options.version) {\n console.log(getPackageVersion());\n exit(0);\n return;\n }\n\n if (options.help) {\n printHelp(cliName);\n exit(0);\n return;\n }\n\n const args = options._;\n if (args.length < 1) {\n console.log(`Missing command. Example usage: ${cliName} <version> [directory]`);\n exit(ERROR_CODE);\n return;\n }\n install(args[0], options as InstallOptions, (err, result) => {\n if (!options.silent) {\n console.log('\\n======================');\n if (err) console.log(`${args[0]} not installed. Error: ${err.message}`);\n else console.log(`${result.version} installed in: ${result.installPath}`);\n console.log('======================');\n }\n exit(err ? ERROR_CODE : 0);\n });\n};\n"],"names":["ERROR_CODE","__dirname","path","dirname","__filename","url","fileURLToPath","getPackageVersion","packagePath","join","packageJson","JSON","parse","fs","readFileSync","version","printHelp","name","console","log","argv","cliName","options","getopts","alias","platform","arch","filename","installPath","storagePath","silent","help","boolean","exit","args","_","length","install","err","result","message"],"mappings":";;;;+BAoCA;;;eAAA;;;2DApCiB;yDACF;oEACK;2DACH;0DACD;8DAC6B;;;;;;AAE7C,IAAMA,aAAa;AACnB,IAAMC,YAAYC,aAAI,CAACC,OAAO,CAAC,OAAOC,eAAe,cAAcA,aAAaC,YAAG,CAACC,aAAa,CAAC;AAElG,SAASC;IACP,IAAMC,cAAcN,aAAI,CAACO,IAAI,CAACR,WAAW,MAAM,MAAM;IACrD,IAAMS,cAAcC,KAAKC,KAAK,CAACC,WAAE,CAACC,YAAY,CAACN,aAAa;IAC5D,OAAOE,YAAYK,OAAO;AAC5B;AAEA,SAASC,UAAUC,IAAY;IAC7B,IAAMF,UAAUR;IAChBW,QAAQC,GAAG,CAAC,AAAC,GAAWJ,OAATE,MAAK,MAAY,OAARF;IACxBG,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC,AAAC,UAAc,OAALF,MAAK;IAC3BC,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;AACd;IAEA,WAAe,SAACC,MAAgBH;IAC9B,IAAMI,UAAUJ,QAAQ;IACxB,IAAMK,UAAUC,IAAAA,sBAAO,EAACH,MAAM;QAC5BI,OAAO;YAAEC,UAAU;YAAKC,MAAM;YAAKC,UAAU;YAAKC,aAAa;YAAKC,aAAa;YAAKC,QAAQ;YAAMf,SAAS;YAAKgB,MAAM;QAAI;QAC5HC,SAAS;YAAC;YAAU;YAAW;SAAO;IACxC;IAEA,IAAIV,QAAQP,OAAO,EAAE;QACnBG,QAAQC,GAAG,CAACZ;QACZ0B,IAAAA,aAAI,EAAC;QACL;IACF;IAEA,IAAIX,QAAQS,IAAI,EAAE;QAChBf,UAAUK;QACVY,IAAAA,aAAI,EAAC;QACL;IACF;IAEA,IAAMC,OAAOZ,QAAQa,CAAC;IACtB,IAAID,KAAKE,MAAM,GAAG,GAAG;QACnBlB,QAAQC,GAAG,CAAC,AAAC,mCAA0C,OAARE,SAAQ;QACvDY,IAAAA,aAAI,EAACjC;QACL;IACF;IACAqC,IAAAA,gBAAO,EAACH,IAAI,CAAC,EAAE,EAAEZ,SAA2B,SAACgB,KAAKC;QAChD,IAAI,CAACjB,QAAQQ,MAAM,EAAE;YACnBZ,QAAQC,GAAG,CAAC;YACZ,IAAImB,KAAKpB,QAAQC,GAAG,CAAC,AAAC,GAAmCmB,OAAjCJ,IAAI,CAAC,EAAE,EAAC,2BAAqC,OAAZI,IAAIE,OAAO;iBAC/DtB,QAAQC,GAAG,CAAC,AAAC,GAAkCoB,OAAhCA,OAAOxB,OAAO,EAAC,mBAAoC,OAAnBwB,OAAOX,WAAW;YACtEV,QAAQC,GAAG,CAAC;QACd;QACAc,IAAAA,aAAI,EAACK,MAAMtC,aAAa;IAC1B;AACF"}
|
|
@@ -18,16 +18,25 @@ function _interop_require_default(obj) {
|
|
|
18
18
|
}
|
|
19
19
|
function install(version, dest, options, callback) {
|
|
20
20
|
var npmVersion = null;
|
|
21
|
+
var checksum;
|
|
21
22
|
var queue = new _queuecb.default(1);
|
|
22
23
|
queue.defer(function(cb) {
|
|
23
|
-
return (0, _installLibts.default)(version, dest, options, function(err, _npmVersion) {
|
|
24
|
+
return (0, _installLibts.default)(version, dest, options, function(err, _npmVersion, _checksum) {
|
|
24
25
|
npmVersion = _npmVersion;
|
|
26
|
+
checksum = _checksum;
|
|
25
27
|
cb(err);
|
|
26
28
|
});
|
|
27
29
|
});
|
|
28
30
|
queue.defer(_installBints.default.bind(null, version, dest, options));
|
|
29
31
|
queue.await(function(err) {
|
|
30
|
-
|
|
32
|
+
var message = "npm ".concat(npmVersion || '');
|
|
33
|
+
if (!err) {
|
|
34
|
+
message += ' installed';
|
|
35
|
+
if (checksum) message += " (".concat(checksum.slice(0, 8), ")");
|
|
36
|
+
} else {
|
|
37
|
+
message += " install failed. Error: ".concat(err.message);
|
|
38
|
+
}
|
|
39
|
+
console.log(message);
|
|
31
40
|
callback(err);
|
|
32
41
|
});
|
|
33
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNPM/index.ts"],"sourcesContent":["import Queue from 'queue-cb';\nimport type { InstallOptions, NoParamCallback } from '../types.ts';\nimport installBin from './installBin.ts';\nimport installLib from './installLib.ts';\n\nexport default function install(version: string, dest: string, options: InstallOptions, callback: NoParamCallback): undefined {\n let npmVersion = null;\n\n const queue = new Queue(1);\n queue.defer((cb) =>\n installLib(version, dest, options, (err, _npmVersion) => {\n npmVersion = _npmVersion;\n cb(err);\n })\n );\n queue.defer(installBin.bind(null, version, dest, options));\n queue.await((err) => {\n
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNPM/index.ts"],"sourcesContent":["import Queue from 'queue-cb';\nimport type { InstallOptions, NoParamCallback } from '../types.ts';\nimport installBin from './installBin.ts';\nimport installLib from './installLib.ts';\n\nexport default function install(version: string, dest: string, options: InstallOptions, callback: NoParamCallback): undefined {\n let npmVersion: string | null = null;\n let checksum: string | undefined;\n\n const queue = new Queue(1);\n queue.defer((cb) =>\n installLib(version, dest, options, (err, _npmVersion, _checksum) => {\n npmVersion = _npmVersion;\n checksum = _checksum;\n cb(err);\n })\n );\n queue.defer(installBin.bind(null, version, dest, options));\n queue.await((err) => {\n let message = `npm ${npmVersion || ''}`;\n if (!err) {\n message += ' installed';\n if (checksum) message += ` (${checksum.slice(0, 8)})`;\n } else {\n message += ` install failed. Error: ${err.message}`;\n }\n console.log(message);\n callback(err);\n });\n}\n"],"names":["install","version","dest","options","callback","npmVersion","checksum","queue","Queue","defer","cb","installLib","err","_npmVersion","_checksum","installBin","bind","await","message","slice","console","log"],"mappings":";;;;+BAKA;;;eAAwBA;;;8DALN;mEAEK;mEACA;;;;;;AAER,SAASA,QAAQC,OAAe,EAAEC,IAAY,EAAEC,OAAuB,EAAEC,QAAyB;IAC/G,IAAIC,aAA4B;IAChC,IAAIC;IAEJ,IAAMC,QAAQ,IAAIC,gBAAK,CAAC;IACxBD,MAAME,KAAK,CAAC,SAACC;eACXC,IAAAA,qBAAU,EAACV,SAASC,MAAMC,SAAS,SAACS,KAAKC,aAAaC;YACpDT,aAAaQ;YACbP,WAAWQ;YACXJ,GAAGE;QACL;;IAEFL,MAAME,KAAK,CAACM,qBAAU,CAACC,IAAI,CAAC,MAAMf,SAASC,MAAMC;IACjDI,MAAMU,KAAK,CAAC,SAACL;QACX,IAAIM,UAAU,AAAC,OAAuB,OAAjBb,cAAc;QACnC,IAAI,CAACO,KAAK;YACRM,WAAW;YACX,IAAIZ,UAAUY,WAAW,AAAC,KAAyB,OAArBZ,SAASa,KAAK,CAAC,GAAG,IAAG;QACrD,OAAO;YACLD,WAAW,AAAC,2BAAsC,OAAZN,IAAIM,OAAO;QACnD;QACAE,QAAQC,GAAG,CAACH;QACZd,SAASQ;IACX;AACF"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { InstallOptions } from '../types.js';
|
|
2
|
-
export type Callback = (error?: Error, npmVersion?: string) => undefined;
|
|
2
|
+
export type Callback = (error?: Error, npmVersion?: string, checksum?: string) => undefined;
|
|
3
3
|
export default function installLib(version: string, dest: string, options: InstallOptions, callback: Callback): undefined;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { InstallOptions } from '../types.js';
|
|
2
|
-
export type Callback = (error?: Error, npmVersion?: string) => undefined;
|
|
2
|
+
export type Callback = (error?: Error, npmVersion?: string, checksum?: string) => undefined;
|
|
3
3
|
export default function installLib(version: string, dest: string, options: InstallOptions, callback: Callback): undefined;
|
|
@@ -8,8 +8,11 @@ Object.defineProperty(exports, "default", {
|
|
|
8
8
|
return installLib;
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
+
var _crypto = /*#__PURE__*/ _interop_require_default(require("crypto"));
|
|
12
|
+
var _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
|
|
11
13
|
var _getremote = /*#__PURE__*/ _interop_require_default(require("get-remote"));
|
|
12
14
|
var _nodefilenametodistpaths = require("node-filename-to-dist-paths");
|
|
15
|
+
var _onone = /*#__PURE__*/ _interop_require_default(require("on-one"));
|
|
13
16
|
var _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
|
14
17
|
var _queuecb = /*#__PURE__*/ _interop_require_default(require("queue-cb"));
|
|
15
18
|
var _constantsts = require("../constants.js");
|
|
@@ -20,6 +23,22 @@ function _interop_require_default(obj) {
|
|
|
20
23
|
default: obj
|
|
21
24
|
};
|
|
22
25
|
}
|
|
26
|
+
function calculateChecksum(filePath, callback) {
|
|
27
|
+
var hash = _crypto.default.createHash('sha256');
|
|
28
|
+
var stream = _fs.default.createReadStream(filePath);
|
|
29
|
+
stream.on('data', function(data) {
|
|
30
|
+
return hash.update(data);
|
|
31
|
+
});
|
|
32
|
+
(0, _onone.default)(stream, [
|
|
33
|
+
'error',
|
|
34
|
+
'end',
|
|
35
|
+
'close',
|
|
36
|
+
'finish'
|
|
37
|
+
], function(err) {
|
|
38
|
+
if (err) return callback(err);
|
|
39
|
+
callback(null, hash.digest('hex'));
|
|
40
|
+
});
|
|
41
|
+
}
|
|
23
42
|
function installLib(version, dest, options, callback) {
|
|
24
43
|
var platform = options.platform;
|
|
25
44
|
var libPath = platform === 'win32' ? dest : _path.default.join(dest, 'lib');
|
|
@@ -33,11 +52,18 @@ function installLib(version, dest, options, callback) {
|
|
|
33
52
|
var npmVersion = distTags["latest-".concat(npmMajor)] || distTags["next-".concat(npmMajor)] || distTags.latest;
|
|
34
53
|
var downloadPath = "".concat(_constantsts.NPM_DIST_URL, "/-/npm-").concat(npmVersion, ".tgz");
|
|
35
54
|
var cachePath = _path.default.join(options.cachePath, _path.default.basename(downloadPath));
|
|
55
|
+
var checksum;
|
|
36
56
|
var queue = new _queuecb.default(1);
|
|
37
57
|
queue.defer(_conditionalCachets.default.bind(null, downloadPath, cachePath));
|
|
58
|
+
queue.defer(function(cb) {
|
|
59
|
+
calculateChecksum(cachePath, function(err, hash) {
|
|
60
|
+
checksum = hash;
|
|
61
|
+
cb(err);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
38
64
|
queue.defer(_conditionalExtractts.default.bind(null, cachePath, installPath));
|
|
39
65
|
queue.await(function(err) {
|
|
40
|
-
err ? callback(err) : callback(null, npmVersion);
|
|
66
|
+
err ? callback(err) : callback(null, npmVersion, checksum);
|
|
41
67
|
});
|
|
42
68
|
});
|
|
43
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNPM/installLib.ts"],"sourcesContent":["import get from 'get-remote';\nimport { getDist } from 'node-filename-to-dist-paths';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport { NPM_DIST_TAGS_URL, NPM_DIST_URL, NPM_MIN_VERSION } from '../constants.ts';\nimport conditionalCache from '../lib/conditionalCache.ts';\nimport conditionalExtract from '../lib/conditionalExtract.ts';\n\ninterface DistRecord {\n latest: string;\n}\n\nimport type { InstallOptions } from '../types.ts';\n\nexport type Callback = (error?: Error, npmVersion?: string) => undefined;\n\nexport default function installLib(version: string, dest: string, options: InstallOptions, callback: Callback): undefined {\n const platform = options.platform;\n const libPath = platform === 'win32' ? dest : path.join(dest, 'lib');\n const installPath = path.join(libPath, 'node_modules', 'npm');\n\n const dist = getDist(version);\n const npmMajorPair = dist && dist.npm ? +dist.npm.split('.')[0] : NPM_MIN_VERSION;\n const npmMajor = Math.max(npmMajorPair, NPM_MIN_VERSION);\n\n get(NPM_DIST_TAGS_URL).json((err, res) => {\n if (err) return callback(err);\n const distTags = res.body as DistRecord;\n const npmVersion = distTags[`latest-${npmMajor}`] || distTags[`next-${npmMajor}`] || distTags.latest;\n const downloadPath = `${NPM_DIST_URL}/-/npm-${npmVersion}.tgz`;\n const cachePath = path.join(options.cachePath, path.basename(downloadPath));\n\n const queue = new Queue(1);\n queue.defer(conditionalCache.bind(null, downloadPath, cachePath));\n queue.defer(conditionalExtract.bind(null, cachePath, installPath));\n queue.await((err) => {\n err ? callback(err) : callback(null, npmVersion);\n });\n });\n}\n"],"names":["installLib","version","dest","options","
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNPM/installLib.ts"],"sourcesContent":["import crypto from 'crypto';\nimport fs from 'fs';\nimport get from 'get-remote';\nimport { getDist } from 'node-filename-to-dist-paths';\nimport oo from 'on-one';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport { NPM_DIST_TAGS_URL, NPM_DIST_URL, NPM_MIN_VERSION } from '../constants.ts';\nimport conditionalCache from '../lib/conditionalCache.ts';\nimport conditionalExtract from '../lib/conditionalExtract.ts';\n\ninterface DistRecord {\n latest: string;\n}\n\nimport type { InstallOptions } from '../types.ts';\n\nexport type Callback = (error?: Error, npmVersion?: string, checksum?: string) => undefined;\n\nfunction calculateChecksum(filePath: string, callback: (err?: Error, checksum?: string) => void): void {\n const hash = crypto.createHash('sha256');\n const stream = fs.createReadStream(filePath);\n stream.on('data', (data) => hash.update(data));\n oo(stream, ['error', 'end', 'close', 'finish'], (err?: Error) => {\n if (err) return callback(err);\n callback(null, hash.digest('hex'));\n });\n}\n\nexport default function installLib(version: string, dest: string, options: InstallOptions, callback: Callback): undefined {\n const platform = options.platform;\n const libPath = platform === 'win32' ? dest : path.join(dest, 'lib');\n const installPath = path.join(libPath, 'node_modules', 'npm');\n\n const dist = getDist(version);\n const npmMajorPair = dist && dist.npm ? +dist.npm.split('.')[0] : NPM_MIN_VERSION;\n const npmMajor = Math.max(npmMajorPair, NPM_MIN_VERSION);\n\n get(NPM_DIST_TAGS_URL).json((err, res) => {\n if (err) return callback(err);\n const distTags = res.body as DistRecord;\n const npmVersion = distTags[`latest-${npmMajor}`] || distTags[`next-${npmMajor}`] || distTags.latest;\n const downloadPath = `${NPM_DIST_URL}/-/npm-${npmVersion}.tgz`;\n const cachePath = path.join(options.cachePath, path.basename(downloadPath));\n\n let checksum: string | undefined;\n const queue = new Queue(1);\n queue.defer(conditionalCache.bind(null, downloadPath, cachePath));\n queue.defer((cb) => {\n calculateChecksum(cachePath, (err, hash) => {\n checksum = hash;\n cb(err);\n });\n });\n queue.defer(conditionalExtract.bind(null, cachePath, installPath));\n queue.await((err) => {\n err ? callback(err) : callback(null, npmVersion, checksum);\n });\n });\n}\n"],"names":["installLib","calculateChecksum","filePath","callback","hash","crypto","createHash","stream","fs","createReadStream","on","data","update","oo","err","digest","version","dest","options","platform","libPath","path","join","installPath","dist","getDist","npmMajorPair","npm","split","NPM_MIN_VERSION","npmMajor","Math","max","get","NPM_DIST_TAGS_URL","json","res","distTags","body","npmVersion","latest","downloadPath","NPM_DIST_URL","cachePath","basename","checksum","queue","Queue","defer","conditionalCache","bind","cb","conditionalExtract","await"],"mappings":";;;;+BA6BA;;;eAAwBA;;;6DA7BL;yDACJ;gEACC;uCACQ;4DACT;2DACE;8DACC;2BAC+C;yEACpC;2EACE;;;;;;AAU/B,SAASC,kBAAkBC,QAAgB,EAAEC,QAAkD;IAC7F,IAAMC,OAAOC,eAAM,CAACC,UAAU,CAAC;IAC/B,IAAMC,SAASC,WAAE,CAACC,gBAAgB,CAACP;IACnCK,OAAOG,EAAE,CAAC,QAAQ,SAACC;eAASP,KAAKQ,MAAM,CAACD;;IACxCE,IAAAA,cAAE,EAACN,QAAQ;QAAC;QAAS;QAAO;QAAS;KAAS,EAAE,SAACO;QAC/C,IAAIA,KAAK,OAAOX,SAASW;QACzBX,SAAS,MAAMC,KAAKW,MAAM,CAAC;IAC7B;AACF;AAEe,SAASf,WAAWgB,OAAe,EAAEC,IAAY,EAAEC,OAAuB,EAAEf,QAAkB;IAC3G,IAAMgB,WAAWD,QAAQC,QAAQ;IACjC,IAAMC,UAAUD,aAAa,UAAUF,OAAOI,aAAI,CAACC,IAAI,CAACL,MAAM;IAC9D,IAAMM,cAAcF,aAAI,CAACC,IAAI,CAACF,SAAS,gBAAgB;IAEvD,IAAMI,OAAOC,IAAAA,gCAAO,EAACT;IACrB,IAAMU,eAAeF,QAAQA,KAAKG,GAAG,GAAG,CAACH,KAAKG,GAAG,CAACC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAGC,4BAAe;IACjF,IAAMC,WAAWC,KAAKC,GAAG,CAACN,cAAcG,4BAAe;IAEvDI,IAAAA,kBAAG,EAACC,8BAAiB,EAAEC,IAAI,CAAC,SAACrB,KAAKsB;QAChC,IAAItB,KAAK,OAAOX,SAASW;QACzB,IAAMuB,WAAWD,IAAIE,IAAI;QACzB,IAAMC,aAAaF,QAAQ,CAAC,AAAC,UAAkB,OAATP,UAAW,IAAIO,QAAQ,CAAC,AAAC,QAAgB,OAATP,UAAW,IAAIO,SAASG,MAAM;QACpG,IAAMC,eAAe,AAAC,GAAwBF,OAAtBG,yBAAY,EAAC,WAAoB,OAAXH,YAAW;QACzD,IAAMI,YAAYtB,aAAI,CAACC,IAAI,CAACJ,QAAQyB,SAAS,EAAEtB,aAAI,CAACuB,QAAQ,CAACH;QAE7D,IAAII;QACJ,IAAMC,QAAQ,IAAIC,gBAAK,CAAC;QACxBD,MAAME,KAAK,CAACC,2BAAgB,CAACC,IAAI,CAAC,MAAMT,cAAcE;QACtDG,MAAME,KAAK,CAAC,SAACG;YACXlD,kBAAkB0C,WAAW,SAAC7B,KAAKV;gBACjCyC,WAAWzC;gBACX+C,GAAGrC;YACL;QACF;QACAgC,MAAME,KAAK,CAACI,6BAAkB,CAACF,IAAI,CAAC,MAAMP,WAAWpB;QACrDuB,MAAMO,KAAK,CAAC,SAACvC;YACXA,MAAMX,SAASW,OAAOX,SAAS,MAAMoC,YAAYM;QACnD;IACF;AACF"}
|
|
@@ -49,14 +49,26 @@ function install(version, dest, options, callback) {
|
|
|
49
49
|
return filenames.indexOf(filename) === i;
|
|
50
50
|
});
|
|
51
51
|
}
|
|
52
|
-
var tryNext = function(cb) {
|
|
53
|
-
if (filenames.length === 0)
|
|
54
|
-
|
|
55
|
-
return
|
|
52
|
+
var tryNext = function(cb, lastErr) {
|
|
53
|
+
if (filenames.length === 0) {
|
|
54
|
+
var msg = "Failed to find installable for ".concat(version).concat(options.filename ? " Filename: ".concat(options.filename) : '');
|
|
55
|
+
return cb(new Error(lastErr ? "".concat(msg, ": ").concat(lastErr.message) : msg));
|
|
56
|
+
}
|
|
57
|
+
(0, _installFilenamets.default)(filenames.shift(), version, dest, options, function(err, checksum) {
|
|
58
|
+
return err ? tryNext(cb, err) : cb(null, checksum);
|
|
56
59
|
});
|
|
57
60
|
};
|
|
58
|
-
tryNext(function(err) {
|
|
59
|
-
|
|
61
|
+
tryNext(function(err, checksum) {
|
|
62
|
+
var message = "node ".concat(version.slice(1));
|
|
63
|
+
if (!err) {
|
|
64
|
+
message += ' installed';
|
|
65
|
+
if (checksum) message += " (".concat(checksum.actual.slice(0, 8), ")");
|
|
66
|
+
} else {
|
|
67
|
+
message += ' install failed';
|
|
68
|
+
if (checksum) message += " (".concat(checksum.actual, " expecting ").concat(checksum.expected, ")");
|
|
69
|
+
message += ". Error: ".concat(err.message);
|
|
70
|
+
}
|
|
71
|
+
console.log(message);
|
|
60
72
|
callback(err);
|
|
61
73
|
});
|
|
62
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNode/index.ts"],"sourcesContent":["import { FILE_PLATFORM_MAP, FILES } from '../constants.ts';\nimport type { InstallOptions, NoParamCallback } from '../types.ts';\nimport installFilename from './installFilename.ts';\n\nexport default function install(version: string, dest: string, options: InstallOptions, callback: NoParamCallback): undefined {\n let filenames = null;\n\n // a specific filename\n if (options.filename) filenames = [options.filename];\n // infer with fallbacks\n else {\n const { platform, arch } = options;\n const filePlatform = FILE_PLATFORM_MAP[platform] || platform;\n const parts = [filePlatform, arch];\n if (options.type) parts.push(options.type);\n if (options.compression) parts.push(options.compression);\n\n // generate the files in search order\n const archs = [arch, process.arch];\n filenames = archs.map((a) => [filePlatform, a].concat(parts.slice(2)).join('-'));\n (FILES[filePlatform] || []).forEach((x) => {\n filenames.push(x.filename);\n });\n filenames.push('src');\n filenames = filenames.filter((filename, i) => filenames.indexOf(filename) === i);\n }\n\n const tryNext = (cb) => {\n if (filenames.length === 0)
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNode/index.ts"],"sourcesContent":["import { FILE_PLATFORM_MAP, FILES } from '../constants.ts';\nimport type { ChecksumResult, InstallOptions, NoParamCallback } from '../types.ts';\nimport installFilename from './installFilename.ts';\n\nexport default function install(version: string, dest: string, options: InstallOptions, callback: NoParamCallback): undefined {\n let filenames = null;\n\n // a specific filename\n if (options.filename) filenames = [options.filename];\n // infer with fallbacks\n else {\n const { platform, arch } = options;\n const filePlatform = FILE_PLATFORM_MAP[platform] || platform;\n const parts = [filePlatform, arch];\n if (options.type) parts.push(options.type);\n if (options.compression) parts.push(options.compression);\n\n // generate the files in search order\n const archs = [arch, process.arch];\n filenames = archs.map((a) => [filePlatform, a].concat(parts.slice(2)).join('-'));\n (FILES[filePlatform] || []).forEach((x) => {\n filenames.push(x.filename);\n });\n filenames.push('src');\n filenames = filenames.filter((filename, i) => filenames.indexOf(filename) === i);\n }\n\n const tryNext = (cb: (err?: Error, checksum?: ChecksumResult) => void, lastErr?: Error) => {\n if (filenames.length === 0) {\n const msg = `Failed to find installable for ${version}${options.filename ? ` Filename: ${options.filename}` : ''}`;\n return cb(new Error(lastErr ? `${msg}: ${lastErr.message}` : msg));\n }\n installFilename(filenames.shift(), version, dest, options, (err, checksum) => (err ? tryNext(cb, err) : cb(null, checksum)));\n };\n tryNext((err, checksum) => {\n let message = `node ${version.slice(1)}`;\n if (!err) {\n message += ' installed';\n if (checksum) message += ` (${checksum.actual.slice(0, 8)})`;\n } else {\n message += ' install failed';\n if (checksum) message += ` (${checksum.actual} expecting ${checksum.expected})`;\n message += `. Error: ${err.message}`;\n }\n console.log(message);\n callback(err);\n });\n}\n"],"names":["install","version","dest","options","callback","filenames","filename","platform","arch","filePlatform","FILE_PLATFORM_MAP","parts","type","push","compression","archs","process","map","a","concat","slice","join","FILES","forEach","x","filter","i","indexOf","tryNext","cb","lastErr","length","msg","Error","message","installFilename","shift","err","checksum","actual","expected","console","log"],"mappings":";;;;+BAIA;;;eAAwBA;;;2BAJiB;wEAEb;;;;;;AAEb,SAASA,QAAQC,OAAe,EAAEC,IAAY,EAAEC,OAAuB,EAAEC,QAAyB;IAC/G,IAAIC,YAAY;IAEhB,sBAAsB;IACtB,IAAIF,QAAQG,QAAQ,EAAED,YAAY;QAACF,QAAQG,QAAQ;KAAC;SAE/C;QACH,IAAQC,WAAmBJ,QAAnBI,UAAUC,OAASL,QAATK;QAClB,IAAMC,eAAeC,8BAAiB,CAACH,SAAS,IAAIA;QACpD,IAAMI,QAAQ;YAACF;YAAcD;SAAK;QAClC,IAAIL,QAAQS,IAAI,EAAED,MAAME,IAAI,CAACV,QAAQS,IAAI;QACzC,IAAIT,QAAQW,WAAW,EAAEH,MAAME,IAAI,CAACV,QAAQW,WAAW;QAEvD,qCAAqC;QACrC,IAAMC,QAAQ;YAACP;YAAMQ,QAAQR,IAAI;SAAC;QAClCH,YAAYU,MAAME,GAAG,CAAC,SAACC;mBAAM;gBAACT;gBAAcS;aAAE,CAACC,MAAM,CAACR,MAAMS,KAAK,CAAC,IAAIC,IAAI,CAAC;;QAC1EC,CAAAA,kBAAK,CAACb,aAAa,IAAI,EAAE,AAAD,EAAGc,OAAO,CAAC,SAACC;YACnCnB,UAAUQ,IAAI,CAACW,EAAElB,QAAQ;QAC3B;QACAD,UAAUQ,IAAI,CAAC;QACfR,YAAYA,UAAUoB,MAAM,CAAC,SAACnB,UAAUoB;mBAAMrB,UAAUsB,OAAO,CAACrB,cAAcoB;;IAChF;IAEA,IAAME,UAAU,SAACC,IAAsDC;QACrE,IAAIzB,UAAU0B,MAAM,KAAK,GAAG;YAC1B,IAAMC,MAAM,AAAC,kCAA2C7B,OAAVF,SAAmE,OAAzDE,QAAQG,QAAQ,GAAG,AAAC,cAA8B,OAAjBH,QAAQG,QAAQ,IAAK;YAC9G,OAAOuB,GAAG,IAAII,MAAMH,UAAU,AAAC,GAAUA,OAARE,KAAI,MAAoB,OAAhBF,QAAQI,OAAO,IAAKF;QAC/D;QACAG,IAAAA,0BAAe,EAAC9B,UAAU+B,KAAK,IAAInC,SAASC,MAAMC,SAAS,SAACkC,KAAKC;mBAAcD,MAAMT,QAAQC,IAAIQ,OAAOR,GAAG,MAAMS;;IACnH;IACAV,QAAQ,SAACS,KAAKC;QACZ,IAAIJ,UAAU,AAAC,QAAwB,OAAjBjC,QAAQmB,KAAK,CAAC;QACpC,IAAI,CAACiB,KAAK;YACRH,WAAW;YACX,IAAII,UAAUJ,WAAW,AAAC,KAAgC,OAA5BI,SAASC,MAAM,CAACnB,KAAK,CAAC,GAAG,IAAG;QAC5D,OAAO;YACLc,WAAW;YACX,IAAII,UAAUJ,WAAW,AAAC,KAAiCI,OAA7BA,SAASC,MAAM,EAAC,eAA+B,OAAlBD,SAASE,QAAQ,EAAC;YAC7EN,WAAW,AAAC,YAAuB,OAAZG,IAAIH,OAAO;QACpC;QACAO,QAAQC,GAAG,CAACR;QACZ9B,SAASiC;IACX;AACF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export default function installCompressed(distPath: string, dest: string, options: InstallOptions, callback:
|
|
1
|
+
import type { ChecksumCallback, InstallOptions } from '../types.js';
|
|
2
|
+
export default function installCompressed(distPath: string, dest: string, options: InstallOptions, callback: ChecksumCallback): undefined;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export default function installCompressed(distPath: string, dest: string, options: InstallOptions, callback:
|
|
1
|
+
import type { ChecksumCallback, InstallOptions } from '../types.js';
|
|
2
|
+
export default function installCompressed(distPath: string, dest: string, options: InstallOptions, callback: ChecksumCallback): undefined;
|
|
@@ -27,9 +27,15 @@ function installCompressed(distPath, dest, options, callback) {
|
|
|
27
27
|
var cachePath = _path.default.join(options.cachePath, _path.default.basename(downloadPath));
|
|
28
28
|
_fs.default.stat(dest, function(err) {
|
|
29
29
|
if (!err) return callback(); // already exists
|
|
30
|
+
var checksum;
|
|
30
31
|
var queue = new _queuecb.default(1);
|
|
31
32
|
queue.defer(_conditionalCachets.default.bind(null, downloadPath, cachePath));
|
|
32
|
-
queue.defer(
|
|
33
|
+
queue.defer(function(cb) {
|
|
34
|
+
(0, _validateDownloadts.default)(distPath, cachePath, function(err, result) {
|
|
35
|
+
checksum = result;
|
|
36
|
+
cb(err);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
33
39
|
queue.defer(_conditionalExtractts.default.bind(null, cachePath, dest, {
|
|
34
40
|
strip: 1,
|
|
35
41
|
time: 1000
|
|
@@ -41,7 +47,7 @@ function installCompressed(distPath, dest, options, callback) {
|
|
|
41
47
|
(0, _rimraf2.default)(installPath, {
|
|
42
48
|
disableGlob: true
|
|
43
49
|
}, function() {
|
|
44
|
-
return callback(err);
|
|
50
|
+
return callback(err, checksum);
|
|
45
51
|
});
|
|
46
52
|
});
|
|
47
53
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNode/installCompressed.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport rimraf2 from 'rimraf2';\n\nimport { NODE_DIST_BASE_URL } from '../constants.ts';\nimport conditionalCache from '../lib/conditionalCache.ts';\nimport conditionalExtract from '../lib/conditionalExtract.ts';\nimport type {
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNode/installCompressed.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport rimraf2 from 'rimraf2';\n\nimport { NODE_DIST_BASE_URL } from '../constants.ts';\nimport conditionalCache from '../lib/conditionalCache.ts';\nimport conditionalExtract from '../lib/conditionalExtract.ts';\nimport type { ChecksumCallback, ChecksumResult, InstallOptions } from '../types.ts';\nimport validateDownload from './validateDownload.ts';\n\nexport default function installCompressed(distPath: string, dest: string, options: InstallOptions, callback: ChecksumCallback): undefined {\n const platform = options.platform;\n const downloadPath = `${NODE_DIST_BASE_URL}/${distPath}`;\n const cachePath = path.join(options.cachePath, path.basename(downloadPath));\n\n fs.stat(dest, (err) => {\n if (!err) return callback(); // already exists\n\n let checksum: ChecksumResult | undefined;\n const queue = new Queue(1);\n queue.defer(conditionalCache.bind(null, downloadPath, cachePath));\n queue.defer((cb) => {\n validateDownload(distPath, cachePath, (err, result) => {\n checksum = result;\n cb(err);\n });\n });\n queue.defer(conditionalExtract.bind(null, cachePath, dest, { strip: 1, time: 1000 }));\n queue.await((err) => {\n // some compressed versions of node come with npm pre-installed, but we want to override with a specific version\n const libPath = platform === 'win32' ? dest : path.join(dest, 'lib');\n const installPath = path.join(libPath, 'node_modules', 'npm');\n rimraf2(installPath, { disableGlob: true }, () => callback(err, checksum));\n });\n });\n}\n"],"names":["installCompressed","distPath","dest","options","callback","platform","downloadPath","NODE_DIST_BASE_URL","cachePath","path","join","basename","fs","stat","err","checksum","queue","Queue","defer","conditionalCache","bind","cb","validateDownload","result","conditionalExtract","strip","time","await","libPath","installPath","rimraf2","disableGlob"],"mappings":";;;;+BAWA;;;eAAwBA;;;yDAXT;2DACE;8DACC;8DACE;2BAEe;yEACN;2EACE;yEAEF;;;;;;AAEd,SAASA,kBAAkBC,QAAgB,EAAEC,IAAY,EAAEC,OAAuB,EAAEC,QAA0B;IAC3H,IAAMC,WAAWF,QAAQE,QAAQ;IACjC,IAAMC,eAAe,AAAC,GAAwBL,OAAtBM,+BAAkB,EAAC,KAAY,OAATN;IAC9C,IAAMO,YAAYC,aAAI,CAACC,IAAI,CAACP,QAAQK,SAAS,EAAEC,aAAI,CAACE,QAAQ,CAACL;IAE7DM,WAAE,CAACC,IAAI,CAACX,MAAM,SAACY;QACb,IAAI,CAACA,KAAK,OAAOV,YAAY,iBAAiB;QAE9C,IAAIW;QACJ,IAAMC,QAAQ,IAAIC,gBAAK,CAAC;QACxBD,MAAME,KAAK,CAACC,2BAAgB,CAACC,IAAI,CAAC,MAAMd,cAAcE;QACtDQ,MAAME,KAAK,CAAC,SAACG;YACXC,IAAAA,2BAAgB,EAACrB,UAAUO,WAAW,SAACM,KAAKS;gBAC1CR,WAAWQ;gBACXF,GAAGP;YACL;QACF;QACAE,MAAME,KAAK,CAACM,6BAAkB,CAACJ,IAAI,CAAC,MAAMZ,WAAWN,MAAM;YAAEuB,OAAO;YAAGC,MAAM;QAAK;QAClFV,MAAMW,KAAK,CAAC,SAACb;YACX,gHAAgH;YAChH,IAAMc,UAAUvB,aAAa,UAAUH,OAAOO,aAAI,CAACC,IAAI,CAACR,MAAM;YAC9D,IAAM2B,cAAcpB,aAAI,CAACC,IAAI,CAACkB,SAAS,gBAAgB;YACvDE,IAAAA,gBAAO,EAACD,aAAa;gBAAEE,aAAa;YAAK,GAAG;uBAAM3B,SAASU,KAAKC;;QAClE;IACF;AACF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export default function installFilename(filename: string, version: string, dest: string, options: InstallOptions, callback:
|
|
1
|
+
import type { ChecksumCallback, InstallOptions } from '../types.js';
|
|
2
|
+
export default function installFilename(filename: string, version: string, dest: string, options: InstallOptions, callback: ChecksumCallback): undefined;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export default function installFilename(filename: string, version: string, dest: string, options: InstallOptions, callback:
|
|
1
|
+
import type { ChecksumCallback, InstallOptions } from '../types.js';
|
|
2
|
+
export default function installFilename(filename: string, version: string, dest: string, options: InstallOptions, callback: ChecksumCallback): undefined;
|
|
@@ -29,11 +29,6 @@ function installFilename(filename, version, dest, options, callback) {
|
|
|
29
29
|
if (filename === 'src') return (0, _indexts.default)(distPath, dest, options, callback);
|
|
30
30
|
if (ext === '.exe') return (0, _installExets.default)(distPath, dest, options, callback);
|
|
31
31
|
if (_constantsts.EXTENSIONS_COMPRESSED.indexOf(ext) >= 0) {
|
|
32
|
-
// 7z is not supported by fast extract
|
|
33
|
-
if (ext === '.7z') {
|
|
34
|
-
callback(new Error('7z not supported. Make a request feature request: https://github.com/kmalakoff/node-install-release/pulls'));
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
32
|
return (0, _installCompressedts.default)(distPath, dest, options, callback);
|
|
38
33
|
}
|
|
39
34
|
callback(new Error("Unable to install ".concat(version, " distPath: ").concat(distPath)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNode/installFilename.ts"],"sourcesContent":["import fromFilename from 'node-filename-to-dist-paths';\nimport path from 'path';\nimport { EXTENSIONS_COMPRESSED } from '../constants.ts';\nimport type {
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNode/installFilename.ts"],"sourcesContent":["import fromFilename from 'node-filename-to-dist-paths';\nimport path from 'path';\nimport { EXTENSIONS_COMPRESSED } from '../constants.ts';\nimport type { ChecksumCallback, InstallOptions } from '../types.ts';\nimport installCompressed from './installCompressed.ts';\nimport installExe from './installExe.ts';\nimport installSource from './installSource/index.ts';\n\nexport default function installFilename(filename: string, version: string, dest: string, options: InstallOptions, callback: ChecksumCallback): undefined {\n const distPath = fromFilename(filename, version);\n if (!distPath) {\n callback(new Error('Not found'));\n return;\n }\n const ext = path.extname(distPath);\n\n if (filename === 'src') return installSource(distPath, dest, options, callback);\n if (ext === '.exe') return installExe(distPath, dest, options, callback);\n if (EXTENSIONS_COMPRESSED.indexOf(ext) >= 0) {\n return installCompressed(distPath, dest, options, callback);\n }\n callback(new Error(`Unable to install ${version} distPath: ${distPath}`));\n}\n"],"names":["installFilename","filename","version","dest","options","callback","distPath","fromFilename","Error","ext","path","extname","installSource","installExe","EXTENSIONS_COMPRESSED","indexOf","installCompressed"],"mappings":";;;;+BAQA;;;eAAwBA;;;8EARC;2DACR;2BACqB;0EAER;mEACP;8DACG;;;;;;AAEX,SAASA,gBAAgBC,QAAgB,EAAEC,OAAe,EAAEC,IAAY,EAAEC,OAAuB,EAAEC,QAA0B;IAC1I,IAAMC,WAAWC,IAAAA,gCAAY,EAACN,UAAUC;IACxC,IAAI,CAACI,UAAU;QACbD,SAAS,IAAIG,MAAM;QACnB;IACF;IACA,IAAMC,MAAMC,aAAI,CAACC,OAAO,CAACL;IAEzB,IAAIL,aAAa,OAAO,OAAOW,IAAAA,gBAAa,EAACN,UAAUH,MAAMC,SAASC;IACtE,IAAII,QAAQ,QAAQ,OAAOI,IAAAA,qBAAU,EAACP,UAAUH,MAAMC,SAASC;IAC/D,IAAIS,kCAAqB,CAACC,OAAO,CAACN,QAAQ,GAAG;QAC3C,OAAOO,IAAAA,4BAAiB,EAACV,UAAUH,MAAMC,SAASC;IACpD;IACAA,SAAS,IAAIG,MAAM,AAAC,qBAAyCF,OAArBJ,SAAQ,eAAsB,OAATI;AAC/D"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export default function validateDownload(distPath: string, installPath: string, callback:
|
|
1
|
+
import type { ChecksumCallback } from '../types.js';
|
|
2
|
+
export default function validateDownload(distPath: string, installPath: string, callback: ChecksumCallback): undefined;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export default function validateDownload(distPath: string, installPath: string, callback:
|
|
1
|
+
import type { ChecksumCallback } from '../types.js';
|
|
2
|
+
export default function validateDownload(distPath: string, installPath: string, callback: ChecksumCallback): undefined;
|
|
@@ -41,7 +41,14 @@ function validateDownload(distPath, installPath, callback) {
|
|
|
41
41
|
callback(err);
|
|
42
42
|
return;
|
|
43
43
|
}
|
|
44
|
-
hash.digest('hex')
|
|
44
|
+
var actual = hash.digest('hex');
|
|
45
|
+
var match = actual === expected;
|
|
46
|
+
var checksum = {
|
|
47
|
+
actual: actual,
|
|
48
|
+
expected: expected,
|
|
49
|
+
match: match
|
|
50
|
+
};
|
|
51
|
+
match ? callback(null, checksum) : callback(new Error("".concat(filename, " checksum failed")), checksum);
|
|
45
52
|
});
|
|
46
53
|
});
|
|
47
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNode/validateDownload.ts"],"sourcesContent":["import crypto from 'crypto';\nimport fs from 'fs';\nimport get from 'get-remote';\nimport oo from 'on-one';\nimport { NODE_DIST_BASE_URL } from '../constants.ts';\n\nimport type {
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNode/validateDownload.ts"],"sourcesContent":["import crypto from 'crypto';\nimport fs from 'fs';\nimport get from 'get-remote';\nimport oo from 'on-one';\nimport { NODE_DIST_BASE_URL } from '../constants.ts';\n\nimport type { ChecksumCallback, ChecksumResult } from '../types.ts';\n\nexport default function validateDownload(distPath: string, installPath: string, callback: ChecksumCallback): undefined {\n const version = distPath.split('/')[0];\n const downloadPath = `${NODE_DIST_BASE_URL}/${version}/SHASUMS256.txt`;\n get(downloadPath).text((err, res) => {\n if (err) return callback(err);\n const text = res.body;\n const filename = distPath.split('/').slice(1).join('/');\n const expected = text.split(filename)[0].split('\\n').pop().trim();\n const hash = crypto.createHash('sha256');\n const stream = fs.createReadStream(installPath);\n stream.on('data', (data) => hash.update(data));\n oo(stream, ['error', 'end', 'close', 'finish'], (err?: Error) => {\n if (err) {\n callback(err);\n return;\n }\n const actual = hash.digest('hex');\n const match = actual === expected;\n const checksum: ChecksumResult = { actual, expected, match };\n match ? callback(null, checksum) : callback(new Error(`${filename} checksum failed`), checksum);\n });\n });\n}\n"],"names":["validateDownload","distPath","installPath","callback","version","split","downloadPath","NODE_DIST_BASE_URL","get","text","err","res","body","filename","slice","join","expected","pop","trim","hash","crypto","createHash","stream","fs","createReadStream","on","data","update","oo","actual","digest","match","checksum","Error"],"mappings":";;;;+BAQA;;;eAAwBA;;;6DARL;yDACJ;gEACC;4DACD;2BACoB;;;;;;AAIpB,SAASA,iBAAiBC,QAAgB,EAAEC,WAAmB,EAAEC,QAA0B;IACxG,IAAMC,UAAUH,SAASI,KAAK,CAAC,IAAI,CAAC,EAAE;IACtC,IAAMC,eAAe,AAAC,GAAwBF,OAAtBG,+BAAkB,EAAC,KAAW,OAARH,SAAQ;IACtDI,IAAAA,kBAAG,EAACF,cAAcG,IAAI,CAAC,SAACC,KAAKC;QAC3B,IAAID,KAAK,OAAOP,SAASO;QACzB,IAAMD,OAAOE,IAAIC,IAAI;QACrB,IAAMC,WAAWZ,SAASI,KAAK,CAAC,KAAKS,KAAK,CAAC,GAAGC,IAAI,CAAC;QACnD,IAAMC,WAAWP,KAAKJ,KAAK,CAACQ,SAAS,CAAC,EAAE,CAACR,KAAK,CAAC,MAAMY,GAAG,GAAGC,IAAI;QAC/D,IAAMC,OAAOC,eAAM,CAACC,UAAU,CAAC;QAC/B,IAAMC,SAASC,WAAE,CAACC,gBAAgB,CAACtB;QACnCoB,OAAOG,EAAE,CAAC,QAAQ,SAACC;mBAASP,KAAKQ,MAAM,CAACD;;QACxCE,IAAAA,cAAE,EAACN,QAAQ;YAAC;YAAS;YAAO;YAAS;SAAS,EAAE,SAACZ;YAC/C,IAAIA,KAAK;gBACPP,SAASO;gBACT;YACF;YACA,IAAMmB,SAASV,KAAKW,MAAM,CAAC;YAC3B,IAAMC,QAAQF,WAAWb;YACzB,IAAMgB,WAA2B;gBAAEH,QAAAA;gBAAQb,UAAAA;gBAAUe,OAAAA;YAAM;YAC3DA,QAAQ5B,SAAS,MAAM6B,YAAY7B,SAAS,IAAI8B,MAAM,AAAC,GAAW,OAATpB,UAAS,sBAAoBmB;QACxF;IACF;AACF"}
|
package/dist/cjs/types.d.cts
CHANGED
|
@@ -35,5 +35,11 @@ export interface Target {
|
|
|
35
35
|
platform: NodeJS.Platform;
|
|
36
36
|
arch: NodeJS.Architecture;
|
|
37
37
|
}
|
|
38
|
+
export type ChecksumResult = {
|
|
39
|
+
actual: string;
|
|
40
|
+
expected: string;
|
|
41
|
+
match: boolean;
|
|
42
|
+
};
|
|
38
43
|
export type InstallCallback = (err?: Error, result?: InstallResult) => void;
|
|
39
44
|
export type NoParamCallback = (err?: Error) => void;
|
|
45
|
+
export type ChecksumCallback = (err?: Error, checksum?: ChecksumResult) => void;
|
package/dist/cjs/types.d.ts
CHANGED
|
@@ -35,5 +35,11 @@ export interface Target {
|
|
|
35
35
|
platform: NodeJS.Platform;
|
|
36
36
|
arch: NodeJS.Architecture;
|
|
37
37
|
}
|
|
38
|
+
export type ChecksumResult = {
|
|
39
|
+
actual: string;
|
|
40
|
+
expected: string;
|
|
41
|
+
match: boolean;
|
|
42
|
+
};
|
|
38
43
|
export type InstallCallback = (err?: Error, result?: InstallResult) => void;
|
|
39
44
|
export type NoParamCallback = (err?: Error) => void;
|
|
45
|
+
export type ChecksumCallback = (err?: Error, checksum?: ChecksumResult) => void;
|
package/dist/esm/cli.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const _default: (argv: string[]) => undefined;
|
|
1
|
+
declare const _default: (argv: string[], name?: string) => undefined;
|
|
2
2
|
export default _default;
|
package/dist/esm/cli.js
CHANGED
|
@@ -1,25 +1,69 @@
|
|
|
1
1
|
import exit from 'exit';
|
|
2
|
+
import fs from 'fs';
|
|
2
3
|
import getopts from 'getopts-compat';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import url from 'url';
|
|
3
6
|
import install from './index.js';
|
|
4
7
|
const ERROR_CODE = 9;
|
|
5
|
-
|
|
6
|
-
|
|
8
|
+
const __dirname = path.dirname(typeof __filename !== 'undefined' ? __filename : url.fileURLToPath(import.meta.url));
|
|
9
|
+
function getPackageVersion() {
|
|
10
|
+
const packagePath = path.join(__dirname, '..', '..', 'package.json');
|
|
11
|
+
const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
|
|
12
|
+
return packageJson.version;
|
|
13
|
+
}
|
|
14
|
+
function printHelp(name) {
|
|
15
|
+
const version = getPackageVersion();
|
|
16
|
+
console.log(`${name} v${version}`);
|
|
17
|
+
console.log('');
|
|
18
|
+
console.log(`Usage: ${name} <version> [options]`);
|
|
19
|
+
console.log('');
|
|
20
|
+
console.log('Arguments:');
|
|
21
|
+
console.log(' version Node.js version to install (e.g., 18.0.0, lts, stable)');
|
|
22
|
+
console.log('');
|
|
23
|
+
console.log('Options:');
|
|
24
|
+
console.log(' -p, --platform Target platform (default: current platform)');
|
|
25
|
+
console.log(' -a, --arch Target architecture (default: current architecture)');
|
|
26
|
+
console.log(' -f, --filename Specific filename to download');
|
|
27
|
+
console.log(' -i, --installPath Installation directory');
|
|
28
|
+
console.log(' -c, --storagePath Cache storage directory');
|
|
29
|
+
console.log(' -si, --silent Suppress output');
|
|
30
|
+
console.log(' -v, --version Show version number');
|
|
31
|
+
console.log(' -h, --help Show this help message');
|
|
32
|
+
}
|
|
33
|
+
export default ((argv, name)=>{
|
|
34
|
+
const cliName = name || 'nir';
|
|
35
|
+
const options = getopts(argv, {
|
|
7
36
|
alias: {
|
|
8
37
|
platform: 'p',
|
|
9
38
|
arch: 'a',
|
|
10
39
|
filename: 'f',
|
|
11
40
|
installPath: 'i',
|
|
12
41
|
storagePath: 'c',
|
|
13
|
-
silent: 'si'
|
|
42
|
+
silent: 'si',
|
|
43
|
+
version: 'v',
|
|
44
|
+
help: 'h'
|
|
14
45
|
},
|
|
15
46
|
boolean: [
|
|
16
|
-
'silent'
|
|
47
|
+
'silent',
|
|
48
|
+
'version',
|
|
49
|
+
'help'
|
|
17
50
|
]
|
|
18
51
|
});
|
|
19
|
-
|
|
52
|
+
if (options.version) {
|
|
53
|
+
console.log(getPackageVersion());
|
|
54
|
+
exit(0);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (options.help) {
|
|
58
|
+
printHelp(cliName);
|
|
59
|
+
exit(0);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const args = options._;
|
|
20
63
|
if (args.length < 1) {
|
|
21
|
-
console.log(
|
|
22
|
-
|
|
64
|
+
console.log(`Missing command. Example usage: ${cliName} <version> [directory]`);
|
|
65
|
+
exit(ERROR_CODE);
|
|
66
|
+
return;
|
|
23
67
|
}
|
|
24
68
|
install(args[0], options, (err, result)=>{
|
|
25
69
|
if (!options.silent) {
|
package/dist/esm/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/cli.ts"],"sourcesContent":["import exit from 'exit';\nimport getopts from 'getopts-compat';\nimport install, { type InstallOptions } from './index.ts';\n\nconst ERROR_CODE = 9;\n\nexport default (argv: string[]): undefined => {\n const options = getopts(argv
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/cli.ts"],"sourcesContent":["import exit from 'exit';\nimport fs from 'fs';\nimport getopts from 'getopts-compat';\nimport path from 'path';\nimport url from 'url';\nimport install, { type InstallOptions } from './index.ts';\n\nconst ERROR_CODE = 9;\nconst __dirname = path.dirname(typeof __filename !== 'undefined' ? __filename : url.fileURLToPath(import.meta.url));\n\nfunction getPackageVersion(): string {\n const packagePath = path.join(__dirname, '..', '..', 'package.json');\n const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf8'));\n return packageJson.version;\n}\n\nfunction printHelp(name: string): void {\n const version = getPackageVersion();\n console.log(`${name} v${version}`);\n console.log('');\n console.log(`Usage: ${name} <version> [options]`);\n console.log('');\n console.log('Arguments:');\n console.log(' version Node.js version to install (e.g., 18.0.0, lts, stable)');\n console.log('');\n console.log('Options:');\n console.log(' -p, --platform Target platform (default: current platform)');\n console.log(' -a, --arch Target architecture (default: current architecture)');\n console.log(' -f, --filename Specific filename to download');\n console.log(' -i, --installPath Installation directory');\n console.log(' -c, --storagePath Cache storage directory');\n console.log(' -si, --silent Suppress output');\n console.log(' -v, --version Show version number');\n console.log(' -h, --help Show this help message');\n}\n\nexport default (argv: string[], name?: string): undefined => {\n const cliName = name || 'nir';\n const options = getopts(argv, {\n alias: { platform: 'p', arch: 'a', filename: 'f', installPath: 'i', storagePath: 'c', silent: 'si', version: 'v', help: 'h' },\n boolean: ['silent', 'version', 'help'],\n });\n\n if (options.version) {\n console.log(getPackageVersion());\n exit(0);\n return;\n }\n\n if (options.help) {\n printHelp(cliName);\n exit(0);\n return;\n }\n\n const args = options._;\n if (args.length < 1) {\n console.log(`Missing command. Example usage: ${cliName} <version> [directory]`);\n exit(ERROR_CODE);\n return;\n }\n install(args[0], options as InstallOptions, (err, result) => {\n if (!options.silent) {\n console.log('\\n======================');\n if (err) console.log(`${args[0]} not installed. Error: ${err.message}`);\n else console.log(`${result.version} installed in: ${result.installPath}`);\n console.log('======================');\n }\n exit(err ? ERROR_CODE : 0);\n });\n};\n"],"names":["exit","fs","getopts","path","url","install","ERROR_CODE","__dirname","dirname","__filename","fileURLToPath","getPackageVersion","packagePath","join","packageJson","JSON","parse","readFileSync","version","printHelp","name","console","log","argv","cliName","options","alias","platform","arch","filename","installPath","storagePath","silent","help","boolean","args","_","length","err","result","message"],"mappings":"AAAA,OAAOA,UAAU,OAAO;AACxB,OAAOC,QAAQ,KAAK;AACpB,OAAOC,aAAa,iBAAiB;AACrC,OAAOC,UAAU,OAAO;AACxB,OAAOC,SAAS,MAAM;AACtB,OAAOC,aAAsC,aAAa;AAE1D,MAAMC,aAAa;AACnB,MAAMC,YAAYJ,KAAKK,OAAO,CAAC,OAAOC,eAAe,cAAcA,aAAaL,IAAIM,aAAa,CAAC,YAAYN,GAAG;AAEjH,SAASO;IACP,MAAMC,cAAcT,KAAKU,IAAI,CAACN,WAAW,MAAM,MAAM;IACrD,MAAMO,cAAcC,KAAKC,KAAK,CAACf,GAAGgB,YAAY,CAACL,aAAa;IAC5D,OAAOE,YAAYI,OAAO;AAC5B;AAEA,SAASC,UAAUC,IAAY;IAC7B,MAAMF,UAAUP;IAChBU,QAAQC,GAAG,CAAC,GAAGF,KAAK,EAAE,EAAEF,SAAS;IACjCG,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC,CAAC,OAAO,EAAEF,KAAK,oBAAoB,CAAC;IAChDC,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;IACZD,QAAQC,GAAG,CAAC;AACd;AAEA,eAAe,CAAA,CAACC,MAAgBH;IAC9B,MAAMI,UAAUJ,QAAQ;IACxB,MAAMK,UAAUvB,QAAQqB,MAAM;QAC5BG,OAAO;YAAEC,UAAU;YAAKC,MAAM;YAAKC,UAAU;YAAKC,aAAa;YAAKC,aAAa;YAAKC,QAAQ;YAAMd,SAAS;YAAKe,MAAM;QAAI;QAC5HC,SAAS;YAAC;YAAU;YAAW;SAAO;IACxC;IAEA,IAAIT,QAAQP,OAAO,EAAE;QACnBG,QAAQC,GAAG,CAACX;QACZX,KAAK;QACL;IACF;IAEA,IAAIyB,QAAQQ,IAAI,EAAE;QAChBd,UAAUK;QACVxB,KAAK;QACL;IACF;IAEA,MAAMmC,OAAOV,QAAQW,CAAC;IACtB,IAAID,KAAKE,MAAM,GAAG,GAAG;QACnBhB,QAAQC,GAAG,CAAC,CAAC,gCAAgC,EAAEE,QAAQ,sBAAsB,CAAC;QAC9ExB,KAAKM;QACL;IACF;IACAD,QAAQ8B,IAAI,CAAC,EAAE,EAAEV,SAA2B,CAACa,KAAKC;QAChD,IAAI,CAACd,QAAQO,MAAM,EAAE;YACnBX,QAAQC,GAAG,CAAC;YACZ,IAAIgB,KAAKjB,QAAQC,GAAG,CAAC,GAAGa,IAAI,CAAC,EAAE,CAAC,uBAAuB,EAAEG,IAAIE,OAAO,EAAE;iBACjEnB,QAAQC,GAAG,CAAC,GAAGiB,OAAOrB,OAAO,CAAC,eAAe,EAAEqB,OAAOT,WAAW,EAAE;YACxET,QAAQC,GAAG,CAAC;QACd;QACAtB,KAAKsC,MAAMhC,aAAa;IAC1B;AACF,CAAA,EAAE"}
|
|
@@ -3,14 +3,23 @@ import installBin from './installBin.js';
|
|
|
3
3
|
import installLib from './installLib.js';
|
|
4
4
|
export default function install(version, dest, options, callback) {
|
|
5
5
|
let npmVersion = null;
|
|
6
|
+
let checksum;
|
|
6
7
|
const queue = new Queue(1);
|
|
7
|
-
queue.defer((cb)=>installLib(version, dest, options, (err, _npmVersion)=>{
|
|
8
|
+
queue.defer((cb)=>installLib(version, dest, options, (err, _npmVersion, _checksum)=>{
|
|
8
9
|
npmVersion = _npmVersion;
|
|
10
|
+
checksum = _checksum;
|
|
9
11
|
cb(err);
|
|
10
12
|
}));
|
|
11
13
|
queue.defer(installBin.bind(null, version, dest, options));
|
|
12
14
|
queue.await((err)=>{
|
|
13
|
-
|
|
15
|
+
let message = `npm ${npmVersion || ''}`;
|
|
16
|
+
if (!err) {
|
|
17
|
+
message += ' installed';
|
|
18
|
+
if (checksum) message += ` (${checksum.slice(0, 8)})`;
|
|
19
|
+
} else {
|
|
20
|
+
message += ` install failed. Error: ${err.message}`;
|
|
21
|
+
}
|
|
22
|
+
console.log(message);
|
|
14
23
|
callback(err);
|
|
15
24
|
});
|
|
16
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNPM/index.ts"],"sourcesContent":["import Queue from 'queue-cb';\nimport type { InstallOptions, NoParamCallback } from '../types.ts';\nimport installBin from './installBin.ts';\nimport installLib from './installLib.ts';\n\nexport default function install(version: string, dest: string, options: InstallOptions, callback: NoParamCallback): undefined {\n let npmVersion = null;\n\n const queue = new Queue(1);\n queue.defer((cb) =>\n installLib(version, dest, options, (err, _npmVersion) => {\n npmVersion = _npmVersion;\n cb(err);\n })\n );\n queue.defer(installBin.bind(null, version, dest, options));\n queue.await((err) => {\n
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNPM/index.ts"],"sourcesContent":["import Queue from 'queue-cb';\nimport type { InstallOptions, NoParamCallback } from '../types.ts';\nimport installBin from './installBin.ts';\nimport installLib from './installLib.ts';\n\nexport default function install(version: string, dest: string, options: InstallOptions, callback: NoParamCallback): undefined {\n let npmVersion: string | null = null;\n let checksum: string | undefined;\n\n const queue = new Queue(1);\n queue.defer((cb) =>\n installLib(version, dest, options, (err, _npmVersion, _checksum) => {\n npmVersion = _npmVersion;\n checksum = _checksum;\n cb(err);\n })\n );\n queue.defer(installBin.bind(null, version, dest, options));\n queue.await((err) => {\n let message = `npm ${npmVersion || ''}`;\n if (!err) {\n message += ' installed';\n if (checksum) message += ` (${checksum.slice(0, 8)})`;\n } else {\n message += ` install failed. Error: ${err.message}`;\n }\n console.log(message);\n callback(err);\n });\n}\n"],"names":["Queue","installBin","installLib","install","version","dest","options","callback","npmVersion","checksum","queue","defer","cb","err","_npmVersion","_checksum","bind","await","message","slice","console","log"],"mappings":"AAAA,OAAOA,WAAW,WAAW;AAE7B,OAAOC,gBAAgB,kBAAkB;AACzC,OAAOC,gBAAgB,kBAAkB;AAEzC,eAAe,SAASC,QAAQC,OAAe,EAAEC,IAAY,EAAEC,OAAuB,EAAEC,QAAyB;IAC/G,IAAIC,aAA4B;IAChC,IAAIC;IAEJ,MAAMC,QAAQ,IAAIV,MAAM;IACxBU,MAAMC,KAAK,CAAC,CAACC,KACXV,WAAWE,SAASC,MAAMC,SAAS,CAACO,KAAKC,aAAaC;YACpDP,aAAaM;YACbL,WAAWM;YACXH,GAAGC;QACL;IAEFH,MAAMC,KAAK,CAACV,WAAWe,IAAI,CAAC,MAAMZ,SAASC,MAAMC;IACjDI,MAAMO,KAAK,CAAC,CAACJ;QACX,IAAIK,UAAU,CAAC,IAAI,EAAEV,cAAc,IAAI;QACvC,IAAI,CAACK,KAAK;YACRK,WAAW;YACX,IAAIT,UAAUS,WAAW,CAAC,EAAE,EAAET,SAASU,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;QACvD,OAAO;YACLD,WAAW,CAAC,wBAAwB,EAAEL,IAAIK,OAAO,EAAE;QACrD;QACAE,QAAQC,GAAG,CAACH;QACZX,SAASM;IACX;AACF"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { InstallOptions } from '../types.js';
|
|
2
|
-
export type Callback = (error?: Error, npmVersion?: string) => undefined;
|
|
2
|
+
export type Callback = (error?: Error, npmVersion?: string, checksum?: string) => undefined;
|
|
3
3
|
export default function installLib(version: string, dest: string, options: InstallOptions, callback: Callback): undefined;
|
|
@@ -1,10 +1,27 @@
|
|
|
1
|
+
import crypto from 'crypto';
|
|
2
|
+
import fs from 'fs';
|
|
1
3
|
import get from 'get-remote';
|
|
2
4
|
import { getDist } from 'node-filename-to-dist-paths';
|
|
5
|
+
import oo from 'on-one';
|
|
3
6
|
import path from 'path';
|
|
4
7
|
import Queue from 'queue-cb';
|
|
5
8
|
import { NPM_DIST_TAGS_URL, NPM_DIST_URL, NPM_MIN_VERSION } from '../constants.js';
|
|
6
9
|
import conditionalCache from '../lib/conditionalCache.js';
|
|
7
10
|
import conditionalExtract from '../lib/conditionalExtract.js';
|
|
11
|
+
function calculateChecksum(filePath, callback) {
|
|
12
|
+
const hash = crypto.createHash('sha256');
|
|
13
|
+
const stream = fs.createReadStream(filePath);
|
|
14
|
+
stream.on('data', (data)=>hash.update(data));
|
|
15
|
+
oo(stream, [
|
|
16
|
+
'error',
|
|
17
|
+
'end',
|
|
18
|
+
'close',
|
|
19
|
+
'finish'
|
|
20
|
+
], (err)=>{
|
|
21
|
+
if (err) return callback(err);
|
|
22
|
+
callback(null, hash.digest('hex'));
|
|
23
|
+
});
|
|
24
|
+
}
|
|
8
25
|
export default function installLib(version, dest, options, callback) {
|
|
9
26
|
const platform = options.platform;
|
|
10
27
|
const libPath = platform === 'win32' ? dest : path.join(dest, 'lib');
|
|
@@ -18,11 +35,18 @@ export default function installLib(version, dest, options, callback) {
|
|
|
18
35
|
const npmVersion = distTags[`latest-${npmMajor}`] || distTags[`next-${npmMajor}`] || distTags.latest;
|
|
19
36
|
const downloadPath = `${NPM_DIST_URL}/-/npm-${npmVersion}.tgz`;
|
|
20
37
|
const cachePath = path.join(options.cachePath, path.basename(downloadPath));
|
|
38
|
+
let checksum;
|
|
21
39
|
const queue = new Queue(1);
|
|
22
40
|
queue.defer(conditionalCache.bind(null, downloadPath, cachePath));
|
|
41
|
+
queue.defer((cb)=>{
|
|
42
|
+
calculateChecksum(cachePath, (err, hash)=>{
|
|
43
|
+
checksum = hash;
|
|
44
|
+
cb(err);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
23
47
|
queue.defer(conditionalExtract.bind(null, cachePath, installPath));
|
|
24
48
|
queue.await((err)=>{
|
|
25
|
-
err ? callback(err) : callback(null, npmVersion);
|
|
49
|
+
err ? callback(err) : callback(null, npmVersion, checksum);
|
|
26
50
|
});
|
|
27
51
|
});
|
|
28
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNPM/installLib.ts"],"sourcesContent":["import get from 'get-remote';\nimport { getDist } from 'node-filename-to-dist-paths';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport { NPM_DIST_TAGS_URL, NPM_DIST_URL, NPM_MIN_VERSION } from '../constants.ts';\nimport conditionalCache from '../lib/conditionalCache.ts';\nimport conditionalExtract from '../lib/conditionalExtract.ts';\n\ninterface DistRecord {\n latest: string;\n}\n\nimport type { InstallOptions } from '../types.ts';\n\nexport type Callback = (error?: Error, npmVersion?: string) => undefined;\n\nexport default function installLib(version: string, dest: string, options: InstallOptions, callback: Callback): undefined {\n const platform = options.platform;\n const libPath = platform === 'win32' ? dest : path.join(dest, 'lib');\n const installPath = path.join(libPath, 'node_modules', 'npm');\n\n const dist = getDist(version);\n const npmMajorPair = dist && dist.npm ? +dist.npm.split('.')[0] : NPM_MIN_VERSION;\n const npmMajor = Math.max(npmMajorPair, NPM_MIN_VERSION);\n\n get(NPM_DIST_TAGS_URL).json((err, res) => {\n if (err) return callback(err);\n const distTags = res.body as DistRecord;\n const npmVersion = distTags[`latest-${npmMajor}`] || distTags[`next-${npmMajor}`] || distTags.latest;\n const downloadPath = `${NPM_DIST_URL}/-/npm-${npmVersion}.tgz`;\n const cachePath = path.join(options.cachePath, path.basename(downloadPath));\n\n const queue = new Queue(1);\n queue.defer(conditionalCache.bind(null, downloadPath, cachePath));\n queue.defer(conditionalExtract.bind(null, cachePath, installPath));\n queue.await((err) => {\n err ? callback(err) : callback(null, npmVersion);\n });\n });\n}\n"],"names":["get","getDist","path","Queue","NPM_DIST_TAGS_URL","NPM_DIST_URL","NPM_MIN_VERSION","conditionalCache","conditionalExtract","installLib","version","dest","options","
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNPM/installLib.ts"],"sourcesContent":["import crypto from 'crypto';\nimport fs from 'fs';\nimport get from 'get-remote';\nimport { getDist } from 'node-filename-to-dist-paths';\nimport oo from 'on-one';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport { NPM_DIST_TAGS_URL, NPM_DIST_URL, NPM_MIN_VERSION } from '../constants.ts';\nimport conditionalCache from '../lib/conditionalCache.ts';\nimport conditionalExtract from '../lib/conditionalExtract.ts';\n\ninterface DistRecord {\n latest: string;\n}\n\nimport type { InstallOptions } from '../types.ts';\n\nexport type Callback = (error?: Error, npmVersion?: string, checksum?: string) => undefined;\n\nfunction calculateChecksum(filePath: string, callback: (err?: Error, checksum?: string) => void): void {\n const hash = crypto.createHash('sha256');\n const stream = fs.createReadStream(filePath);\n stream.on('data', (data) => hash.update(data));\n oo(stream, ['error', 'end', 'close', 'finish'], (err?: Error) => {\n if (err) return callback(err);\n callback(null, hash.digest('hex'));\n });\n}\n\nexport default function installLib(version: string, dest: string, options: InstallOptions, callback: Callback): undefined {\n const platform = options.platform;\n const libPath = platform === 'win32' ? dest : path.join(dest, 'lib');\n const installPath = path.join(libPath, 'node_modules', 'npm');\n\n const dist = getDist(version);\n const npmMajorPair = dist && dist.npm ? +dist.npm.split('.')[0] : NPM_MIN_VERSION;\n const npmMajor = Math.max(npmMajorPair, NPM_MIN_VERSION);\n\n get(NPM_DIST_TAGS_URL).json((err, res) => {\n if (err) return callback(err);\n const distTags = res.body as DistRecord;\n const npmVersion = distTags[`latest-${npmMajor}`] || distTags[`next-${npmMajor}`] || distTags.latest;\n const downloadPath = `${NPM_DIST_URL}/-/npm-${npmVersion}.tgz`;\n const cachePath = path.join(options.cachePath, path.basename(downloadPath));\n\n let checksum: string | undefined;\n const queue = new Queue(1);\n queue.defer(conditionalCache.bind(null, downloadPath, cachePath));\n queue.defer((cb) => {\n calculateChecksum(cachePath, (err, hash) => {\n checksum = hash;\n cb(err);\n });\n });\n queue.defer(conditionalExtract.bind(null, cachePath, installPath));\n queue.await((err) => {\n err ? callback(err) : callback(null, npmVersion, checksum);\n });\n });\n}\n"],"names":["crypto","fs","get","getDist","oo","path","Queue","NPM_DIST_TAGS_URL","NPM_DIST_URL","NPM_MIN_VERSION","conditionalCache","conditionalExtract","calculateChecksum","filePath","callback","hash","createHash","stream","createReadStream","on","data","update","err","digest","installLib","version","dest","options","platform","libPath","join","installPath","dist","npmMajorPair","npm","split","npmMajor","Math","max","json","res","distTags","body","npmVersion","latest","downloadPath","cachePath","basename","checksum","queue","defer","bind","cb","await"],"mappings":"AAAA,OAAOA,YAAY,SAAS;AAC5B,OAAOC,QAAQ,KAAK;AACpB,OAAOC,SAAS,aAAa;AAC7B,SAASC,OAAO,QAAQ,8BAA8B;AACtD,OAAOC,QAAQ,SAAS;AACxB,OAAOC,UAAU,OAAO;AACxB,OAAOC,WAAW,WAAW;AAC7B,SAASC,iBAAiB,EAAEC,YAAY,EAAEC,eAAe,QAAQ,kBAAkB;AACnF,OAAOC,sBAAsB,6BAA6B;AAC1D,OAAOC,wBAAwB,+BAA+B;AAU9D,SAASC,kBAAkBC,QAAgB,EAAEC,QAAkD;IAC7F,MAAMC,OAAOf,OAAOgB,UAAU,CAAC;IAC/B,MAAMC,SAAShB,GAAGiB,gBAAgB,CAACL;IACnCI,OAAOE,EAAE,CAAC,QAAQ,CAACC,OAASL,KAAKM,MAAM,CAACD;IACxChB,GAAGa,QAAQ;QAAC;QAAS;QAAO;QAAS;KAAS,EAAE,CAACK;QAC/C,IAAIA,KAAK,OAAOR,SAASQ;QACzBR,SAAS,MAAMC,KAAKQ,MAAM,CAAC;IAC7B;AACF;AAEA,eAAe,SAASC,WAAWC,OAAe,EAAEC,IAAY,EAAEC,OAAuB,EAAEb,QAAkB;IAC3G,MAAMc,WAAWD,QAAQC,QAAQ;IACjC,MAAMC,UAAUD,aAAa,UAAUF,OAAOrB,KAAKyB,IAAI,CAACJ,MAAM;IAC9D,MAAMK,cAAc1B,KAAKyB,IAAI,CAACD,SAAS,gBAAgB;IAEvD,MAAMG,OAAO7B,QAAQsB;IACrB,MAAMQ,eAAeD,QAAQA,KAAKE,GAAG,GAAG,CAACF,KAAKE,GAAG,CAACC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG1B;IAClE,MAAM2B,WAAWC,KAAKC,GAAG,CAACL,cAAcxB;IAExCP,IAAIK,mBAAmBgC,IAAI,CAAC,CAACjB,KAAKkB;QAChC,IAAIlB,KAAK,OAAOR,SAASQ;QACzB,MAAMmB,WAAWD,IAAIE,IAAI;QACzB,MAAMC,aAAaF,QAAQ,CAAC,CAAC,OAAO,EAAEL,UAAU,CAAC,IAAIK,QAAQ,CAAC,CAAC,KAAK,EAAEL,UAAU,CAAC,IAAIK,SAASG,MAAM;QACpG,MAAMC,eAAe,GAAGrC,aAAa,OAAO,EAAEmC,WAAW,IAAI,CAAC;QAC9D,MAAMG,YAAYzC,KAAKyB,IAAI,CAACH,QAAQmB,SAAS,EAAEzC,KAAK0C,QAAQ,CAACF;QAE7D,IAAIG;QACJ,MAAMC,QAAQ,IAAI3C,MAAM;QACxB2C,MAAMC,KAAK,CAACxC,iBAAiByC,IAAI,CAAC,MAAMN,cAAcC;QACtDG,MAAMC,KAAK,CAAC,CAACE;YACXxC,kBAAkBkC,WAAW,CAACxB,KAAKP;gBACjCiC,WAAWjC;gBACXqC,GAAG9B;YACL;QACF;QACA2B,MAAMC,KAAK,CAACvC,mBAAmBwC,IAAI,CAAC,MAAML,WAAWf;QACrDkB,MAAMI,KAAK,CAAC,CAAC/B;YACXA,MAAMR,SAASQ,OAAOR,SAAS,MAAM6B,YAAYK;QACnD;IACF;AACF"}
|
|
@@ -30,12 +30,24 @@ export default function install(version, dest, options, callback) {
|
|
|
30
30
|
filenames.push('src');
|
|
31
31
|
filenames = filenames.filter((filename, i)=>filenames.indexOf(filename) === i);
|
|
32
32
|
}
|
|
33
|
-
const tryNext = (cb)=>{
|
|
34
|
-
if (filenames.length === 0)
|
|
35
|
-
|
|
33
|
+
const tryNext = (cb, lastErr)=>{
|
|
34
|
+
if (filenames.length === 0) {
|
|
35
|
+
const msg = `Failed to find installable for ${version}${options.filename ? ` Filename: ${options.filename}` : ''}`;
|
|
36
|
+
return cb(new Error(lastErr ? `${msg}: ${lastErr.message}` : msg));
|
|
37
|
+
}
|
|
38
|
+
installFilename(filenames.shift(), version, dest, options, (err, checksum)=>err ? tryNext(cb, err) : cb(null, checksum));
|
|
36
39
|
};
|
|
37
|
-
tryNext((err)=>{
|
|
38
|
-
|
|
40
|
+
tryNext((err, checksum)=>{
|
|
41
|
+
let message = `node ${version.slice(1)}`;
|
|
42
|
+
if (!err) {
|
|
43
|
+
message += ' installed';
|
|
44
|
+
if (checksum) message += ` (${checksum.actual.slice(0, 8)})`;
|
|
45
|
+
} else {
|
|
46
|
+
message += ' install failed';
|
|
47
|
+
if (checksum) message += ` (${checksum.actual} expecting ${checksum.expected})`;
|
|
48
|
+
message += `. Error: ${err.message}`;
|
|
49
|
+
}
|
|
50
|
+
console.log(message);
|
|
39
51
|
callback(err);
|
|
40
52
|
});
|
|
41
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNode/index.ts"],"sourcesContent":["import { FILE_PLATFORM_MAP, FILES } from '../constants.ts';\nimport type { InstallOptions, NoParamCallback } from '../types.ts';\nimport installFilename from './installFilename.ts';\n\nexport default function install(version: string, dest: string, options: InstallOptions, callback: NoParamCallback): undefined {\n let filenames = null;\n\n // a specific filename\n if (options.filename) filenames = [options.filename];\n // infer with fallbacks\n else {\n const { platform, arch } = options;\n const filePlatform = FILE_PLATFORM_MAP[platform] || platform;\n const parts = [filePlatform, arch];\n if (options.type) parts.push(options.type);\n if (options.compression) parts.push(options.compression);\n\n // generate the files in search order\n const archs = [arch, process.arch];\n filenames = archs.map((a) => [filePlatform, a].concat(parts.slice(2)).join('-'));\n (FILES[filePlatform] || []).forEach((x) => {\n filenames.push(x.filename);\n });\n filenames.push('src');\n filenames = filenames.filter((filename, i) => filenames.indexOf(filename) === i);\n }\n\n const tryNext = (cb) => {\n if (filenames.length === 0)
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNode/index.ts"],"sourcesContent":["import { FILE_PLATFORM_MAP, FILES } from '../constants.ts';\nimport type { ChecksumResult, InstallOptions, NoParamCallback } from '../types.ts';\nimport installFilename from './installFilename.ts';\n\nexport default function install(version: string, dest: string, options: InstallOptions, callback: NoParamCallback): undefined {\n let filenames = null;\n\n // a specific filename\n if (options.filename) filenames = [options.filename];\n // infer with fallbacks\n else {\n const { platform, arch } = options;\n const filePlatform = FILE_PLATFORM_MAP[platform] || platform;\n const parts = [filePlatform, arch];\n if (options.type) parts.push(options.type);\n if (options.compression) parts.push(options.compression);\n\n // generate the files in search order\n const archs = [arch, process.arch];\n filenames = archs.map((a) => [filePlatform, a].concat(parts.slice(2)).join('-'));\n (FILES[filePlatform] || []).forEach((x) => {\n filenames.push(x.filename);\n });\n filenames.push('src');\n filenames = filenames.filter((filename, i) => filenames.indexOf(filename) === i);\n }\n\n const tryNext = (cb: (err?: Error, checksum?: ChecksumResult) => void, lastErr?: Error) => {\n if (filenames.length === 0) {\n const msg = `Failed to find installable for ${version}${options.filename ? ` Filename: ${options.filename}` : ''}`;\n return cb(new Error(lastErr ? `${msg}: ${lastErr.message}` : msg));\n }\n installFilename(filenames.shift(), version, dest, options, (err, checksum) => (err ? tryNext(cb, err) : cb(null, checksum)));\n };\n tryNext((err, checksum) => {\n let message = `node ${version.slice(1)}`;\n if (!err) {\n message += ' installed';\n if (checksum) message += ` (${checksum.actual.slice(0, 8)})`;\n } else {\n message += ' install failed';\n if (checksum) message += ` (${checksum.actual} expecting ${checksum.expected})`;\n message += `. Error: ${err.message}`;\n }\n console.log(message);\n callback(err);\n });\n}\n"],"names":["FILE_PLATFORM_MAP","FILES","installFilename","install","version","dest","options","callback","filenames","filename","platform","arch","filePlatform","parts","type","push","compression","archs","process","map","a","concat","slice","join","forEach","x","filter","i","indexOf","tryNext","cb","lastErr","length","msg","Error","message","shift","err","checksum","actual","expected","console","log"],"mappings":"AAAA,SAASA,iBAAiB,EAAEC,KAAK,QAAQ,kBAAkB;AAE3D,OAAOC,qBAAqB,uBAAuB;AAEnD,eAAe,SAASC,QAAQC,OAAe,EAAEC,IAAY,EAAEC,OAAuB,EAAEC,QAAyB;IAC/G,IAAIC,YAAY;IAEhB,sBAAsB;IACtB,IAAIF,QAAQG,QAAQ,EAAED,YAAY;QAACF,QAAQG,QAAQ;KAAC;SAE/C;QACH,MAAM,EAAEC,QAAQ,EAAEC,IAAI,EAAE,GAAGL;QAC3B,MAAMM,eAAeZ,iBAAiB,CAACU,SAAS,IAAIA;QACpD,MAAMG,QAAQ;YAACD;YAAcD;SAAK;QAClC,IAAIL,QAAQQ,IAAI,EAAED,MAAME,IAAI,CAACT,QAAQQ,IAAI;QACzC,IAAIR,QAAQU,WAAW,EAAEH,MAAME,IAAI,CAACT,QAAQU,WAAW;QAEvD,qCAAqC;QACrC,MAAMC,QAAQ;YAACN;YAAMO,QAAQP,IAAI;SAAC;QAClCH,YAAYS,MAAME,GAAG,CAAC,CAACC,IAAM;gBAACR;gBAAcQ;aAAE,CAACC,MAAM,CAACR,MAAMS,KAAK,CAAC,IAAIC,IAAI,CAAC;QAC1EtB,CAAAA,KAAK,CAACW,aAAa,IAAI,EAAE,AAAD,EAAGY,OAAO,CAAC,CAACC;YACnCjB,UAAUO,IAAI,CAACU,EAAEhB,QAAQ;QAC3B;QACAD,UAAUO,IAAI,CAAC;QACfP,YAAYA,UAAUkB,MAAM,CAAC,CAACjB,UAAUkB,IAAMnB,UAAUoB,OAAO,CAACnB,cAAckB;IAChF;IAEA,MAAME,UAAU,CAACC,IAAsDC;QACrE,IAAIvB,UAAUwB,MAAM,KAAK,GAAG;YAC1B,MAAMC,MAAM,CAAC,+BAA+B,EAAE7B,UAAUE,QAAQG,QAAQ,GAAG,CAAC,WAAW,EAAEH,QAAQG,QAAQ,EAAE,GAAG,IAAI;YAClH,OAAOqB,GAAG,IAAII,MAAMH,UAAU,GAAGE,IAAI,EAAE,EAAEF,QAAQI,OAAO,EAAE,GAAGF;QAC/D;QACA/B,gBAAgBM,UAAU4B,KAAK,IAAIhC,SAASC,MAAMC,SAAS,CAAC+B,KAAKC,WAAcD,MAAMR,QAAQC,IAAIO,OAAOP,GAAG,MAAMQ;IACnH;IACAT,QAAQ,CAACQ,KAAKC;QACZ,IAAIH,UAAU,CAAC,KAAK,EAAE/B,QAAQkB,KAAK,CAAC,IAAI;QACxC,IAAI,CAACe,KAAK;YACRF,WAAW;YACX,IAAIG,UAAUH,WAAW,CAAC,EAAE,EAAEG,SAASC,MAAM,CAACjB,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;QAC9D,OAAO;YACLa,WAAW;YACX,IAAIG,UAAUH,WAAW,CAAC,EAAE,EAAEG,SAASC,MAAM,CAAC,WAAW,EAAED,SAASE,QAAQ,CAAC,CAAC,CAAC;YAC/EL,WAAW,CAAC,SAAS,EAAEE,IAAIF,OAAO,EAAE;QACtC;QACAM,QAAQC,GAAG,CAACP;QACZ5B,SAAS8B;IACX;AACF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export default function installCompressed(distPath: string, dest: string, options: InstallOptions, callback:
|
|
1
|
+
import type { ChecksumCallback, InstallOptions } from '../types.js';
|
|
2
|
+
export default function installCompressed(distPath: string, dest: string, options: InstallOptions, callback: ChecksumCallback): undefined;
|
|
@@ -12,9 +12,15 @@ export default function installCompressed(distPath, dest, options, callback) {
|
|
|
12
12
|
const cachePath = path.join(options.cachePath, path.basename(downloadPath));
|
|
13
13
|
fs.stat(dest, (err)=>{
|
|
14
14
|
if (!err) return callback(); // already exists
|
|
15
|
+
let checksum;
|
|
15
16
|
const queue = new Queue(1);
|
|
16
17
|
queue.defer(conditionalCache.bind(null, downloadPath, cachePath));
|
|
17
|
-
queue.defer(
|
|
18
|
+
queue.defer((cb)=>{
|
|
19
|
+
validateDownload(distPath, cachePath, (err, result)=>{
|
|
20
|
+
checksum = result;
|
|
21
|
+
cb(err);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
18
24
|
queue.defer(conditionalExtract.bind(null, cachePath, dest, {
|
|
19
25
|
strip: 1,
|
|
20
26
|
time: 1000
|
|
@@ -25,7 +31,7 @@ export default function installCompressed(distPath, dest, options, callback) {
|
|
|
25
31
|
const installPath = path.join(libPath, 'node_modules', 'npm');
|
|
26
32
|
rimraf2(installPath, {
|
|
27
33
|
disableGlob: true
|
|
28
|
-
}, ()=>callback(err));
|
|
34
|
+
}, ()=>callback(err, checksum));
|
|
29
35
|
});
|
|
30
36
|
});
|
|
31
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNode/installCompressed.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport rimraf2 from 'rimraf2';\n\nimport { NODE_DIST_BASE_URL } from '../constants.ts';\nimport conditionalCache from '../lib/conditionalCache.ts';\nimport conditionalExtract from '../lib/conditionalExtract.ts';\nimport type {
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNode/installCompressed.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport rimraf2 from 'rimraf2';\n\nimport { NODE_DIST_BASE_URL } from '../constants.ts';\nimport conditionalCache from '../lib/conditionalCache.ts';\nimport conditionalExtract from '../lib/conditionalExtract.ts';\nimport type { ChecksumCallback, ChecksumResult, InstallOptions } from '../types.ts';\nimport validateDownload from './validateDownload.ts';\n\nexport default function installCompressed(distPath: string, dest: string, options: InstallOptions, callback: ChecksumCallback): undefined {\n const platform = options.platform;\n const downloadPath = `${NODE_DIST_BASE_URL}/${distPath}`;\n const cachePath = path.join(options.cachePath, path.basename(downloadPath));\n\n fs.stat(dest, (err) => {\n if (!err) return callback(); // already exists\n\n let checksum: ChecksumResult | undefined;\n const queue = new Queue(1);\n queue.defer(conditionalCache.bind(null, downloadPath, cachePath));\n queue.defer((cb) => {\n validateDownload(distPath, cachePath, (err, result) => {\n checksum = result;\n cb(err);\n });\n });\n queue.defer(conditionalExtract.bind(null, cachePath, dest, { strip: 1, time: 1000 }));\n queue.await((err) => {\n // some compressed versions of node come with npm pre-installed, but we want to override with a specific version\n const libPath = platform === 'win32' ? dest : path.join(dest, 'lib');\n const installPath = path.join(libPath, 'node_modules', 'npm');\n rimraf2(installPath, { disableGlob: true }, () => callback(err, checksum));\n });\n });\n}\n"],"names":["fs","path","Queue","rimraf2","NODE_DIST_BASE_URL","conditionalCache","conditionalExtract","validateDownload","installCompressed","distPath","dest","options","callback","platform","downloadPath","cachePath","join","basename","stat","err","checksum","queue","defer","bind","cb","result","strip","time","await","libPath","installPath","disableGlob"],"mappings":"AAAA,OAAOA,QAAQ,KAAK;AACpB,OAAOC,UAAU,OAAO;AACxB,OAAOC,WAAW,WAAW;AAC7B,OAAOC,aAAa,UAAU;AAE9B,SAASC,kBAAkB,QAAQ,kBAAkB;AACrD,OAAOC,sBAAsB,6BAA6B;AAC1D,OAAOC,wBAAwB,+BAA+B;AAE9D,OAAOC,sBAAsB,wBAAwB;AAErD,eAAe,SAASC,kBAAkBC,QAAgB,EAAEC,IAAY,EAAEC,OAAuB,EAAEC,QAA0B;IAC3H,MAAMC,WAAWF,QAAQE,QAAQ;IACjC,MAAMC,eAAe,GAAGV,mBAAmB,CAAC,EAAEK,UAAU;IACxD,MAAMM,YAAYd,KAAKe,IAAI,CAACL,QAAQI,SAAS,EAAEd,KAAKgB,QAAQ,CAACH;IAE7Dd,GAAGkB,IAAI,CAACR,MAAM,CAACS;QACb,IAAI,CAACA,KAAK,OAAOP,YAAY,iBAAiB;QAE9C,IAAIQ;QACJ,MAAMC,QAAQ,IAAInB,MAAM;QACxBmB,MAAMC,KAAK,CAACjB,iBAAiBkB,IAAI,CAAC,MAAMT,cAAcC;QACtDM,MAAMC,KAAK,CAAC,CAACE;YACXjB,iBAAiBE,UAAUM,WAAW,CAACI,KAAKM;gBAC1CL,WAAWK;gBACXD,GAAGL;YACL;QACF;QACAE,MAAMC,KAAK,CAAChB,mBAAmBiB,IAAI,CAAC,MAAMR,WAAWL,MAAM;YAAEgB,OAAO;YAAGC,MAAM;QAAK;QAClFN,MAAMO,KAAK,CAAC,CAACT;YACX,gHAAgH;YAChH,MAAMU,UAAUhB,aAAa,UAAUH,OAAOT,KAAKe,IAAI,CAACN,MAAM;YAC9D,MAAMoB,cAAc7B,KAAKe,IAAI,CAACa,SAAS,gBAAgB;YACvD1B,QAAQ2B,aAAa;gBAAEC,aAAa;YAAK,GAAG,IAAMnB,SAASO,KAAKC;QAClE;IACF;AACF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export default function installFilename(filename: string, version: string, dest: string, options: InstallOptions, callback:
|
|
1
|
+
import type { ChecksumCallback, InstallOptions } from '../types.js';
|
|
2
|
+
export default function installFilename(filename: string, version: string, dest: string, options: InstallOptions, callback: ChecksumCallback): undefined;
|
|
@@ -14,11 +14,6 @@ export default function installFilename(filename, version, dest, options, callba
|
|
|
14
14
|
if (filename === 'src') return installSource(distPath, dest, options, callback);
|
|
15
15
|
if (ext === '.exe') return installExe(distPath, dest, options, callback);
|
|
16
16
|
if (EXTENSIONS_COMPRESSED.indexOf(ext) >= 0) {
|
|
17
|
-
// 7z is not supported by fast extract
|
|
18
|
-
if (ext === '.7z') {
|
|
19
|
-
callback(new Error('7z not supported. Make a request feature request: https://github.com/kmalakoff/node-install-release/pulls'));
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
17
|
return installCompressed(distPath, dest, options, callback);
|
|
23
18
|
}
|
|
24
19
|
callback(new Error(`Unable to install ${version} distPath: ${distPath}`));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNode/installFilename.ts"],"sourcesContent":["import fromFilename from 'node-filename-to-dist-paths';\nimport path from 'path';\nimport { EXTENSIONS_COMPRESSED } from '../constants.ts';\nimport type {
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNode/installFilename.ts"],"sourcesContent":["import fromFilename from 'node-filename-to-dist-paths';\nimport path from 'path';\nimport { EXTENSIONS_COMPRESSED } from '../constants.ts';\nimport type { ChecksumCallback, InstallOptions } from '../types.ts';\nimport installCompressed from './installCompressed.ts';\nimport installExe from './installExe.ts';\nimport installSource from './installSource/index.ts';\n\nexport default function installFilename(filename: string, version: string, dest: string, options: InstallOptions, callback: ChecksumCallback): undefined {\n const distPath = fromFilename(filename, version);\n if (!distPath) {\n callback(new Error('Not found'));\n return;\n }\n const ext = path.extname(distPath);\n\n if (filename === 'src') return installSource(distPath, dest, options, callback);\n if (ext === '.exe') return installExe(distPath, dest, options, callback);\n if (EXTENSIONS_COMPRESSED.indexOf(ext) >= 0) {\n return installCompressed(distPath, dest, options, callback);\n }\n callback(new Error(`Unable to install ${version} distPath: ${distPath}`));\n}\n"],"names":["fromFilename","path","EXTENSIONS_COMPRESSED","installCompressed","installExe","installSource","installFilename","filename","version","dest","options","callback","distPath","Error","ext","extname","indexOf"],"mappings":"AAAA,OAAOA,kBAAkB,8BAA8B;AACvD,OAAOC,UAAU,OAAO;AACxB,SAASC,qBAAqB,QAAQ,kBAAkB;AAExD,OAAOC,uBAAuB,yBAAyB;AACvD,OAAOC,gBAAgB,kBAAkB;AACzC,OAAOC,mBAAmB,2BAA2B;AAErD,eAAe,SAASC,gBAAgBC,QAAgB,EAAEC,OAAe,EAAEC,IAAY,EAAEC,OAAuB,EAAEC,QAA0B;IAC1I,MAAMC,WAAWZ,aAAaO,UAAUC;IACxC,IAAI,CAACI,UAAU;QACbD,SAAS,IAAIE,MAAM;QACnB;IACF;IACA,MAAMC,MAAMb,KAAKc,OAAO,CAACH;IAEzB,IAAIL,aAAa,OAAO,OAAOF,cAAcO,UAAUH,MAAMC,SAASC;IACtE,IAAIG,QAAQ,QAAQ,OAAOV,WAAWQ,UAAUH,MAAMC,SAASC;IAC/D,IAAIT,sBAAsBc,OAAO,CAACF,QAAQ,GAAG;QAC3C,OAAOX,kBAAkBS,UAAUH,MAAMC,SAASC;IACpD;IACAA,SAAS,IAAIE,MAAM,CAAC,kBAAkB,EAAEL,QAAQ,WAAW,EAAEI,UAAU;AACzE"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export default function validateDownload(distPath: string, installPath: string, callback:
|
|
1
|
+
import type { ChecksumCallback } from '../types.js';
|
|
2
|
+
export default function validateDownload(distPath: string, installPath: string, callback: ChecksumCallback): undefined;
|
|
@@ -24,7 +24,14 @@ export default function validateDownload(distPath, installPath, callback) {
|
|
|
24
24
|
callback(err);
|
|
25
25
|
return;
|
|
26
26
|
}
|
|
27
|
-
hash.digest('hex')
|
|
27
|
+
const actual = hash.digest('hex');
|
|
28
|
+
const match = actual === expected;
|
|
29
|
+
const checksum = {
|
|
30
|
+
actual,
|
|
31
|
+
expected,
|
|
32
|
+
match
|
|
33
|
+
};
|
|
34
|
+
match ? callback(null, checksum) : callback(new Error(`${filename} checksum failed`), checksum);
|
|
28
35
|
});
|
|
29
36
|
});
|
|
30
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNode/validateDownload.ts"],"sourcesContent":["import crypto from 'crypto';\nimport fs from 'fs';\nimport get from 'get-remote';\nimport oo from 'on-one';\nimport { NODE_DIST_BASE_URL } from '../constants.ts';\n\nimport type {
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/installNode/validateDownload.ts"],"sourcesContent":["import crypto from 'crypto';\nimport fs from 'fs';\nimport get from 'get-remote';\nimport oo from 'on-one';\nimport { NODE_DIST_BASE_URL } from '../constants.ts';\n\nimport type { ChecksumCallback, ChecksumResult } from '../types.ts';\n\nexport default function validateDownload(distPath: string, installPath: string, callback: ChecksumCallback): undefined {\n const version = distPath.split('/')[0];\n const downloadPath = `${NODE_DIST_BASE_URL}/${version}/SHASUMS256.txt`;\n get(downloadPath).text((err, res) => {\n if (err) return callback(err);\n const text = res.body;\n const filename = distPath.split('/').slice(1).join('/');\n const expected = text.split(filename)[0].split('\\n').pop().trim();\n const hash = crypto.createHash('sha256');\n const stream = fs.createReadStream(installPath);\n stream.on('data', (data) => hash.update(data));\n oo(stream, ['error', 'end', 'close', 'finish'], (err?: Error) => {\n if (err) {\n callback(err);\n return;\n }\n const actual = hash.digest('hex');\n const match = actual === expected;\n const checksum: ChecksumResult = { actual, expected, match };\n match ? callback(null, checksum) : callback(new Error(`${filename} checksum failed`), checksum);\n });\n });\n}\n"],"names":["crypto","fs","get","oo","NODE_DIST_BASE_URL","validateDownload","distPath","installPath","callback","version","split","downloadPath","text","err","res","body","filename","slice","join","expected","pop","trim","hash","createHash","stream","createReadStream","on","data","update","actual","digest","match","checksum","Error"],"mappings":"AAAA,OAAOA,YAAY,SAAS;AAC5B,OAAOC,QAAQ,KAAK;AACpB,OAAOC,SAAS,aAAa;AAC7B,OAAOC,QAAQ,SAAS;AACxB,SAASC,kBAAkB,QAAQ,kBAAkB;AAIrD,eAAe,SAASC,iBAAiBC,QAAgB,EAAEC,WAAmB,EAAEC,QAA0B;IACxG,MAAMC,UAAUH,SAASI,KAAK,CAAC,IAAI,CAAC,EAAE;IACtC,MAAMC,eAAe,GAAGP,mBAAmB,CAAC,EAAEK,QAAQ,eAAe,CAAC;IACtEP,IAAIS,cAAcC,IAAI,CAAC,CAACC,KAAKC;QAC3B,IAAID,KAAK,OAAOL,SAASK;QACzB,MAAMD,OAAOE,IAAIC,IAAI;QACrB,MAAMC,WAAWV,SAASI,KAAK,CAAC,KAAKO,KAAK,CAAC,GAAGC,IAAI,CAAC;QACnD,MAAMC,WAAWP,KAAKF,KAAK,CAACM,SAAS,CAAC,EAAE,CAACN,KAAK,CAAC,MAAMU,GAAG,GAAGC,IAAI;QAC/D,MAAMC,OAAOtB,OAAOuB,UAAU,CAAC;QAC/B,MAAMC,SAASvB,GAAGwB,gBAAgB,CAAClB;QACnCiB,OAAOE,EAAE,CAAC,QAAQ,CAACC,OAASL,KAAKM,MAAM,CAACD;QACxCxB,GAAGqB,QAAQ;YAAC;YAAS;YAAO;YAAS;SAAS,EAAE,CAACX;YAC/C,IAAIA,KAAK;gBACPL,SAASK;gBACT;YACF;YACA,MAAMgB,SAASP,KAAKQ,MAAM,CAAC;YAC3B,MAAMC,QAAQF,WAAWV;YACzB,MAAMa,WAA2B;gBAAEH;gBAAQV;gBAAUY;YAAM;YAC3DA,QAAQvB,SAAS,MAAMwB,YAAYxB,SAAS,IAAIyB,MAAM,GAAGjB,SAAS,gBAAgB,CAAC,GAAGgB;QACxF;IACF;AACF"}
|
package/dist/esm/types.d.ts
CHANGED
|
@@ -35,5 +35,11 @@ export interface Target {
|
|
|
35
35
|
platform: NodeJS.Platform;
|
|
36
36
|
arch: NodeJS.Architecture;
|
|
37
37
|
}
|
|
38
|
+
export type ChecksumResult = {
|
|
39
|
+
actual: string;
|
|
40
|
+
expected: string;
|
|
41
|
+
match: boolean;
|
|
42
|
+
};
|
|
38
43
|
export type InstallCallback = (err?: Error, result?: InstallResult) => void;
|
|
39
44
|
export type NoParamCallback = (err?: Error) => void;
|
|
45
|
+
export type ChecksumCallback = (err?: Error, checksum?: ChecksumResult) => void;
|
package/dist/esm/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/types.ts"],"sourcesContent":["import type { VersionOptions } from 'node-resolve-versions';\n\nexport interface File {\n filename: string;\n starting: string;\n}\n\nexport interface FilePath {\n src: string;\n dest: string;\n optional?: boolean;\n}\n\nexport type StorageLocations = {\n cachePath: string;\n buildPath: string;\n installPath: string;\n};\n\nexport type InstallResult = {\n version: string;\n installPath: string;\n execPath: string;\n platform: NodeJS.Platform;\n};\n\nexport interface InstallOptions extends VersionOptions {\n type?: string;\n compression?: boolean;\n installPath?: string;\n buildPath?: string;\n name?: string;\n storagePath?: string;\n filename?: string;\n platform?: NodeJS.Platform;\n arch?: NodeJS.Architecture;\n cachePath?: string;\n}\n\nexport interface Target {\n platform: NodeJS.Platform;\n arch: NodeJS.Architecture;\n}\n\nexport type InstallCallback = (err?: Error, result?: InstallResult) => void;\nexport type NoParamCallback = (err?: Error) => void;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node-version/node-install-release/src/types.ts"],"sourcesContent":["import type { VersionOptions } from 'node-resolve-versions';\n\nexport interface File {\n filename: string;\n starting: string;\n}\n\nexport interface FilePath {\n src: string;\n dest: string;\n optional?: boolean;\n}\n\nexport type StorageLocations = {\n cachePath: string;\n buildPath: string;\n installPath: string;\n};\n\nexport type InstallResult = {\n version: string;\n installPath: string;\n execPath: string;\n platform: NodeJS.Platform;\n};\n\nexport interface InstallOptions extends VersionOptions {\n type?: string;\n compression?: boolean;\n installPath?: string;\n buildPath?: string;\n name?: string;\n storagePath?: string;\n filename?: string;\n platform?: NodeJS.Platform;\n arch?: NodeJS.Architecture;\n cachePath?: string;\n}\n\nexport interface Target {\n platform: NodeJS.Platform;\n arch: NodeJS.Architecture;\n}\n\nexport type ChecksumResult = {\n actual: string;\n expected: string;\n match: boolean;\n};\n\nexport type InstallCallback = (err?: Error, result?: InstallResult) => void;\nexport type NoParamCallback = (err?: Error) => void;\nexport type ChecksumCallback = (err?: Error, checksum?: ChecksumResult) => void;\n"],"names":[],"mappings":"AAoDA,WAAgF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-install-release",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.15.1",
|
|
4
4
|
"description": "Cross-platform solution for installing releases of Node.js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"node",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"build": "tsds build",
|
|
38
38
|
"format": "biome check --write --unsafe",
|
|
39
39
|
"prepublishOnly": "tsds validate",
|
|
40
|
-
"test": "
|
|
40
|
+
"test": "tsds test:node --no-timeouts",
|
|
41
41
|
"test:engines": "nvu 0.8,0.10,0.12,4,12,16,lts,stable tsds test:node --no-timeouts",
|
|
42
42
|
"version": "tsds version"
|
|
43
43
|
},
|
|
@@ -60,14 +60,17 @@
|
|
|
60
60
|
"rimraf2": "*"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
|
+
"@biomejs/biome": "*",
|
|
63
64
|
"@types/mocha": "*",
|
|
64
65
|
"@types/node": "*",
|
|
65
66
|
"cr": "*",
|
|
66
67
|
"lodash.find": "*",
|
|
67
68
|
"lodash.values": "*",
|
|
68
69
|
"node-version-compare": "*",
|
|
70
|
+
"node-version-use": "*",
|
|
69
71
|
"node-version-utils": "*",
|
|
70
|
-
"pinkie-promise": "*"
|
|
72
|
+
"pinkie-promise": "*",
|
|
73
|
+
"ts-dev-stack": "*"
|
|
71
74
|
},
|
|
72
75
|
"engines": {
|
|
73
76
|
"node": ">=0.8"
|