@nimbus-sh/worker 0.1.4 → 0.1.6
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 +37 -0
- package/dist/_shared/crypto.d.ts +15 -0
- package/dist/_shared/crypto.d.ts.map +1 -0
- package/dist/_shared/crypto.js +122 -0
- package/dist/facets/manager.d.ts +24 -0
- package/dist/facets/manager.d.ts.map +1 -1
- package/dist/facets/manager.js +279 -70
- package/dist/facets/process.d.ts +11 -2
- package/dist/facets/process.d.ts.map +1 -1
- package/dist/facets/process.js +187 -21
- package/dist/facets/vite-dev-server.d.ts +2 -0
- package/dist/facets/vite-dev-server.d.ts.map +1 -1
- package/dist/facets/vite-dev-server.js +39 -12
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/loaders/child-process/spawn-facet.d.ts +1 -3
- package/dist/loaders/child-process/spawn-facet.d.ts.map +1 -1
- package/dist/loaders/child-process/spawn-facet.js +1 -12
- package/dist/loaders/child-process/spawn-pool.d.ts +1 -1
- package/dist/loaders/child-process/spawn-pool.d.ts.map +1 -1
- package/dist/loaders/child-process/spawn-pool.js +1 -6
- package/dist/loaders/loader-pool.d.ts +7 -0
- package/dist/loaders/loader-pool.d.ts.map +1 -1
- package/dist/loaders/loader-pool.js +3 -1
- package/dist/npm/installer.d.ts.map +1 -1
- package/dist/npm/installer.js +47 -27
- package/dist/npm/pre-bundle-facet.d.ts.map +1 -1
- package/dist/npm/pre-bundle-facet.js +2 -1
- package/dist/npm/resolve-one-facet.d.ts.map +1 -1
- package/dist/npm/resolve-one-facet.js +41 -13
- package/dist/npm/resolver.d.ts.map +1 -1
- package/dist/npm/resolver.js +70 -35
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +45 -21
- package/dist/router/remote-api.d.ts.map +1 -1
- package/dist/router/remote-api.js +29 -8
- package/dist/runtime/barrel-synthesizer.d.ts +7 -0
- package/dist/runtime/barrel-synthesizer.d.ts.map +1 -1
- package/dist/runtime/barrel-synthesizer.js +11 -0
- package/dist/runtime/clang-runner.d.ts +2 -2
- package/dist/runtime/clang-runner.d.ts.map +1 -1
- package/dist/runtime/clang-runner.js +64 -47
- package/dist/runtime/esbuild-service.d.ts +12 -5
- package/dist/runtime/esbuild-service.d.ts.map +1 -1
- package/dist/runtime/esbuild-service.js +28 -14
- package/dist/runtime/node-runner.d.ts +2 -0
- package/dist/runtime/node-runner.d.ts.map +1 -1
- package/dist/runtime/node-shims.d.ts +4 -2
- package/dist/runtime/node-shims.d.ts.map +1 -1
- package/dist/runtime/node-shims.js +404 -55
- package/dist/runtime/os-contracts.d.ts +128 -0
- package/dist/runtime/os-contracts.d.ts.map +1 -0
- package/dist/runtime/os-contracts.js +1 -0
- package/dist/runtime/package-manager.d.ts +31 -0
- package/dist/runtime/package-manager.d.ts.map +1 -1
- package/dist/runtime/package-manager.js +162 -15
- package/dist/runtime/port-registry.d.ts +5 -0
- package/dist/runtime/port-registry.d.ts.map +1 -1
- package/dist/runtime/port-registry.js +22 -1
- package/dist/runtime/pyodide-runtime-assets.d.ts +19 -0
- package/dist/runtime/pyodide-runtime-assets.d.ts.map +1 -0
- package/dist/runtime/pyodide-runtime-assets.js +44 -0
- package/dist/runtime/python-repl.d.ts +3 -0
- package/dist/runtime/python-repl.d.ts.map +1 -1
- package/dist/runtime/python-repl.js +18 -32
- package/dist/runtime/python-runner.d.ts +8 -9
- package/dist/runtime/python-runner.d.ts.map +1 -1
- package/dist/runtime/python-runner.js +958 -118
- package/dist/runtime/python-socket-shim.d.ts +11 -0
- package/dist/runtime/python-socket-shim.d.ts.map +1 -0
- package/dist/runtime/python-socket-shim.js +526 -0
- package/dist/runtime/require-resolver.d.ts.map +1 -1
- package/dist/runtime/require-resolver.js +2 -11
- package/dist/runtime/ruby-gems.d.ts +25 -0
- package/dist/runtime/ruby-gems.d.ts.map +1 -0
- package/dist/runtime/ruby-gems.js +582 -0
- package/dist/runtime/ruby-runner.d.ts +2 -4
- package/dist/runtime/ruby-runner.d.ts.map +1 -1
- package/dist/runtime/ruby-runner.js +335 -34
- package/dist/runtime/runtime-catalog.d.ts +16 -4
- package/dist/runtime/runtime-catalog.d.ts.map +1 -1
- package/dist/runtime/runtime-catalog.js +21 -10
- package/dist/runtime/runtime-registry.d.ts +3 -0
- package/dist/runtime/runtime-registry.d.ts.map +1 -1
- package/dist/runtime/runtime-registry.js +4 -0
- package/dist/runtime/sqlite-runtime-fs-bridge.d.ts +43 -0
- package/dist/runtime/sqlite-runtime-fs-bridge.d.ts.map +1 -0
- package/dist/runtime/sqlite-runtime-fs-bridge.js +224 -0
- package/dist/runtime/static-server.d.ts +3 -0
- package/dist/runtime/static-server.d.ts.map +1 -0
- package/dist/runtime/static-server.js +121 -0
- package/dist/runtime/vfs-snapshot.d.ts +57 -0
- package/dist/runtime/vfs-snapshot.d.ts.map +1 -0
- package/dist/runtime/vfs-snapshot.js +141 -0
- package/dist/runtime/virtual-socket-kernel.d.ts +16 -0
- package/dist/runtime/virtual-socket-kernel.d.ts.map +1 -0
- package/dist/runtime/virtual-socket-kernel.js +360 -0
- package/dist/runtime/wasi-instance.d.ts +6 -3
- package/dist/runtime/wasi-instance.d.ts.map +1 -1
- package/dist/runtime/wasm-runner.d.ts +1 -25
- package/dist/runtime/wasm-runner.d.ts.map +1 -1
- package/dist/runtime/wasm-runner.js +1 -160
- package/dist/session/agent.d.ts +43 -0
- package/dist/session/agent.d.ts.map +1 -0
- package/dist/session/agent.js +1252 -0
- package/dist/session/init.d.ts.map +1 -1
- package/dist/session/init.js +64 -19
- package/dist/session/nimbus-session.d.ts +14 -2
- package/dist/session/nimbus-session.d.ts.map +1 -1
- package/dist/session/nimbus-session.js +104 -30
- package/dist/session/programmatic.d.ts +10 -0
- package/dist/session/programmatic.d.ts.map +1 -1
- package/dist/session/programmatic.js +121 -0
- package/dist/session/routes.d.ts.map +1 -1
- package/dist/session/routes.js +19 -1
- package/dist/session/rpc.d.ts +11 -0
- package/dist/session/rpc.d.ts.map +1 -1
- package/dist/session/rpc.js +56 -43
- package/dist/session/supervisor-rpc.d.ts +15 -0
- package/dist/session/supervisor-rpc.d.ts.map +1 -1
- package/dist/session/supervisor-rpc.js +32 -0
- package/dist/session/ws.d.ts +4 -3
- package/dist/session/ws.d.ts.map +1 -1
- package/dist/session/ws.js +11 -1
- package/dist/shell/unix-commands.d.ts.map +1 -1
- package/dist/shell/unix-commands.js +52 -51
- package/dist/vfs/path.d.ts +8 -4
- package/dist/vfs/path.d.ts.map +1 -1
- package/dist/vfs/path.js +16 -4
- package/dist/vfs/sqlite-vfs.d.ts +2 -0
- package/dist/vfs/sqlite-vfs.d.ts.map +1 -1
- package/dist/vfs/sqlite-vfs.js +11 -0
- package/dist/vfs/symlink-registry.d.ts +7 -1
- package/dist/vfs/symlink-registry.d.ts.map +1 -1
- package/dist/vfs/symlink-registry.js +16 -11
- package/package.json +4 -1
- package/public/index.html +240 -0
- package/public/s/index.html +1316 -128
- package/runtime-contracts/pyodide-workerd-adapter.json +18 -0
- package/scripts/bundle-runtime.mjs +99 -24
package/dist/npm/installer.js
CHANGED
|
@@ -39,7 +39,7 @@ import { fetchEsbuildWasmBytes } from '../runtime/esbuild-wasm-bytes.js';
|
|
|
39
39
|
import { CHUNK_SIZE } from '../constants.js';
|
|
40
40
|
import { waitForLowAllocPressure } from '../observability/heavy-alloc-coord.js';
|
|
41
41
|
import { countPackageFiles, BARREL_PKG_FILE_THRESHOLD, packageNameFromSpecifier } from '../runtime/barrel-detect.js';
|
|
42
|
-
import { scanNamedImports, buildSyntheticEntry, buildScopedSliceForSynthetic, syntheticEntryPath, } from '../runtime/barrel-synthesizer.js';
|
|
42
|
+
import { scanNamedImports, namedImportSignature, buildSyntheticEntry, buildScopedSliceForSynthetic, syntheticEntryPath, } from '../runtime/barrel-synthesizer.js';
|
|
43
43
|
import { enc } from '../_shared/bytes.js';
|
|
44
44
|
// ── NpmInstaller ────────────────────────────────────────────────────────
|
|
45
45
|
export class NpmInstaller {
|
|
@@ -914,17 +914,8 @@ export class NpmInstaller {
|
|
|
914
914
|
if (explicitPackages && explicitPackages.length > 0) {
|
|
915
915
|
// Explicit packages: npm install react react-dom@18.2.0
|
|
916
916
|
for (const pkg of explicitPackages) {
|
|
917
|
-
const
|
|
918
|
-
|
|
919
|
-
specs[pkg.substring(0, atIdx)] = pkg.substring(atIdx + 1);
|
|
920
|
-
}
|
|
921
|
-
else if (pkg.startsWith('@') && pkg.indexOf('@', 1) > 0) {
|
|
922
|
-
const idx = pkg.indexOf('@', 1);
|
|
923
|
-
specs[pkg.substring(0, idx)] = pkg.substring(idx + 1);
|
|
924
|
-
}
|
|
925
|
-
else {
|
|
926
|
-
specs[pkg] = 'latest';
|
|
927
|
-
}
|
|
917
|
+
const parsed = parseExplicitPackageSpec(pkg);
|
|
918
|
+
specs[parsed.name] = parsed.range;
|
|
928
919
|
}
|
|
929
920
|
return this.applyW6Registry(specs);
|
|
930
921
|
}
|
|
@@ -1135,17 +1126,7 @@ export class NpmInstaller {
|
|
|
1135
1126
|
pkgJson.dependencies = {};
|
|
1136
1127
|
for (const spec of explicitPackages) {
|
|
1137
1128
|
// Find the resolved package matching this spec
|
|
1138
|
-
const
|
|
1139
|
-
let name;
|
|
1140
|
-
if (spec.startsWith('@') && spec.indexOf('@', 1) > 0) {
|
|
1141
|
-
name = spec.substring(0, spec.indexOf('@', 1));
|
|
1142
|
-
}
|
|
1143
|
-
else if (atIdx > 0 && !spec.startsWith('@')) {
|
|
1144
|
-
name = spec.substring(0, atIdx);
|
|
1145
|
-
}
|
|
1146
|
-
else {
|
|
1147
|
-
name = spec;
|
|
1148
|
-
}
|
|
1129
|
+
const { name } = parseExplicitPackageSpec(spec);
|
|
1149
1130
|
// W6: if a swap fired, the user typed `name` but `resolved` is
|
|
1150
1131
|
// keyed by the swap target (e.g. user typed 'esbuild', resolved
|
|
1151
1132
|
// has 'esbuild-wasm'). Look up via lookupSwap to bridge the
|
|
@@ -1248,8 +1229,6 @@ export class NpmInstaller {
|
|
|
1248
1229
|
const namedImports = scanNamedImports(this.vfs, projDir);
|
|
1249
1230
|
for (const specifier of toBuild) {
|
|
1250
1231
|
const existing = this.cache.getEsmBundle(specifier);
|
|
1251
|
-
if (existing && existing.bundleHash === BUNDLER_VERSION)
|
|
1252
|
-
continue;
|
|
1253
1232
|
const entryPath = this.resolvePackageEntryPath(specifier, nmDir);
|
|
1254
1233
|
if (!entryPath)
|
|
1255
1234
|
continue;
|
|
@@ -1266,6 +1245,7 @@ export class NpmInstaller {
|
|
|
1266
1245
|
if (isBarrel && specifier === pkgName) {
|
|
1267
1246
|
// Top-level barrel import. Synthesize.
|
|
1268
1247
|
const names = namedImports.get(pkgName);
|
|
1248
|
+
const inputHash = namedImportSignature(pkgName, names);
|
|
1269
1249
|
if (!names || names.size === 0) {
|
|
1270
1250
|
// No statically-resolvable imports. We refuse to bundle the
|
|
1271
1251
|
// whole barrel (would OOM) AND we refuse to CDN-fallback
|
|
@@ -1277,6 +1257,11 @@ export class NpmInstaller {
|
|
|
1277
1257
|
`with no static named imports detected. Add explicit imports to enable bundling.`);
|
|
1278
1258
|
continue;
|
|
1279
1259
|
}
|
|
1260
|
+
if (existing &&
|
|
1261
|
+
existing.bundleHash === BUNDLER_VERSION &&
|
|
1262
|
+
existing.inputHash === inputHash) {
|
|
1263
|
+
continue;
|
|
1264
|
+
}
|
|
1280
1265
|
const synth = buildSyntheticEntry(this.vfs, nmDir, pkgName, names);
|
|
1281
1266
|
if (!synth)
|
|
1282
1267
|
continue;
|
|
@@ -1291,9 +1276,17 @@ export class NpmInstaller {
|
|
|
1291
1276
|
}
|
|
1292
1277
|
this.onProgress?.(` synthesized entry for ${specifier} (barrel: ${fileCount} files; ` +
|
|
1293
1278
|
`${names.size} static imports → tree-shaken bundle)`);
|
|
1294
|
-
pending.push({
|
|
1279
|
+
pending.push({
|
|
1280
|
+
specifier,
|
|
1281
|
+
entryPath,
|
|
1282
|
+
synthetic: true,
|
|
1283
|
+
syntheticReferencedFiles: synth.referencedFiles,
|
|
1284
|
+
inputHash: inputHash ?? '',
|
|
1285
|
+
});
|
|
1295
1286
|
continue;
|
|
1296
1287
|
}
|
|
1288
|
+
if (existing && existing.bundleHash === BUNDLER_VERSION && existing.inputHash === '')
|
|
1289
|
+
continue;
|
|
1297
1290
|
pending.push({ specifier, entryPath });
|
|
1298
1291
|
}
|
|
1299
1292
|
if (pending.length === 0)
|
|
@@ -1611,7 +1604,7 @@ export class NpmInstaller {
|
|
|
1611
1604
|
bundleHash: BUNDLER_VERSION,
|
|
1612
1605
|
esmCode: result.esmCode,
|
|
1613
1606
|
builtAt: Date.now(),
|
|
1614
|
-
inputHash: '',
|
|
1607
|
+
inputHash: next.inputHash ?? '',
|
|
1615
1608
|
});
|
|
1616
1609
|
okCount++;
|
|
1617
1610
|
}
|
|
@@ -1898,6 +1891,33 @@ export class NpmInstaller {
|
|
|
1898
1891
|
function parentOf(path) {
|
|
1899
1892
|
return path.includes('/') ? path.substring(0, path.lastIndexOf('/')) : '';
|
|
1900
1893
|
}
|
|
1894
|
+
function parseExplicitPackageSpec(spec) {
|
|
1895
|
+
const aliasMarker = spec.indexOf('@npm:');
|
|
1896
|
+
if (aliasMarker > 0) {
|
|
1897
|
+
return {
|
|
1898
|
+
name: spec.slice(0, aliasMarker),
|
|
1899
|
+
range: 'npm:' + spec.slice(aliasMarker + '@npm:'.length),
|
|
1900
|
+
};
|
|
1901
|
+
}
|
|
1902
|
+
const rangeAt = findPackageRangeSeparator(spec);
|
|
1903
|
+
if (rangeAt >= 0) {
|
|
1904
|
+
return {
|
|
1905
|
+
name: spec.slice(0, rangeAt),
|
|
1906
|
+
range: spec.slice(rangeAt + 1) || 'latest',
|
|
1907
|
+
};
|
|
1908
|
+
}
|
|
1909
|
+
return { name: spec, range: 'latest' };
|
|
1910
|
+
}
|
|
1911
|
+
function findPackageRangeSeparator(spec) {
|
|
1912
|
+
if (!spec)
|
|
1913
|
+
return -1;
|
|
1914
|
+
if (spec[0] !== '@')
|
|
1915
|
+
return spec.indexOf('@');
|
|
1916
|
+
const slash = spec.indexOf('/');
|
|
1917
|
+
if (slash < 0)
|
|
1918
|
+
return -1;
|
|
1919
|
+
return spec.indexOf('@', slash + 1);
|
|
1920
|
+
}
|
|
1901
1921
|
function safeJsonParse(json, fallback) {
|
|
1902
1922
|
try {
|
|
1903
1923
|
return JSON.parse(json);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pre-bundle-facet.d.ts","sourceRoot":"","sources":["../../src/npm/pre-bundle-facet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAA6B,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAgB3F;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;CACd;AACD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,IAAI,CAAC;CACb;AACD,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;AAEhD,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC5B,iFAAiF;IACjF,SAAS,EAAE,MAAM,CAAC;IAClB,uGAAuG;IACvG,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB;;;;;;OAMG;IACH,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,+EAA+E;IAC/E,cAAc,EAAE,MAAM,CAAC;IACvB;;;8DAG0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,8BAA8B;AAC9B,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,OAAO,CAAC;IACZ,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAID;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AACD,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ;IAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAEpD;AAED,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf;IAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA4GpD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAEjE;AAmBD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,YAAY,GACvB,MAAM,aAAa,EACnB,MAAM;IACJ,UAAU,EAAE;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;KAAE,CAAC;CAC7D,KACA,OAAO,CAAC,eAAe,
|
|
1
|
+
{"version":3,"file":"pre-bundle-facet.d.ts","sourceRoot":"","sources":["../../src/npm/pre-bundle-facet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAA6B,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAgB3F;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;CACd;AACD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,IAAI,CAAC;CACb;AACD,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;AAEhD,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC5B,iFAAiF;IACjF,SAAS,EAAE,MAAM,CAAC;IAClB,uGAAuG;IACvG,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB;;;;;;OAMG;IACH,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,+EAA+E;IAC/E,cAAc,EAAE,MAAM,CAAC;IACvB;;;8DAG0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,8BAA8B;AAC9B,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,OAAO,CAAC;IACZ,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAID;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AACD,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ;IAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAEpD;AAED,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf;IAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA4GpD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAEjE;AAmBD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,YAAY,GACvB,MAAM,aAAa,EACnB,MAAM;IACJ,UAAU,EAAE;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;KAAE,CAAC;CAC7D,KACA,OAAO,CAAC,eAAe,CAiazB,CAAC;AAGF,OAAO,EAAE,eAAe,EAAE,CAAC;AAE3B,MAAM,MAAM,gBAAgB,GAAG,eAAe,CAAC"}
|
|
@@ -315,7 +315,8 @@ export const prebundleOne = async function prebundleOne(spec, _env) {
|
|
|
315
315
|
const stripLeadingSlash = (p) => p.replace(/^\/+/, '');
|
|
316
316
|
const normalizePath = (p) => {
|
|
317
317
|
// Resolve any `..` segments to keep tryResolve's exists() lookups
|
|
318
|
-
// canonical
|
|
318
|
+
// canonical. This helper runs inside the serialized facet function,
|
|
319
|
+
// so it mirrors src/vfs/path.ts instead of importing it.
|
|
319
320
|
const parts = p.split('/');
|
|
320
321
|
const out = [];
|
|
321
322
|
for (const seg of parts) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-one-facet.d.ts","sourceRoot":"","sources":["../../src/npm/resolve-one-facet.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"resolve-one-facet.d.ts","sourceRoot":"","sources":["../../src/npm/resolve-one-facet.ts"],"names":[],"mappings":"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"}
|
|
@@ -74,6 +74,33 @@ export const resolveOnePackumentInFacet = async function resolveOnePackumentInFa
|
|
|
74
74
|
const messages = [];
|
|
75
75
|
const events = [];
|
|
76
76
|
const cacheWrites = [];
|
|
77
|
+
const parseRegistryRequest = (name, range) => {
|
|
78
|
+
const text = String(range || 'latest');
|
|
79
|
+
if (!text.startsWith('npm:')) {
|
|
80
|
+
return { installName: name, registryName: name, range: text, alias: false };
|
|
81
|
+
}
|
|
82
|
+
const target = text.slice(4);
|
|
83
|
+
const findSeparator = (specText) => {
|
|
84
|
+
if (!specText)
|
|
85
|
+
return -1;
|
|
86
|
+
if (specText[0] !== '@')
|
|
87
|
+
return specText.indexOf('@');
|
|
88
|
+
const slash = specText.indexOf('/');
|
|
89
|
+
if (slash < 0)
|
|
90
|
+
return -1;
|
|
91
|
+
return specText.indexOf('@', slash + 1);
|
|
92
|
+
};
|
|
93
|
+
const splitAt = findSeparator(target);
|
|
94
|
+
const registryName = splitAt >= 0 ? target.slice(0, splitAt) : target;
|
|
95
|
+
const targetRange = splitAt >= 0 ? target.slice(splitAt + 1) : 'latest';
|
|
96
|
+
return {
|
|
97
|
+
installName: name,
|
|
98
|
+
registryName: registryName || name,
|
|
99
|
+
range: targetRange || 'latest',
|
|
100
|
+
alias: true,
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
const request = parseRegistryRequest(spec.name, spec.range);
|
|
77
104
|
// cache-obs-2: per-resolve cache events. Filled by the L2/L3 path
|
|
78
105
|
// (spliced from supervisor RPC return.events) and the L4 path
|
|
79
106
|
// (post-network-fetch). Threaded through `out()` into the result.
|
|
@@ -98,7 +125,7 @@ export const resolveOnePackumentInFacet = async function resolveOnePackumentInFa
|
|
|
98
125
|
return out(null, 0, 'skipped');
|
|
99
126
|
}
|
|
100
127
|
// 2. Registry policy.
|
|
101
|
-
let effName =
|
|
128
|
+
let effName = request.registryName;
|
|
102
129
|
// @ts-ignore — preamble.
|
|
103
130
|
const __swap = SHOULD_SWAP(spec.name);
|
|
104
131
|
if (__swap) {
|
|
@@ -137,18 +164,18 @@ export const resolveOnePackumentInFacet = async function resolveOnePackumentInFa
|
|
|
137
164
|
const entries = spec.cachedEntries || [];
|
|
138
165
|
if (entries.length === 0)
|
|
139
166
|
return null;
|
|
140
|
-
const cleanRange = (
|
|
167
|
+
const cleanRange = (request.range || '').replace(/^[~^>=<\s]+/, '');
|
|
141
168
|
if (/^\d+\.\d+\.\d+$/.test(cleanRange)) {
|
|
142
|
-
const exact = entries.find((e) => e.name ===
|
|
169
|
+
const exact = entries.find((e) => e.name === request.installName && e.version === cleanRange);
|
|
143
170
|
if (exact)
|
|
144
171
|
return exact;
|
|
145
172
|
}
|
|
146
|
-
const candidates = entries.filter((e) => e.name ===
|
|
173
|
+
const candidates = entries.filter((e) => e.name === request.installName);
|
|
147
174
|
if (candidates.length === 0)
|
|
148
175
|
return null;
|
|
149
176
|
const versions = candidates.map((e) => e.version);
|
|
150
177
|
// @ts-ignore — preamble.
|
|
151
|
-
const picked = RESOLVE_VERSION(versions,
|
|
178
|
+
const picked = RESOLVE_VERSION(versions, request.range);
|
|
152
179
|
if (!picked)
|
|
153
180
|
return null;
|
|
154
181
|
return candidates.find((e) => e.version === picked) || null;
|
|
@@ -320,26 +347,27 @@ export const resolveOnePackumentInFacet = async function resolveOnePackumentInFa
|
|
|
320
347
|
}
|
|
321
348
|
// 6. Pick version.
|
|
322
349
|
let version = null;
|
|
323
|
-
if (
|
|
324
|
-
version =
|
|
325
|
-
if (!version &&
|
|
350
|
+
if (request.range && data.versions[request.range])
|
|
351
|
+
version = request.range;
|
|
352
|
+
if (!version && request.range && request.range !== 'latest') {
|
|
326
353
|
const allVersions = Object.keys(data.versions);
|
|
327
354
|
// @ts-ignore — preamble.
|
|
328
|
-
version = RESOLVE_VERSION(allVersions,
|
|
355
|
+
version = RESOLVE_VERSION(allVersions, request.range);
|
|
329
356
|
}
|
|
330
357
|
if (!version) {
|
|
331
|
-
version = data['dist-tags']?.[
|
|
358
|
+
version = data['dist-tags']?.[request.range] || data['dist-tags']?.latest || null;
|
|
332
359
|
}
|
|
333
360
|
if (!version || !data.versions[version]) {
|
|
334
|
-
messages.push(`[resolve-one] ${effName}: no version satisfies ${
|
|
361
|
+
messages.push(`[resolve-one] ${effName}: no version satisfies ${request.range}`);
|
|
335
362
|
return out(null, bytes, packumentSource);
|
|
336
363
|
}
|
|
337
364
|
// 7. Materialise ResolvedPackage.
|
|
338
365
|
const vData = data.versions[version];
|
|
339
366
|
const versionToResolved = (v) => {
|
|
367
|
+
const packageName = request.installName || v.name;
|
|
340
368
|
const binField = v.bin || {};
|
|
341
369
|
const bin = typeof binField === 'string'
|
|
342
|
-
? { [String(
|
|
370
|
+
? { [String(packageName).split('/').pop()]: binField }
|
|
343
371
|
: binField;
|
|
344
372
|
let peerDependencies;
|
|
345
373
|
let allPeers;
|
|
@@ -365,7 +393,7 @@ export const resolveOnePackumentInFacet = async function resolveOnePackumentInFa
|
|
|
365
393
|
? Object.fromEntries(Object.entries(v.optionalDependencies).filter(([, r]) => typeof r === 'string'))
|
|
366
394
|
: undefined;
|
|
367
395
|
const resolvedOut = {
|
|
368
|
-
name:
|
|
396
|
+
name: packageName,
|
|
369
397
|
version: v.version,
|
|
370
398
|
tarballUrl: v.dist?.tarball || '',
|
|
371
399
|
integrity: v.dist?.integrity || v.dist?.shasum || '',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/npm/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAsB,MAAM,YAAY,CAAC;AA0B/D;;;;GAIG;AACH,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE7E;;;GAGG;AACH,wBAAgB,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAmBnF;AAID,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC;;yBAEqB;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C;;;kEAG8D;IAC9D,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C;;8CAE0C;IAC1C,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,GAAG,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/npm/resolver.ts"],"names":[],"mappings":"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"}
|
package/dist/npm/resolver.js
CHANGED
|
@@ -169,26 +169,56 @@ export function resolveVersion(versions, range) {
|
|
|
169
169
|
});
|
|
170
170
|
return matching[0];
|
|
171
171
|
}
|
|
172
|
+
function parseRegistryRequest(name, range) {
|
|
173
|
+
const text = String(range || 'latest');
|
|
174
|
+
if (!text.startsWith('npm:')) {
|
|
175
|
+
return { installName: name, registryName: name, range: text, alias: false };
|
|
176
|
+
}
|
|
177
|
+
const target = text.slice(4);
|
|
178
|
+
const splitAt = findPackageRangeSeparator(target);
|
|
179
|
+
const registryName = splitAt >= 0 ? target.slice(0, splitAt) : target;
|
|
180
|
+
const targetRange = splitAt >= 0 ? target.slice(splitAt + 1) : 'latest';
|
|
181
|
+
return {
|
|
182
|
+
installName: name,
|
|
183
|
+
registryName: registryName || name,
|
|
184
|
+
range: targetRange || 'latest',
|
|
185
|
+
alias: true,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
function findPackageRangeSeparator(spec) {
|
|
189
|
+
if (!spec)
|
|
190
|
+
return -1;
|
|
191
|
+
if (spec[0] !== '@')
|
|
192
|
+
return spec.indexOf('@');
|
|
193
|
+
const slash = spec.indexOf('/');
|
|
194
|
+
if (slash < 0)
|
|
195
|
+
return -1;
|
|
196
|
+
return spec.indexOf('@', slash + 1);
|
|
197
|
+
}
|
|
172
198
|
// ── Package resolution ──────────────────────────────────────────────────
|
|
173
199
|
/**
|
|
174
200
|
* Resolve a single package from the registry.
|
|
175
201
|
* Checks cache first, then fetches from npm.
|
|
176
202
|
*/
|
|
177
203
|
export async function resolvePackage(name, versionRange, cache, fetchFn, log) {
|
|
204
|
+
const request = parseRegistryRequest(name, versionRange);
|
|
205
|
+
const cacheName = request.installName;
|
|
206
|
+
const registryName = request.registryName;
|
|
207
|
+
const requestedRange = request.range;
|
|
178
208
|
// 1. Check for exact version in registry cache
|
|
179
209
|
try {
|
|
180
|
-
const cleanRange =
|
|
210
|
+
const cleanRange = requestedRange.replace(/^[~^>=<\s]+/, '');
|
|
181
211
|
if (cleanRange.match(/^\d+\.\d+\.\d+$/)) {
|
|
182
|
-
const cached = cache.getRegistryEntry(
|
|
212
|
+
const cached = cache.getRegistryEntry(cacheName, cleanRange);
|
|
183
213
|
if (cached) {
|
|
184
|
-
log?.(` ${
|
|
214
|
+
log?.(` ${cacheName}: found exact ${cleanRange} in cache`);
|
|
185
215
|
return registryCacheToResolved(cached);
|
|
186
216
|
}
|
|
187
217
|
}
|
|
188
218
|
// 2. Check if we have cached versions to resolve against
|
|
189
|
-
const cachedVersions = cache.getRegistryVersions(
|
|
219
|
+
const cachedVersions = cache.getRegistryVersions(cacheName);
|
|
190
220
|
if (cachedVersions.length > 0) {
|
|
191
|
-
const isDistTag = !
|
|
221
|
+
const isDistTag = !requestedRange || requestedRange === 'latest' || requestedRange === '*' || requestedRange === '';
|
|
192
222
|
if (isDistTag) {
|
|
193
223
|
// "latest", "*", "" → pick the highest cached version (sort descending)
|
|
194
224
|
const sorted = cachedVersions
|
|
@@ -196,25 +226,25 @@ export async function resolvePackage(name, versionRange, cache, fetchFn, log) {
|
|
|
196
226
|
.filter(x => x.parsed !== null)
|
|
197
227
|
.sort((a, b) => compareSemver(b.parsed, a.parsed));
|
|
198
228
|
if (sorted.length > 0) {
|
|
199
|
-
log?.(` ${
|
|
229
|
+
log?.(` ${cacheName}: resolved ${requestedRange || '(empty)'} → ${sorted[0].entry.version} (highest cached)`);
|
|
200
230
|
return registryCacheToResolved(sorted[0].entry);
|
|
201
231
|
}
|
|
202
232
|
}
|
|
203
233
|
else {
|
|
204
234
|
// Semver range: try to match against cached versions
|
|
205
235
|
const versions = cachedVersions.map(e => e.version);
|
|
206
|
-
const resolved = resolveVersion(versions,
|
|
236
|
+
const resolved = resolveVersion(versions, requestedRange);
|
|
207
237
|
if (resolved) {
|
|
208
238
|
const entry = cachedVersions.find(e => e.version === resolved);
|
|
209
239
|
if (entry) {
|
|
210
|
-
log?.(` ${
|
|
240
|
+
log?.(` ${cacheName}: resolved ${requestedRange} → ${resolved} from cache`);
|
|
211
241
|
return registryCacheToResolved(entry);
|
|
212
242
|
}
|
|
213
243
|
}
|
|
214
244
|
// Cached versions exist but none match — only skip fetch if cache is fresh
|
|
215
245
|
const newest = Math.max(...cachedVersions.map(e => e.fetchedAt));
|
|
216
246
|
if (Date.now() - newest < 3600_000) {
|
|
217
|
-
log?.(` ${
|
|
247
|
+
log?.(` ${cacheName}: ${cachedVersions.length} cached versions, none match ${requestedRange}, cache fresh`);
|
|
218
248
|
return null;
|
|
219
249
|
}
|
|
220
250
|
}
|
|
@@ -222,18 +252,20 @@ export async function resolvePackage(name, versionRange, cache, fetchFn, log) {
|
|
|
222
252
|
}
|
|
223
253
|
catch (e) {
|
|
224
254
|
// Cache read failed (schema issue, corrupt data, etc.) — fall through to network
|
|
225
|
-
log?.(` ${
|
|
255
|
+
log?.(` ${cacheName}: cache read error: ${e?.message}`);
|
|
226
256
|
}
|
|
227
257
|
// 3. Fetch from registry
|
|
228
|
-
log?.(
|
|
258
|
+
log?.(request.alias
|
|
259
|
+
? ` ${cacheName}: fetching ${registryName} from registry (${fetchFn ? 'proxy' : 'direct'})...`
|
|
260
|
+
: ` ${registryName}: fetching from registry (${fetchFn ? 'proxy' : 'direct'})...`);
|
|
229
261
|
setResolverPhase('fetching');
|
|
230
|
-
packumentFetchStart(
|
|
262
|
+
packumentFetchStart(registryName);
|
|
231
263
|
let data;
|
|
232
264
|
let bytesDecoded = 0;
|
|
233
265
|
try {
|
|
234
|
-
const safeName =
|
|
235
|
-
? '@' + encodeURIComponent(
|
|
236
|
-
: encodeURIComponent(
|
|
266
|
+
const safeName = registryName.startsWith('@')
|
|
267
|
+
? '@' + encodeURIComponent(registryName.slice(1))
|
|
268
|
+
: encodeURIComponent(registryName);
|
|
237
269
|
const url = `${NPM_REGISTRY}/${safeName}`;
|
|
238
270
|
// retryableFetch: 3 retries on 5xx/network errors with jittered
|
|
239
271
|
// exponential backoff. Per-attempt timeout = the prior single-attempt
|
|
@@ -244,14 +276,14 @@ export async function resolvePackage(name, versionRange, cache, fetchFn, log) {
|
|
|
244
276
|
headers: { 'Accept': 'application/json' },
|
|
245
277
|
}, {
|
|
246
278
|
retries: DEFAULT_RETRIES,
|
|
247
|
-
name,
|
|
279
|
+
name: registryName,
|
|
248
280
|
fetchImpl: fetchFn,
|
|
249
281
|
perAttemptTimeoutMs: FETCH_TIMEOUT_MS,
|
|
250
282
|
onRetry: (attempt, total, delayMs, reason) => {
|
|
251
|
-
log?.(` ${
|
|
283
|
+
log?.(` ${registryName}: retry ${attempt}/${total} after ${delayMs}ms (${reason})`);
|
|
252
284
|
},
|
|
253
285
|
});
|
|
254
|
-
log?.(` ${
|
|
286
|
+
log?.(` ${registryName}: registry responded ${resp.status}`);
|
|
255
287
|
// Dispose the (potentially RPC-stub-backed) Response explicitly once
|
|
256
288
|
// the body is consumed / dropped. When fetchFn is the supervisor fetch
|
|
257
289
|
// proxy, `resp` is a cross-isolate stub returned from
|
|
@@ -303,7 +335,7 @@ export async function resolvePackage(name, versionRange, cache, fetchFn, log) {
|
|
|
303
335
|
}
|
|
304
336
|
}
|
|
305
337
|
catch (e) {
|
|
306
|
-
log?.(` ${
|
|
338
|
+
log?.(` ${registryName}: fetch error: ${e?.message}`);
|
|
307
339
|
// Balance counters even on the error path. responseStubDisposed
|
|
308
340
|
// was either already called in the finally above (if we got past
|
|
309
341
|
// retryableFetch) or not — the safe move is to always run
|
|
@@ -313,31 +345,33 @@ export async function resolvePackage(name, versionRange, cache, fetchFn, log) {
|
|
|
313
345
|
}
|
|
314
346
|
packumentFetchEnd(bytesDecoded);
|
|
315
347
|
if (!data.versions) {
|
|
316
|
-
log?.(` ${
|
|
348
|
+
log?.(` ${registryName}: no versions field in packument`);
|
|
317
349
|
return null;
|
|
318
350
|
}
|
|
319
351
|
// Resolve version
|
|
320
352
|
let version = null;
|
|
321
353
|
// Try exact match
|
|
322
|
-
if (
|
|
323
|
-
version =
|
|
354
|
+
if (requestedRange && data.versions[requestedRange]) {
|
|
355
|
+
version = requestedRange;
|
|
324
356
|
}
|
|
325
357
|
// Try range resolution
|
|
326
|
-
if (!version &&
|
|
358
|
+
if (!version && requestedRange && requestedRange !== 'latest') {
|
|
327
359
|
const allVersions = Object.keys(data.versions);
|
|
328
|
-
version = resolveVersion(allVersions,
|
|
360
|
+
version = resolveVersion(allVersions, requestedRange);
|
|
329
361
|
}
|
|
330
362
|
// Try dist-tags
|
|
331
363
|
if (!version) {
|
|
332
|
-
version = data['dist-tags']?.[
|
|
364
|
+
version = data['dist-tags']?.[requestedRange] || data['dist-tags']?.latest || null;
|
|
333
365
|
}
|
|
334
366
|
if (!version || !data.versions[version]) {
|
|
335
|
-
log?.(` ${
|
|
367
|
+
log?.(` ${registryName}: could not resolve version for range ${requestedRange}`);
|
|
336
368
|
return null;
|
|
337
369
|
}
|
|
338
|
-
log?.(
|
|
370
|
+
log?.(request.alias
|
|
371
|
+
? ` ${cacheName}: resolved ${registryName}@${requestedRange} → ${version}`
|
|
372
|
+
: ` ${registryName}: resolved → ${version}`);
|
|
339
373
|
const vData = data.versions[version];
|
|
340
|
-
const pkg = versionToResolved(vData);
|
|
374
|
+
const pkg = versionToResolved(vData, cacheName);
|
|
341
375
|
setResolverPhase('caching');
|
|
342
376
|
// Cache the resolved version (non-fatal — if caching fails, we still return the package)
|
|
343
377
|
try {
|
|
@@ -360,10 +394,10 @@ export async function resolvePackage(name, versionRange, cache, fetchFn, log) {
|
|
|
360
394
|
}
|
|
361
395
|
// Also cache other popular versions from the packument (non-fatal)
|
|
362
396
|
try {
|
|
363
|
-
cachePopularVersions(data, cache, pkg.version);
|
|
397
|
+
cachePopularVersions(data, cache, pkg.version, cacheName);
|
|
364
398
|
}
|
|
365
399
|
catch (e) {
|
|
366
|
-
console.error(`[npm-resolve] popular version cache failed for ${
|
|
400
|
+
console.error(`[npm-resolve] popular version cache failed for ${registryName}:`, e?.message);
|
|
367
401
|
}
|
|
368
402
|
return pkg;
|
|
369
403
|
}
|
|
@@ -372,7 +406,7 @@ export async function resolvePackage(name, versionRange, cache, fetchFn, log) {
|
|
|
372
406
|
* Avoids re-fetching the full packument for transitive deps that reference
|
|
373
407
|
* the same package with a different range.
|
|
374
408
|
*/
|
|
375
|
-
function cachePopularVersions(data, cache, alreadyCached) {
|
|
409
|
+
function cachePopularVersions(data, cache, alreadyCached, installName) {
|
|
376
410
|
const versions = Object.keys(data.versions || {});
|
|
377
411
|
// Cache the latest dist-tag version if different
|
|
378
412
|
const latest = data['dist-tags']?.latest;
|
|
@@ -393,7 +427,7 @@ function cachePopularVersions(data, cache, alreadyCached) {
|
|
|
393
427
|
if (!vData)
|
|
394
428
|
continue;
|
|
395
429
|
try {
|
|
396
|
-
const pkg = versionToResolved(vData);
|
|
430
|
+
const pkg = versionToResolved(vData, installName);
|
|
397
431
|
cache.putRegistryEntry({
|
|
398
432
|
name: pkg.name,
|
|
399
433
|
version: pkg.version,
|
|
@@ -412,10 +446,11 @@ function cachePopularVersions(data, cache, alreadyCached) {
|
|
|
412
446
|
}
|
|
413
447
|
}
|
|
414
448
|
/** Convert npm registry version data to ResolvedPackage. */
|
|
415
|
-
function versionToResolved(vData) {
|
|
449
|
+
function versionToResolved(vData, installName) {
|
|
450
|
+
const packageName = installName || vData.name;
|
|
416
451
|
const binField = vData.bin || {};
|
|
417
452
|
const bin = typeof binField === 'string'
|
|
418
|
-
? { [
|
|
453
|
+
? { [packageName.split('/').pop()]: binField }
|
|
419
454
|
: binField;
|
|
420
455
|
// X.5-F R2.5: keep the full peer set (including optionals) on a
|
|
421
456
|
// hidden field so the BFS walk can include optional peers when
|
|
@@ -431,7 +466,7 @@ function versionToResolved(vData) {
|
|
|
431
466
|
.filter(([, r]) => typeof r === 'string'))
|
|
432
467
|
: undefined;
|
|
433
468
|
const out = {
|
|
434
|
-
name:
|
|
469
|
+
name: packageName,
|
|
435
470
|
version: vData.version,
|
|
436
471
|
tarballUrl: vData.dist?.tarball || '',
|
|
437
472
|
integrity: vData.dist?.integrity || vData.dist?.shasum || '',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAwBH,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,iBAAiB,CAAC;AAGzB,YAAY,EACV,YAAY,IAAI,eAAe,EAC/B,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,oDAAoD;IACpD,aAAa,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,OAAO,EAAE,OAAO,CAAC;IACjB,oBAAoB;IACpB,GAAG,EAAE,GAAG,CAAC;CACV;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;OAMG;IACH,cAAc,CAAC,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9D;;;OAGG;IACH,YAAY,CAAC,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAErD,0CAA0C;AAC1C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,gBAAgB,KAClB,QAAQ,GAAG,IAAI,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;AAEhD,+CAA+C;AAC/C,MAAM,WAAW,0BAA0B;IACzC,oCAAoC;IACpC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,qDAAqD;IACrD,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,yEAAyE;IACzE,GAAG,CAAC,EAAE,qBAAqB,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC7E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,0BAA+B,GACvC,aAAa,CA+If"}
|