install-module-linked-compat 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/bin/cli.js +2 -2
- package/dist/cjs/cli.js +7 -7
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/compat.d.cts +15 -1
- package/dist/cjs/compat.d.ts +15 -1
- package/dist/cjs/compat.js +141 -6
- package/dist/cjs/compat.js.map +1 -1
- package/dist/cjs/index.d.cts +5 -5
- package/dist/cjs/index.d.ts +5 -5
- package/dist/cjs/index.js +70 -17
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/workers/spawn.d.cts +3 -0
- package/dist/cjs/workers/spawn.d.ts +3 -0
- package/dist/cjs/workers/spawn.js +24 -0
- package/dist/cjs/workers/spawn.js.map +1 -0
- package/dist/esm/cli.js +6 -6
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/compat.d.ts +15 -1
- package/dist/esm/compat.js +66 -2
- package/dist/esm/compat.js.map +1 -1
- package/dist/esm/index.d.ts +5 -5
- package/dist/esm/index.js +21 -10
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/workers/spawn.d.ts +3 -0
- package/dist/esm/workers/spawn.js +6 -0
- package/dist/esm/workers/spawn.js.map +1 -0
- package/package.json +5 -6
- package/dist/cjs/constants.d.cts +0 -1
- package/dist/cjs/constants.d.ts +0 -1
- package/dist/cjs/constants.js +0 -19
- package/dist/cjs/constants.js.map +0 -1
- package/dist/cjs/lib/cache.d.cts +0 -2
- package/dist/cjs/lib/cache.d.ts +0 -2
- package/dist/cjs/lib/cache.js +0 -182
- package/dist/cjs/lib/cache.js.map +0 -1
- package/dist/cjs/lib/clear.d.cts +0 -2
- package/dist/cjs/lib/clear.d.ts +0 -2
- package/dist/cjs/lib/clear.js +0 -17
- package/dist/cjs/lib/clear.js.map +0 -1
- package/dist/cjs/lib/getSpecifier.d.cts +0 -2
- package/dist/cjs/lib/getSpecifier.d.ts +0 -2
- package/dist/cjs/lib/getSpecifier.js +0 -34
- package/dist/cjs/lib/getSpecifier.js.map +0 -1
- package/dist/cjs/lib/install.d.cts +0 -2
- package/dist/cjs/lib/install.d.ts +0 -2
- package/dist/cjs/lib/install.js +0 -69
- package/dist/cjs/lib/install.js.map +0 -1
- package/dist/cjs/lib/parseInstallString.d.cts +0 -4
- package/dist/cjs/lib/parseInstallString.d.ts +0 -4
- package/dist/cjs/lib/parseInstallString.js +0 -51
- package/dist/cjs/lib/parseInstallString.js.map +0 -1
- package/dist/cjs/lib/renameWithFallback.d.cts +0 -1
- package/dist/cjs/lib/renameWithFallback.d.ts +0 -1
- package/dist/cjs/lib/renameWithFallback.js +0 -32
- package/dist/cjs/lib/renameWithFallback.js.map +0 -1
- package/dist/cjs/types.d.cts +0 -9
- package/dist/cjs/types.d.ts +0 -9
- package/dist/cjs/types.js +0 -5
- package/dist/cjs/types.js.map +0 -1
- package/dist/cjs/workers/async.d.cts +0 -2
- package/dist/cjs/workers/async.d.ts +0 -2
- package/dist/cjs/workers/async.js +0 -108
- package/dist/cjs/workers/async.js.map +0 -1
- package/dist/cjs/workers/sync.d.cts +0 -1
- package/dist/cjs/workers/sync.d.ts +0 -1
- package/dist/cjs/workers/sync.js +0 -30
- package/dist/cjs/workers/sync.js.map +0 -1
- package/dist/esm/constants.d.ts +0 -1
- package/dist/esm/constants.js +0 -3
- package/dist/esm/constants.js.map +0 -1
- package/dist/esm/lib/cache.d.ts +0 -2
- package/dist/esm/lib/cache.js +0 -93
- package/dist/esm/lib/cache.js.map +0 -1
- package/dist/esm/lib/clear.d.ts +0 -2
- package/dist/esm/lib/clear.js +0 -6
- package/dist/esm/lib/clear.js.map +0 -1
- package/dist/esm/lib/getSpecifier.d.ts +0 -2
- package/dist/esm/lib/getSpecifier.js +0 -18
- package/dist/esm/lib/getSpecifier.js.map +0 -1
- package/dist/esm/lib/install.d.ts +0 -2
- package/dist/esm/lib/install.js +0 -23
- package/dist/esm/lib/install.js.map +0 -1
- package/dist/esm/lib/parseInstallString.d.ts +0 -4
- package/dist/esm/lib/parseInstallString.js +0 -14
- package/dist/esm/lib/parseInstallString.js.map +0 -1
- package/dist/esm/lib/renameWithFallback.d.ts +0 -1
- package/dist/esm/lib/renameWithFallback.js +0 -16
- package/dist/esm/lib/renameWithFallback.js.map +0 -1
- package/dist/esm/types.d.ts +0 -9
- package/dist/esm/types.js +0 -1
- package/dist/esm/types.js.map +0 -1
- package/dist/esm/workers/async.d.ts +0 -2
- package/dist/esm/workers/async.js +0 -50
- package/dist/esm/workers/async.js.map +0 -1
- package/dist/esm/workers/sync.d.ts +0 -1
- package/dist/esm/workers/sync.js +0 -14
- package/dist/esm/workers/sync.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/install-module-linked-compat/src/lib/install.ts"],"sourcesContent":["import spawn from 'cross-spawn-cb';\nimport { bind } from 'node-version-call-local';\nimport path from 'path';\nimport url from 'url';\nimport type { InstallCallback } from '../types.ts';\n\nconst __dirname = path.dirname(typeof __filename !== 'undefined' ? __filename : url.fileURLToPath(import.meta.url));\nconst major = +process.versions.node.split('.')[0];\nconst workerPath = path.join(__dirname, '..', '..', 'cjs', 'lib', 'install.js');\n\nfunction run(specifier: string, dest: string, callback: InstallCallback): void {\n spawn('npm', ['install', specifier], { cwd: dest }, (err) => {\n err ? callback(err) : callback(undefined, path.join(dest, ...specifier.split('/')));\n });\n}\n\ntype installFunction = (specifier: string, dest: string, callback: InstallCallback) => void;\n\nconst worker = (major > 0 ? run : bind('>0.12', workerPath, { callbacks: true })) as installFunction;\n\nexport default function install(specifier: string, dest: string, callback: InstallCallback): void {\n worker(specifier, dest, callback);\n}\n"],"names":["install","__dirname","path","dirname","__filename","url","fileURLToPath","major","process","versions","node","split","workerPath","join","run","specifier","dest","callback","spawn","cwd","err","undefined","worker","bind","callbacks"],"mappings":";;;;+BAoBA;;;eAAwBA;;;mEApBN;oCACG;2DACJ;0DACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGhB,IAAMC,YAAYC,aAAI,CAACC,OAAO,CAAC,OAAOC,eAAe,cAAcA,aAAaC,YAAG,CAACC,aAAa,CAAC;AAClG,IAAMC,QAAQ,CAACC,QAAQC,QAAQ,CAACC,IAAI,CAACC,KAAK,CAAC,IAAI,CAAC,EAAE;AAClD,IAAMC,aAAaV,aAAI,CAACW,IAAI,CAACZ,WAAW,MAAM,MAAM,OAAO,OAAO;AAElE,SAASa,IAAIC,SAAiB,EAAEC,IAAY,EAAEC,QAAyB;IACrEC,IAAAA,qBAAK,EAAC,OAAO;QAAC;QAAWH;KAAU,EAAE;QAAEI,KAAKH;IAAK,GAAG,SAACI;YACTlB;QAA1CkB,MAAMH,SAASG,OAAOH,SAASI,WAAWnB,CAAAA,SAAAA,aAAI,EAACW,IAAI,OAATX,QAAAA;YAAUc;SAA8B,CAAxCd,OAAgB,qBAAGa,UAAUJ,KAAK,CAAC;IAC/E;AACF;AAIA,IAAMW,SAAUf,QAAQ,IAAIO,MAAMS,IAAAA,0BAAI,EAAC,SAASX,YAAY;IAAEY,WAAW;AAAK;AAE/D,SAASxB,QAAQe,SAAiB,EAAEC,IAAY,EAAEC,QAAyB;IACxFK,OAAOP,WAAWC,MAAMC;AAC1B"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "default", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return parseInstallString;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
function _array_like_to_array(arr, len) {
|
|
12
|
-
if (len == null || len > arr.length) len = arr.length;
|
|
13
|
-
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
14
|
-
return arr2;
|
|
15
|
-
}
|
|
16
|
-
function _array_without_holes(arr) {
|
|
17
|
-
if (Array.isArray(arr)) return _array_like_to_array(arr);
|
|
18
|
-
}
|
|
19
|
-
function _iterable_to_array(iter) {
|
|
20
|
-
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) {
|
|
21
|
-
return Array.from(iter);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
function _non_iterable_spread() {
|
|
25
|
-
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
26
|
-
}
|
|
27
|
-
function _to_consumable_array(arr) {
|
|
28
|
-
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
|
|
29
|
-
}
|
|
30
|
-
function _unsupported_iterable_to_array(o, minLen) {
|
|
31
|
-
if (!o) return;
|
|
32
|
-
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
33
|
-
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
34
|
-
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
35
|
-
if (n === "Map" || n === "Set") return Array.from(n);
|
|
36
|
-
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
37
|
-
}
|
|
38
|
-
function parseInstallString(installString) {
|
|
39
|
-
var _installParts_pop;
|
|
40
|
-
var installParts = installString.split('/');
|
|
41
|
-
var nameVersionParts = ((_installParts_pop = installParts.pop()) !== null && _installParts_pop !== void 0 ? _installParts_pop : '').split('@');
|
|
42
|
-
var version = nameVersionParts.length > 1 ? nameVersionParts.pop() : undefined;
|
|
43
|
-
var name = _to_consumable_array(installParts).concat([
|
|
44
|
-
nameVersionParts.join('@')
|
|
45
|
-
]).join('/');
|
|
46
|
-
return {
|
|
47
|
-
name: name,
|
|
48
|
-
version: version
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/install-module-linked-compat/src/lib/parseInstallString.ts"],"sourcesContent":["export default function parseInstallString(installString: string) {\n const installParts = installString.split('/');\n const nameVersionParts = (installParts.pop() ?? '').split('@');\n const version = nameVersionParts.length > 1 ? nameVersionParts.pop() : undefined;\n const name = [...installParts, nameVersionParts.join('@')].join('/');\n return {\n name,\n version,\n };\n}\n"],"names":["parseInstallString","installString","installParts","split","nameVersionParts","pop","version","length","undefined","name","join"],"mappings":";;;;+BAAA;;;eAAwBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAT,SAASA,mBAAmBC,aAAqB;QAEpCC;IAD1B,IAAMA,eAAeD,cAAcE,KAAK,CAAC;IACzC,IAAMC,mBAAmB,EAACF,oBAAAA,aAAaG,GAAG,gBAAhBH,+BAAAA,oBAAsB,IAAIC,KAAK,CAAC;IAC1D,IAAMG,UAAUF,iBAAiBG,MAAM,GAAG,IAAIH,iBAAiBC,GAAG,KAAKG;IACvE,IAAMC,OAAO,AAAC,qBAAGP,qBAAJ;QAAkBE,iBAAiBM,IAAI,CAAC;KAAK,EAACA,IAAI,CAAC;IAChE,OAAO;QACLD,MAAAA;QACAH,SAAAA;IACF;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default function renameWithFallback(src: string, dest: string, callback: (err?: Error | null) => void): void;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default function renameWithFallback(src: string, dest: string, callback: (err?: Error | null) => void): void;
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "default", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return renameWithFallback;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
var _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
|
|
12
|
-
function _interop_require_default(obj) {
|
|
13
|
-
return obj && obj.__esModule ? obj : {
|
|
14
|
-
default: obj
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
function renameWithFallback(src, dest, callback) {
|
|
18
|
-
_fs.default.rename(src, dest, function(err) {
|
|
19
|
-
if (!err) return callback();
|
|
20
|
-
// Another process may have already created dest - check if it exists
|
|
21
|
-
// On Windows, concurrent renames to the same destination throw EPERM
|
|
22
|
-
if (err.code === 'EEXIST' || err.code === 'ENOTEMPTY' || err.code === 'EPERM') {
|
|
23
|
-
_fs.default.stat(dest, function(statErr) {
|
|
24
|
-
if (!statErr) return callback(); // dest exists, race was won by another process
|
|
25
|
-
callback(err); // dest doesn't exist, actual error
|
|
26
|
-
});
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
callback(err);
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/install-module-linked-compat/src/lib/renameWithFallback.ts"],"sourcesContent":["import fs from 'fs';\n\nexport default function renameWithFallback(src: string, dest: string, callback: (err?: Error | null) => void): void {\n fs.rename(src, dest, (err) => {\n if (!err) return callback();\n\n // Another process may have already created dest - check if it exists\n // On Windows, concurrent renames to the same destination throw EPERM\n if (err.code === 'EEXIST' || err.code === 'ENOTEMPTY' || err.code === 'EPERM') {\n fs.stat(dest, (statErr) => {\n if (!statErr) return callback(); // dest exists, race was won by another process\n callback(err); // dest doesn't exist, actual error\n });\n return;\n }\n\n callback(err);\n });\n}\n"],"names":["renameWithFallback","src","dest","callback","fs","rename","err","code","stat","statErr"],"mappings":";;;;+BAEA;;;eAAwBA;;;yDAFT;;;;;;AAEA,SAASA,mBAAmBC,GAAW,EAAEC,IAAY,EAAEC,QAAsC;IAC1GC,WAAE,CAACC,MAAM,CAACJ,KAAKC,MAAM,SAACI;QACpB,IAAI,CAACA,KAAK,OAAOH;QAEjB,qEAAqE;QACrE,qEAAqE;QACrE,IAAIG,IAAIC,IAAI,KAAK,YAAYD,IAAIC,IAAI,KAAK,eAAeD,IAAIC,IAAI,KAAK,SAAS;YAC7EH,WAAE,CAACI,IAAI,CAACN,MAAM,SAACO;gBACb,IAAI,CAACA,SAAS,OAAON,YAAY,+CAA+C;gBAChFA,SAASG,MAAM,mCAAmC;YACpD;YACA;QACF;QAEAH,SAASG;IACX;AACF"}
|
package/dist/cjs/types.d.cts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export interface CleanOptions {
|
|
2
|
-
slient?: boolean;
|
|
3
|
-
}
|
|
4
|
-
export type GetScopedSpecifiedCallback = (err?: Error | null, installSpecifier?: string) => void;
|
|
5
|
-
export type EnsureCachedCallback = (err?: Error | null, cachedAt?: string) => void;
|
|
6
|
-
export type InstallCallback = (err?: Error | null, installedAt?: string) => void;
|
|
7
|
-
export interface InstallOptions {
|
|
8
|
-
cachePath?: string;
|
|
9
|
-
}
|
package/dist/cjs/types.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export interface CleanOptions {
|
|
2
|
-
slient?: boolean;
|
|
3
|
-
}
|
|
4
|
-
export type GetScopedSpecifiedCallback = (err?: Error | null, installSpecifier?: string) => void;
|
|
5
|
-
export type EnsureCachedCallback = (err?: Error | null, cachedAt?: string) => void;
|
|
6
|
-
export type InstallCallback = (err?: Error | null, installedAt?: string) => void;
|
|
7
|
-
export interface InstallOptions {
|
|
8
|
-
cachePath?: string;
|
|
9
|
-
}
|
package/dist/cjs/types.js
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
package/dist/cjs/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":""}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "default", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return installModule;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
var _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
|
|
12
|
-
var _fsremovecompat = require("fs-remove-compat");
|
|
13
|
-
var _mkdirpclassic = /*#__PURE__*/ _interop_require_default(require("mkdirp-classic"));
|
|
14
|
-
var _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
|
15
|
-
var _queuecb = /*#__PURE__*/ _interop_require_default(require("queue-cb"));
|
|
16
|
-
var _tempsuffix = /*#__PURE__*/ _interop_require_default(require("temp-suffix"));
|
|
17
|
-
var _constantsts = require("../constants.js");
|
|
18
|
-
var _cachets = /*#__PURE__*/ _interop_require_default(require("../lib/cache.js"));
|
|
19
|
-
var _parseInstallStringts = /*#__PURE__*/ _interop_require_default(require("../lib/parseInstallString.js"));
|
|
20
|
-
function _array_like_to_array(arr, len) {
|
|
21
|
-
if (len == null || len > arr.length) len = arr.length;
|
|
22
|
-
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
23
|
-
return arr2;
|
|
24
|
-
}
|
|
25
|
-
function _array_without_holes(arr) {
|
|
26
|
-
if (Array.isArray(arr)) return _array_like_to_array(arr);
|
|
27
|
-
}
|
|
28
|
-
function _interop_require_default(obj) {
|
|
29
|
-
return obj && obj.__esModule ? obj : {
|
|
30
|
-
default: obj
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
function _iterable_to_array(iter) {
|
|
34
|
-
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) {
|
|
35
|
-
return Array.from(iter);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
function _non_iterable_spread() {
|
|
39
|
-
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
40
|
-
}
|
|
41
|
-
function _to_consumable_array(arr) {
|
|
42
|
-
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
|
|
43
|
-
}
|
|
44
|
-
function _unsupported_iterable_to_array(o, minLen) {
|
|
45
|
-
if (!o) return;
|
|
46
|
-
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
47
|
-
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
48
|
-
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
49
|
-
if (n === "Map" || n === "Set") return Array.from(n);
|
|
50
|
-
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
51
|
-
}
|
|
52
|
-
var _process_env_OSTYPE;
|
|
53
|
-
var isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test((_process_env_OSTYPE = process.env.OSTYPE) !== null && _process_env_OSTYPE !== void 0 ? _process_env_OSTYPE : '');
|
|
54
|
-
var symlinkType = isWindows ? 'junction' : 'dir';
|
|
55
|
-
function installModule(installString, nodeModulesPath, options, callback) {
|
|
56
|
-
var _path1;
|
|
57
|
-
var cachePath = options.cachePath || _constantsts.DEFAULT_CACHE_PATH;
|
|
58
|
-
var name = (0, _parseInstallStringts.default)(installString).name;
|
|
59
|
-
var dest = (_path1 = _path.default).join.apply(_path1, [
|
|
60
|
-
nodeModulesPath
|
|
61
|
-
].concat(_to_consumable_array(name.split('/'))));
|
|
62
|
-
_fs.default.stat(dest, function(err) {
|
|
63
|
-
if (!err) return callback(undefined, dest); // already installed
|
|
64
|
-
(0, _cachets.default)(installString, cachePath, function(err, cachedAt) {
|
|
65
|
-
if (err) {
|
|
66
|
-
console.log("Could not install: ".concat(installString, ". Message: ").concat(err.message));
|
|
67
|
-
return callback(err);
|
|
68
|
-
}
|
|
69
|
-
// Use temp symlink + atomic rename to avoid cross-process race conditions
|
|
70
|
-
var tempDest = (0, _tempsuffix.default)(dest);
|
|
71
|
-
var queue = new _queuecb.default(1);
|
|
72
|
-
queue.defer(function(cb) {
|
|
73
|
-
return (0, _mkdirpclassic.default)(_path.default.dirname(dest), function(err) {
|
|
74
|
-
return cb(err);
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
// biome-ignore lint/style/noNonNullAssertion: cache always sets cachedAt when err is null
|
|
78
|
-
queue.defer(function(cb) {
|
|
79
|
-
return _fs.default.symlink(cachedAt, tempDest, symlinkType, function(err) {
|
|
80
|
-
return cb(err);
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
queue.defer(function(cb) {
|
|
84
|
-
_fs.default.rename(tempDest, dest, function(err) {
|
|
85
|
-
var _err_code;
|
|
86
|
-
// If rename fails because dest exists, another process won - that's ok
|
|
87
|
-
if (err && [
|
|
88
|
-
'EEXIST',
|
|
89
|
-
'ENOTEMPTY',
|
|
90
|
-
'EPERM'
|
|
91
|
-
].indexOf((_err_code = err.code) !== null && _err_code !== void 0 ? _err_code : '') >= 0) {
|
|
92
|
-
(0, _fsremovecompat.safeRm)(tempDest, function() {
|
|
93
|
-
return cb();
|
|
94
|
-
});
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
cb(err);
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
queue.await(function(err) {
|
|
101
|
-
err ? (0, _fsremovecompat.safeRm)(tempDest, function() {
|
|
102
|
-
return callback(err);
|
|
103
|
-
}) : callback(undefined, dest);
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/install-module-linked-compat/src/workers/async.ts"],"sourcesContent":["import fs from 'fs';\nimport { safeRm } from 'fs-remove-compat';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport tempSuffix from 'temp-suffix';\nimport { DEFAULT_CACHE_PATH } from '../constants.ts';\nimport cache from '../lib/cache.ts';\nimport parseInstallString from '../lib/parseInstallString.ts';\n\nconst isWindows = process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE ?? '');\nconst symlinkType = isWindows ? 'junction' : 'dir';\n\nimport type { InstallCallback, InstallOptions } from '../types.ts';\n\nexport default function installModule(installString: string, nodeModulesPath: string, options: InstallOptions, callback: InstallCallback): void {\n const cachePath = options.cachePath || DEFAULT_CACHE_PATH;\n const { name } = parseInstallString(installString);\n const dest = path.join(nodeModulesPath, ...name.split('/'));\n\n fs.stat(dest, (err) => {\n if (!err) return callback(undefined, dest); // already installed\n\n cache(installString, cachePath, (err, cachedAt) => {\n if (err) {\n console.log(`Could not install: ${installString}. Message: ${err.message}`);\n return callback(err);\n }\n\n // Use temp symlink + atomic rename to avoid cross-process race conditions\n const tempDest = tempSuffix(dest);\n const queue = new Queue(1);\n queue.defer((cb) => mkdirp(path.dirname(dest), (err) => cb(err)));\n // biome-ignore lint/style/noNonNullAssertion: cache always sets cachedAt when err is null\n queue.defer((cb) => fs.symlink(cachedAt!, tempDest, symlinkType, (err) => cb(err)));\n queue.defer((cb) => {\n fs.rename(tempDest, dest, (err) => {\n // If rename fails because dest exists, another process won - that's ok\n if (err && ['EEXIST', 'ENOTEMPTY', 'EPERM'].indexOf(err.code ?? '') >= 0) {\n safeRm(tempDest, () => cb());\n return;\n }\n cb(err);\n });\n });\n queue.await((err) => {\n err ? safeRm(tempDest, () => callback(err)) : callback(undefined, dest);\n });\n });\n });\n}\n"],"names":["installModule","process","isWindows","platform","test","env","OSTYPE","symlinkType","installString","nodeModulesPath","options","callback","path","cachePath","DEFAULT_CACHE_PATH","name","parseInstallString","dest","join","split","fs","stat","err","undefined","cache","cachedAt","console","log","message","tempDest","tempSuffix","queue","Queue","defer","cb","mkdirp","dirname","symlink","rename","indexOf","code","safeRm","await"],"mappings":";;;;+BAeA;;;eAAwBA;;;yDAfT;8BACQ;oEACJ;2DACF;8DACC;iEACK;2BACY;8DACjB;2EACa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAE0CC;AAAzE,IAAMC,YAAYD,QAAQE,QAAQ,KAAK,WAAW,kBAAkBC,IAAI,EAACH,sBAAAA,QAAQI,GAAG,CAACC,MAAM,cAAlBL,iCAAAA,sBAAsB;AAC/F,IAAMM,cAAcL,YAAY,aAAa;AAI9B,SAASF,cAAcQ,aAAqB,EAAEC,eAAuB,EAAEC,OAAuB,EAAEC,QAAyB;QAGzHC;IAFb,IAAMC,YAAYH,QAAQG,SAAS,IAAIC,+BAAkB;IACzD,IAAM,AAAEC,OAASC,IAAAA,6BAAkB,EAACR,eAA5BO;IACR,IAAME,OAAOL,CAAAA,SAAAA,aAAI,EAACM,IAAI,OAATN,QAAAA;QAAUH;KAAoC,CAA9CG,OAA2B,qBAAGG,KAAKI,KAAK,CAAC;IAEtDC,WAAE,CAACC,IAAI,CAACJ,MAAM,SAACK;QACb,IAAI,CAACA,KAAK,OAAOX,SAASY,WAAWN,OAAO,oBAAoB;QAEhEO,IAAAA,gBAAK,EAAChB,eAAeK,WAAW,SAACS,KAAKG;YACpC,IAAIH,KAAK;gBACPI,QAAQC,GAAG,CAAC,AAAC,sBAAgDL,OAA3Bd,eAAc,eAAyB,OAAZc,IAAIM,OAAO;gBACxE,OAAOjB,SAASW;YAClB;YAEA,0EAA0E;YAC1E,IAAMO,WAAWC,IAAAA,mBAAU,EAACb;YAC5B,IAAMc,QAAQ,IAAIC,gBAAK,CAAC;YACxBD,MAAME,KAAK,CAAC,SAACC;uBAAOC,IAAAA,sBAAM,EAACvB,aAAI,CAACwB,OAAO,CAACnB,OAAO,SAACK;2BAAQY,GAAGZ;;;YAC3D,0FAA0F;YAC1FS,MAAME,KAAK,CAAC,SAACC;uBAAOd,WAAE,CAACiB,OAAO,CAACZ,UAAWI,UAAUtB,aAAa,SAACe;2BAAQY,GAAGZ;;;YAC7ES,MAAME,KAAK,CAAC,SAACC;gBACXd,WAAE,CAACkB,MAAM,CAACT,UAAUZ,MAAM,SAACK;wBAE2BA;oBADpD,uEAAuE;oBACvE,IAAIA,OAAO;wBAAC;wBAAU;wBAAa;qBAAQ,CAACiB,OAAO,EAACjB,YAAAA,IAAIkB,IAAI,cAARlB,uBAAAA,YAAY,OAAO,GAAG;wBACxEmB,IAAAA,sBAAM,EAACZ,UAAU;mCAAMK;;wBACvB;oBACF;oBACAA,GAAGZ;gBACL;YACF;YACAS,MAAMW,KAAK,CAAC,SAACpB;gBACXA,MAAMmB,IAAAA,sBAAM,EAACZ,UAAU;2BAAMlB,SAASW;qBAAQX,SAASY,WAAWN;YACpE;QACF;IACF;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default function installModuleSync(installString: string, nodeModulesPath: string, options?: object): string | undefined;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default function installModuleSync(installString: string, nodeModulesPath: string, options?: object): string | undefined;
|
package/dist/cjs/workers/sync.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "default", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return installModuleSync;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
var _module = /*#__PURE__*/ _interop_require_default(require("module"));
|
|
12
|
-
var _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
|
13
|
-
var _url = /*#__PURE__*/ _interop_require_default(require("url"));
|
|
14
|
-
function _interop_require_default(obj) {
|
|
15
|
-
return obj && obj.__esModule ? obj : {
|
|
16
|
-
default: obj
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
var _require = typeof require === 'undefined' ? _module.default.createRequire(require("url").pathToFileURL(__filename).toString()) : require;
|
|
20
|
-
var __dirname = _path.default.dirname(typeof __filename !== 'undefined' ? __filename : _url.default.fileURLToPath(require("url").pathToFileURL(__filename).toString()));
|
|
21
|
-
// Worker MUST always load from dist/cjs/ for old Node compatibility (works from both cjs and esm)
|
|
22
|
-
var workerPath = _path.default.join(__dirname, '..', '..', 'cjs', 'workers', 'async.js');
|
|
23
|
-
var functionExec = null; // break dependencies
|
|
24
|
-
function installModuleSync(installString, nodeModulesPath, options) {
|
|
25
|
-
if (!functionExec) functionExec = _require('function-exec-sync');
|
|
26
|
-
return functionExec === null || functionExec === void 0 ? void 0 : functionExec({
|
|
27
|
-
callbacks: true
|
|
28
|
-
}, workerPath, installString, nodeModulesPath, options);
|
|
29
|
-
}
|
|
30
|
-
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/install-module-linked-compat/src/workers/sync.ts"],"sourcesContent":["import Module from 'module';\nimport path from 'path';\nimport url from 'url';\n\nconst _require = typeof require === 'undefined' ? Module.createRequire(import.meta.url) : require;\nconst __dirname = path.dirname(typeof __filename !== 'undefined' ? __filename : url.fileURLToPath(import.meta.url));\n\n// Worker MUST always load from dist/cjs/ for old Node compatibility (works from both cjs and esm)\nconst workerPath = path.join(__dirname, '..', '..', 'cjs', 'workers', 'async.js');\n\nlet functionExec: ((opts: object, ...args: unknown[]) => unknown) | null = null; // break dependencies\nexport default function installModuleSync(installString: string, nodeModulesPath: string, options?: object): string | undefined {\n if (!functionExec) functionExec = _require('function-exec-sync');\n return functionExec?.({ callbacks: true }, workerPath, installString, nodeModulesPath, options) as string | undefined;\n}\n"],"names":["installModuleSync","_require","require","Module","createRequire","__dirname","path","dirname","__filename","url","fileURLToPath","workerPath","join","functionExec","installString","nodeModulesPath","options","callbacks"],"mappings":";;;;+BAWA;;;eAAwBA;;;6DAXL;2DACF;0DACD;;;;;;AAEhB,IAAMC,WAAW,OAAOC,YAAY,cAAcC,eAAM,CAACC,aAAa,CAAC,uDAAmBF;AAC1F,IAAMG,YAAYC,aAAI,CAACC,OAAO,CAAC,OAAOC,eAAe,cAAcA,aAAaC,YAAG,CAACC,aAAa,CAAC;AAElG,kGAAkG;AAClG,IAAMC,aAAaL,aAAI,CAACM,IAAI,CAACP,WAAW,MAAM,MAAM,OAAO,WAAW;AAEtE,IAAIQ,eAAuE,MAAM,qBAAqB;AACvF,SAASb,kBAAkBc,aAAqB,EAAEC,eAAuB,EAAEC,OAAgB;IACxG,IAAI,CAACH,cAAcA,eAAeZ,SAAS;IAC3C,OAAOY,yBAAAA,mCAAAA,aAAe;QAAEI,WAAW;IAAK,GAAGN,YAAYG,eAAeC,iBAAiBC;AACzF"}
|
package/dist/esm/constants.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const DEFAULT_CACHE_PATH: string;
|
package/dist/esm/constants.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/install-module-linked-compat/src/constants.ts"],"sourcesContent":["import path from 'path';\n\nimport { homedir } from './compat.ts';\n\nexport const DEFAULT_CACHE_PATH = path.join(homedir(), '.iml') as string;\n"],"names":["path","homedir","DEFAULT_CACHE_PATH","join"],"mappings":"AAAA,OAAOA,UAAU,OAAO;AAExB,SAASC,OAAO,QAAQ,cAAc;AAEtC,OAAO,MAAMC,qBAAqBF,KAAKG,IAAI,CAACF,WAAW,QAAkB"}
|
package/dist/esm/lib/cache.d.ts
DELETED
package/dist/esm/lib/cache.js
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import { safeRm } from 'fs-remove-compat';
|
|
3
|
-
import lockfile from 'lockfile';
|
|
4
|
-
import mkdirp from 'mkdirp-classic';
|
|
5
|
-
import path from 'path';
|
|
6
|
-
import Queue from 'queue-cb';
|
|
7
|
-
import tempSuffix from 'temp-suffix';
|
|
8
|
-
import getSpecifier from './getSpecifier.js';
|
|
9
|
-
import install from './install.js';
|
|
10
|
-
import parse from './parseInstallString.js';
|
|
11
|
-
import renameWithFallback from './renameWithFallback.js';
|
|
12
|
-
const LOCK_OPTIONS = {
|
|
13
|
-
wait: 600000,
|
|
14
|
-
pollPeriod: 100,
|
|
15
|
-
stale: 660000,
|
|
16
|
-
retries: 3
|
|
17
|
-
};
|
|
18
|
-
export default function ensureCached(installString, cachePath, callback) {
|
|
19
|
-
getSpecifier(installString, (err, specifier)=>{
|
|
20
|
-
if (err) return callback(err);
|
|
21
|
-
// biome-ignore lint/style/noNonNullAssertion: getSpecifier always sets the specifier when err is null
|
|
22
|
-
const cachedAt = path.join(cachePath, specifier);
|
|
23
|
-
const lockPath = `${cachedAt}.lock`;
|
|
24
|
-
const readyPath = path.join(cachedAt, '.ready');
|
|
25
|
-
const { name } = parse(installString);
|
|
26
|
-
// Check if already cached AND complete (fast path, no lock needed)
|
|
27
|
-
fs.stat(readyPath, (readyErr)=>{
|
|
28
|
-
if (!readyErr) return callback(undefined, cachedAt); // Valid cache
|
|
29
|
-
// Not cached or incomplete - acquire lock and install
|
|
30
|
-
doLockedInstall();
|
|
31
|
-
});
|
|
32
|
-
function doLockedInstall() {
|
|
33
|
-
// Ensure lock file's parent directory exists (handles scoped packages like @scope/pkg)
|
|
34
|
-
mkdirp(path.dirname(lockPath), (mkdirErr)=>{
|
|
35
|
-
if (mkdirErr) return callback(mkdirErr);
|
|
36
|
-
const startTime = Date.now();
|
|
37
|
-
// Retry loop for Windows EPERM - treat it like EEXIST (lock held by another process)
|
|
38
|
-
function tryLock(cb) {
|
|
39
|
-
lockfile.lock(lockPath, {
|
|
40
|
-
...LOCK_OPTIONS
|
|
41
|
-
}, (lockErr)=>{
|
|
42
|
-
if (lockErr && lockErr.code === 'EPERM' && Date.now() - startTime < LOCK_OPTIONS.wait) {
|
|
43
|
-
setTimeout(()=>tryLock(cb), LOCK_OPTIONS.pollPeriod);
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
cb(lockErr);
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
tryLock((lockErr)=>{
|
|
50
|
-
if (lockErr) return callback(lockErr);
|
|
51
|
-
// Single exit point - always unlock before calling back
|
|
52
|
-
function done(err) {
|
|
53
|
-
lockfile.unlock(lockPath, ()=>callback(err, err ? undefined : cachedAt));
|
|
54
|
-
}
|
|
55
|
-
// Re-check cache (another process may have completed while we waited for lock)
|
|
56
|
-
fs.stat(readyPath, (readyErr)=>{
|
|
57
|
-
if (!readyErr) return done(); // Cache appeared while we waited
|
|
58
|
-
// Clean up any incomplete cache before installing
|
|
59
|
-
safeRm(cachedAt, (rmErr)=>{
|
|
60
|
-
if (rmErr) return done(rmErr);
|
|
61
|
-
doInstall(done);
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
function doInstall(cb) {
|
|
68
|
-
const tmp = `${cachedAt}-${tempSuffix()}`;
|
|
69
|
-
const tmpModulePath = path.join(tmp, 'node_modules', ...name.split('/'));
|
|
70
|
-
const queue = new Queue(1);
|
|
71
|
-
queue.defer((cb)=>mkdirp(tmp, (err)=>cb(err)));
|
|
72
|
-
queue.defer((cb)=>fs.writeFile(path.join(tmp, 'package.json'), '{}', 'utf8', (err)=>cb(err)));
|
|
73
|
-
// biome-ignore lint/style/noNonNullAssertion: getSpecifier always sets the specifier when err is null
|
|
74
|
-
queue.defer(install.bind(null, specifier, tmp));
|
|
75
|
-
queue.defer((qcb)=>{
|
|
76
|
-
// Verify npm actually created the package directory - npm may silently skip
|
|
77
|
-
// installation (exit 0) when platform doesn't match (os/cpu/libc fields)
|
|
78
|
-
fs.stat(tmpModulePath, (statErr)=>{
|
|
79
|
-
if (statErr) return qcb(new Error(`Package directory not created by npm. This may happen when the package has platform restrictions (os/cpu/libc) that don't match the current system: ${tmpModulePath}`));
|
|
80
|
-
qcb();
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
queue.defer(renameWithFallback.bind(null, tmpModulePath, cachedAt));
|
|
84
|
-
queue.defer(renameWithFallback.bind(null, path.join(tmp, 'node_modules'), path.join(cachedAt, 'node_modules')));
|
|
85
|
-
// Write .ready marker after both renames succeed
|
|
86
|
-
queue.defer((cb)=>fs.writeFile(readyPath, '', 'utf8', (err)=>cb(err)));
|
|
87
|
-
queue.await((queueErr)=>{
|
|
88
|
-
// Clean up temp directory whether installed or not
|
|
89
|
-
safeRm(tmp, ()=>cb(queueErr));
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/install-module-linked-compat/src/lib/cache.ts"],"sourcesContent":["import fs from 'fs';\nimport { safeRm } from 'fs-remove-compat';\nimport lockfile from 'lockfile';\nimport mkdirp from 'mkdirp-classic';\nimport path from 'path';\nimport Queue from 'queue-cb';\nimport tempSuffix from 'temp-suffix';\nimport type { EnsureCachedCallback } from '../types.ts';\nimport getSpecifier from './getSpecifier.ts';\nimport install from './install.ts';\nimport parse from './parseInstallString.ts';\nimport renameWithFallback from './renameWithFallback.ts';\n\nconst LOCK_OPTIONS = {\n wait: 600000, // Wait up to 10 minutes for lock (npm installs can be slow)\n pollPeriod: 100, // Check every 100ms\n stale: 660000, // Consider locks stale after 11 minutes (must be > wait)\n retries: 3, // Retry 3 times on transient errors\n};\n\nexport default function ensureCached(installString: string, cachePath: string, callback: EnsureCachedCallback) {\n getSpecifier(installString, (err, specifier) => {\n if (err) return callback(err);\n // biome-ignore lint/style/noNonNullAssertion: getSpecifier always sets the specifier when err is null\n const cachedAt = path.join(cachePath, specifier!);\n const lockPath = `${cachedAt}.lock`;\n const readyPath = path.join(cachedAt, '.ready');\n const { name } = parse(installString);\n\n // Check if already cached AND complete (fast path, no lock needed)\n fs.stat(readyPath, (readyErr: NodeJS.ErrnoException | null) => {\n if (!readyErr) return callback(undefined, cachedAt); // Valid cache\n\n // Not cached or incomplete - acquire lock and install\n doLockedInstall();\n });\n\n function doLockedInstall() {\n // Ensure lock file's parent directory exists (handles scoped packages like @scope/pkg)\n mkdirp(path.dirname(lockPath), (mkdirErr: Error | null) => {\n if (mkdirErr) return callback(mkdirErr);\n\n const startTime = Date.now();\n\n // Retry loop for Windows EPERM - treat it like EEXIST (lock held by another process)\n function tryLock(cb: (err?: Error | null) => void) {\n lockfile.lock(lockPath, { ...LOCK_OPTIONS }, (lockErr: Error | null) => {\n if (lockErr && (lockErr as NodeJS.ErrnoException).code === 'EPERM' && Date.now() - startTime < LOCK_OPTIONS.wait) {\n setTimeout(() => tryLock(cb), LOCK_OPTIONS.pollPeriod);\n return;\n }\n cb(lockErr);\n });\n }\n\n tryLock((lockErr) => {\n if (lockErr) return callback(lockErr);\n\n // Single exit point - always unlock before calling back\n function done(err?: Error | null) {\n lockfile.unlock(lockPath, () => callback(err, err ? undefined : cachedAt));\n }\n\n // Re-check cache (another process may have completed while we waited for lock)\n fs.stat(readyPath, (readyErr: NodeJS.ErrnoException | null) => {\n if (!readyErr) return done(); // Cache appeared while we waited\n\n // Clean up any incomplete cache before installing\n safeRm(cachedAt, (rmErr) => {\n if (rmErr) return done(rmErr);\n doInstall(done);\n });\n });\n });\n });\n }\n\n function doInstall(cb: (err?: Error | null) => void) {\n const tmp = `${cachedAt}-${tempSuffix()}`;\n const tmpModulePath = path.join(tmp, 'node_modules', ...name.split('/'));\n\n const queue = new Queue(1);\n queue.defer((cb) => mkdirp(tmp, (err) => cb(err)));\n queue.defer((cb) => fs.writeFile(path.join(tmp, 'package.json'), '{}', 'utf8', (err) => cb(err)));\n // biome-ignore lint/style/noNonNullAssertion: getSpecifier always sets the specifier when err is null\n queue.defer(install.bind(null, specifier!, tmp));\n queue.defer((qcb) => {\n // Verify npm actually created the package directory - npm may silently skip\n // installation (exit 0) when platform doesn't match (os/cpu/libc fields)\n fs.stat(tmpModulePath, (statErr) => {\n if (statErr) return qcb(new Error(`Package directory not created by npm. This may happen when the package has platform restrictions (os/cpu/libc) that don't match the current system: ${tmpModulePath}`));\n qcb();\n });\n });\n queue.defer(renameWithFallback.bind(null, tmpModulePath, cachedAt));\n queue.defer(renameWithFallback.bind(null, path.join(tmp, 'node_modules'), path.join(cachedAt, 'node_modules')));\n // Write .ready marker after both renames succeed\n queue.defer((cb) => fs.writeFile(readyPath, '', 'utf8', (err) => cb(err)));\n queue.await((queueErr) => {\n // Clean up temp directory whether installed or not\n safeRm(tmp, () => cb(queueErr));\n });\n }\n });\n}\n"],"names":["fs","safeRm","lockfile","mkdirp","path","Queue","tempSuffix","getSpecifier","install","parse","renameWithFallback","LOCK_OPTIONS","wait","pollPeriod","stale","retries","ensureCached","installString","cachePath","callback","err","specifier","cachedAt","join","lockPath","readyPath","name","stat","readyErr","undefined","doLockedInstall","dirname","mkdirErr","startTime","Date","now","tryLock","cb","lock","lockErr","code","setTimeout","done","unlock","rmErr","doInstall","tmp","tmpModulePath","split","queue","defer","writeFile","bind","qcb","statErr","Error","await","queueErr"],"mappings":"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"}
|
package/dist/esm/lib/clear.d.ts
DELETED
package/dist/esm/lib/clear.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/install-module-linked-compat/src/lib/clear.ts"],"sourcesContent":["import { safeRmSync } from 'fs-remove-compat';\nimport { DEFAULT_CACHE_PATH } from '../constants.ts';\n\nimport type { CleanOptions } from '../types.ts';\n\nexport default function clear(_options?: CleanOptions) {\n safeRmSync(DEFAULT_CACHE_PATH);\n console.log(`Cleaned ${DEFAULT_CACHE_PATH}`);\n}\n"],"names":["safeRmSync","DEFAULT_CACHE_PATH","clear","_options","console","log"],"mappings":"AAAA,SAASA,UAAU,QAAQ,mBAAmB;AAC9C,SAASC,kBAAkB,QAAQ,kBAAkB;AAIrD,eAAe,SAASC,MAAMC,QAAuB;IACnDH,WAAWC;IACXG,QAAQC,GAAG,CAAC,CAAC,QAAQ,EAAEJ,oBAAoB;AAC7C"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { getContent } from 'get-file-compat';
|
|
2
|
-
import parseInstallString from './parseInstallString.js';
|
|
3
|
-
export default function getSpecifier(installString, callback) {
|
|
4
|
-
const { name, version } = parseInstallString(installString);
|
|
5
|
-
if (version) return callback(undefined, installString);
|
|
6
|
-
// URL-encode the package name (handles scoped packages: @scope/pkg -> @scope%2Fpkg)
|
|
7
|
-
const encodedName = encodeURIComponent(name).replace(/%40/g, '@');
|
|
8
|
-
getContent(`https://registry.npmjs.org/${encodedName}/latest`, 'utf8', (err, res)=>{
|
|
9
|
-
if (err) return callback(err);
|
|
10
|
-
try {
|
|
11
|
-
var _ref;
|
|
12
|
-
const json = JSON.parse((_ref = res === null || res === void 0 ? void 0 : res.content) !== null && _ref !== void 0 ? _ref : 'null');
|
|
13
|
-
callback(undefined, `${name}@${json.version}`);
|
|
14
|
-
} catch (err) {
|
|
15
|
-
callback(err);
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/install-module-linked-compat/src/lib/getSpecifier.ts"],"sourcesContent":["import { getContent } from 'get-file-compat';\nimport type { GetScopedSpecifiedCallback } from '../types.ts';\nimport parseInstallString from './parseInstallString.ts';\n\ninterface JSONPackage {\n version: string;\n}\n\nexport default function getSpecifier(installString: string, callback: GetScopedSpecifiedCallback) {\n const { name, version } = parseInstallString(installString);\n if (version) return callback(undefined, installString);\n\n // URL-encode the package name (handles scoped packages: @scope/pkg -> @scope%2Fpkg)\n const encodedName = encodeURIComponent(name).replace(/%40/g, '@');\n getContent(`https://registry.npmjs.org/${encodedName}/latest`, 'utf8', (err, res) => {\n if (err) return callback(err);\n try {\n const json = JSON.parse(res?.content ?? 'null');\n callback(undefined, `${name}@${(json as JSONPackage).version}`);\n } catch (err) {\n callback(err as Error);\n }\n });\n}\n"],"names":["getContent","parseInstallString","getSpecifier","installString","callback","name","version","undefined","encodedName","encodeURIComponent","replace","err","res","json","JSON","parse","content"],"mappings":"AAAA,SAASA,UAAU,QAAQ,kBAAkB;AAE7C,OAAOC,wBAAwB,0BAA0B;AAMzD,eAAe,SAASC,aAAaC,aAAqB,EAAEC,QAAoC;IAC9F,MAAM,EAAEC,IAAI,EAAEC,OAAO,EAAE,GAAGL,mBAAmBE;IAC7C,IAAIG,SAAS,OAAOF,SAASG,WAAWJ;IAExC,oFAAoF;IACpF,MAAMK,cAAcC,mBAAmBJ,MAAMK,OAAO,CAAC,QAAQ;IAC7DV,WAAW,CAAC,2BAA2B,EAAEQ,YAAY,OAAO,CAAC,EAAE,QAAQ,CAACG,KAAKC;QAC3E,IAAID,KAAK,OAAOP,SAASO;QACzB,IAAI;;YACF,MAAME,OAAOC,KAAKC,KAAK,SAACH,gBAAAA,0BAAAA,IAAKI,OAAO,uCAAI;YACxCZ,SAASG,WAAW,GAAGF,KAAK,CAAC,EAAE,AAACQ,KAAqBP,OAAO,EAAE;QAChE,EAAE,OAAOK,KAAK;YACZP,SAASO;QACX;IACF;AACF"}
|
package/dist/esm/lib/install.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import spawn from 'cross-spawn-cb';
|
|
2
|
-
import { bind } from 'node-version-call-local';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
import url from 'url';
|
|
5
|
-
const __dirname = path.dirname(typeof __filename !== 'undefined' ? __filename : url.fileURLToPath(import.meta.url));
|
|
6
|
-
const major = +process.versions.node.split('.')[0];
|
|
7
|
-
const workerPath = path.join(__dirname, '..', '..', 'cjs', 'lib', 'install.js');
|
|
8
|
-
function run(specifier, dest, callback) {
|
|
9
|
-
spawn('npm', [
|
|
10
|
-
'install',
|
|
11
|
-
specifier
|
|
12
|
-
], {
|
|
13
|
-
cwd: dest
|
|
14
|
-
}, (err)=>{
|
|
15
|
-
err ? callback(err) : callback(undefined, path.join(dest, ...specifier.split('/')));
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
const worker = major > 0 ? run : bind('>0.12', workerPath, {
|
|
19
|
-
callbacks: true
|
|
20
|
-
});
|
|
21
|
-
export default function install(specifier, dest, callback) {
|
|
22
|
-
worker(specifier, dest, callback);
|
|
23
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/install-module-linked-compat/src/lib/install.ts"],"sourcesContent":["import spawn from 'cross-spawn-cb';\nimport { bind } from 'node-version-call-local';\nimport path from 'path';\nimport url from 'url';\nimport type { InstallCallback } from '../types.ts';\n\nconst __dirname = path.dirname(typeof __filename !== 'undefined' ? __filename : url.fileURLToPath(import.meta.url));\nconst major = +process.versions.node.split('.')[0];\nconst workerPath = path.join(__dirname, '..', '..', 'cjs', 'lib', 'install.js');\n\nfunction run(specifier: string, dest: string, callback: InstallCallback): void {\n spawn('npm', ['install', specifier], { cwd: dest }, (err) => {\n err ? callback(err) : callback(undefined, path.join(dest, ...specifier.split('/')));\n });\n}\n\ntype installFunction = (specifier: string, dest: string, callback: InstallCallback) => void;\n\nconst worker = (major > 0 ? run : bind('>0.12', workerPath, { callbacks: true })) as installFunction;\n\nexport default function install(specifier: string, dest: string, callback: InstallCallback): void {\n worker(specifier, dest, callback);\n}\n"],"names":["spawn","bind","path","url","__dirname","dirname","__filename","fileURLToPath","major","process","versions","node","split","workerPath","join","run","specifier","dest","callback","cwd","err","undefined","worker","callbacks","install"],"mappings":"AAAA,OAAOA,WAAW,iBAAiB;AACnC,SAASC,IAAI,QAAQ,0BAA0B;AAC/C,OAAOC,UAAU,OAAO;AACxB,OAAOC,SAAS,MAAM;AAGtB,MAAMC,YAAYF,KAAKG,OAAO,CAAC,OAAOC,eAAe,cAAcA,aAAaH,IAAII,aAAa,CAAC,YAAYJ,GAAG;AACjH,MAAMK,QAAQ,CAACC,QAAQC,QAAQ,CAACC,IAAI,CAACC,KAAK,CAAC,IAAI,CAAC,EAAE;AAClD,MAAMC,aAAaX,KAAKY,IAAI,CAACV,WAAW,MAAM,MAAM,OAAO,OAAO;AAElE,SAASW,IAAIC,SAAiB,EAAEC,IAAY,EAAEC,QAAyB;IACrElB,MAAM,OAAO;QAAC;QAAWgB;KAAU,EAAE;QAAEG,KAAKF;IAAK,GAAG,CAACG;QACnDA,MAAMF,SAASE,OAAOF,SAASG,WAAWnB,KAAKY,IAAI,CAACG,SAASD,UAAUJ,KAAK,CAAC;IAC/E;AACF;AAIA,MAAMU,SAAUd,QAAQ,IAAIO,MAAMd,KAAK,SAASY,YAAY;IAAEU,WAAW;AAAK;AAE9E,eAAe,SAASC,QAAQR,SAAiB,EAAEC,IAAY,EAAEC,QAAyB;IACxFI,OAAON,WAAWC,MAAMC;AAC1B"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export default function parseInstallString(installString) {
|
|
2
|
-
var _installParts_pop;
|
|
3
|
-
const installParts = installString.split('/');
|
|
4
|
-
const nameVersionParts = ((_installParts_pop = installParts.pop()) !== null && _installParts_pop !== void 0 ? _installParts_pop : '').split('@');
|
|
5
|
-
const version = nameVersionParts.length > 1 ? nameVersionParts.pop() : undefined;
|
|
6
|
-
const name = [
|
|
7
|
-
...installParts,
|
|
8
|
-
nameVersionParts.join('@')
|
|
9
|
-
].join('/');
|
|
10
|
-
return {
|
|
11
|
-
name,
|
|
12
|
-
version
|
|
13
|
-
};
|
|
14
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/install-module-linked-compat/src/lib/parseInstallString.ts"],"sourcesContent":["export default function parseInstallString(installString: string) {\n const installParts = installString.split('/');\n const nameVersionParts = (installParts.pop() ?? '').split('@');\n const version = nameVersionParts.length > 1 ? nameVersionParts.pop() : undefined;\n const name = [...installParts, nameVersionParts.join('@')].join('/');\n return {\n name,\n version,\n };\n}\n"],"names":["parseInstallString","installString","installParts","split","nameVersionParts","pop","version","length","undefined","name","join"],"mappings":"AAAA,eAAe,SAASA,mBAAmBC,aAAqB;QAEpCC;IAD1B,MAAMA,eAAeD,cAAcE,KAAK,CAAC;IACzC,MAAMC,mBAAmB,EAACF,oBAAAA,aAAaG,GAAG,gBAAhBH,+BAAAA,oBAAsB,IAAIC,KAAK,CAAC;IAC1D,MAAMG,UAAUF,iBAAiBG,MAAM,GAAG,IAAIH,iBAAiBC,GAAG,KAAKG;IACvE,MAAMC,OAAO;WAAIP;QAAcE,iBAAiBM,IAAI,CAAC;KAAK,CAACA,IAAI,CAAC;IAChE,OAAO;QACLD;QACAH;IACF;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default function renameWithFallback(src: string, dest: string, callback: (err?: Error | null) => void): void;
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
export default function renameWithFallback(src, dest, callback) {
|
|
3
|
-
fs.rename(src, dest, (err)=>{
|
|
4
|
-
if (!err) return callback();
|
|
5
|
-
// Another process may have already created dest - check if it exists
|
|
6
|
-
// On Windows, concurrent renames to the same destination throw EPERM
|
|
7
|
-
if (err.code === 'EEXIST' || err.code === 'ENOTEMPTY' || err.code === 'EPERM') {
|
|
8
|
-
fs.stat(dest, (statErr)=>{
|
|
9
|
-
if (!statErr) return callback(); // dest exists, race was won by another process
|
|
10
|
-
callback(err); // dest doesn't exist, actual error
|
|
11
|
-
});
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
callback(err);
|
|
15
|
-
});
|
|
16
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/install-module-linked-compat/src/lib/renameWithFallback.ts"],"sourcesContent":["import fs from 'fs';\n\nexport default function renameWithFallback(src: string, dest: string, callback: (err?: Error | null) => void): void {\n fs.rename(src, dest, (err) => {\n if (!err) return callback();\n\n // Another process may have already created dest - check if it exists\n // On Windows, concurrent renames to the same destination throw EPERM\n if (err.code === 'EEXIST' || err.code === 'ENOTEMPTY' || err.code === 'EPERM') {\n fs.stat(dest, (statErr) => {\n if (!statErr) return callback(); // dest exists, race was won by another process\n callback(err); // dest doesn't exist, actual error\n });\n return;\n }\n\n callback(err);\n });\n}\n"],"names":["fs","renameWithFallback","src","dest","callback","rename","err","code","stat","statErr"],"mappings":"AAAA,OAAOA,QAAQ,KAAK;AAEpB,eAAe,SAASC,mBAAmBC,GAAW,EAAEC,IAAY,EAAEC,QAAsC;IAC1GJ,GAAGK,MAAM,CAACH,KAAKC,MAAM,CAACG;QACpB,IAAI,CAACA,KAAK,OAAOF;QAEjB,qEAAqE;QACrE,qEAAqE;QACrE,IAAIE,IAAIC,IAAI,KAAK,YAAYD,IAAIC,IAAI,KAAK,eAAeD,IAAIC,IAAI,KAAK,SAAS;YAC7EP,GAAGQ,IAAI,CAACL,MAAM,CAACM;gBACb,IAAI,CAACA,SAAS,OAAOL,YAAY,+CAA+C;gBAChFA,SAASE,MAAM,mCAAmC;YACpD;YACA;QACF;QAEAF,SAASE;IACX;AACF"}
|
package/dist/esm/types.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export interface CleanOptions {
|
|
2
|
-
slient?: boolean;
|
|
3
|
-
}
|
|
4
|
-
export type GetScopedSpecifiedCallback = (err?: Error | null, installSpecifier?: string) => void;
|
|
5
|
-
export type EnsureCachedCallback = (err?: Error | null, cachedAt?: string) => void;
|
|
6
|
-
export type InstallCallback = (err?: Error | null, installedAt?: string) => void;
|
|
7
|
-
export interface InstallOptions {
|
|
8
|
-
cachePath?: string;
|
|
9
|
-
}
|
package/dist/esm/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { };
|