remote-components 0.0.41 → 0.0.42

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 (33) hide show
  1. package/dist/html/host.cjs +429 -312
  2. package/dist/html/host.cjs.map +1 -1
  3. package/dist/html/host.js +429 -312
  4. package/dist/html/host.js.map +1 -1
  5. package/dist/html/remote.cjs.map +1 -1
  6. package/dist/html/remote.js.map +1 -1
  7. package/dist/internal/shared/client/remote-component.cjs +404 -304
  8. package/dist/internal/shared/client/remote-component.cjs.map +1 -1
  9. package/dist/internal/shared/client/remote-component.d.ts +10 -1
  10. package/dist/internal/shared/client/remote-component.js +404 -304
  11. package/dist/internal/shared/client/remote-component.js.map +1 -1
  12. package/dist/internal/shared/error.cjs +4 -4
  13. package/dist/internal/shared/error.cjs.map +1 -1
  14. package/dist/internal/shared/error.d.ts +5 -2
  15. package/dist/internal/shared/error.js +4 -4
  16. package/dist/internal/shared/error.js.map +1 -1
  17. package/dist/internal/shared/ssr/fetch-remote-component.cjs +22 -7
  18. package/dist/internal/shared/ssr/fetch-remote-component.cjs.map +1 -1
  19. package/dist/internal/shared/ssr/fetch-remote-component.js +22 -7
  20. package/dist/internal/shared/ssr/fetch-remote-component.js.map +1 -1
  21. package/dist/internal/webpack/shared-modules.cjs +36 -1
  22. package/dist/internal/webpack/shared-modules.cjs.map +1 -1
  23. package/dist/internal/webpack/shared-modules.js +36 -1
  24. package/dist/internal/webpack/shared-modules.js.map +1 -1
  25. package/dist/next/host/client/index.cjs +412 -311
  26. package/dist/next/host/client/index.cjs.map +1 -1
  27. package/dist/next/host/client/index.js +412 -311
  28. package/dist/next/host/client/index.js.map +1 -1
  29. package/dist/react/index.cjs +4 -3
  30. package/dist/react/index.cjs.map +1 -1
  31. package/dist/react/index.js +4 -3
  32. package/dist/react/index.js.map +1 -1
  33. package/package.json +4 -6
@@ -275,14 +275,14 @@ var RemoteComponentsError = class extends Error {
275
275
  }
276
276
  };
277
277
  function multipleRemoteComponentsError(url) {
278
- return new Error(
278
+ return new RemoteComponentsError(
279
279
  `Multiple Remote Components found at "${url}". When a page exposes multiple Remote Components you must specify the "name" prop to select which one to load.`
280
280
  );
281
281
  }
282
- function failedToFetchRemoteComponentError(url, error) {
282
+ function failedToFetchRemoteComponentError(url, { status, statusText }, help = "Is the URL correct and accessible?") {
283
283
  return new RemoteComponentsError(
284
- `Failed to fetch Remote Component from "${url}". Is the URL correct and accessible?`,
285
- { cause: error instanceof Error ? error : new Error(String(error)) }
284
+ `Failed to fetch Remote Component from "${url}". ${help}`,
285
+ { cause: new Error(`${status} ${statusText}`) }
286
286
  );
287
287
  }
288
288
 
@@ -293,6 +293,18 @@ import * as JSXRuntime from "react/jsx-runtime";
293
293
  import * as ReactDOM from "react-dom";
294
294
  import * as ReactDOMClient from "react-dom/client";
295
295
 
296
+ // src/shared/utils/logger.ts
297
+ var PREFIX = "remote-components";
298
+ var DEBUG = typeof window !== "undefined" && localStorage.getItem("RC_DEBUG") === "true";
299
+ function logDebug(location2, message) {
300
+ if (DEBUG) {
301
+ console.debug(`[${PREFIX}:${location2}]: ${message}`);
302
+ }
303
+ }
304
+ function logWarn(location2, message) {
305
+ console.warn(`[${PREFIX}:${location2}]: ${message}`);
306
+ }
307
+
296
308
  // src/shared/webpack/next-client-pages-loader.ts
297
309
  function nextClientPagesLoader(bundle, route, styleContainer = document.head) {
298
310
  const self = globalThis;
@@ -407,28 +419,62 @@ function nextClientPagesLoader(bundle, route, styleContainer = document.head) {
407
419
 
408
420
  // src/shared/webpack/shared-modules.ts
409
421
  function applySharedModules(bundle, resolve) {
422
+ logDebug(
423
+ "SharedModules",
424
+ `applySharedModules called for bundle: "${bundle}"`
425
+ );
426
+ logDebug(
427
+ "SharedModules",
428
+ `Shared modules to resolve: ${Object.keys(resolve)}`
429
+ );
410
430
  const self = globalThis;
411
431
  if (self.__remote_webpack_require__?.[bundle]) {
412
432
  const modulePaths = Object.keys(
413
433
  self.__remote_webpack_module_map__?.[bundle] ?? self.__remote_webpack_require__[bundle].m ?? {}
414
434
  );
435
+ logDebug(
436
+ "SharedModules",
437
+ `Available module paths in __remote_webpack_require__[${bundle}]: ${modulePaths}`
438
+ );
415
439
  for (const [key, value] of Object.entries(resolve)) {
416
440
  let ids = modulePaths.filter((p) => p === key);
417
441
  if (ids.length === 0) {
418
442
  ids = modulePaths.filter((p) => p.includes(key));
419
443
  }
444
+ if (ids.length === 0) {
445
+ logDebug(
446
+ "SharedModules",
447
+ `No matching module path found for shared module "${key}"`
448
+ );
449
+ }
420
450
  for (let id of ids) {
421
451
  const webpackBundle = self.__remote_webpack_require__[bundle];
422
452
  if (webpackBundle.m) {
423
453
  if (self.__remote_webpack_module_map__?.[bundle]?.[id]) {
424
- id = `${self.__remote_webpack_module_map__[bundle][id]}`;
454
+ const mappedId = `${self.__remote_webpack_module_map__[bundle][id]}`;
455
+ logDebug(
456
+ "SharedModules",
457
+ `Mapped module id: "${id}" -> "${mappedId}"`
458
+ );
459
+ id = mappedId;
425
460
  }
426
461
  webpackBundle.m[id] = (module) => {
427
462
  module.exports = value;
428
463
  };
464
+ } else {
465
+ logWarn(
466
+ "SharedModules",
467
+ `webpackBundle.m is not available for bundle "${bundle}"`
468
+ );
429
469
  }
430
470
  }
431
471
  }
472
+ } else {
473
+ logWarn("SharedModules", `No webpack require found for bundle "${bundle}"`);
474
+ logDebug(
475
+ "SharedModules",
476
+ `Available bundles: ${Object.keys(self.__remote_webpack_require__ ?? {})}`
477
+ );
432
478
  }
433
479
  }
434
480
 
@@ -549,52 +595,7 @@ function getBundleKey(bundle) {
549
595
  return escapeString(bundle);
550
596
  }
551
597
 
552
- // src/shared/client/webpack-adapter.ts
553
- async function setupWebpackRuntime(runtime, scripts = [], url = new URL(location.href), bundle, shared = {}, remoteShared = {}) {
554
- const self = globalThis;
555
- if (!self.__remote_bundle_url__) {
556
- self.__remote_bundle_url__ = {};
557
- }
558
- self.__remote_bundle_url__[bundle ?? "default"] = url;
559
- self.__webpack_get_script_filename__ = () => null;
560
- if (typeof self.__webpack_require__ !== "function" || self.__webpack_require_type__ !== "turbopack") {
561
- if (!self.__original_webpack_require__ && !self.__original_webpack_chunk_load__) {
562
- self.__original_webpack_chunk_load__ = self.__webpack_chunk_load__;
563
- self.__original_webpack_require__ = self.__webpack_require__;
564
- }
565
- self.__webpack_chunk_load__ = createChunkLoader(runtime);
566
- self.__webpack_require__ = createModuleRequire(runtime);
567
- self.__webpack_require_type__ = runtime;
568
- if (self.__remote_webpack_require__ && runtime === RUNTIME_TURBOPACK) {
569
- const remoteBundle = bundle ?? "default";
570
- self.__remote_webpack_require__[remoteBundle] = self.__webpack_require__;
571
- self.__remote_webpack_require__[remoteBundle].type = "turbopack";
572
- }
573
- }
574
- if (runtime === RUNTIME_TURBOPACK) {
575
- await Promise.all(
576
- scripts.map((script) => {
577
- if (script.src) {
578
- return self.__webpack_chunk_load__?.(script.src, bundle);
579
- }
580
- return Promise.resolve(void 0);
581
- })
582
- );
583
- }
584
- await initializeSharedModules(
585
- bundle ?? "default",
586
- // include all core modules as shared
587
- {
588
- react: async () => (await import("react")).default,
589
- "react-dom": async () => (await import("react-dom")).default,
590
- "react/jsx-dev-runtime": async () => (await import("react/jsx-dev-runtime")).default,
591
- "react/jsx-runtime": async () => (await import("react/jsx-runtime")).default,
592
- "react-dom/client": async () => (await import("react-dom/client")).default,
593
- ...shared
594
- },
595
- remoteShared
596
- );
597
- }
598
+ // src/shared/client/chunk-loader.ts
598
599
  function createChunkLoader(runtime) {
599
600
  return function __turbopack_chunk_load__(chunkId, scriptBundle) {
600
601
  const self = globalThis;
@@ -709,46 +710,232 @@ async function handleTurbopackChunk(code, bundle, url) {
709
710
  await Promise.all(loadChunkLists);
710
711
  }
711
712
  }
712
- function createModuleRequire(runtime) {
713
- return (id) => {
714
- const self = globalThis;
715
- const { bundle, id: moduleId } = id.match(REMOTE_COMPONENT_REGEX)?.groups ?? {
716
- bundle: "default",
717
- id
718
- };
719
- const remoteRuntime = self.__remote_webpack_require__?.[bundle ?? "default"] ? self.__remote_webpack_require__[bundle ?? "default"]?.type || "webpack" : runtime;
720
- try {
721
- if (remoteRuntime === RUNTIME_WEBPACK && bundle && moduleId) {
722
- return self.__remote_webpack_require__?.[bundle]?.(moduleId);
713
+
714
+ // src/shared/client/turbopack-module.ts
715
+ function handleTurbopackModule(bundle, moduleId, id) {
716
+ const self = globalThis;
717
+ const bundleKey = getBundleKey(bundle);
718
+ const modules = self[`TURBOPACK_${bundleKey}`];
719
+ const moduleInit = findModuleInit(modules, moduleId);
720
+ const exports = {};
721
+ const moduleExports = { exports };
722
+ if (!self.__remote_components_turbopack_modules__) {
723
+ self.__remote_components_turbopack_modules__ = {};
724
+ }
725
+ if (!self.__remote_components_turbopack_modules__[bundle]) {
726
+ self.__remote_components_turbopack_modules__[bundle] = {};
727
+ }
728
+ if (self.__remote_components_turbopack_modules__[bundle][moduleId]) {
729
+ return self.__remote_components_turbopack_modules__[bundle][moduleId];
730
+ }
731
+ if (typeof moduleInit !== "function") {
732
+ throw new Error(
733
+ `Module ${id} not found in bundle ${bundle} with id ${moduleId}`
734
+ );
735
+ }
736
+ self.__remote_components_turbopack_modules__[bundle][moduleId] = moduleExports.exports;
737
+ if (!self.__remote_components_turbopack_global__) {
738
+ self.__remote_components_turbopack_global__ = {};
739
+ }
740
+ if (!self.__remote_components_turbopack_global__[bundle]) {
741
+ self.__remote_components_turbopack_global__[bundle] = {};
742
+ }
743
+ const allModules = modules?.flat() ?? [];
744
+ moduleInit(
745
+ createTurbopackContext(
746
+ bundle,
747
+ exports,
748
+ moduleExports,
749
+ allModules,
750
+ moduleInit,
751
+ id,
752
+ self
753
+ ),
754
+ moduleExports,
755
+ exports
756
+ );
757
+ if (self.__remote_components_turbopack_modules__[bundle][moduleId] !== moduleExports.exports) {
758
+ self.__remote_components_turbopack_modules__[bundle][moduleId] = moduleExports.exports;
759
+ }
760
+ return moduleExports.exports;
761
+ }
762
+ function findModuleInit(modules, moduleId) {
763
+ const allModules = modules?.flat() ?? [];
764
+ if (typeof allModules[1] === "string" || typeof allModules[1] === "number") {
765
+ const normalizedId = /^[0-9]+$/.test(moduleId) ? Number(moduleId) : moduleId;
766
+ let moduleIdIndex = allModules.indexOf(normalizedId);
767
+ if (moduleIdIndex === -1) {
768
+ moduleIdIndex = allModules.findIndex(
769
+ (bundleEntry) => typeof bundleEntry === "string" && bundleEntry.startsWith(moduleId) || bundleEntry === normalizedId
770
+ );
771
+ }
772
+ if (moduleIdIndex !== -1) {
773
+ while (typeof allModules[moduleIdIndex] !== "function" && moduleIdIndex < allModules.length) {
774
+ moduleIdIndex++;
723
775
  }
724
- const sharedModule = getSharedModule(bundle ?? "default", moduleId ?? id);
725
- if (sharedModule) {
726
- return sharedModule;
776
+ return allModules[moduleIdIndex];
777
+ }
778
+ } else {
779
+ return allModules.find(
780
+ (bundleEntry) => typeof bundleEntry === "object" && bundleEntry !== null && moduleId in bundleEntry
781
+ )?.[moduleId];
782
+ }
783
+ return void 0;
784
+ }
785
+ function createTurbopackContext(bundle, exports, moduleExports, allModules, moduleInit, id, self) {
786
+ return {
787
+ // HMR not implemented for Remote Components
788
+ k: {
789
+ register() {
790
+ },
791
+ registerExports() {
792
+ },
793
+ signature() {
794
+ return (fn) => fn;
727
795
  }
728
- if (bundle && moduleId) {
729
- return handleTurbopackModule(bundle, moduleId, id);
796
+ },
797
+ // ESM exports setup
798
+ s(bindings, esmId) {
799
+ let mod = exports;
800
+ if (typeof esmId === "string" || typeof esmId === "number") {
801
+ if (!self.__remote_components_turbopack_modules__) {
802
+ self.__remote_components_turbopack_modules__ = {};
803
+ }
804
+ if (!self.__remote_components_turbopack_modules__[bundle]) {
805
+ self.__remote_components_turbopack_modules__[bundle] = {};
806
+ }
807
+ if (!self.__remote_components_turbopack_modules__[bundle][esmId]) {
808
+ self.__remote_components_turbopack_modules__[bundle][esmId] = {};
809
+ }
810
+ mod = self.__remote_components_turbopack_modules__[bundle][esmId];
730
811
  }
731
- throw new Error(`Module "${id}" not found.`);
732
- } catch (requireError) {
733
- if (typeof self.__original_webpack_require__ !== "function") {
734
- throw new RemoteComponentsError(
735
- `Module "${id}" not found in remote component bundle "${bundle}".`,
736
- {
737
- cause: requireError instanceof Error ? requireError : void 0
812
+ Object.defineProperty(mod, "__esModule", { value: true });
813
+ if (Array.isArray(bindings)) {
814
+ let i = 0;
815
+ while (i < bindings.length) {
816
+ const propName = bindings[i++];
817
+ const tagOrFunc = bindings[i++];
818
+ if (typeof tagOrFunc === "number") {
819
+ Object.defineProperty(mod, propName, {
820
+ value: bindings[i++],
821
+ enumerable: true,
822
+ writable: false
823
+ });
824
+ } else {
825
+ const getterFn = tagOrFunc;
826
+ if (typeof bindings[i] === "function") {
827
+ const setterFn = bindings[i++];
828
+ Object.defineProperty(mod, propName, {
829
+ get: getterFn,
830
+ set: setterFn,
831
+ enumerable: true
832
+ });
833
+ } else {
834
+ Object.defineProperty(mod, propName, {
835
+ get: getterFn,
836
+ enumerable: true
837
+ });
838
+ }
738
839
  }
739
- );
840
+ }
740
841
  }
741
- try {
742
- return self.__original_webpack_require__(id);
743
- } catch (originalError) {
744
- throw new RemoteComponentsError(
745
- `Module "${id}" not found in remote component bundle "${bundle}".`,
746
- { cause: originalError instanceof Error ? originalError : void 0 }
842
+ },
843
+ // import
844
+ i(importId) {
845
+ let mod;
846
+ if (typeof importId === "string") {
847
+ const { exportSource, exportName } = /\s+<export (?<exportSource>.*?) as (?<exportName>.*?)>$/.exec(
848
+ importId
849
+ )?.groups ?? {};
850
+ const normalizedId = importId.replace(
851
+ /\s+<export(?<specifier>.*)>$/,
852
+ ""
747
853
  );
854
+ mod = self.__webpack_require__?.(`[${bundle}] ${normalizedId}`);
855
+ if (mod && exportSource && exportName && (exportSource === "*" || typeof mod[exportSource] !== "undefined") && typeof mod[exportName] === "undefined") {
856
+ if (exportSource === "*") {
857
+ mod[exportName] = mod;
858
+ } else {
859
+ mod[exportName] = mod[exportSource];
860
+ }
861
+ }
862
+ } else {
863
+ mod = self.__webpack_require__?.(`[${bundle}] ${importId}`);
748
864
  }
749
- }
865
+ if (typeof mod !== "object" || mod === null) {
866
+ mod = { default: mod };
867
+ } else if (!("default" in mod) && mod.toString() !== "[object Module]") {
868
+ try {
869
+ mod.default = mod;
870
+ } catch {
871
+ }
872
+ }
873
+ return mod;
874
+ },
875
+ // require
876
+ r(requireId) {
877
+ return self.__webpack_require__?.(`[${bundle}] ${requireId}`);
878
+ },
879
+ // value exports
880
+ v(value) {
881
+ if (typeof value === "function") {
882
+ exports.default = value((vid) => {
883
+ return self.__webpack_require__?.(`[${bundle}] ${vid}`);
884
+ });
885
+ } else {
886
+ moduleExports.exports = value;
887
+ }
888
+ },
889
+ // async module initializer
890
+ async a(mod) {
891
+ let result;
892
+ await mod(
893
+ () => {
894
+ },
895
+ (value) => result = value
896
+ );
897
+ exports.default = result;
898
+ },
899
+ // async module loader
900
+ async A(Aid) {
901
+ const mod = self.__webpack_require__?.(`[${bundle}] ${Aid}`);
902
+ return mod.default(
903
+ (parentId) => self.__webpack_require__?.(`[${bundle}] ${parentId}`)
904
+ );
905
+ },
906
+ // chunk loader
907
+ l(url) {
908
+ const moduleInitIndex = allModules.indexOf(moduleInit);
909
+ if (moduleInitIndex !== -1) {
910
+ const scriptIndex = allModules.slice(0, moduleInitIndex).findLastIndex((bundleEntry) => bundleEntry instanceof Element);
911
+ if (scriptIndex !== -1) {
912
+ const script = allModules[scriptIndex];
913
+ const scriptSrc = script.getAttribute("data-turbopack-src") || "";
914
+ const nextIndex = scriptSrc.indexOf("/_next");
915
+ const baseUrl = nextIndex !== -1 ? scriptSrc.slice(0, nextIndex) : "";
916
+ const bundleUrl = `[${bundle}] ${baseUrl}/_next/${url}`;
917
+ return self.__webpack_chunk_load__?.(bundleUrl, bundle);
918
+ }
919
+ }
920
+ throw new Error(
921
+ `Failed to load Turbopack chunk "${url}" for module "${id}". Check the URL is correct.`
922
+ );
923
+ },
924
+ // global object for this bundle
925
+ g: self.__remote_components_turbopack_global__?.[bundle],
926
+ m: moduleExports,
927
+ e: exports
750
928
  };
751
929
  }
930
+
931
+ // src/shared/client/turbopack-patterns.ts
932
+ var REMOTE_SHARED_MARKER_RE = /(?:self|[a-z])\.TURBOPACK_REMOTE_SHARED/;
933
+ var REMOTE_SHARED_ASSIGNMENT_RE = /\.TURBOPACK_REMOTE_SHARED=await (?:__turbopack_context__|e)\.A\((?<sharedModuleId>[0-9]+)\)/;
934
+ var ASYNC_MODULE_LOADER_RE = /(?:__turbopack_context__|e)\.A\((?<asyncSharedModuleId>[0-9]+)\)/;
935
+ var ASYNC_MODULE_RESOLVE_RE = /(?<ctx>__turbopack_context__|e)=>\{\k<ctx>\.v\((?<inner>parentImport|e)=>Promise\.resolve\(\)\.then\(\(\)=>\k<inner>\((?<sharedModuleId>[0-9]+)\)\)\)\}/;
936
+ var ASYNC_MODULE_ALL_RE = /(?<ctx>__turbopack_context__|e)=>\{\k<ctx>\.v\((?<vCb>parentImport|t)=>Promise\.all\(\["[^"]+"\]\.map\((?<mapCb>chunk|t)=>\k<ctx>\.l\(\k<mapCb>\)\)\)\.then\(\(\)=>\k<vCb>\((?<sharedModuleId>[0-9]+)\)\)\)\}/;
937
+
938
+ // src/shared/client/shared-modules.ts
752
939
  async function initializeSharedModules(bundle, hostShared = {}, remoteShared = {}) {
753
940
  const self = globalThis;
754
941
  self.__remote_shared_modules__ = self.__remote_shared_modules__ ?? {};
@@ -765,14 +952,12 @@ async function initializeSharedModules(bundle, hostShared = {}, remoteShared = {
765
952
  return false;
766
953
  }
767
954
  const funcCode = idOrFunc.toString();
768
- return /[a-z]\.TURBOPACK_REMOTE_SHARED/.test(funcCode);
955
+ return REMOTE_SHARED_MARKER_RE.test(funcCode);
769
956
  });
770
957
  if (sharedModuleInitializerIndex > 0) {
771
958
  const sharedModuleInitializerCode = allModules[sharedModuleInitializerIndex].toString();
772
959
  const sharedModuleInitializerId = allModules[sharedModuleInitializerIndex - 1];
773
- const { sharedModuleId } = /\.TURBOPACK_REMOTE_SHARED=await e\.A\((?<sharedModuleId>[0-9]+)\)/.exec(
774
- sharedModuleInitializerCode
775
- )?.groups ?? {};
960
+ const { sharedModuleId } = REMOTE_SHARED_ASSIGNMENT_RE.exec(sharedModuleInitializerCode)?.groups ?? {};
776
961
  if (sharedModuleId) {
777
962
  const { default: sharedModuleInitializerInstance } = handleTurbopackModule(
778
963
  bundle,
@@ -784,33 +969,11 @@ async function initializeSharedModules(bundle, hostShared = {}, remoteShared = {
784
969
  }
785
970
  if (sharedModuleInitializer) {
786
971
  const { shared } = await sharedModuleInitializer;
787
- const sharedModuleIds = Object.entries(shared).filter(([, value]) => typeof value === "function").reduce((acc, [key, value]) => {
788
- const { asyncSharedModuleId } = /e\.A\((?<asyncSharedModuleId>[0-9]+)\)/.exec(value.toString())?.groups ?? {};
789
- if (asyncSharedModuleId) {
790
- const asyncSharedModuleIdNumber = Number(asyncSharedModuleId);
791
- let asyncSharedModule;
792
- const newAllModules = self[`TURBOPACK_${bundleKey}`]?.flat() ?? [];
793
- const asyncSharedModuleIdIndex = newAllModules.indexOf(
794
- asyncSharedModuleIdNumber
795
- );
796
- if (asyncSharedModuleIdIndex !== -1 && typeof newAllModules[asyncSharedModuleIdIndex + 1] === "function") {
797
- asyncSharedModule = newAllModules[asyncSharedModuleIdIndex + 1];
798
- }
799
- if (asyncSharedModule) {
800
- const asyncSharedModuleCode = asyncSharedModule.toString();
801
- const { sharedModuleId } = /e=>{e\.v\(e=>Promise\.resolve\(\)\.then\(\(\)=>e\((?<sharedModuleId>[0-9]+)\)\)\)}/.exec(
802
- asyncSharedModuleCode
803
- )?.groups ?? /e=>{e\.v\(t=>Promise\.all\(\["[^"]+"\].map\(t=>e\.l\(t\)\)\)\.then\(\(\)=>t\((?<sharedModuleId>[0-9]+)\)\)\)}/.exec(
804
- asyncSharedModuleCode
805
- )?.groups ?? {};
806
- acc[sharedModuleId ?? asyncSharedModuleId] = key.replace(
807
- "__remote_shared_module_",
808
- ""
809
- );
810
- }
811
- }
812
- return acc;
813
- }, {});
972
+ const sharedModuleIds = extractSharedModuleIds(
973
+ shared,
974
+ bundleKey,
975
+ self
976
+ );
814
977
  return Promise.all(
815
978
  Object.entries(sharedModuleIds).map(async ([id, module]) => {
816
979
  if (self.__remote_shared_modules__?.[bundle]) {
@@ -834,6 +997,31 @@ async function initializeSharedModules(bundle, hostShared = {}, remoteShared = {
834
997
  })
835
998
  );
836
999
  }
1000
+ function extractSharedModuleIds(shared, bundleKey, self) {
1001
+ return Object.entries(shared).filter(([, value]) => typeof value === "function").reduce((acc, [key, value]) => {
1002
+ const { asyncSharedModuleId } = ASYNC_MODULE_LOADER_RE.exec(value.toString())?.groups ?? {};
1003
+ if (asyncSharedModuleId) {
1004
+ const asyncSharedModuleIdNumber = Number(asyncSharedModuleId);
1005
+ let asyncSharedModule;
1006
+ const newAllModules = self[`TURBOPACK_${bundleKey}`]?.flat() ?? [];
1007
+ const asyncSharedModuleIdIndex = newAllModules.indexOf(
1008
+ asyncSharedModuleIdNumber
1009
+ );
1010
+ if (asyncSharedModuleIdIndex !== -1 && typeof newAllModules[asyncSharedModuleIdIndex + 1] === "function") {
1011
+ asyncSharedModule = newAllModules[asyncSharedModuleIdIndex + 1];
1012
+ }
1013
+ if (asyncSharedModule) {
1014
+ const asyncSharedModuleCode = asyncSharedModule.toString();
1015
+ const { sharedModuleId } = ASYNC_MODULE_RESOLVE_RE.exec(asyncSharedModuleCode)?.groups ?? ASYNC_MODULE_ALL_RE.exec(asyncSharedModuleCode)?.groups ?? {};
1016
+ acc[sharedModuleId ?? asyncSharedModuleId] = key.replace(
1017
+ "__remote_shared_module_",
1018
+ ""
1019
+ );
1020
+ }
1021
+ }
1022
+ return acc;
1023
+ }, {});
1024
+ }
837
1025
  function getSharedModule(bundle, id) {
838
1026
  const self = globalThis;
839
1027
  for (const [key, value] of Object.entries(
@@ -845,210 +1033,100 @@ function getSharedModule(bundle, id) {
845
1033
  }
846
1034
  return null;
847
1035
  }
848
- function handleTurbopackModule(bundle, moduleId, id) {
1036
+
1037
+ // src/shared/client/webpack-adapter.ts
1038
+ async function setupWebpackRuntime(runtime, scripts = [], url = new URL(location.href), bundle, shared = {}, remoteShared = {}) {
849
1039
  const self = globalThis;
850
- const bundleKey = getBundleKey(bundle);
851
- const modules = self[`TURBOPACK_${bundleKey}`];
852
- let moduleInit;
853
- const allModules = modules?.flat() ?? [];
854
- if (typeof allModules[1] === "string" || typeof allModules[1] === "number") {
855
- const normalizedId = /^[0-9]+$/.test(moduleId) ? Number(moduleId) : moduleId;
856
- let moduleIdIndex = allModules.indexOf(normalizedId);
857
- if (moduleIdIndex === -1) {
858
- moduleIdIndex = allModules.findIndex(
859
- (bundleEntry) => typeof bundleEntry === "string" && bundleEntry.startsWith(moduleId) || bundleEntry === normalizedId
860
- );
1040
+ if (!self.__remote_bundle_url__) {
1041
+ self.__remote_bundle_url__ = {};
1042
+ }
1043
+ self.__remote_bundle_url__[bundle ?? "default"] = url;
1044
+ self.__webpack_get_script_filename__ = () => null;
1045
+ if (typeof self.__webpack_require__ !== "function" || self.__webpack_require_type__ !== "turbopack") {
1046
+ if (!self.__original_webpack_require__ && !self.__original_webpack_chunk_load__) {
1047
+ self.__original_webpack_chunk_load__ = self.__webpack_chunk_load__;
1048
+ self.__original_webpack_require__ = self.__webpack_require__;
861
1049
  }
862
- if (moduleIdIndex !== -1) {
863
- while (typeof allModules[moduleIdIndex] !== "function" && moduleIdIndex < allModules.length) {
864
- moduleIdIndex++;
865
- }
866
- moduleInit = allModules[moduleIdIndex];
1050
+ self.__webpack_chunk_load__ = createChunkLoader(runtime);
1051
+ self.__webpack_require__ = createModuleRequire(runtime);
1052
+ self.__webpack_require_type__ = runtime;
1053
+ if (self.__remote_webpack_require__ && runtime === RUNTIME_TURBOPACK) {
1054
+ const remoteBundle = bundle ?? "default";
1055
+ self.__remote_webpack_require__[remoteBundle] = self.__webpack_require__;
1056
+ self.__remote_webpack_require__[remoteBundle].type = "turbopack";
867
1057
  }
868
- } else {
869
- moduleInit = allModules.find(
870
- (bundleEntry) => typeof bundleEntry === "object" && bundleEntry !== null && moduleId in bundleEntry
871
- )?.[moduleId];
872
- }
873
- const exports = {};
874
- const moduleExports = { exports };
875
- if (!self.__remote_components_turbopack_modules__) {
876
- self.__remote_components_turbopack_modules__ = {};
877
- }
878
- if (!self.__remote_components_turbopack_modules__[bundle]) {
879
- self.__remote_components_turbopack_modules__[bundle] = {};
880
1058
  }
881
- if (self.__remote_components_turbopack_modules__[bundle][moduleId]) {
882
- return self.__remote_components_turbopack_modules__[bundle][moduleId];
883
- }
884
- if (typeof moduleInit !== "function") {
885
- throw new Error(
886
- `Module ${id} not found in bundle ${bundle} with id ${moduleId}`
1059
+ if (runtime === RUNTIME_TURBOPACK) {
1060
+ await Promise.all(
1061
+ scripts.map((script) => {
1062
+ if (script.src) {
1063
+ return self.__webpack_chunk_load__?.(script.src, bundle);
1064
+ }
1065
+ return Promise.resolve(void 0);
1066
+ })
887
1067
  );
888
1068
  }
889
- self.__remote_components_turbopack_modules__[bundle][moduleId] = moduleExports.exports;
890
- if (!self.__remote_components_turbopack_global__) {
891
- self.__remote_components_turbopack_global__ = {};
892
- }
893
- if (!self.__remote_components_turbopack_global__[bundle]) {
894
- self.__remote_components_turbopack_global__[bundle] = {};
895
- }
896
- moduleInit(
897
- {
898
- // HMR not implemented for Remote Components
899
- k: {
900
- register() {
901
- },
902
- registerExports() {
903
- },
904
- signature() {
905
- return (fn) => {
906
- return fn;
907
- };
908
- }
909
- },
910
- // esm
911
- s(bindings, esmId) {
912
- let mod = exports;
913
- if (typeof esmId === "string" || typeof esmId === "number") {
914
- if (!self.__remote_components_turbopack_modules__) {
915
- self.__remote_components_turbopack_modules__ = {};
916
- }
917
- if (!self.__remote_components_turbopack_modules__[bundle]) {
918
- self.__remote_components_turbopack_modules__[bundle] = {};
919
- }
920
- if (!self.__remote_components_turbopack_modules__[bundle][esmId]) {
921
- self.__remote_components_turbopack_modules__[bundle][esmId] = {};
922
- }
923
- mod = self.__remote_components_turbopack_modules__[bundle][esmId];
924
- }
925
- Object.defineProperty(mod, "__esModule", { value: true });
926
- if (Array.isArray(bindings)) {
927
- let i = 0;
928
- while (i < bindings.length) {
929
- const propName = bindings[i++];
930
- const tagOrFunc = bindings[i++];
931
- if (typeof tagOrFunc === "number") {
932
- Object.defineProperty(mod, propName, {
933
- value: bindings[i++],
934
- enumerable: true,
935
- writable: false
936
- });
937
- } else {
938
- const getterFn = tagOrFunc;
939
- if (typeof bindings[i] === "function") {
940
- const setterFn = bindings[i++];
941
- Object.defineProperty(mod, propName, {
942
- get: getterFn,
943
- set: setterFn,
944
- enumerable: true
945
- });
946
- } else {
947
- Object.defineProperty(mod, propName, {
948
- get: getterFn,
949
- enumerable: true
950
- });
951
- }
952
- }
953
- }
954
- }
955
- },
956
- // import
957
- i(importId) {
958
- let mod;
959
- if (typeof importId === "string") {
960
- const { exportSource, exportName } = /\s+<export (?<exportSource>.*?) as (?<exportName>.*?)>$/.exec(
961
- importId
962
- )?.groups ?? {};
963
- const normalizedId = importId.replace(
964
- /\s+<export(?<specifier>.*)>$/,
965
- ""
966
- );
967
- mod = self.__webpack_require__?.(
968
- `[${bundle}] ${normalizedId}`
969
- );
970
- if (exportSource && exportName && (exportSource === "*" || typeof mod[exportSource] !== "undefined") && typeof mod[exportName] === "undefined") {
971
- if (exportSource === "*") {
972
- mod[exportName] = mod;
973
- } else {
974
- mod[exportName] = mod[exportSource];
975
- }
976
- }
977
- } else {
978
- mod = self.__webpack_require__?.(`[${bundle}] ${importId}`);
979
- }
980
- if (typeof mod !== "object") {
981
- mod = { default: mod };
982
- } else if (!("default" in mod) && // eslint-disable-next-line @typescript-eslint/no-base-to-string
983
- mod.toString() !== "[object Module]") {
984
- try {
985
- mod.default = mod;
986
- } catch {
1069
+ const coreShared = {
1070
+ react: async () => (await import("react")).default,
1071
+ "react-dom": async () => (await import("react-dom")).default,
1072
+ "react/jsx-dev-runtime": async () => (await import("react/jsx-dev-runtime")).default,
1073
+ "react/jsx-runtime": async () => (await import("react/jsx-runtime")).default,
1074
+ "react-dom/client": async () => (await import("react-dom/client")).default,
1075
+ ...shared
1076
+ };
1077
+ await initializeSharedModules(
1078
+ bundle ?? "default",
1079
+ // include all core modules as shared
1080
+ coreShared,
1081
+ remoteShared
1082
+ );
1083
+ }
1084
+ function createModuleRequire(runtime) {
1085
+ return (id) => {
1086
+ const self = globalThis;
1087
+ const { bundle, id: moduleId } = id.match(REMOTE_COMPONENT_REGEX)?.groups ?? {
1088
+ bundle: "default",
1089
+ id
1090
+ };
1091
+ const remoteRuntime = self.__remote_webpack_require__?.[bundle ?? "default"] ? self.__remote_webpack_require__[bundle ?? "default"]?.type || "webpack" : runtime;
1092
+ logDebug("WebpackAdapter", `remoteRuntime: "${remoteRuntime}"`);
1093
+ try {
1094
+ if (remoteRuntime === RUNTIME_WEBPACK && bundle && moduleId) {
1095
+ return self.__remote_webpack_require__?.[bundle]?.(moduleId);
1096
+ }
1097
+ const sharedModuleId = moduleId ?? id;
1098
+ const sharedModule = getSharedModule(bundle ?? "default", sharedModuleId);
1099
+ if (sharedModule) {
1100
+ return sharedModule;
1101
+ }
1102
+ if (bundle && moduleId) {
1103
+ return handleTurbopackModule(bundle, moduleId, id);
1104
+ }
1105
+ throw new Error(`Module "${id}" not found.`);
1106
+ } catch (requireError) {
1107
+ logWarn(
1108
+ "WebpackAdapter",
1109
+ `Module require failed: ${String(requireError)}`
1110
+ );
1111
+ if (typeof self.__original_webpack_require__ !== "function") {
1112
+ throw new RemoteComponentsError(
1113
+ `Module "${id}" not found in remote component bundle "${bundle}".`,
1114
+ {
1115
+ cause: requireError instanceof Error ? requireError : void 0
987
1116
  }
988
- }
989
- return mod;
990
- },
991
- // require
992
- r(requireId) {
993
- return self.__webpack_require__?.(`[${bundle}] ${requireId}`);
994
- },
995
- // value exports
996
- v(value) {
997
- if (typeof value === "function") {
998
- exports.default = value((vid) => {
999
- return self.__webpack_require__?.(`[${bundle}] ${vid}`);
1000
- });
1001
- } else {
1002
- moduleExports.exports = value;
1003
- }
1004
- },
1005
- // async module initializer
1006
- async a(mod) {
1007
- let result;
1008
- await mod(
1009
- () => {
1010
- },
1011
- (value) => result = value
1012
1117
  );
1013
- exports.default = result;
1014
- },
1015
- // async module loader
1016
- async A(Aid) {
1017
- const mod = self.__webpack_require__?.(`[${bundle}] ${Aid}`);
1018
- return mod.default(
1019
- (parentId) => self.__webpack_require__?.(`[${bundle}] ${parentId}`)
1020
- );
1021
- },
1022
- // chunk loader
1023
- l(url) {
1024
- const moduleInitIndex = allModules.indexOf(moduleInit);
1025
- if (moduleInitIndex !== -1) {
1026
- const scriptIndex = allModules.slice(0, moduleInitIndex).findLastIndex((bundleEntry) => bundleEntry instanceof Element);
1027
- if (scriptIndex !== -1) {
1028
- const script = allModules[scriptIndex];
1029
- const scriptSrc = script.getAttribute("data-turbopack-src") || "";
1030
- const nextIndex = scriptSrc.indexOf("/_next");
1031
- const baseUrl = nextIndex !== -1 ? scriptSrc.slice(0, nextIndex) : "";
1032
- const bundleUrl = `[${bundle}] ${baseUrl}/_next/${url}`;
1033
- return self.__webpack_chunk_load__?.(bundleUrl, bundle);
1034
- }
1035
- }
1036
- throw new Error(
1037
- `Failed to load Turbopack chunk "${url}" for module "${id}". Check the URL is correct.`
1118
+ }
1119
+ try {
1120
+ logDebug("WebpackAdapter", "Falling back to original webpack require");
1121
+ return self.__original_webpack_require__(id);
1122
+ } catch (originalError) {
1123
+ throw new RemoteComponentsError(
1124
+ `Module "${id}" not found in remote component bundle "${bundle}".`,
1125
+ { cause: originalError instanceof Error ? originalError : void 0 }
1038
1126
  );
1039
- },
1040
- // global
1041
- g: self.__remote_components_turbopack_global__[bundle],
1042
- m: moduleExports,
1043
- e: exports
1044
- },
1045
- moduleExports,
1046
- exports
1047
- );
1048
- if (self.__remote_components_turbopack_modules__[bundle][moduleId] !== moduleExports.exports) {
1049
- self.__remote_components_turbopack_modules__[bundle][moduleId] = moduleExports.exports;
1050
- }
1051
- return moduleExports.exports;
1127
+ }
1128
+ }
1129
+ };
1052
1130
  }
1053
1131
 
1054
1132
  // src/shared/client/component-loader.ts
@@ -1076,6 +1154,18 @@ async function loadRemoteComponent({
1076
1154
  await loadScripts(scripts);
1077
1155
  }
1078
1156
  const hostShared = await shared;
1157
+ logDebug(
1158
+ "ComponentLoader",
1159
+ `loadRemoteComponent: bundle="${bundle}", name="${name}"`
1160
+ );
1161
+ logDebug(
1162
+ "ComponentLoader",
1163
+ `Host shared modules available: ${Object.keys(hostShared)}`
1164
+ );
1165
+ logDebug(
1166
+ "ComponentLoader",
1167
+ `Remote shared modules requested: ${JSON.stringify(remoteShared)}`
1168
+ );
1079
1169
  await setupWebpackRuntime(
1080
1170
  runtime,
1081
1171
  scripts,
@@ -1095,6 +1185,11 @@ async function loadRemoteComponent({
1095
1185
  (acc, [key, value]) => {
1096
1186
  if (typeof hostShared[value] !== "undefined") {
1097
1187
  acc[key.replace(/^\(ssr\)\/(?<relative>\.\/)?/, "")] = hostShared[value];
1188
+ } else {
1189
+ logDebug(
1190
+ "ComponentLoader",
1191
+ `Remote requests "${value}" but host doesn't provide it`
1192
+ );
1098
1193
  }
1099
1194
  return acc;
1100
1195
  },
@@ -1110,6 +1205,11 @@ async function loadRemoteComponent({
1110
1205
  })
1111
1206
  );
1112
1207
  applySharedModules(bundle, resolve);
1208
+ } else {
1209
+ logWarn(
1210
+ "ComponentLoader",
1211
+ "No bundle specified, skipping shared module setup"
1212
+ );
1113
1213
  }
1114
1214
  if (data.length > 0) {
1115
1215
  return await loadRSCComponent(rscName ?? name, data);
@@ -1489,9 +1589,10 @@ function RemoteComponent({
1489
1589
  };
1490
1590
  const res = await fetch(url, fetchInit);
1491
1591
  if (!res.ok) {
1492
- let error = failedToFetchRemoteComponentError(url.href, {
1493
- cause: new Error(`${res.status} ${res.statusText}`)
1494
- });
1592
+ let error = failedToFetchRemoteComponentError(
1593
+ url.href,
1594
+ res
1595
+ );
1495
1596
  try {
1496
1597
  const body = await res.text();
1497
1598
  const parser2 = new DOMParser();