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.
Files changed (48) hide show
  1. package/dist/cjs/cli.d.cts +1 -1
  2. package/dist/cjs/cli.d.ts +1 -1
  3. package/dist/cjs/cli.js +51 -7
  4. package/dist/cjs/cli.js.map +1 -1
  5. package/dist/cjs/installNPM/index.js +11 -2
  6. package/dist/cjs/installNPM/index.js.map +1 -1
  7. package/dist/cjs/installNPM/installLib.d.cts +1 -1
  8. package/dist/cjs/installNPM/installLib.d.ts +1 -1
  9. package/dist/cjs/installNPM/installLib.js +27 -1
  10. package/dist/cjs/installNPM/installLib.js.map +1 -1
  11. package/dist/cjs/installNode/index.js +18 -6
  12. package/dist/cjs/installNode/index.js.map +1 -1
  13. package/dist/cjs/installNode/installCompressed.d.cts +2 -2
  14. package/dist/cjs/installNode/installCompressed.d.ts +2 -2
  15. package/dist/cjs/installNode/installCompressed.js +8 -2
  16. package/dist/cjs/installNode/installCompressed.js.map +1 -1
  17. package/dist/cjs/installNode/installFilename.d.cts +2 -2
  18. package/dist/cjs/installNode/installFilename.d.ts +2 -2
  19. package/dist/cjs/installNode/installFilename.js +0 -5
  20. package/dist/cjs/installNode/installFilename.js.map +1 -1
  21. package/dist/cjs/installNode/validateDownload.d.cts +2 -2
  22. package/dist/cjs/installNode/validateDownload.d.ts +2 -2
  23. package/dist/cjs/installNode/validateDownload.js +8 -1
  24. package/dist/cjs/installNode/validateDownload.js.map +1 -1
  25. package/dist/cjs/types.d.cts +6 -0
  26. package/dist/cjs/types.d.ts +6 -0
  27. package/dist/esm/cli.d.ts +1 -1
  28. package/dist/esm/cli.js +51 -7
  29. package/dist/esm/cli.js.map +1 -1
  30. package/dist/esm/installNPM/index.js +11 -2
  31. package/dist/esm/installNPM/index.js.map +1 -1
  32. package/dist/esm/installNPM/installLib.d.ts +1 -1
  33. package/dist/esm/installNPM/installLib.js +25 -1
  34. package/dist/esm/installNPM/installLib.js.map +1 -1
  35. package/dist/esm/installNode/index.js +17 -5
  36. package/dist/esm/installNode/index.js.map +1 -1
  37. package/dist/esm/installNode/installCompressed.d.ts +2 -2
  38. package/dist/esm/installNode/installCompressed.js +8 -2
  39. package/dist/esm/installNode/installCompressed.js.map +1 -1
  40. package/dist/esm/installNode/installFilename.d.ts +2 -2
  41. package/dist/esm/installNode/installFilename.js +0 -5
  42. package/dist/esm/installNode/installFilename.js.map +1 -1
  43. package/dist/esm/installNode/validateDownload.d.ts +2 -2
  44. package/dist/esm/installNode/validateDownload.js +8 -1
  45. package/dist/esm/installNode/validateDownload.js.map +1 -1
  46. package/dist/esm/types.d.ts +6 -0
  47. package/dist/esm/types.js.map +1 -1
  48. package/package.json +6 -3
@@ -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 _default = function(argv) {
21
- var options = (0, _getoptscompat.default)(argv.slice(1), {
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
- var args = argv.slice(0, 1).concat(options._);
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('Missing command. Example usage: nir version [directory]');
37
- return (0, _exit.default)(ERROR_CODE);
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) {
@@ -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.slice(1), {\n alias: { platform: 'p', arch: 'a', filename: 'f', installPath: 'i', storagePath: 'c', silent: 'si' },\n boolean: ['silent'],\n });\n\n const args = argv.slice(0, 1).concat(options._);\n if (args.length < 1) {\n console.log('Missing command. Example usage: nir version [directory]');\n return exit(ERROR_CODE);\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","argv","options","getopts","slice","alias","platform","arch","filename","installPath","storagePath","silent","boolean","args","concat","_","length","console","log","exit","install","err","result","message","version"],"mappings":";;;;+BAMA;;;eAAA;;;2DANiB;oEACG;8DACyB;;;;;;AAE7C,IAAMA,aAAa;IAEnB,WAAe,SAACC;IACd,IAAMC,UAAUC,IAAAA,sBAAO,EAACF,KAAKG,KAAK,CAAC,IAAI;QACrCC,OAAO;YAAEC,UAAU;YAAKC,MAAM;YAAKC,UAAU;YAAKC,aAAa;YAAKC,aAAa;YAAKC,QAAQ;QAAK;QACnGC,SAAS;YAAC;SAAS;IACrB;IAEA,IAAMC,OAAOZ,KAAKG,KAAK,CAAC,GAAG,GAAGU,MAAM,CAACZ,QAAQa,CAAC;IAC9C,IAAIF,KAAKG,MAAM,GAAG,GAAG;QACnBC,QAAQC,GAAG,CAAC;QACZ,OAAOC,IAAAA,aAAI,EAACnB;IACd;IACAoB,IAAAA,gBAAO,EAACP,IAAI,CAAC,EAAE,EAAEX,SAA2B,SAACmB,KAAKC;QAChD,IAAI,CAACpB,QAAQS,MAAM,EAAE;YACnBM,QAAQC,GAAG,CAAC;YACZ,IAAIG,KAAKJ,QAAQC,GAAG,CAAC,AAAC,GAAmCG,OAAjCR,IAAI,CAAC,EAAE,EAAC,2BAAqC,OAAZQ,IAAIE,OAAO;iBAC/DN,QAAQC,GAAG,CAAC,AAAC,GAAkCI,OAAhCA,OAAOE,OAAO,EAAC,mBAAoC,OAAnBF,OAAOb,WAAW;YACtEQ,QAAQC,GAAG,CAAC;QACd;QACAC,IAAAA,aAAI,EAACE,MAAMrB,aAAa;IAC1B;AACF"}
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
- console.log("npm ".concat(npmVersion || '', " ").concat(!err ? 'installed' : "install failed. Error: ".concat(err.message)));
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 console.log(`npm ${npmVersion || ''} ${!err ? 'installed' : `install failed. Error: ${err.message}`}`);\n callback(err);\n });\n}\n"],"names":["install","version","dest","options","callback","npmVersion","queue","Queue","defer","cb","installLib","err","_npmVersion","installBin","bind","await","console","log","message"],"mappings":";;;;+BAKA;;;eAAwBA;;;8DALN;mEAEK;mEACA;;;;;;AAER,SAASA,QAAQC,OAAe,EAAEC,IAAY,EAAEC,OAAuB,EAAEC,QAAyB;IAC/G,IAAIC,aAAa;IAEjB,IAAMC,QAAQ,IAAIC,gBAAK,CAAC;IACxBD,MAAME,KAAK,CAAC,SAACC;eACXC,IAAAA,qBAAU,EAACT,SAASC,MAAMC,SAAS,SAACQ,KAAKC;YACvCP,aAAaO;YACbH,GAAGE;QACL;;IAEFL,MAAME,KAAK,CAACK,qBAAU,CAACC,IAAI,CAAC,MAAMb,SAASC,MAAMC;IACjDG,MAAMS,KAAK,CAAC,SAACJ;QACXK,QAAQC,GAAG,CAAC,AAAC,OAA0B,OAApBZ,cAAc,IAAG,KAAgE,OAA7D,CAACM,MAAM,cAAc,AAAC,0BAAqC,OAAZA,IAAIO,OAAO;QACjGd,SAASO;IACX;AACF"}
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","callback","platform","libPath","path","join","installPath","dist","getDist","npmMajorPair","npm","split","NPM_MIN_VERSION","npmMajor","Math","max","get","NPM_DIST_TAGS_URL","json","err","res","distTags","body","npmVersion","latest","downloadPath","NPM_DIST_URL","cachePath","basename","queue","Queue","defer","conditionalCache","bind","conditionalExtract","await"],"mappings":";;;;+BAgBA;;;eAAwBA;;;gEAhBR;uCACQ;2DACP;8DACC;2BAC+C;yEACpC;2EACE;;;;;;AAUhB,SAASA,WAAWC,OAAe,EAAEC,IAAY,EAAEC,OAAuB,EAAEC,QAAkB;IAC3G,IAAMC,WAAWF,QAAQE,QAAQ;IACjC,IAAMC,UAAUD,aAAa,UAAUH,OAAOK,aAAI,CAACC,IAAI,CAACN,MAAM;IAC9D,IAAMO,cAAcF,aAAI,CAACC,IAAI,CAACF,SAAS,gBAAgB;IAEvD,IAAMI,OAAOC,IAAAA,gCAAO,EAACV;IACrB,IAAMW,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,SAACC,KAAKC;QAChC,IAAID,KAAK,OAAOlB,SAASkB;QACzB,IAAME,WAAWD,IAAIE,IAAI;QACzB,IAAMC,aAAaF,QAAQ,CAAC,AAAC,UAAkB,OAATR,UAAW,IAAIQ,QAAQ,CAAC,AAAC,QAAgB,OAATR,UAAW,IAAIQ,SAASG,MAAM;QACpG,IAAMC,eAAe,AAAC,GAAwBF,OAAtBG,yBAAY,EAAC,WAAoB,OAAXH,YAAW;QACzD,IAAMI,YAAYvB,aAAI,CAACC,IAAI,CAACL,QAAQ2B,SAAS,EAAEvB,aAAI,CAACwB,QAAQ,CAACH;QAE7D,IAAMI,QAAQ,IAAIC,gBAAK,CAAC;QACxBD,MAAME,KAAK,CAACC,2BAAgB,CAACC,IAAI,CAAC,MAAMR,cAAcE;QACtDE,MAAME,KAAK,CAACG,6BAAkB,CAACD,IAAI,CAAC,MAAMN,WAAWrB;QACrDuB,MAAMM,KAAK,CAAC,SAAChB;YACXA,MAAMlB,SAASkB,OAAOlB,SAAS,MAAMsB;QACvC;IACF;AACF"}
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) return cb(new Error("Failed to find installable for ".concat(version).concat(options.filename ? " Filename: ".concat(options.filename) : '')));
54
- (0, _installFilenamets.default)(filenames.shift(), version, dest, options, function(err) {
55
- return err ? tryNext(cb) : cb();
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
- console.log("node ".concat(version.slice(1), " ").concat(!err ? 'installed' : "install failed. Error: ".concat(err.message)));
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) return cb(new Error(`Failed to find installable for ${version}${options.filename ? ` Filename: ${options.filename}` : ''}`));\n installFilename(filenames.shift(), version, dest, options, (err) => (err ? tryNext(cb) : cb()));\n };\n tryNext((err) => {\n console.log(`node ${version.slice(1)} ${!err ? 'installed' : `install failed. Error: ${err.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","length","Error","installFilename","shift","err","console","log","message"],"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;QACf,IAAIxB,UAAUyB,MAAM,KAAK,GAAG,OAAOD,GAAG,IAAIE,MAAM,AAAC,kCAA2C5B,OAAVF,SAAmE,OAAzDE,QAAQG,QAAQ,GAAG,AAAC,cAA8B,OAAjBH,QAAQG,QAAQ,IAAK;QAClJ0B,IAAAA,0BAAe,EAAC3B,UAAU4B,KAAK,IAAIhC,SAASC,MAAMC,SAAS,SAAC+B;mBAASA,MAAMN,QAAQC,MAAMA;;IAC3F;IACAD,QAAQ,SAACM;QACPC,QAAQC,GAAG,CAAC,AAAC,QAA2B,OAApBnC,QAAQmB,KAAK,CAAC,IAAG,KAAgE,OAA7D,CAACc,MAAM,cAAc,AAAC,0BAAqC,OAAZA,IAAIG,OAAO;QAClGjC,SAAS8B;IACX;AACF"}
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 { InstallOptions, NoParamCallback } from '../types.js';
2
- export default function installCompressed(distPath: string, dest: string, options: InstallOptions, callback: NoParamCallback): undefined;
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 { InstallOptions, NoParamCallback } from '../types.js';
2
- export default function installCompressed(distPath: string, dest: string, options: InstallOptions, callback: NoParamCallback): undefined;
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(_validateDownloadts.default.bind(null, distPath, cachePath));
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 { InstallOptions, NoParamCallback } from '../types.ts';\nimport validateDownload from './validateDownload.ts';\n\nexport default function installCompressed(distPath: string, dest: string, options: InstallOptions, callback: NoParamCallback): 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 const queue = new Queue(1);\n queue.defer(conditionalCache.bind(null, downloadPath, cachePath));\n queue.defer(validateDownload.bind(null, distPath, cachePath));\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));\n });\n });\n}\n"],"names":["installCompressed","distPath","dest","options","callback","platform","downloadPath","NODE_DIST_BASE_URL","cachePath","path","join","basename","fs","stat","err","queue","Queue","defer","conditionalCache","bind","validateDownload","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,QAAyB;IAC1H,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,IAAMW,QAAQ,IAAIC,gBAAK,CAAC;QACxBD,MAAME,KAAK,CAACC,2BAAgB,CAACC,IAAI,CAAC,MAAMb,cAAcE;QACtDO,MAAME,KAAK,CAACG,2BAAgB,CAACD,IAAI,CAAC,MAAMlB,UAAUO;QAClDO,MAAME,KAAK,CAACI,6BAAkB,CAACF,IAAI,CAAC,MAAMX,WAAWN,MAAM;YAAEoB,OAAO;YAAGC,MAAM;QAAK;QAClFR,MAAMS,KAAK,CAAC,SAACV;YACX,gHAAgH;YAChH,IAAMW,UAAUpB,aAAa,UAAUH,OAAOO,aAAI,CAACC,IAAI,CAACR,MAAM;YAC9D,IAAMwB,cAAcjB,aAAI,CAACC,IAAI,CAACe,SAAS,gBAAgB;YACvDE,IAAAA,gBAAO,EAACD,aAAa;gBAAEE,aAAa;YAAK,GAAG;uBAAMxB,SAASU;;QAC7D;IACF;AACF"}
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 { InstallOptions, NoParamCallback } from '../types.js';
2
- export default function installFilename(filename: string, version: string, dest: string, options: InstallOptions, callback: NoParamCallback): undefined;
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 { InstallOptions, NoParamCallback } from '../types.js';
2
- export default function installFilename(filename: string, version: string, dest: string, options: InstallOptions, callback: NoParamCallback): undefined;
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 { InstallOptions, NoParamCallback } 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: NoParamCallback): 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 // 7z is not supported by fast extract\n if (ext === '.7z') {\n callback(new Error('7z not supported. Make a request feature request: https://github.com/kmalakoff/node-install-release/pulls'));\n return;\n }\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,QAAyB;IACzI,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,sCAAsC;QACtC,IAAIA,QAAQ,OAAO;YACjBJ,SAAS,IAAIG,MAAM;YACnB;QACF;QACA,OAAOQ,IAAAA,4BAAiB,EAACV,UAAUH,MAAMC,SAASC;IACpD;IACAA,SAAS,IAAIG,MAAM,AAAC,qBAAyCF,OAArBJ,SAAQ,eAAsB,OAATI;AAC/D"}
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 { NoParamCallback } from '../types.js';
2
- export default function validateDownload(distPath: string, installPath: string, callback: NoParamCallback): undefined;
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 { NoParamCallback } from '../types.js';
2
- export default function validateDownload(distPath: string, installPath: string, callback: NoParamCallback): undefined;
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') !== expected ? callback(new Error("".concat(filename, " checksum failed"))) : callback();
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 { NoParamCallback } from '../types.ts';\n\nexport default function validateDownload(distPath: string, installPath: string, callback: NoParamCallback): 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 hash.digest('hex') !== expected ? callback(new Error(`${filename} checksum failed`)) : callback();\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","digest","Error"],"mappings":";;;;+BAQA;;;eAAwBA;;;6DARL;yDACJ;gEACC;4DACD;2BACoB;;;;;;AAIpB,SAASA,iBAAiBC,QAAgB,EAAEC,WAAmB,EAAEC,QAAyB;IACvG,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;YACAS,KAAKU,MAAM,CAAC,WAAWb,WAAWb,SAAS,IAAI2B,MAAM,AAAC,GAAW,OAATjB,UAAS,wBAAsBV;QACzF;IACF;AACF"}
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"}
@@ -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;
@@ -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
- export default ((argv)=>{
6
- const options = getopts(argv.slice(1), {
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
- const args = argv.slice(0, 1).concat(options._);
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('Missing command. Example usage: nir version [directory]');
22
- return exit(ERROR_CODE);
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) {
@@ -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.slice(1), {\n alias: { platform: 'p', arch: 'a', filename: 'f', installPath: 'i', storagePath: 'c', silent: 'si' },\n boolean: ['silent'],\n });\n\n const args = argv.slice(0, 1).concat(options._);\n if (args.length < 1) {\n console.log('Missing command. Example usage: nir version [directory]');\n return exit(ERROR_CODE);\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","getopts","install","ERROR_CODE","argv","options","slice","alias","platform","arch","filename","installPath","storagePath","silent","boolean","args","concat","_","length","console","log","err","result","message","version"],"mappings":"AAAA,OAAOA,UAAU,OAAO;AACxB,OAAOC,aAAa,iBAAiB;AACrC,OAAOC,aAAsC,aAAa;AAE1D,MAAMC,aAAa;AAEnB,eAAe,CAAA,CAACC;IACd,MAAMC,UAAUJ,QAAQG,KAAKE,KAAK,CAAC,IAAI;QACrCC,OAAO;YAAEC,UAAU;YAAKC,MAAM;YAAKC,UAAU;YAAKC,aAAa;YAAKC,aAAa;YAAKC,QAAQ;QAAK;QACnGC,SAAS;YAAC;SAAS;IACrB;IAEA,MAAMC,OAAOX,KAAKE,KAAK,CAAC,GAAG,GAAGU,MAAM,CAACX,QAAQY,CAAC;IAC9C,IAAIF,KAAKG,MAAM,GAAG,GAAG;QACnBC,QAAQC,GAAG,CAAC;QACZ,OAAOpB,KAAKG;IACd;IACAD,QAAQa,IAAI,CAAC,EAAE,EAAEV,SAA2B,CAACgB,KAAKC;QAChD,IAAI,CAACjB,QAAQQ,MAAM,EAAE;YACnBM,QAAQC,GAAG,CAAC;YACZ,IAAIC,KAAKF,QAAQC,GAAG,CAAC,GAAGL,IAAI,CAAC,EAAE,CAAC,uBAAuB,EAAEM,IAAIE,OAAO,EAAE;iBACjEJ,QAAQC,GAAG,CAAC,GAAGE,OAAOE,OAAO,CAAC,eAAe,EAAEF,OAAOX,WAAW,EAAE;YACxEQ,QAAQC,GAAG,CAAC;QACd;QACApB,KAAKqB,MAAMlB,aAAa;IAC1B;AACF,CAAA,EAAE"}
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
- console.log(`npm ${npmVersion || ''} ${!err ? 'installed' : `install failed. Error: ${err.message}`}`);
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 console.log(`npm ${npmVersion || ''} ${!err ? 'installed' : `install failed. Error: ${err.message}`}`);\n callback(err);\n });\n}\n"],"names":["Queue","installBin","installLib","install","version","dest","options","callback","npmVersion","queue","defer","cb","err","_npmVersion","bind","await","console","log","message"],"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,aAAa;IAEjB,MAAMC,QAAQ,IAAIT,MAAM;IACxBS,MAAMC,KAAK,CAAC,CAACC,KACXT,WAAWE,SAASC,MAAMC,SAAS,CAACM,KAAKC;YACvCL,aAAaK;YACbF,GAAGC;QACL;IAEFH,MAAMC,KAAK,CAACT,WAAWa,IAAI,CAAC,MAAMV,SAASC,MAAMC;IACjDG,MAAMM,KAAK,CAAC,CAACH;QACXI,QAAQC,GAAG,CAAC,CAAC,IAAI,EAAET,cAAc,GAAG,CAAC,EAAE,CAACI,MAAM,cAAc,CAAC,uBAAuB,EAAEA,IAAIM,OAAO,EAAE,EAAE;QACrGX,SAASK;IACX;AACF"}
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","callback","platform","libPath","join","installPath","dist","npmMajorPair","npm","split","npmMajor","Math","max","json","err","res","distTags","body","npmVersion","latest","downloadPath","cachePath","basename","queue","defer","bind","await"],"mappings":"AAAA,OAAOA,SAAS,aAAa;AAC7B,SAASC,OAAO,QAAQ,8BAA8B;AACtD,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,eAAe,SAASC,WAAWC,OAAe,EAAEC,IAAY,EAAEC,OAAuB,EAAEC,QAAkB;IAC3G,MAAMC,WAAWF,QAAQE,QAAQ;IACjC,MAAMC,UAAUD,aAAa,UAAUH,OAAOT,KAAKc,IAAI,CAACL,MAAM;IAC9D,MAAMM,cAAcf,KAAKc,IAAI,CAACD,SAAS,gBAAgB;IAEvD,MAAMG,OAAOjB,QAAQS;IACrB,MAAMS,eAAeD,QAAQA,KAAKE,GAAG,GAAG,CAACF,KAAKE,GAAG,CAACC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAGf;IAClE,MAAMgB,WAAWC,KAAKC,GAAG,CAACL,cAAcb;IAExCN,IAAII,mBAAmBqB,IAAI,CAAC,CAACC,KAAKC;QAChC,IAAID,KAAK,OAAOb,SAASa;QACzB,MAAME,WAAWD,IAAIE,IAAI;QACzB,MAAMC,aAAaF,QAAQ,CAAC,CAAC,OAAO,EAAEN,UAAU,CAAC,IAAIM,QAAQ,CAAC,CAAC,KAAK,EAAEN,UAAU,CAAC,IAAIM,SAASG,MAAM;QACpG,MAAMC,eAAe,GAAG3B,aAAa,OAAO,EAAEyB,WAAW,IAAI,CAAC;QAC9D,MAAMG,YAAY/B,KAAKc,IAAI,CAACJ,QAAQqB,SAAS,EAAE/B,KAAKgC,QAAQ,CAACF;QAE7D,MAAMG,QAAQ,IAAIhC,MAAM;QACxBgC,MAAMC,KAAK,CAAC7B,iBAAiB8B,IAAI,CAAC,MAAML,cAAcC;QACtDE,MAAMC,KAAK,CAAC5B,mBAAmB6B,IAAI,CAAC,MAAMJ,WAAWhB;QACrDkB,MAAMG,KAAK,CAAC,CAACZ;YACXA,MAAMb,SAASa,OAAOb,SAAS,MAAMiB;QACvC;IACF;AACF"}
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) return cb(new Error(`Failed to find installable for ${version}${options.filename ? ` Filename: ${options.filename}` : ''}`));
35
- installFilename(filenames.shift(), version, dest, options, (err)=>err ? tryNext(cb) : cb());
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
- console.log(`node ${version.slice(1)} ${!err ? 'installed' : `install failed. Error: ${err.message}`}`);
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) return cb(new Error(`Failed to find installable for ${version}${options.filename ? ` Filename: ${options.filename}` : ''}`));\n installFilename(filenames.shift(), version, dest, options, (err) => (err ? tryNext(cb) : cb()));\n };\n tryNext((err) => {\n console.log(`node ${version.slice(1)} ${!err ? 'installed' : `install failed. Error: ${err.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","length","Error","shift","err","console","log","message"],"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;QACf,IAAItB,UAAUuB,MAAM,KAAK,GAAG,OAAOD,GAAG,IAAIE,MAAM,CAAC,+BAA+B,EAAE5B,UAAUE,QAAQG,QAAQ,GAAG,CAAC,WAAW,EAAEH,QAAQG,QAAQ,EAAE,GAAG,IAAI;QACtJP,gBAAgBM,UAAUyB,KAAK,IAAI7B,SAASC,MAAMC,SAAS,CAAC4B,MAASA,MAAML,QAAQC,MAAMA;IAC3F;IACAD,QAAQ,CAACK;QACPC,QAAQC,GAAG,CAAC,CAAC,KAAK,EAAEhC,QAAQkB,KAAK,CAAC,GAAG,CAAC,EAAE,CAACY,MAAM,cAAc,CAAC,uBAAuB,EAAEA,IAAIG,OAAO,EAAE,EAAE;QACtG9B,SAAS2B;IACX;AACF"}
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 { InstallOptions, NoParamCallback } from '../types.js';
2
- export default function installCompressed(distPath: string, dest: string, options: InstallOptions, callback: NoParamCallback): undefined;
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(validateDownload.bind(null, distPath, cachePath));
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 { InstallOptions, NoParamCallback } from '../types.ts';\nimport validateDownload from './validateDownload.ts';\n\nexport default function installCompressed(distPath: string, dest: string, options: InstallOptions, callback: NoParamCallback): 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 const queue = new Queue(1);\n queue.defer(conditionalCache.bind(null, downloadPath, cachePath));\n queue.defer(validateDownload.bind(null, distPath, cachePath));\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));\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","queue","defer","bind","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,QAAyB;IAC1H,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,MAAMQ,QAAQ,IAAIlB,MAAM;QACxBkB,MAAMC,KAAK,CAAChB,iBAAiBiB,IAAI,CAAC,MAAMR,cAAcC;QACtDK,MAAMC,KAAK,CAACd,iBAAiBe,IAAI,CAAC,MAAMb,UAAUM;QAClDK,MAAMC,KAAK,CAACf,mBAAmBgB,IAAI,CAAC,MAAMP,WAAWL,MAAM;YAAEa,OAAO;YAAGC,MAAM;QAAK;QAClFJ,MAAMK,KAAK,CAAC,CAACN;YACX,gHAAgH;YAChH,MAAMO,UAAUb,aAAa,UAAUH,OAAOT,KAAKe,IAAI,CAACN,MAAM;YAC9D,MAAMiB,cAAc1B,KAAKe,IAAI,CAACU,SAAS,gBAAgB;YACvDvB,QAAQwB,aAAa;gBAAEC,aAAa;YAAK,GAAG,IAAMhB,SAASO;QAC7D;IACF;AACF"}
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 { InstallOptions, NoParamCallback } from '../types.js';
2
- export default function installFilename(filename: string, version: string, dest: string, options: InstallOptions, callback: NoParamCallback): undefined;
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 { InstallOptions, NoParamCallback } 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: NoParamCallback): 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 // 7z is not supported by fast extract\n if (ext === '.7z') {\n callback(new Error('7z not supported. Make a request feature request: https://github.com/kmalakoff/node-install-release/pulls'));\n return;\n }\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,QAAyB;IACzI,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,sCAAsC;QACtC,IAAIA,QAAQ,OAAO;YACjBH,SAAS,IAAIE,MAAM;YACnB;QACF;QACA,OAAOV,kBAAkBS,UAAUH,MAAMC,SAASC;IACpD;IACAA,SAAS,IAAIE,MAAM,CAAC,kBAAkB,EAAEL,QAAQ,WAAW,EAAEI,UAAU;AACzE"}
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 { NoParamCallback } from '../types.js';
2
- export default function validateDownload(distPath: string, installPath: string, callback: NoParamCallback): undefined;
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') !== expected ? callback(new Error(`${filename} checksum failed`)) : callback();
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 { NoParamCallback } from '../types.ts';\n\nexport default function validateDownload(distPath: string, installPath: string, callback: NoParamCallback): 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 hash.digest('hex') !== expected ? callback(new Error(`${filename} checksum failed`)) : callback();\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","digest","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,QAAyB;IACvG,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;YACAS,KAAKO,MAAM,CAAC,WAAWV,WAAWX,SAAS,IAAIsB,MAAM,GAAGd,SAAS,gBAAgB,CAAC,KAAKR;QACzF;IACF;AACF"}
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"}
@@ -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;
@@ -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":"AA6CA,WAAoD"}
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.14.12",
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": "mocha --no-timeouts test/**/*.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"