@nimbus-sh/worker 0.1.5 → 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.
Files changed (135) hide show
  1. package/README.md +37 -0
  2. package/dist/_shared/crypto.d.ts +15 -0
  3. package/dist/_shared/crypto.d.ts.map +1 -0
  4. package/dist/_shared/crypto.js +122 -0
  5. package/dist/facets/manager.d.ts +24 -0
  6. package/dist/facets/manager.d.ts.map +1 -1
  7. package/dist/facets/manager.js +279 -70
  8. package/dist/facets/process.d.ts +11 -2
  9. package/dist/facets/process.d.ts.map +1 -1
  10. package/dist/facets/process.js +187 -21
  11. package/dist/facets/vite-dev-server.d.ts +2 -0
  12. package/dist/facets/vite-dev-server.d.ts.map +1 -1
  13. package/dist/facets/vite-dev-server.js +39 -12
  14. package/dist/index.d.ts +2 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +2 -0
  17. package/dist/loaders/child-process/spawn-facet.d.ts +1 -3
  18. package/dist/loaders/child-process/spawn-facet.d.ts.map +1 -1
  19. package/dist/loaders/child-process/spawn-facet.js +1 -12
  20. package/dist/loaders/child-process/spawn-pool.d.ts +1 -1
  21. package/dist/loaders/child-process/spawn-pool.d.ts.map +1 -1
  22. package/dist/loaders/child-process/spawn-pool.js +1 -6
  23. package/dist/npm/installer.d.ts.map +1 -1
  24. package/dist/npm/installer.js +47 -27
  25. package/dist/npm/pre-bundle-facet.d.ts.map +1 -1
  26. package/dist/npm/pre-bundle-facet.js +2 -1
  27. package/dist/npm/resolve-one-facet.d.ts.map +1 -1
  28. package/dist/npm/resolve-one-facet.js +41 -13
  29. package/dist/npm/resolver.d.ts.map +1 -1
  30. package/dist/npm/resolver.js +70 -35
  31. package/dist/router/index.d.ts.map +1 -1
  32. package/dist/router/index.js +45 -21
  33. package/dist/router/remote-api.d.ts.map +1 -1
  34. package/dist/router/remote-api.js +29 -8
  35. package/dist/runtime/barrel-synthesizer.d.ts +7 -0
  36. package/dist/runtime/barrel-synthesizer.d.ts.map +1 -1
  37. package/dist/runtime/barrel-synthesizer.js +11 -0
  38. package/dist/runtime/clang-runner.d.ts.map +1 -1
  39. package/dist/runtime/clang-runner.js +1 -8
  40. package/dist/runtime/esbuild-service.d.ts +12 -5
  41. package/dist/runtime/esbuild-service.d.ts.map +1 -1
  42. package/dist/runtime/esbuild-service.js +28 -14
  43. package/dist/runtime/node-runner.d.ts +2 -0
  44. package/dist/runtime/node-runner.d.ts.map +1 -1
  45. package/dist/runtime/node-shims.d.ts +4 -2
  46. package/dist/runtime/node-shims.d.ts.map +1 -1
  47. package/dist/runtime/node-shims.js +404 -55
  48. package/dist/runtime/os-contracts.d.ts +128 -0
  49. package/dist/runtime/os-contracts.d.ts.map +1 -0
  50. package/dist/runtime/os-contracts.js +1 -0
  51. package/dist/runtime/package-manager.d.ts.map +1 -1
  52. package/dist/runtime/package-manager.js +32 -7
  53. package/dist/runtime/port-registry.d.ts +5 -0
  54. package/dist/runtime/port-registry.d.ts.map +1 -1
  55. package/dist/runtime/port-registry.js +22 -1
  56. package/dist/runtime/pyodide-runtime-assets.d.ts +19 -0
  57. package/dist/runtime/pyodide-runtime-assets.d.ts.map +1 -0
  58. package/dist/runtime/pyodide-runtime-assets.js +44 -0
  59. package/dist/runtime/python-repl.d.ts +3 -1
  60. package/dist/runtime/python-repl.d.ts.map +1 -1
  61. package/dist/runtime/python-repl.js +11 -29
  62. package/dist/runtime/python-runner.d.ts +8 -9
  63. package/dist/runtime/python-runner.d.ts.map +1 -1
  64. package/dist/runtime/python-runner.js +897 -61
  65. package/dist/runtime/python-socket-shim.d.ts +11 -0
  66. package/dist/runtime/python-socket-shim.d.ts.map +1 -0
  67. package/dist/runtime/python-socket-shim.js +526 -0
  68. package/dist/runtime/require-resolver.d.ts.map +1 -1
  69. package/dist/runtime/require-resolver.js +2 -11
  70. package/dist/runtime/ruby-gems.d.ts +25 -0
  71. package/dist/runtime/ruby-gems.d.ts.map +1 -0
  72. package/dist/runtime/ruby-gems.js +582 -0
  73. package/dist/runtime/ruby-runner.d.ts +2 -4
  74. package/dist/runtime/ruby-runner.d.ts.map +1 -1
  75. package/dist/runtime/ruby-runner.js +335 -34
  76. package/dist/runtime/runtime-catalog.d.ts +16 -4
  77. package/dist/runtime/runtime-catalog.d.ts.map +1 -1
  78. package/dist/runtime/runtime-catalog.js +21 -10
  79. package/dist/runtime/runtime-registry.d.ts +3 -0
  80. package/dist/runtime/runtime-registry.d.ts.map +1 -1
  81. package/dist/runtime/runtime-registry.js +4 -0
  82. package/dist/runtime/sqlite-runtime-fs-bridge.d.ts +43 -0
  83. package/dist/runtime/sqlite-runtime-fs-bridge.d.ts.map +1 -0
  84. package/dist/runtime/sqlite-runtime-fs-bridge.js +224 -0
  85. package/dist/runtime/static-server.d.ts +3 -0
  86. package/dist/runtime/static-server.d.ts.map +1 -0
  87. package/dist/runtime/static-server.js +121 -0
  88. package/dist/runtime/vfs-snapshot.d.ts +57 -0
  89. package/dist/runtime/vfs-snapshot.d.ts.map +1 -0
  90. package/dist/runtime/vfs-snapshot.js +141 -0
  91. package/dist/runtime/virtual-socket-kernel.d.ts +16 -0
  92. package/dist/runtime/virtual-socket-kernel.d.ts.map +1 -0
  93. package/dist/runtime/virtual-socket-kernel.js +360 -0
  94. package/dist/runtime/wasi-instance.d.ts +6 -3
  95. package/dist/runtime/wasi-instance.d.ts.map +1 -1
  96. package/dist/runtime/wasm-runner.d.ts +1 -25
  97. package/dist/runtime/wasm-runner.d.ts.map +1 -1
  98. package/dist/runtime/wasm-runner.js +1 -160
  99. package/dist/session/agent.d.ts +43 -0
  100. package/dist/session/agent.d.ts.map +1 -0
  101. package/dist/session/agent.js +1252 -0
  102. package/dist/session/init.d.ts.map +1 -1
  103. package/dist/session/init.js +15 -16
  104. package/dist/session/nimbus-session.d.ts +13 -2
  105. package/dist/session/nimbus-session.d.ts.map +1 -1
  106. package/dist/session/nimbus-session.js +55 -7
  107. package/dist/session/programmatic.d.ts +10 -0
  108. package/dist/session/programmatic.d.ts.map +1 -1
  109. package/dist/session/programmatic.js +121 -0
  110. package/dist/session/routes.d.ts.map +1 -1
  111. package/dist/session/routes.js +19 -1
  112. package/dist/session/rpc.d.ts +11 -0
  113. package/dist/session/rpc.d.ts.map +1 -1
  114. package/dist/session/rpc.js +56 -43
  115. package/dist/session/supervisor-rpc.d.ts +15 -0
  116. package/dist/session/supervisor-rpc.d.ts.map +1 -1
  117. package/dist/session/supervisor-rpc.js +32 -0
  118. package/dist/session/ws.d.ts +4 -3
  119. package/dist/session/ws.d.ts.map +1 -1
  120. package/dist/session/ws.js +11 -1
  121. package/dist/shell/unix-commands.js +12 -16
  122. package/dist/vfs/path.d.ts +8 -4
  123. package/dist/vfs/path.d.ts.map +1 -1
  124. package/dist/vfs/path.js +16 -4
  125. package/dist/vfs/sqlite-vfs.d.ts +2 -0
  126. package/dist/vfs/sqlite-vfs.d.ts.map +1 -1
  127. package/dist/vfs/sqlite-vfs.js +11 -0
  128. package/dist/vfs/symlink-registry.d.ts +7 -1
  129. package/dist/vfs/symlink-registry.d.ts.map +1 -1
  130. package/dist/vfs/symlink-registry.js +16 -11
  131. package/package.json +4 -1
  132. package/public/index.html +240 -0
  133. package/public/s/index.html +1172 -146
  134. package/runtime-contracts/pyodide-workerd-adapter.json +18 -0
  135. package/scripts/bundle-runtime.mjs +99 -24
@@ -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 atIdx = pkg.lastIndexOf('@');
918
- if (atIdx > 0 && !pkg.startsWith('@')) {
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 atIdx = spec.lastIndexOf('@');
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({ specifier, entryPath, synthetic: true, syntheticReferencedFiles: synth.referencedFiles });
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,CAgazB,CAAC;AAGF,OAAO,EAAE,eAAe,EAAE,CAAC;AAE3B,MAAM,MAAM,gBAAgB,GAAG,eAAe,CAAC"}
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; mirrors src/vfs-path.ts behaviour without importing.
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE/E;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,UAAU,EAAE,OAAO,CAAC;IACpB,gCAAgC;IAChC,cAAc,EAAE,OAAO,CAAC;IACxB,8CAA8C;IAC9C,cAAc,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,sEAAsE;IACtE,GAAG,EAAE,eAAe,GAAG,IAAI,CAAC;IAC5B;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C;;;;;OAKG;IACH,WAAW,EAAE,GAAG,EAAE,CAAC;IACnB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,sDAAsD;IACtD,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B;;;OAGG;IACH,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;IAClE;;;;;;;;;;;;;;OAcG;IACH,eAAe,CAAC,EAAE,KAAK,CACnB;QAAE,IAAI,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,WAAW,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAChF;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,WAAW,CAAA;KAAE,CACrE,CAAC;IACF;;;OAGG;IACH,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,iBAAiB,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9H;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,0BAA0B,GACrC,MAAM,cAAc,EACpB,KAAK;IACH,UAAU,EAAE;QAIV,kBAAkB,CAAC,EAAE,CACnB,IAAI,EAAE,MAAM,KACT,OAAO,CACR;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,OAAO,CAAA;SAAE,GACjD,IAAI,GACJ;YACE,MAAM,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAC;gBAAC,OAAO,EAAE,OAAO,CAAA;aAAE,GAAG,IAAI,CAAC;YACjE,MAAM,EAAE,KAAK,CACT;gBAAE,IAAI,EAAE,KAAK,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAC;gBAAC,SAAS,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAA;aAAE,GAC/D;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAC;gBAAC,SAAS,EAAE,MAAM,CAAA;aAAE,CACpD,CAAC;SACH,CACJ,CAAC;QACF,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KACvE,CAAC;CACH,KACA,OAAO,CAAC,gBAAgB,CAmV1B,CAAC"}
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 = spec.name;
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 = (spec.range || '').replace(/^[~^>=<\s]+/, '');
167
+ const cleanRange = (request.range || '').replace(/^[~^>=<\s]+/, '');
141
168
  if (/^\d+\.\d+\.\d+$/.test(cleanRange)) {
142
- const exact = entries.find((e) => e.name === effName && e.version === cleanRange);
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 === effName);
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, spec.range);
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 (spec.range && data.versions[spec.range])
324
- version = spec.range;
325
- if (!version && spec.range && spec.range !== 'latest') {
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, spec.range);
355
+ version = RESOLVE_VERSION(allVersions, request.range);
329
356
  }
330
357
  if (!version) {
331
- version = data['dist-tags']?.[spec.range] || data['dist-tags']?.latest || null;
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 ${spec.range}`);
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(v.name).split('/').pop()]: binField }
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: v.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":"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"}
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/npm/resolver.ts"],"names":[],"mappings":"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"}
@@ -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 = versionRange.replace(/^[~^>=<\s]+/, '');
210
+ const cleanRange = requestedRange.replace(/^[~^>=<\s]+/, '');
181
211
  if (cleanRange.match(/^\d+\.\d+\.\d+$/)) {
182
- const cached = cache.getRegistryEntry(name, cleanRange);
212
+ const cached = cache.getRegistryEntry(cacheName, cleanRange);
183
213
  if (cached) {
184
- log?.(` ${name}: found exact ${cleanRange} in cache`);
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(name);
219
+ const cachedVersions = cache.getRegistryVersions(cacheName);
190
220
  if (cachedVersions.length > 0) {
191
- const isDistTag = !versionRange || versionRange === 'latest' || versionRange === '*' || versionRange === '';
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?.(` ${name}: resolved ${versionRange || '(empty)'} → ${sorted[0].entry.version} (highest cached)`);
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, versionRange);
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?.(` ${name}: resolved ${versionRange} → ${resolved} from cache`);
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?.(` ${name}: ${cachedVersions.length} cached versions, none match ${versionRange}, cache fresh`);
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?.(` ${name}: cache read error: ${e?.message}`);
255
+ log?.(` ${cacheName}: cache read error: ${e?.message}`);
226
256
  }
227
257
  // 3. Fetch from registry
228
- log?.(` ${name}: fetching from registry (${fetchFn ? 'proxy' : 'direct'})...`);
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(name);
262
+ packumentFetchStart(registryName);
231
263
  let data;
232
264
  let bytesDecoded = 0;
233
265
  try {
234
- const safeName = name.startsWith('@')
235
- ? '@' + encodeURIComponent(name.slice(1))
236
- : encodeURIComponent(name);
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?.(` ${name}: retry ${attempt}/${total} after ${delayMs}ms (${reason})`);
283
+ log?.(` ${registryName}: retry ${attempt}/${total} after ${delayMs}ms (${reason})`);
252
284
  },
253
285
  });
254
- log?.(` ${name}: registry responded ${resp.status}`);
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?.(` ${name}: fetch error: ${e?.message}`);
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?.(` ${name}: no versions field in packument`);
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 (versionRange && data.versions[versionRange]) {
323
- version = versionRange;
354
+ if (requestedRange && data.versions[requestedRange]) {
355
+ version = requestedRange;
324
356
  }
325
357
  // Try range resolution
326
- if (!version && versionRange && versionRange !== 'latest') {
358
+ if (!version && requestedRange && requestedRange !== 'latest') {
327
359
  const allVersions = Object.keys(data.versions);
328
- version = resolveVersion(allVersions, versionRange);
360
+ version = resolveVersion(allVersions, requestedRange);
329
361
  }
330
362
  // Try dist-tags
331
363
  if (!version) {
332
- version = data['dist-tags']?.[versionRange] || data['dist-tags']?.latest || null;
364
+ version = data['dist-tags']?.[requestedRange] || data['dist-tags']?.latest || null;
333
365
  }
334
366
  if (!version || !data.versions[version]) {
335
- log?.(` ${name}: could not resolve version for range ${versionRange}`);
367
+ log?.(` ${registryName}: could not resolve version for range ${requestedRange}`);
336
368
  return null;
337
369
  }
338
- log?.(` ${name}: resolved → ${version}`);
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 ${name}:`, e?.message);
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
- ? { [vData.name.split('/').pop()]: binField }
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: vData.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;AAqBH,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,iBAAiB,CAAC;AAEzB,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,CAkHf"}
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"}