remote-components 0.4.2 → 0.4.3

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 (114) hide show
  1. package/dist/{chunk-KVQI55BZ.cjs → chunk-2W7JBTID.cjs} +37 -36
  2. package/dist/chunk-2W7JBTID.cjs.map +1 -0
  3. package/dist/{chunk-TZT7DLO5.cjs → chunk-3AX5WLZD.cjs} +4 -4
  4. package/dist/{chunk-4O3EOST4.cjs → chunk-4AH3KXDW.cjs} +27 -27
  5. package/dist/{chunk-MTMDXJLM.js → chunk-4NW46ZVD.js} +410 -146
  6. package/dist/chunk-4NW46ZVD.js.map +1 -0
  7. package/dist/{chunk-SAGYPGIQ.js → chunk-55TEMSB5.js} +92 -23
  8. package/dist/chunk-55TEMSB5.js.map +1 -0
  9. package/dist/{chunk-RLI4YTBJ.cjs → chunk-7XXO2DLF.cjs} +96 -27
  10. package/dist/chunk-7XXO2DLF.cjs.map +1 -0
  11. package/dist/{chunk-RUWR74XQ.cjs → chunk-BBXVML3D.cjs} +1 -1
  12. package/dist/{chunk-RUWR74XQ.cjs.map → chunk-BBXVML3D.cjs.map} +1 -1
  13. package/dist/{chunk-42TVDI3G.cjs → chunk-C5EYU7EQ.cjs} +7 -7
  14. package/dist/{chunk-CC3WOSDO.js → chunk-DGZVFKSQ.js} +10 -9
  15. package/dist/chunk-DGZVFKSQ.js.map +1 -0
  16. package/dist/{chunk-AKOMV2UF.js → chunk-HL6BL5HY.js} +3 -3
  17. package/dist/chunk-HMB3SIVJ.cjs +973 -0
  18. package/dist/chunk-HMB3SIVJ.cjs.map +1 -0
  19. package/dist/{chunk-LOYJP2V2.js → chunk-HYVNEUIK.js} +5 -5
  20. package/dist/chunk-KV5J7PNM.js +152 -0
  21. package/dist/chunk-KV5J7PNM.js.map +1 -0
  22. package/dist/{chunk-LQ7VQ74E.js → chunk-LEKG4YWI.js} +2 -2
  23. package/dist/chunk-SECN7UAL.cjs +152 -0
  24. package/dist/chunk-SECN7UAL.cjs.map +1 -0
  25. package/dist/{chunk-S2A4TFLS.js → chunk-ULXU6XWH.js} +1 -1
  26. package/dist/{chunk-S2A4TFLS.js.map → chunk-ULXU6XWH.js.map} +1 -1
  27. package/dist/config/nextjs.cjs +7 -7
  28. package/dist/config/nextjs.js +2 -2
  29. package/dist/host/html.cjs +36 -36
  30. package/dist/host/html.js +10 -10
  31. package/dist/host/nextjs/app/client-only.cjs +17 -17
  32. package/dist/host/nextjs/app/client-only.js +8 -8
  33. package/dist/host/react.cjs +9 -9
  34. package/dist/host/react.js +8 -8
  35. package/dist/internal/config/webpack/next-client-pages-loader.cjs +151 -53
  36. package/dist/internal/config/webpack/next-client-pages-loader.cjs.map +1 -1
  37. package/dist/internal/config/webpack/next-client-pages-loader.d.ts +8 -4
  38. package/dist/internal/config/webpack/next-client-pages-loader.js +153 -53
  39. package/dist/internal/config/webpack/next-client-pages-loader.js.map +1 -1
  40. package/dist/internal/host/shared/pipeline.d.ts +1 -1
  41. package/dist/internal/host/shared/shared-broker.cjs +106 -0
  42. package/dist/internal/host/shared/shared-broker.cjs.map +1 -0
  43. package/dist/internal/host/shared/shared-broker.d.ts +35 -0
  44. package/dist/internal/host/shared/shared-broker.js +80 -0
  45. package/dist/internal/host/shared/shared-broker.js.map +1 -0
  46. package/dist/internal/host/shared/shared-module-resolver.cjs +13 -22
  47. package/dist/internal/host/shared/shared-module-resolver.cjs.map +1 -1
  48. package/dist/internal/host/shared/shared-module-resolver.d.ts +1 -1
  49. package/dist/internal/host/shared/shared-module-resolver.js +16 -22
  50. package/dist/internal/host/shared/shared-module-resolver.js.map +1 -1
  51. package/dist/internal/runtime/loaders/component-loader.cjs +2 -1
  52. package/dist/internal/runtime/loaders/component-loader.cjs.map +1 -1
  53. package/dist/internal/runtime/loaders/component-loader.d.ts +1 -1
  54. package/dist/internal/runtime/loaders/component-loader.js +2 -1
  55. package/dist/internal/runtime/loaders/component-loader.js.map +1 -1
  56. package/dist/internal/runtime/loaders/static-loader.d.ts +1 -1
  57. package/dist/internal/runtime/namespace.d.ts +1 -1
  58. package/dist/internal/runtime/turbopack/module.cjs +26 -4
  59. package/dist/internal/runtime/turbopack/module.cjs.map +1 -1
  60. package/dist/internal/runtime/turbopack/module.d.ts +14 -7
  61. package/dist/internal/runtime/turbopack/module.js +27 -5
  62. package/dist/internal/runtime/turbopack/module.js.map +1 -1
  63. package/dist/internal/runtime/turbopack/remote-scope-setup.cjs +5 -4
  64. package/dist/internal/runtime/turbopack/remote-scope-setup.cjs.map +1 -1
  65. package/dist/internal/runtime/turbopack/remote-scope-setup.js +5 -4
  66. package/dist/internal/runtime/turbopack/remote-scope-setup.js.map +1 -1
  67. package/dist/internal/runtime/turbopack/shared-modules.cjs +113 -26
  68. package/dist/internal/runtime/turbopack/shared-modules.cjs.map +1 -1
  69. package/dist/internal/runtime/turbopack/shared-modules.d.ts +3 -1
  70. package/dist/internal/runtime/turbopack/shared-modules.js +116 -26
  71. package/dist/internal/runtime/turbopack/shared-modules.js.map +1 -1
  72. package/dist/internal/runtime/types.cjs.map +1 -1
  73. package/dist/internal/runtime/types.d.ts +1 -1
  74. package/dist/internal/utils/logger.cjs.map +1 -1
  75. package/dist/internal/utils/logger.d.ts +1 -1
  76. package/dist/internal/utils/logger.js.map +1 -1
  77. package/dist/remote/html.cjs +6 -6
  78. package/dist/remote/html.js +2 -2
  79. package/dist/{script-VPOI7ARP.js → script-ISAHSV3X.js} +3 -3
  80. package/dist/{script-D5AD7HLV.cjs → script-YQCDUYDP.cjs} +4 -4
  81. package/dist/static-loader-EOJQHFZ6.cjs +11 -0
  82. package/dist/{static-loader-OHSAUD62.js → static-loader-Z24427MK.js} +3 -3
  83. package/dist/{turbopack-5N44NVPT.js → turbopack-7F757Z7V.js} +6 -6
  84. package/dist/{turbopack-EPXGK4EV.cjs → turbopack-DULMVTWV.cjs} +12 -12
  85. package/dist/{types-8b0edd78.d.ts → types-bd7be268.d.ts} +1 -5
  86. package/dist/{webpack-SIFRCBIN.cjs → webpack-6LXCB7WA.cjs} +14 -14
  87. package/dist/{webpack-KSDNIXMS.js → webpack-WGVTKJ3W.js} +5 -5
  88. package/package.json +1 -1
  89. package/dist/chunk-CC3WOSDO.js.map +0 -1
  90. package/dist/chunk-JJTCFQHE.cjs +0 -202
  91. package/dist/chunk-JJTCFQHE.cjs.map +0 -1
  92. package/dist/chunk-KVQI55BZ.cjs.map +0 -1
  93. package/dist/chunk-MKO52FRO.js +0 -202
  94. package/dist/chunk-MKO52FRO.js.map +0 -1
  95. package/dist/chunk-MQ2BBSL4.cjs +0 -709
  96. package/dist/chunk-MQ2BBSL4.cjs.map +0 -1
  97. package/dist/chunk-MTMDXJLM.js.map +0 -1
  98. package/dist/chunk-RLI4YTBJ.cjs.map +0 -1
  99. package/dist/chunk-SAGYPGIQ.js.map +0 -1
  100. package/dist/static-loader-UDIXK5MV.cjs +0 -11
  101. /package/dist/{chunk-TZT7DLO5.cjs.map → chunk-3AX5WLZD.cjs.map} +0 -0
  102. /package/dist/{chunk-4O3EOST4.cjs.map → chunk-4AH3KXDW.cjs.map} +0 -0
  103. /package/dist/{chunk-42TVDI3G.cjs.map → chunk-C5EYU7EQ.cjs.map} +0 -0
  104. /package/dist/{chunk-AKOMV2UF.js.map → chunk-HL6BL5HY.js.map} +0 -0
  105. /package/dist/{chunk-LOYJP2V2.js.map → chunk-HYVNEUIK.js.map} +0 -0
  106. /package/dist/{chunk-LQ7VQ74E.js.map → chunk-LEKG4YWI.js.map} +0 -0
  107. /package/dist/{script-VPOI7ARP.js.map → script-ISAHSV3X.js.map} +0 -0
  108. /package/dist/{script-D5AD7HLV.cjs.map → script-YQCDUYDP.cjs.map} +0 -0
  109. /package/dist/{static-loader-UDIXK5MV.cjs.map → static-loader-EOJQHFZ6.cjs.map} +0 -0
  110. /package/dist/{static-loader-OHSAUD62.js.map → static-loader-Z24427MK.js.map} +0 -0
  111. /package/dist/{turbopack-5N44NVPT.js.map → turbopack-7F757Z7V.js.map} +0 -0
  112. /package/dist/{turbopack-EPXGK4EV.cjs.map → turbopack-DULMVTWV.cjs.map} +0 -0
  113. /package/dist/{webpack-SIFRCBIN.cjs.map → webpack-6LXCB7WA.cjs.map} +0 -0
  114. /package/dist/{webpack-KSDNIXMS.js.map → webpack-WGVTKJ3W.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/config/webpack/next-client-pages-loader.ts"],"sourcesContent":["import { getNamespace } from '#internal/runtime/namespace';\nimport { RemoteComponentsError } from '#internal/utils/error';\n\n// module loader for Next.js Pages Router\nexport function nextClientPagesLoader(\n bundle: string,\n route: string,\n styleContainer: HTMLHeadElement | ShadowRoot | null = document.head,\n) {\n // make a typed reference to the global scope\n const self = globalThis as typeof globalThis & {\n // webpack remote module loading function scoped for each bundle\n __remote_webpack_require__?: Record<\n string,\n ((remoteId: string | number) => unknown) & {\n c?: Record<\n string | number,\n { id: string; parents: string[]; children: string[] }\n >;\n m?: Record<string | number, (module: { exports: unknown }) => void>;\n type?: 'turbopack' | 'webpack';\n }\n >;\n // webpack module map for each bundle used in production builds\n __remote_webpack_module_map__?: Record<string, Record<string, number>>;\n // Next.js client pages loader reference storage\n __NEXT_P?: [\n (\n | [\n string,\n () => { default?: React.ComponentType<Record<string, unknown>> },\n ]\n | undefined\n ),\n (\n | [\n string,\n () => {\n default?: React.ComponentType<\n {\n Component: React.ComponentType<Record<string, unknown>>;\n } & Record<string, unknown>\n >;\n },\n ]\n | undefined\n ),\n (\n | [\n string,\n () => {\n default?: React.ComponentType<\n {\n Component: React.ComponentType<Record<string, unknown>>;\n } & Record<string, unknown>\n >;\n },\n ]\n | undefined\n ),\n ];\n };\n\n const ns = getNamespace();\n ns.pageComponentCache ??= {};\n const cacheKey = `${bundle}:${route}`;\n\n // Applies the cached CSS for `bundle` into the caller's styleContainer.\n // Mirrors the final CSS-attach step of the fresh-load path so that cache\n // hits and additional host instances (each with their own shadow root)\n // still receive the styles.\n const applyBundleCss = () => {\n const elements = ns.cssCache[bundle] ?? [];\n if (styleContainer) {\n for (const el of elements) {\n styleContainer.appendChild(el.cloneNode(true));\n }\n } else {\n for (const el of elements) {\n document.head.appendChild(el);\n }\n }\n };\n\n // On repeat loads (e.g. after history.back()) the next-client-pages-loader\n // chunk is already cached by webpack and its factory won't re-run, so\n // __NEXT_P wouldn't be populated. Reuse the Component/App extracted on the\n // first load, but still run the CSS attach below because the caller may be\n // a different host instance with its own styleContainer.\n const cachedEntry = ns.pageComponentCache[cacheKey];\n if (cachedEntry) {\n applyBundleCss();\n return cachedEntry;\n }\n\n // temporarily remove the original Next.js CSS loader\n const nextCssOriginal = document.querySelector(\n `[id=\"__next_css__DO_NOT_USE__\"]:not([data-bundle=\"${bundle}\"][data-route=\"${route}\"])`,\n );\n if (nextCssOriginal) {\n nextCssOriginal.parentNode?.removeChild(nextCssOriginal);\n }\n\n // create a new Next.js CSS loader element\n const nextCss = document.createElement('noscript');\n nextCss.id = '__next_css__DO_NOT_USE__';\n nextCss.setAttribute('data-bundle', bundle);\n nextCss.setAttribute('data-route', route);\n const nextCssEnd = document.createElement('noscript');\n nextCssEnd.id = '__next_css__DO_NOT_USE_END__';\n nextCssEnd.setAttribute('data-bundle', bundle);\n nextCssEnd.setAttribute('data-route', route);\n document.head.appendChild(nextCssEnd);\n document.head.appendChild(nextCss);\n\n // find the page component loader chunk\n const componentLoaderChunk =\n Object.keys(self.__remote_webpack_require__?.[bundle]?.m ?? {}).find(\n (key) =>\n key.includes('/webpack/loaders/next-client-pages-loader.js') &&\n key.includes(`page=${encodeURIComponent(route)}!`),\n ) ??\n Object.keys(self.__remote_webpack_require__?.[bundle]?.m ?? {}).find(\n (key) => key.includes('/next/dist/client/page-loader.js'),\n ) ??\n self.__remote_webpack_module_map__?.[bundle]?.[\n Object.keys(self.__remote_webpack_module_map__[bundle] ?? {}).find(\n (key) =>\n key.includes('/webpack/loaders/next-client-pages-loader.js') &&\n key.includes(`page=${encodeURIComponent(route)}!`),\n ) ??\n Object.keys(self.__remote_webpack_module_map__[bundle] ?? {}).find(\n (key) => key.includes('/next/dist/client/page-loader.js'),\n ) ??\n ''\n ] ??\n -1;\n\n // find the app loader chunk\n const appLoaderChunk =\n Object.keys(self.__remote_webpack_require__?.[bundle]?.m ?? {}).find(\n (key) =>\n key.includes('/webpack/loaders/next-client-pages-loader.js') &&\n key.includes(`page=%2F_app`),\n ) ??\n Object.keys(self.__remote_webpack_require__?.[bundle]?.m ?? {}).find(\n (key) => key.includes('/next/dist/client/page-loader.js'),\n ) ??\n self.__remote_webpack_module_map__?.[bundle]?.[\n Object.keys(self.__remote_webpack_module_map__[bundle] ?? {}).find(\n (key) =>\n key.includes('/webpack/loaders/next-client-pages-loader.js') &&\n key.includes(`page=%2F_app`),\n ) ??\n Object.keys(self.__remote_webpack_module_map__[bundle] ?? {}).find(\n (key) => key.includes('/next/dist/client/page-loader.js'),\n ) ??\n ''\n ] ??\n -1;\n\n // if we didn't find the component loader or app loader, throw an error\n if (!(componentLoaderChunk && appLoaderChunk)) {\n throw new RemoteComponentsError(\n `Next.js client pages loader not found in bundle \"${bundle}\".`,\n );\n }\n\n // temporarily store the original __NEXT_P reference\n // this is required to avoid conflicts with the Next.js client pages loader\n // which uses the same global variable to store the page components\n const __NEXT_P_ORIGINAL = self.__NEXT_P;\n const selfOriginal = self;\n delete selfOriginal.__NEXT_P;\n\n // load the component and app loader chunks\n self.__remote_webpack_require__?.[bundle]?.(\n self.__remote_webpack_require__[bundle].type !== 'turbopack'\n ? componentLoaderChunk\n : `[${bundle}] ${componentLoaderChunk}`,\n );\n if (\n typeof appLoaderChunk === 'string' ||\n (typeof appLoaderChunk === 'number' && appLoaderChunk !== -1)\n ) {\n self.__remote_webpack_require__?.[bundle]?.(\n self.__remote_webpack_require__[bundle].type !== 'turbopack'\n ? appLoaderChunk\n : `[${bundle}] ${appLoaderChunk}`,\n );\n }\n\n // if we have the __NEXT_P global variable, we can extract the component and app\n if (self.__NEXT_P) {\n const [, componentLoader] = self.__NEXT_P[0] ?? [\n undefined,\n () => ({ default: null }),\n ];\n const [, appLoader] = self.__NEXT_P[2] ?? [\n undefined,\n () => ({\n default: null,\n }),\n ];\n const { default: Component = null } = componentLoader();\n const { default: App = null } = appLoader();\n\n const cssCache = ns.cssCache;\n\n if (!cssCache[bundle]) {\n // load the CSS files from the remote bundle\n const cssRE = /\\.s?css$/;\n Object.keys(self.__remote_webpack_require__?.[bundle]?.m ?? {})\n .filter((id) => cssRE.test(id))\n .forEach((id) => {\n self.__remote_webpack_require__?.[bundle]?.(id);\n });\n\n Object.keys(self.__remote_webpack_module_map__?.[bundle] ?? {})\n .filter((path) => cssRE.test(path))\n .forEach((path) => {\n const id = self.__remote_webpack_module_map__?.[bundle]?.[path];\n if (id) {\n self.__remote_webpack_require__?.[bundle]?.(id);\n }\n });\n\n const elements = [];\n let node = nextCss.previousSibling;\n while (node && node !== nextCssEnd) {\n elements.push(node);\n node.remove();\n node = nextCss.previousSibling;\n }\n cssCache[bundle] = elements;\n }\n\n applyBundleCss();\n\n // restore the original __NEXT_P reference\n delete self.__NEXT_P;\n self.__NEXT_P = __NEXT_P_ORIGINAL;\n\n // restore the original Next.js CSS loader\n if (nextCssOriginal) {\n nextCssOriginal.parentNode?.appendChild(nextCssOriginal);\n }\n\n nextCss.remove();\n nextCssEnd.remove();\n\n const result = { Component, App };\n ns.pageComponentCache[cacheKey] = result;\n return result;\n }\n\n return { Component: null, App: null };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/config/webpack/next-client-pages-loader.ts"],"sourcesContent":["import type React from 'react';\nimport { getNamespace } from '#internal/runtime/namespace';\nimport { requireModule } from '#internal/runtime/turbopack/module';\nimport {\n getScope,\n type RemoteScope,\n} from '#internal/runtime/turbopack/remote-scope';\nimport { getTurbopackModules } from '#internal/runtime/turbopack/shared-modules';\nimport { RemoteComponentsError } from '#internal/utils/error';\nimport { logDebug } from '#internal/utils/logger';\n\ntype PageComponent = React.ComponentType<Record<string, unknown>>;\ntype AppComponent = React.ComponentType<\n { Component: PageComponent } & Record<string, unknown>\n>;\ntype NextPageEntry = [string, () => { default?: PageComponent }];\ntype NextAppEntry = [string, () => { default?: AppComponent }];\n\n// module loader for Next.js Pages Router\nexport function nextClientPagesLoader(\n bundle: string,\n route: string,\n styleContainer: HTMLHeadElement | ShadowRoot | null = document.head,\n): { Component: PageComponent | null; App: AppComponent | null } {\n // make a typed reference to the global scope\n const self = globalThis as typeof globalThis & {\n // webpack remote module loading function scoped for each bundle\n __remote_webpack_require__?: Record<\n string,\n ((remoteId: string | number) => unknown) & {\n c?: Record<\n string | number,\n { id: string; parents: string[]; children: string[] }\n >;\n m?: Record<string | number, (module: { exports: unknown }) => void>;\n type?: 'turbopack' | 'webpack';\n }\n >;\n // webpack module map for each bundle used in production builds\n __remote_webpack_module_map__?: Record<string, Record<string, number>>;\n // Next.js client pages loader reference storage\n __NEXT_P?: [\n (\n | [\n string,\n () => { default?: React.ComponentType<Record<string, unknown>> },\n ]\n | undefined\n ),\n (\n | [\n string,\n () => {\n default?: React.ComponentType<\n {\n Component: React.ComponentType<Record<string, unknown>>;\n } & Record<string, unknown>\n >;\n },\n ]\n | undefined\n ),\n (\n | [\n string,\n () => {\n default?: React.ComponentType<\n {\n Component: React.ComponentType<Record<string, unknown>>;\n } & Record<string, unknown>\n >;\n },\n ]\n | undefined\n ),\n ];\n };\n\n const ns = getNamespace();\n ns.pageComponentCache ??= {};\n const cacheKey = `${bundle}:${route}`;\n const remoteRequire = self.__remote_webpack_require__?.[bundle];\n const turbopackScope =\n remoteRequire?.type === 'turbopack' ? getScope(bundle) : undefined;\n\n // Applies the cached CSS for `bundle` into the caller's styleContainer.\n // Mirrors the final CSS-attach step of the fresh-load path so that cache\n // hits and additional host instances (each with their own shadow root)\n // still receive the styles.\n const applyBundleCss = () => {\n const elements = ns.cssCache[bundle] ?? [];\n if (styleContainer) {\n for (const el of elements) {\n styleContainer.appendChild(el.cloneNode(true));\n }\n } else {\n for (const el of elements) {\n document.head.appendChild(el);\n }\n }\n };\n\n // On repeat loads (e.g. after history.back()) the next-client-pages-loader\n // chunk is already cached by webpack and its factory won't re-run, so\n // __NEXT_P wouldn't be populated. Reuse the Component/App extracted on the\n // first load, but still run the CSS attach below because the caller may be\n // a different host instance with its own styleContainer.\n const cachedEntry = ns.pageComponentCache[cacheKey];\n if (cachedEntry) {\n applyBundleCss();\n return cachedEntry;\n }\n\n // temporarily remove the original Next.js CSS loader\n const nextCssOriginal = document.querySelector(\n `[id=\"__next_css__DO_NOT_USE__\"]:not([data-bundle=\"${bundle}\"][data-route=\"${route}\"])`,\n );\n const nextCssOriginalParent = nextCssOriginal?.parentNode ?? null;\n const nextCssOriginalNextSibling = nextCssOriginal?.nextSibling ?? null;\n if (nextCssOriginal) {\n nextCssOriginalParent?.removeChild(nextCssOriginal);\n }\n\n // create a new Next.js CSS loader element\n const nextCss = document.createElement('noscript');\n nextCss.id = '__next_css__DO_NOT_USE__';\n nextCss.setAttribute('data-bundle', bundle);\n nextCss.setAttribute('data-route', route);\n const nextCssEnd = document.createElement('noscript');\n nextCssEnd.id = '__next_css__DO_NOT_USE_END__';\n nextCssEnd.setAttribute('data-bundle', bundle);\n nextCssEnd.setAttribute('data-route', route);\n document.head.appendChild(nextCssEnd);\n document.head.appendChild(nextCss);\n\n // find the page component loader chunk\n const componentLoaderChunk =\n (turbopackScope\n ? findTurbopackPagesLoaderId(turbopackScope, route)\n : undefined) ??\n Object.keys(remoteRequire?.m ?? {}).find(\n (key) =>\n key.includes('/webpack/loaders/next-client-pages-loader.js') &&\n key.includes(`page=${encodeURIComponent(route)}!`),\n ) ??\n Object.keys(remoteRequire?.m ?? {}).find((key) =>\n key.includes('/next/dist/client/page-loader.js'),\n ) ??\n self.__remote_webpack_module_map__?.[bundle]?.[\n Object.keys(self.__remote_webpack_module_map__[bundle] ?? {}).find(\n (key) =>\n key.includes('/webpack/loaders/next-client-pages-loader.js') &&\n key.includes(`page=${encodeURIComponent(route)}!`),\n ) ??\n Object.keys(self.__remote_webpack_module_map__[bundle] ?? {}).find(\n (key) => key.includes('/next/dist/client/page-loader.js'),\n ) ??\n ''\n ] ??\n -1;\n\n // find the app loader chunk\n const appLoaderChunk =\n (turbopackScope\n ? findTurbopackPagesLoaderId(turbopackScope, '/_app')\n : undefined) ??\n Object.keys(remoteRequire?.m ?? {}).find(\n (key) =>\n key.includes('/webpack/loaders/next-client-pages-loader.js') &&\n key.includes(`page=%2F_app`),\n ) ??\n Object.keys(remoteRequire?.m ?? {}).find((key) =>\n key.includes('/next/dist/client/page-loader.js'),\n ) ??\n self.__remote_webpack_module_map__?.[bundle]?.[\n Object.keys(self.__remote_webpack_module_map__[bundle] ?? {}).find(\n (key) =>\n key.includes('/webpack/loaders/next-client-pages-loader.js') &&\n key.includes(`page=%2F_app`),\n ) ??\n Object.keys(self.__remote_webpack_module_map__[bundle] ?? {}).find(\n (key) => key.includes('/next/dist/client/page-loader.js'),\n ) ??\n ''\n ] ??\n -1;\n\n // if we didn't find the component loader or app loader, throw an error\n if (!isLoaderId(componentLoaderChunk) || !isLoaderId(appLoaderChunk)) {\n throw new RemoteComponentsError(\n `Next.js client pages loader not found in bundle \"${bundle}\".`,\n );\n }\n\n // temporarily store the original __NEXT_P reference\n // this is required to avoid conflicts with the Next.js client pages loader\n // which uses the same global variable to store the page components\n const __NEXT_P_ORIGINAL = self.__NEXT_P;\n const selfOriginal = self;\n delete selfOriginal.__NEXT_P;\n\n try {\n // load the component and app loader chunks\n loadPagesLoaderModule(bundle, componentLoaderChunk, turbopackScope);\n if (isLoaderId(appLoaderChunk)) {\n loadPagesLoaderModule(bundle, appLoaderChunk, turbopackScope);\n }\n\n // if we have the __NEXT_P global variable, we can extract the component and app\n if (self.__NEXT_P) {\n logDebug(\n 'ComponentLoader',\n `Next.js Pages loader registry for \"${route}\" in \"${bundle}\": ${self.__NEXT_P.map((entry) => entry?.[0] ?? '<empty>').join(', ')}`,\n );\n const componentEntry = (self.__NEXT_P.find(\n (entry) => entry?.[0] === route,\n ) ?? self.__NEXT_P[0]) as NextPageEntry | undefined;\n const appEntry = (self.__NEXT_P.find((entry) => entry?.[0] === '/_app') ??\n self.__NEXT_P[2]) as NextAppEntry | undefined;\n const [, componentLoader] = componentEntry ?? [\n undefined,\n () => ({ default: null }),\n ];\n const [, appLoader] = appEntry ?? [\n undefined,\n () => ({\n default: null,\n }),\n ];\n const { default: Component = null } = componentLoader();\n const { default: App = null } = appLoader();\n\n const cssCache = ns.cssCache;\n\n if (!cssCache[bundle]) {\n // load the CSS files from the remote bundle\n const cssRE = /\\.s?css$/;\n Object.keys(self.__remote_webpack_require__?.[bundle]?.m ?? {})\n .filter((id) => cssRE.test(id))\n .forEach((id) => {\n self.__remote_webpack_require__?.[bundle]?.(id);\n });\n\n Object.keys(self.__remote_webpack_module_map__?.[bundle] ?? {})\n .filter((path) => cssRE.test(path))\n .forEach((path) => {\n const id = self.__remote_webpack_module_map__?.[bundle]?.[path];\n if (id) {\n self.__remote_webpack_require__?.[bundle]?.(id);\n }\n });\n\n const elements = [];\n let node = nextCss.previousSibling;\n while (node && node !== nextCssEnd) {\n elements.push(node);\n node.remove();\n node = nextCss.previousSibling;\n }\n cssCache[bundle] = elements;\n }\n\n applyBundleCss();\n\n const result = { Component, App };\n ns.pageComponentCache[cacheKey] = result;\n return result;\n }\n\n logDebug(\n 'ComponentLoader',\n `Next.js Pages loaders for route \"${route}\" in \"${bundle}\" did not populate __NEXT_P`,\n );\n return { Component: null, App: null };\n } finally {\n // restore the original __NEXT_P reference\n if (typeof __NEXT_P_ORIGINAL === 'undefined') {\n delete self.__NEXT_P;\n } else {\n self.__NEXT_P = __NEXT_P_ORIGINAL;\n }\n // restore the original Next.js CSS loader\n if (nextCssOriginal && nextCssOriginalParent) {\n const restoreBefore =\n nextCssOriginalNextSibling?.parentNode === nextCssOriginalParent\n ? nextCssOriginalNextSibling\n : null;\n nextCssOriginalParent.insertBefore(nextCssOriginal, restoreBefore);\n }\n\n nextCss.remove();\n nextCssEnd.remove();\n }\n}\n\ntype LoaderId = string | number;\n\nfunction isLoaderId(id: unknown): id is LoaderId {\n return (\n (typeof id === 'string' && id.length > 0) ||\n (typeof id === 'number' && id !== -1)\n );\n}\n\nfunction loadPagesLoaderModule(\n bundle: string,\n id: LoaderId,\n turbopackScope: RemoteScope | undefined,\n) {\n const self = globalThis as typeof globalThis & {\n __remote_webpack_require__?: Record<\n string,\n ((remoteId: string | number) => unknown) & {\n c?: Record<string | number, unknown>;\n type?: 'turbopack' | 'webpack';\n }\n >;\n };\n\n if (turbopackScope) {\n delete turbopackScope.moduleCache[String(id)];\n requireModule(turbopackScope, id);\n return;\n }\n\n const remoteRequire = self.__remote_webpack_require__?.[bundle];\n if (remoteRequire?.c) {\n delete remoteRequire.c[id];\n }\n remoteRequire?.(id);\n}\n\nfunction findTurbopackPagesLoaderId(\n scope: RemoteScope,\n route: string,\n): LoaderId | undefined {\n const modules = getTurbopackModules(scope);\n if (!modules) return undefined;\n\n const routeLiteral = JSON.stringify(route);\n const singleQuotedRouteLiteral = `'${route.replaceAll(\"'\", \"\\\\'\")}'`;\n const flat = modules.flat();\n\n for (let index = 0; index < flat.length; index++) {\n const entry = flat[index];\n\n if (typeof entry === 'function') {\n const code = entry.toString();\n if (\n code.includes('__NEXT_P') &&\n (code.includes(routeLiteral) || code.includes(singleQuotedRouteLiteral))\n ) {\n const id = findPreviousModuleId(flat, index);\n if (isLoaderId(id) && isTurbopackPagesLoaderId(id)) {\n logDebug(\n 'SharedModules',\n `Resolved Turbopack Pages loader for route \"${route}\" in \"${scope.scopedName}\" as \"${id}\"`,\n );\n return id;\n }\n }\n continue;\n }\n\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)) continue;\n if (typeof Element !== 'undefined' && entry instanceof Element) continue;\n\n for (const [id, moduleInit] of Object.entries(\n entry as Record<string, unknown>,\n )) {\n if (typeof moduleInit !== 'function') continue;\n const code = moduleInit.toString();\n if (\n code.includes('__NEXT_P') &&\n (code.includes(routeLiteral) ||\n code.includes(singleQuotedRouteLiteral)) &&\n isTurbopackPagesLoaderId(id)\n ) {\n logDebug(\n 'SharedModules',\n `Resolved Turbopack Pages loader for route \"${route}\" in \"${scope.scopedName}\" as \"${id}\"`,\n );\n return id;\n }\n }\n }\n\n return undefined;\n}\n\nfunction isTurbopackPagesLoaderId(id: LoaderId): boolean {\n if (typeof id === 'number') return true;\n return (\n id.includes('[next]/entry/page-loader.ts') ||\n id.includes('/next/dist/client/page-loader.js')\n );\n}\n\nfunction findPreviousModuleId(\n entries: unknown[],\n factoryIndex: number,\n): LoaderId | undefined {\n for (let index = factoryIndex - 1; index >= 0; index--) {\n const entry = entries[index];\n if (isLoaderId(entry)) return entry;\n if (typeof entry === 'function') return undefined;\n }\n return undefined;\n}\n"],"mappings":"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","names":[]}
@@ -3,7 +3,7 @@ import { ScriptDescriptor } from './asset-descriptors.js';
3
3
  import { InternalResolveClientUrl } from '../../runtime/url/resolve-client-url.js';
4
4
  import { a as ConsumeLoaderPayload } from '../../../server-handoff-8c89b856.js';
5
5
  import { ParsedRemoteComponent } from '../../runtime/html/parse-remote-html.js';
6
- import { M as MountOrUnmountFunction } from '../../../types-8b0edd78.js';
6
+ import { M as MountOrUnmountFunction } from '../../../types-bd7be268.js';
7
7
  import 'react';
8
8
  import './config.js';
9
9
  import './fetch-interceptors.js';
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var shared_broker_exports = {};
20
+ __export(shared_broker_exports, {
21
+ createSharedModulePlan: () => createSharedModulePlan,
22
+ installSharedModulePlan: () => installSharedModulePlan,
23
+ resolveSharedModulePlan: () => resolveSharedModulePlan
24
+ });
25
+ module.exports = __toCommonJS(shared_broker_exports);
26
+ var import_logger = require("#internal/utils/logger");
27
+ function createSharedModulePlan({
28
+ bundle,
29
+ hostShared,
30
+ remoteShared,
31
+ scope = `remote:${bundle}`,
32
+ callerTag = "SharedBroker"
33
+ }) {
34
+ const entries = Object.entries(remoteShared).map(([id, rawSpecifier]) => {
35
+ const specifier = String(rawSpecifier);
36
+ const provider = hostShared[specifier];
37
+ const entry = {
38
+ id,
39
+ specifier,
40
+ required: true,
41
+ singleton: true,
42
+ scope,
43
+ provider,
44
+ status: typeof provider === "undefined" ? "missing" : "resolved"
45
+ };
46
+ if (entry.status === "missing") {
47
+ (0, import_logger.logDebug)(
48
+ callerTag,
49
+ `Remote "${bundle}" requests "${specifier}" for "${id}" but the host does not provide it`
50
+ );
51
+ }
52
+ return entry;
53
+ });
54
+ (0, import_logger.logDebug)(
55
+ callerTag,
56
+ `Share plan for "${bundle}": ${entries.map((entry) => `${entry.id}=>${entry.specifier}:${entry.status}`).join(", ")}`
57
+ );
58
+ return {
59
+ protocol: "v0",
60
+ bundle,
61
+ entries
62
+ };
63
+ }
64
+ async function resolveSharedModulePlan(plan) {
65
+ const resolved = {};
66
+ await Promise.all(
67
+ plan.entries.map(async (entry) => {
68
+ if (entry.status !== "resolved")
69
+ return;
70
+ const value = typeof entry.provider === "function" ? await entry.provider(plan.bundle) : entry.provider;
71
+ resolved[entry.id] = value;
72
+ })
73
+ );
74
+ return resolved;
75
+ }
76
+ async function installSharedModulePlan({
77
+ plan,
78
+ target,
79
+ callerTag = "SharedBroker",
80
+ onMissing
81
+ }) {
82
+ return Promise.all(
83
+ plan.entries.map(async (entry) => {
84
+ if (entry.status !== "resolved") {
85
+ if (onMissing) {
86
+ onMissing(entry);
87
+ } else {
88
+ (0, import_logger.logError)(
89
+ callerTag,
90
+ `Shared module "${entry.specifier}" not found for "${plan.bundle}".`
91
+ );
92
+ }
93
+ return void 0;
94
+ }
95
+ target[entry.id] = typeof entry.provider === "function" ? await entry.provider(plan.bundle) : entry.provider;
96
+ return void 0;
97
+ })
98
+ );
99
+ }
100
+ // Annotate the CommonJS export names for ESM import in node:
101
+ 0 && (module.exports = {
102
+ createSharedModulePlan,
103
+ installSharedModulePlan,
104
+ resolveSharedModulePlan
105
+ });
106
+ //# sourceMappingURL=shared-broker.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/host/shared/shared-broker.ts"],"sourcesContent":["import type { LogLocation } from '#internal/utils/logger';\nimport { logDebug, logError } from '#internal/utils/logger';\n\nexport type SharedModuleFactory = (bundle?: string) => Promise<unknown>;\n\nexport interface SharedModuleRequirement {\n id: string;\n specifier: string;\n required: boolean;\n singleton: boolean;\n scope: string;\n}\n\nexport interface SharedModuleResolution extends SharedModuleRequirement {\n provider?: SharedModuleFactory | unknown;\n status: 'resolved' | 'missing';\n}\n\nexport interface SharedModulePlan {\n protocol: 'v0';\n bundle: string;\n entries: SharedModuleResolution[];\n}\n\nexport function createSharedModulePlan({\n bundle,\n hostShared,\n remoteShared,\n scope = `remote:${bundle}`,\n callerTag = 'SharedBroker',\n}: {\n bundle: string;\n hostShared: Record<string, SharedModuleFactory | unknown>;\n remoteShared: Record<string, string | number>;\n scope?: string;\n callerTag?: LogLocation;\n}): SharedModulePlan {\n const entries = Object.entries(remoteShared).map(([id, rawSpecifier]) => {\n const specifier = String(rawSpecifier);\n const provider = hostShared[specifier];\n const entry: SharedModuleResolution = {\n id,\n specifier,\n required: true,\n singleton: true,\n scope,\n provider,\n status: typeof provider === 'undefined' ? 'missing' : 'resolved',\n };\n\n if (entry.status === 'missing') {\n logDebug(\n callerTag,\n `Remote \"${bundle}\" requests \"${specifier}\" for \"${id}\" but the host does not provide it`,\n );\n }\n\n return entry;\n });\n\n logDebug(\n callerTag,\n `Share plan for \"${bundle}\": ${entries\n .map((entry) => `${entry.id}=>${entry.specifier}:${entry.status}`)\n .join(', ')}`,\n );\n\n return {\n protocol: 'v0',\n bundle,\n entries,\n };\n}\n\nexport async function resolveSharedModulePlan(\n plan: SharedModulePlan,\n): Promise<Record<string, unknown>> {\n const resolved: Record<string, unknown> = {};\n\n await Promise.all(\n plan.entries.map(async (entry) => {\n if (entry.status !== 'resolved') return;\n const value =\n typeof entry.provider === 'function'\n ? await (entry.provider as SharedModuleFactory)(plan.bundle)\n : entry.provider;\n resolved[entry.id] = value;\n }),\n );\n\n return resolved;\n}\n\nexport async function installSharedModulePlan({\n plan,\n target,\n callerTag = 'SharedBroker',\n onMissing,\n}: {\n plan: SharedModulePlan;\n target: Record<string, unknown>;\n callerTag?: LogLocation;\n onMissing?: (entry: SharedModuleResolution) => void;\n}): Promise<undefined[]> {\n return Promise.all(\n plan.entries.map(async (entry) => {\n if (entry.status !== 'resolved') {\n if (onMissing) {\n onMissing(entry);\n } else {\n logError(\n callerTag,\n `Shared module \"${entry.specifier}\" not found for \"${plan.bundle}\".`,\n );\n }\n return undefined;\n }\n\n target[entry.id] =\n typeof entry.provider === 'function'\n ? await (entry.provider as SharedModuleFactory)(plan.bundle)\n : entry.provider;\n return undefined;\n }),\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAAmC;AAuB5B,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ,UAAU;AAAA,EAClB,YAAY;AACd,GAMqB;AACnB,QAAM,UAAU,OAAO,QAAQ,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,YAAY,MAAM;AACvE,UAAM,YAAY,OAAO,YAAY;AACrC,UAAM,WAAW,WAAW,SAAS;AACrC,UAAM,QAAgC;AAAA,MACpC;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,QAAQ,OAAO,aAAa,cAAc,YAAY;AAAA,IACxD;AAEA,QAAI,MAAM,WAAW,WAAW;AAC9B;AAAA,QACE;AAAA,QACA,WAAW,qBAAqB,mBAAmB;AAAA,MACrD;AAAA,IACF;AAEA,WAAO;AAAA,EACT,CAAC;AAED;AAAA,IACE;AAAA,IACA,mBAAmB,YAAY,QAC5B,IAAI,CAAC,UAAU,GAAG,MAAM,OAAO,MAAM,aAAa,MAAM,QAAQ,EAChE,KAAK,IAAI;AAAA,EACd;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,wBACpB,MACkC;AAClC,QAAM,WAAoC,CAAC;AAE3C,QAAM,QAAQ;AAAA,IACZ,KAAK,QAAQ,IAAI,OAAO,UAAU;AAChC,UAAI,MAAM,WAAW;AAAY;AACjC,YAAM,QACJ,OAAO,MAAM,aAAa,aACtB,MAAO,MAAM,SAAiC,KAAK,MAAM,IACzD,MAAM;AACZ,eAAS,MAAM,EAAE,IAAI;AAAA,IACvB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,eAAsB,wBAAwB;AAAA,EAC5C;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AACF,GAKyB;AACvB,SAAO,QAAQ;AAAA,IACb,KAAK,QAAQ,IAAI,OAAO,UAAU;AAChC,UAAI,MAAM,WAAW,YAAY;AAC/B,YAAI,WAAW;AACb,oBAAU,KAAK;AAAA,QACjB,OAAO;AACL;AAAA,YACE;AAAA,YACA,kBAAkB,MAAM,6BAA6B,KAAK;AAAA,UAC5D;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAEA,aAAO,MAAM,EAAE,IACb,OAAO,MAAM,aAAa,aACtB,MAAO,MAAM,SAAiC,KAAK,MAAM,IACzD,MAAM;AACZ,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -0,0 +1,35 @@
1
+ import { LogLocation } from '../../utils/logger.js';
2
+
3
+ type SharedModuleFactory = (bundle?: string) => Promise<unknown>;
4
+ interface SharedModuleRequirement {
5
+ id: string;
6
+ specifier: string;
7
+ required: boolean;
8
+ singleton: boolean;
9
+ scope: string;
10
+ }
11
+ interface SharedModuleResolution extends SharedModuleRequirement {
12
+ provider?: SharedModuleFactory | unknown;
13
+ status: 'resolved' | 'missing';
14
+ }
15
+ interface SharedModulePlan {
16
+ protocol: 'v0';
17
+ bundle: string;
18
+ entries: SharedModuleResolution[];
19
+ }
20
+ declare function createSharedModulePlan({ bundle, hostShared, remoteShared, scope, callerTag, }: {
21
+ bundle: string;
22
+ hostShared: Record<string, SharedModuleFactory | unknown>;
23
+ remoteShared: Record<string, string | number>;
24
+ scope?: string;
25
+ callerTag?: LogLocation;
26
+ }): SharedModulePlan;
27
+ declare function resolveSharedModulePlan(plan: SharedModulePlan): Promise<Record<string, unknown>>;
28
+ declare function installSharedModulePlan({ plan, target, callerTag, onMissing, }: {
29
+ plan: SharedModulePlan;
30
+ target: Record<string, unknown>;
31
+ callerTag?: LogLocation;
32
+ onMissing?: (entry: SharedModuleResolution) => void;
33
+ }): Promise<undefined[]>;
34
+
35
+ export { SharedModuleFactory, SharedModulePlan, SharedModuleRequirement, SharedModuleResolution, createSharedModulePlan, installSharedModulePlan, resolveSharedModulePlan };
@@ -0,0 +1,80 @@
1
+ import { logDebug, logError } from "#internal/utils/logger";
2
+ function createSharedModulePlan({
3
+ bundle,
4
+ hostShared,
5
+ remoteShared,
6
+ scope = `remote:${bundle}`,
7
+ callerTag = "SharedBroker"
8
+ }) {
9
+ const entries = Object.entries(remoteShared).map(([id, rawSpecifier]) => {
10
+ const specifier = String(rawSpecifier);
11
+ const provider = hostShared[specifier];
12
+ const entry = {
13
+ id,
14
+ specifier,
15
+ required: true,
16
+ singleton: true,
17
+ scope,
18
+ provider,
19
+ status: typeof provider === "undefined" ? "missing" : "resolved"
20
+ };
21
+ if (entry.status === "missing") {
22
+ logDebug(
23
+ callerTag,
24
+ `Remote "${bundle}" requests "${specifier}" for "${id}" but the host does not provide it`
25
+ );
26
+ }
27
+ return entry;
28
+ });
29
+ logDebug(
30
+ callerTag,
31
+ `Share plan for "${bundle}": ${entries.map((entry) => `${entry.id}=>${entry.specifier}:${entry.status}`).join(", ")}`
32
+ );
33
+ return {
34
+ protocol: "v0",
35
+ bundle,
36
+ entries
37
+ };
38
+ }
39
+ async function resolveSharedModulePlan(plan) {
40
+ const resolved = {};
41
+ await Promise.all(
42
+ plan.entries.map(async (entry) => {
43
+ if (entry.status !== "resolved")
44
+ return;
45
+ const value = typeof entry.provider === "function" ? await entry.provider(plan.bundle) : entry.provider;
46
+ resolved[entry.id] = value;
47
+ })
48
+ );
49
+ return resolved;
50
+ }
51
+ async function installSharedModulePlan({
52
+ plan,
53
+ target,
54
+ callerTag = "SharedBroker",
55
+ onMissing
56
+ }) {
57
+ return Promise.all(
58
+ plan.entries.map(async (entry) => {
59
+ if (entry.status !== "resolved") {
60
+ if (onMissing) {
61
+ onMissing(entry);
62
+ } else {
63
+ logError(
64
+ callerTag,
65
+ `Shared module "${entry.specifier}" not found for "${plan.bundle}".`
66
+ );
67
+ }
68
+ return void 0;
69
+ }
70
+ target[entry.id] = typeof entry.provider === "function" ? await entry.provider(plan.bundle) : entry.provider;
71
+ return void 0;
72
+ })
73
+ );
74
+ }
75
+ export {
76
+ createSharedModulePlan,
77
+ installSharedModulePlan,
78
+ resolveSharedModulePlan
79
+ };
80
+ //# sourceMappingURL=shared-broker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/host/shared/shared-broker.ts"],"sourcesContent":["import type { LogLocation } from '#internal/utils/logger';\nimport { logDebug, logError } from '#internal/utils/logger';\n\nexport type SharedModuleFactory = (bundle?: string) => Promise<unknown>;\n\nexport interface SharedModuleRequirement {\n id: string;\n specifier: string;\n required: boolean;\n singleton: boolean;\n scope: string;\n}\n\nexport interface SharedModuleResolution extends SharedModuleRequirement {\n provider?: SharedModuleFactory | unknown;\n status: 'resolved' | 'missing';\n}\n\nexport interface SharedModulePlan {\n protocol: 'v0';\n bundle: string;\n entries: SharedModuleResolution[];\n}\n\nexport function createSharedModulePlan({\n bundle,\n hostShared,\n remoteShared,\n scope = `remote:${bundle}`,\n callerTag = 'SharedBroker',\n}: {\n bundle: string;\n hostShared: Record<string, SharedModuleFactory | unknown>;\n remoteShared: Record<string, string | number>;\n scope?: string;\n callerTag?: LogLocation;\n}): SharedModulePlan {\n const entries = Object.entries(remoteShared).map(([id, rawSpecifier]) => {\n const specifier = String(rawSpecifier);\n const provider = hostShared[specifier];\n const entry: SharedModuleResolution = {\n id,\n specifier,\n required: true,\n singleton: true,\n scope,\n provider,\n status: typeof provider === 'undefined' ? 'missing' : 'resolved',\n };\n\n if (entry.status === 'missing') {\n logDebug(\n callerTag,\n `Remote \"${bundle}\" requests \"${specifier}\" for \"${id}\" but the host does not provide it`,\n );\n }\n\n return entry;\n });\n\n logDebug(\n callerTag,\n `Share plan for \"${bundle}\": ${entries\n .map((entry) => `${entry.id}=>${entry.specifier}:${entry.status}`)\n .join(', ')}`,\n );\n\n return {\n protocol: 'v0',\n bundle,\n entries,\n };\n}\n\nexport async function resolveSharedModulePlan(\n plan: SharedModulePlan,\n): Promise<Record<string, unknown>> {\n const resolved: Record<string, unknown> = {};\n\n await Promise.all(\n plan.entries.map(async (entry) => {\n if (entry.status !== 'resolved') return;\n const value =\n typeof entry.provider === 'function'\n ? await (entry.provider as SharedModuleFactory)(plan.bundle)\n : entry.provider;\n resolved[entry.id] = value;\n }),\n );\n\n return resolved;\n}\n\nexport async function installSharedModulePlan({\n plan,\n target,\n callerTag = 'SharedBroker',\n onMissing,\n}: {\n plan: SharedModulePlan;\n target: Record<string, unknown>;\n callerTag?: LogLocation;\n onMissing?: (entry: SharedModuleResolution) => void;\n}): Promise<undefined[]> {\n return Promise.all(\n plan.entries.map(async (entry) => {\n if (entry.status !== 'resolved') {\n if (onMissing) {\n onMissing(entry);\n } else {\n logError(\n callerTag,\n `Shared module \"${entry.specifier}\" not found for \"${plan.bundle}\".`,\n );\n }\n return undefined;\n }\n\n target[entry.id] =\n typeof entry.provider === 'function'\n ? await (entry.provider as SharedModuleFactory)(plan.bundle)\n : entry.provider;\n return undefined;\n }),\n );\n}\n"],"mappings":"AACA,SAAS,UAAU,gBAAgB;AAuB5B,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ,UAAU;AAAA,EAClB,YAAY;AACd,GAMqB;AACnB,QAAM,UAAU,OAAO,QAAQ,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,YAAY,MAAM;AACvE,UAAM,YAAY,OAAO,YAAY;AACrC,UAAM,WAAW,WAAW,SAAS;AACrC,UAAM,QAAgC;AAAA,MACpC;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,QAAQ,OAAO,aAAa,cAAc,YAAY;AAAA,IACxD;AAEA,QAAI,MAAM,WAAW,WAAW;AAC9B;AAAA,QACE;AAAA,QACA,WAAW,qBAAqB,mBAAmB;AAAA,MACrD;AAAA,IACF;AAEA,WAAO;AAAA,EACT,CAAC;AAED;AAAA,IACE;AAAA,IACA,mBAAmB,YAAY,QAC5B,IAAI,CAAC,UAAU,GAAG,MAAM,OAAO,MAAM,aAAa,MAAM,QAAQ,EAChE,KAAK,IAAI;AAAA,EACd;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,wBACpB,MACkC;AAClC,QAAM,WAAoC,CAAC;AAE3C,QAAM,QAAQ;AAAA,IACZ,KAAK,QAAQ,IAAI,OAAO,UAAU;AAChC,UAAI,MAAM,WAAW;AAAY;AACjC,YAAM,QACJ,OAAO,MAAM,aAAa,aACtB,MAAO,MAAM,SAAiC,KAAK,MAAM,IACzD,MAAM;AACZ,eAAS,MAAM,EAAE,IAAI;AAAA,IACvB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,eAAsB,wBAAwB;AAAA,EAC5C;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AACF,GAKyB;AACvB,SAAO,QAAQ;AAAA,IACb,KAAK,QAAQ,IAAI,OAAO,UAAU;AAChC,UAAI,MAAM,WAAW,YAAY;AAC/B,YAAI,WAAW;AACb,oBAAU,KAAK;AAAA,QACjB,OAAO;AACL;AAAA,YACE;AAAA,YACA,kBAAkB,MAAM,6BAA6B,KAAK;AAAA,UAC5D;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAEA,aAAO,MAAM,EAAE,IACb,OAAO,MAAM,aAAa,aACtB,MAAO,MAAM,SAAiC,KAAK,MAAM,IACzD,MAAM;AACZ,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -37,7 +37,7 @@ __export(shared_module_resolver_exports, {
37
37
  });
38
38
  module.exports = __toCommonJS(shared_module_resolver_exports);
39
39
  var import_polyfill = require("#internal/host/shared/polyfill");
40
- var import_logger = require("#internal/utils/logger");
40
+ var import_shared_broker = require("#internal/host/shared/shared-broker");
41
41
  const CORE_REACT_SHARED_KEYS = [
42
42
  "react",
43
43
  "react/jsx-dev-runtime",
@@ -78,31 +78,22 @@ function buildHostShared(userShared, resolveClientUrl, options) {
78
78
  return result;
79
79
  }
80
80
  async function buildWebpackResolve(hostShared, remoteShared, bundle, reactModules, callerTag = "SharedModuleResolver") {
81
+ const sharePlan = (0, import_shared_broker.createSharedModulePlan)({
82
+ bundle,
83
+ hostShared,
84
+ remoteShared,
85
+ callerTag
86
+ });
87
+ const plannedResolve = await (0, import_shared_broker.resolveSharedModulePlan)(sharePlan);
81
88
  const resolve = {
82
89
  ...reactModules,
83
- ...Object.entries(remoteShared).reduce(
84
- (acc, [key, value]) => {
85
- if (typeof hostShared[value] !== "undefined") {
86
- acc[key.replace(/^\(ssr\)\/(?<relative>\.\/)?/, "")] = hostShared[value];
87
- } else {
88
- (0, import_logger.logDebug)(
89
- callerTag,
90
- `Remote requests "${value}" but host doesn't provide it`
91
- );
92
- }
93
- return acc;
94
- },
95
- {}
90
+ ...Object.fromEntries(
91
+ Object.entries(plannedResolve).map(([key, value]) => [
92
+ key.replace(/^\(ssr\)\/(?<relative>\.\/)?/, ""),
93
+ value
94
+ ])
96
95
  )
97
96
  };
98
- await Promise.all(
99
- Object.entries(resolve).map(async ([key, value]) => {
100
- if (typeof value === "function") {
101
- resolve[key] = await value(bundle);
102
- }
103
- return Promise.resolve(value);
104
- })
105
- );
106
97
  return resolve;
107
98
  }
108
99
  // Annotate the CommonJS export names for ESM import in node:
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/host/shared/shared-module-resolver.ts"],"sourcesContent":["import type { InternalResolveClientUrl } from '#internal/host/server/types';\nimport { sharedPolyfills } from '#internal/host/shared/polyfill';\nimport type { LogLocation } from '#internal/utils/logger';\nimport { logDebug } from '#internal/utils/logger';\n\n/**\n * The core React packages that are always shared between host and remote.\n * These correspond to the `/react/*.js` and `/react-dom/*.js` path keys\n * used in the webpack module resolution map.\n */\nexport const CORE_REACT_SHARED_KEYS = [\n 'react',\n 'react/jsx-dev-runtime',\n 'react/jsx-runtime',\n 'react-dom',\n 'react-dom/client',\n] as const;\n\n/**\n * Maps each core React package to its webpack-style path key.\n * For example, `react` maps to `/react/index.js`.\n */\nexport const CORE_REACT_PATH_MAP: Record<string, string> = {\n react: '/react/index.js',\n 'react/jsx-dev-runtime': '/react/jsx-dev-runtime.js',\n 'react/jsx-runtime': '/react/jsx-runtime.js',\n 'react-dom': '/react-dom/index.js',\n 'react-dom/client': '/react-dom/client.js',\n};\n\n/**\n * The vendorShared record used by the Next.js config to map React packages\n * to their webpack path-key string literals. Derived from CORE_REACT_PATH_MAP\n * but excludes `react-dom/client` to match the existing config behavior.\n */\nexport const VENDOR_SHARED: Record<string, string> = Object.fromEntries(\n Object.entries(CORE_REACT_PATH_MAP)\n .filter(([key]) => key !== 'react-dom/client')\n .map(([key, path]) => [key, `'${path}'`]),\n);\n\ntype SharedModuleFactory = (bundle?: string) => Promise<unknown>;\n\n/**\n * Builds the `coreShared` map for the Turbopack runtime's\n * `initializeSharedModules`. Each entry is an async factory that dynamically\n * imports the corresponding React package. User-provided shared modules\n * override core entries (e.g. to supply a pinned React version).\n */\nexport function buildCoreShared(\n userShared?: Record<string, SharedModuleFactory>,\n): Record<string, SharedModuleFactory> {\n return {\n react: async () => (await import('react')).default,\n 'react-dom': async () => (await import('react-dom')).default,\n 'react/jsx-dev-runtime': async () =>\n (await import('react/jsx-dev-runtime')).default,\n 'react/jsx-runtime': async () =>\n (await import('react/jsx-runtime')).default,\n 'react-dom/client': async () => (await import('react-dom/client')).default,\n ...userShared,\n };\n}\n\ninterface HostSharedGlobals {\n __remote_component_host_shared_modules__?: Record<\n string,\n SharedModuleFactory\n >;\n __remote_component_shared__?: Record<string, SharedModuleFactory>;\n}\n\n/**\n * Builds the merged host shared modules map with a consistent merge priority:\n * 1. Polyfills (lowest priority — fallback implementations)\n * 2. Global host shared modules (`__remote_component_host_shared_modules__`)\n * 3. User-provided shared modules (highest priority — explicit overrides)\n *\n * Some callers also include `__remote_component_shared__` (the pages router\n * global). Pass `includeRemoteComponentShared: true` to include it at the end.\n */\nexport function buildHostShared(\n userShared?: Record<string, SharedModuleFactory>,\n resolveClientUrl?: InternalResolveClientUrl,\n options?: { includeRemoteComponentShared?: boolean },\n): Record<string, SharedModuleFactory> {\n const self = globalThis as typeof globalThis & HostSharedGlobals;\n const result: Record<string, SharedModuleFactory> = {\n ...sharedPolyfills(userShared, resolveClientUrl),\n ...self.__remote_component_host_shared_modules__,\n ...userShared,\n };\n if (options?.includeRemoteComponentShared) {\n Object.assign(result, self.__remote_component_shared__);\n }\n return result;\n}\n\n/**\n * React module instances keyed by their webpack path, e.g.\n * `{ '/react/index.js': React }`. Passed into `buildWebpackResolve` so it\n * can populate the resolve map without importing React itself.\n */\nexport interface ReactModules {\n '/react/index.js': unknown;\n '/react/jsx-dev-runtime.js': unknown;\n '/react/jsx-runtime.js': unknown;\n '/react-dom/index.js': unknown;\n '/react-dom/client.js': unknown;\n}\n\n/**\n * Builds the `resolve` map passed to `applySharedModules` for the webpack\n * runtime. Combines:\n * - Static React module path keys (`/react/index.js`, etc.)\n * - Remote shared modules matched against host shared, with `(ssr)/` prefix stripped\n *\n * After building the map, resolves any factory functions by awaiting them\n * with the given bundle name.\n */\nexport async function buildWebpackResolve(\n hostShared: Record<string, SharedModuleFactory | unknown>,\n remoteShared: Record<string, string | number>,\n bundle: string,\n reactModules: ReactModules,\n callerTag: LogLocation = 'SharedModuleResolver',\n): Promise<Record<string, unknown>> {\n const resolve: Record<string, unknown> = {\n ...reactModules,\n ...Object.entries(remoteShared).reduce<Record<string, unknown>>(\n (acc, [key, value]) => {\n if (typeof hostShared[value] !== 'undefined') {\n acc[key.replace(/^\\(ssr\\)\\/(?<relative>\\.\\/)?/, '')] =\n hostShared[value];\n } else {\n logDebug(\n callerTag,\n `Remote requests \"${value}\" but host doesn't provide it`,\n );\n }\n return acc;\n },\n {},\n ),\n };\n await Promise.all(\n Object.entries(resolve).map(async ([key, value]) => {\n if (typeof value === 'function') {\n resolve[key] = await value(bundle);\n }\n return Promise.resolve(value);\n }),\n );\n return resolve;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,sBAAgC;AAEhC,oBAAyB;AAOlB,MAAM,yBAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,MAAM,sBAA8C;AAAA,EACzD,OAAO;AAAA,EACP,yBAAyB;AAAA,EACzB,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,oBAAoB;AACtB;AAOO,MAAM,gBAAwC,OAAO;AAAA,EAC1D,OAAO,QAAQ,mBAAmB,EAC/B,OAAO,CAAC,CAAC,GAAG,MAAM,QAAQ,kBAAkB,EAC5C,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC;AAC5C;AAUO,SAAS,gBACd,YACqC;AACrC,SAAO;AAAA,IACL,OAAO,aAAa,MAAM,OAAO,OAAO,GAAG;AAAA,IAC3C,aAAa,aAAa,MAAM,OAAO,WAAW,GAAG;AAAA,IACrD,yBAAyB,aACtB,MAAM,OAAO,uBAAuB,GAAG;AAAA,IAC1C,qBAAqB,aAClB,MAAM,OAAO,mBAAmB,GAAG;AAAA,IACtC,oBAAoB,aAAa,MAAM,OAAO,kBAAkB,GAAG;AAAA,IACnE,GAAG;AAAA,EACL;AACF;AAmBO,SAAS,gBACd,YACA,kBACA,SACqC;AACrC,QAAM,OAAO;AACb,QAAM,SAA8C;AAAA,IAClD,OAAG,iCAAgB,YAAY,gBAAgB;AAAA,IAC/C,GAAG,KAAK;AAAA,IACR,GAAG;AAAA,EACL;AACA,MAAI,SAAS,8BAA8B;AACzC,WAAO,OAAO,QAAQ,KAAK,2BAA2B;AAAA,EACxD;AACA,SAAO;AACT;AAwBA,eAAsB,oBACpB,YACA,cACA,QACA,cACA,YAAyB,wBACS;AAClC,QAAM,UAAmC;AAAA,IACvC,GAAG;AAAA,IACH,GAAG,OAAO,QAAQ,YAAY,EAAE;AAAA,MAC9B,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM;AACrB,YAAI,OAAO,WAAW,KAAK,MAAM,aAAa;AAC5C,cAAI,IAAI,QAAQ,gCAAgC,EAAE,CAAC,IACjD,WAAW,KAAK;AAAA,QACpB,OAAO;AACL;AAAA,YACE;AAAA,YACA,oBAAoB;AAAA,UACtB;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,QAAQ;AAAA,IACZ,OAAO,QAAQ,OAAO,EAAE,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM;AAClD,UAAI,OAAO,UAAU,YAAY;AAC/B,gBAAQ,GAAG,IAAI,MAAM,MAAM,MAAM;AAAA,MACnC;AACA,aAAO,QAAQ,QAAQ,KAAK;AAAA,IAC9B,CAAC;AAAA,EACH;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../../src/host/shared/shared-module-resolver.ts"],"sourcesContent":["import type { InternalResolveClientUrl } from '#internal/host/server/types';\nimport { sharedPolyfills } from '#internal/host/shared/polyfill';\nimport {\n createSharedModulePlan,\n resolveSharedModulePlan,\n type SharedModuleFactory,\n} from '#internal/host/shared/shared-broker';\nimport type { LogLocation } from '#internal/utils/logger';\n\n/**\n * The core React packages that are always shared between host and remote.\n * These correspond to the `/react/*.js` and `/react-dom/*.js` path keys\n * used in the webpack module resolution map.\n */\nexport const CORE_REACT_SHARED_KEYS = [\n 'react',\n 'react/jsx-dev-runtime',\n 'react/jsx-runtime',\n 'react-dom',\n 'react-dom/client',\n] as const;\n\n/**\n * Maps each core React package to its webpack-style path key.\n * For example, `react` maps to `/react/index.js`.\n */\nexport const CORE_REACT_PATH_MAP: Record<string, string> = {\n react: '/react/index.js',\n 'react/jsx-dev-runtime': '/react/jsx-dev-runtime.js',\n 'react/jsx-runtime': '/react/jsx-runtime.js',\n 'react-dom': '/react-dom/index.js',\n 'react-dom/client': '/react-dom/client.js',\n};\n\n/**\n * The vendorShared record used by the Next.js config to map React packages\n * to their webpack path-key string literals. Derived from CORE_REACT_PATH_MAP\n * but excludes `react-dom/client` to match the existing config behavior.\n */\nexport const VENDOR_SHARED: Record<string, string> = Object.fromEntries(\n Object.entries(CORE_REACT_PATH_MAP)\n .filter(([key]) => key !== 'react-dom/client')\n .map(([key, path]) => [key, `'${path}'`]),\n);\n\n/**\n * Builds the `coreShared` map for the Turbopack runtime's\n * `initializeSharedModules`. Each entry is an async factory that dynamically\n * imports the corresponding React package. User-provided shared modules\n * override core entries (e.g. to supply a pinned React version).\n */\nexport function buildCoreShared(\n userShared?: Record<string, SharedModuleFactory>,\n): Record<string, SharedModuleFactory> {\n return {\n react: async () => (await import('react')).default,\n 'react-dom': async () => (await import('react-dom')).default,\n 'react/jsx-dev-runtime': async () =>\n (await import('react/jsx-dev-runtime')).default,\n 'react/jsx-runtime': async () =>\n (await import('react/jsx-runtime')).default,\n 'react-dom/client': async () => (await import('react-dom/client')).default,\n ...userShared,\n };\n}\n\ninterface HostSharedGlobals {\n __remote_component_host_shared_modules__?: Record<\n string,\n SharedModuleFactory\n >;\n __remote_component_shared__?: Record<string, SharedModuleFactory>;\n}\n\n/**\n * Builds the merged host shared modules map with a consistent merge priority:\n * 1. Polyfills (lowest priority — fallback implementations)\n * 2. Global host shared modules (`__remote_component_host_shared_modules__`)\n * 3. User-provided shared modules (highest priority — explicit overrides)\n *\n * Some callers also include `__remote_component_shared__` (the pages router\n * global). Pass `includeRemoteComponentShared: true` to include it at the end.\n */\nexport function buildHostShared(\n userShared?: Record<string, SharedModuleFactory>,\n resolveClientUrl?: InternalResolveClientUrl,\n options?: { includeRemoteComponentShared?: boolean },\n): Record<string, SharedModuleFactory> {\n const self = globalThis as typeof globalThis & HostSharedGlobals;\n const result: Record<string, SharedModuleFactory> = {\n ...sharedPolyfills(userShared, resolveClientUrl),\n ...self.__remote_component_host_shared_modules__,\n ...userShared,\n };\n if (options?.includeRemoteComponentShared) {\n Object.assign(result, self.__remote_component_shared__);\n }\n return result;\n}\n\n/**\n * React module instances keyed by their webpack path, e.g.\n * `{ '/react/index.js': React }`. Passed into `buildWebpackResolve` so it\n * can populate the resolve map without importing React itself.\n */\nexport interface ReactModules {\n '/react/index.js': unknown;\n '/react/jsx-dev-runtime.js': unknown;\n '/react/jsx-runtime.js': unknown;\n '/react-dom/index.js': unknown;\n '/react-dom/client.js': unknown;\n}\n\n/**\n * Builds the `resolve` map passed to `applySharedModules` for the webpack\n * runtime. Combines:\n * - Static React module path keys (`/react/index.js`, etc.)\n * - Remote shared modules matched against host shared, with `(ssr)/` prefix stripped\n *\n * After building the map, resolves any factory functions by awaiting them\n * with the given bundle name.\n */\nexport async function buildWebpackResolve(\n hostShared: Record<string, SharedModuleFactory | unknown>,\n remoteShared: Record<string, string | number>,\n bundle: string,\n reactModules: ReactModules,\n callerTag: LogLocation = 'SharedModuleResolver',\n): Promise<Record<string, unknown>> {\n const sharePlan = createSharedModulePlan({\n bundle,\n hostShared,\n remoteShared,\n callerTag,\n });\n const plannedResolve = await resolveSharedModulePlan(sharePlan);\n const resolve: Record<string, unknown> = {\n ...reactModules,\n ...Object.fromEntries(\n Object.entries(plannedResolve).map(([key, value]) => [\n key.replace(/^\\(ssr\\)\\/(?<relative>\\.\\/)?/, ''),\n value,\n ]),\n ),\n };\n return resolve;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,sBAAgC;AAChC,2BAIO;AAQA,MAAM,yBAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,MAAM,sBAA8C;AAAA,EACzD,OAAO;AAAA,EACP,yBAAyB;AAAA,EACzB,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,oBAAoB;AACtB;AAOO,MAAM,gBAAwC,OAAO;AAAA,EAC1D,OAAO,QAAQ,mBAAmB,EAC/B,OAAO,CAAC,CAAC,GAAG,MAAM,QAAQ,kBAAkB,EAC5C,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC;AAC5C;AAQO,SAAS,gBACd,YACqC;AACrC,SAAO;AAAA,IACL,OAAO,aAAa,MAAM,OAAO,OAAO,GAAG;AAAA,IAC3C,aAAa,aAAa,MAAM,OAAO,WAAW,GAAG;AAAA,IACrD,yBAAyB,aACtB,MAAM,OAAO,uBAAuB,GAAG;AAAA,IAC1C,qBAAqB,aAClB,MAAM,OAAO,mBAAmB,GAAG;AAAA,IACtC,oBAAoB,aAAa,MAAM,OAAO,kBAAkB,GAAG;AAAA,IACnE,GAAG;AAAA,EACL;AACF;AAmBO,SAAS,gBACd,YACA,kBACA,SACqC;AACrC,QAAM,OAAO;AACb,QAAM,SAA8C;AAAA,IAClD,OAAG,iCAAgB,YAAY,gBAAgB;AAAA,IAC/C,GAAG,KAAK;AAAA,IACR,GAAG;AAAA,EACL;AACA,MAAI,SAAS,8BAA8B;AACzC,WAAO,OAAO,QAAQ,KAAK,2BAA2B;AAAA,EACxD;AACA,SAAO;AACT;AAwBA,eAAsB,oBACpB,YACA,cACA,QACA,cACA,YAAyB,wBACS;AAClC,QAAM,gBAAY,6CAAuB;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,iBAAiB,UAAM,8CAAwB,SAAS;AAC9D,QAAM,UAAmC;AAAA,IACvC,GAAG;AAAA,IACH,GAAG,OAAO;AAAA,MACR,OAAO,QAAQ,cAAc,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAAA,QACnD,IAAI,QAAQ,gCAAgC,EAAE;AAAA,QAC9C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
@@ -1,4 +1,5 @@
1
1
  import { InternalResolveClientUrl } from '../../runtime/url/resolve-client-url.js';
2
+ import { SharedModuleFactory } from './shared-broker.js';
2
3
  import { LogLocation } from '../../utils/logger.js';
3
4
 
4
5
  /**
@@ -18,7 +19,6 @@ declare const CORE_REACT_PATH_MAP: Record<string, string>;
18
19
  * but excludes `react-dom/client` to match the existing config behavior.
19
20
  */
20
21
  declare const VENDOR_SHARED: Record<string, string>;
21
- type SharedModuleFactory = (bundle?: string) => Promise<unknown>;
22
22
  /**
23
23
  * Builds the `coreShared` map for the Turbopack runtime's
24
24
  * `initializeSharedModules`. Each entry is an async factory that dynamically
@@ -1,5 +1,8 @@
1
1
  import { sharedPolyfills } from "#internal/host/shared/polyfill";
2
- import { logDebug } from "#internal/utils/logger";
2
+ import {
3
+ createSharedModulePlan,
4
+ resolveSharedModulePlan
5
+ } from "#internal/host/shared/shared-broker";
3
6
  const CORE_REACT_SHARED_KEYS = [
4
7
  "react",
5
8
  "react/jsx-dev-runtime",
@@ -40,31 +43,22 @@ function buildHostShared(userShared, resolveClientUrl, options) {
40
43
  return result;
41
44
  }
42
45
  async function buildWebpackResolve(hostShared, remoteShared, bundle, reactModules, callerTag = "SharedModuleResolver") {
46
+ const sharePlan = createSharedModulePlan({
47
+ bundle,
48
+ hostShared,
49
+ remoteShared,
50
+ callerTag
51
+ });
52
+ const plannedResolve = await resolveSharedModulePlan(sharePlan);
43
53
  const resolve = {
44
54
  ...reactModules,
45
- ...Object.entries(remoteShared).reduce(
46
- (acc, [key, value]) => {
47
- if (typeof hostShared[value] !== "undefined") {
48
- acc[key.replace(/^\(ssr\)\/(?<relative>\.\/)?/, "")] = hostShared[value];
49
- } else {
50
- logDebug(
51
- callerTag,
52
- `Remote requests "${value}" but host doesn't provide it`
53
- );
54
- }
55
- return acc;
56
- },
57
- {}
55
+ ...Object.fromEntries(
56
+ Object.entries(plannedResolve).map(([key, value]) => [
57
+ key.replace(/^\(ssr\)\/(?<relative>\.\/)?/, ""),
58
+ value
59
+ ])
58
60
  )
59
61
  };
60
- await Promise.all(
61
- Object.entries(resolve).map(async ([key, value]) => {
62
- if (typeof value === "function") {
63
- resolve[key] = await value(bundle);
64
- }
65
- return Promise.resolve(value);
66
- })
67
- );
68
62
  return resolve;
69
63
  }
70
64
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/host/shared/shared-module-resolver.ts"],"sourcesContent":["import type { InternalResolveClientUrl } from '#internal/host/server/types';\nimport { sharedPolyfills } from '#internal/host/shared/polyfill';\nimport type { LogLocation } from '#internal/utils/logger';\nimport { logDebug } from '#internal/utils/logger';\n\n/**\n * The core React packages that are always shared between host and remote.\n * These correspond to the `/react/*.js` and `/react-dom/*.js` path keys\n * used in the webpack module resolution map.\n */\nexport const CORE_REACT_SHARED_KEYS = [\n 'react',\n 'react/jsx-dev-runtime',\n 'react/jsx-runtime',\n 'react-dom',\n 'react-dom/client',\n] as const;\n\n/**\n * Maps each core React package to its webpack-style path key.\n * For example, `react` maps to `/react/index.js`.\n */\nexport const CORE_REACT_PATH_MAP: Record<string, string> = {\n react: '/react/index.js',\n 'react/jsx-dev-runtime': '/react/jsx-dev-runtime.js',\n 'react/jsx-runtime': '/react/jsx-runtime.js',\n 'react-dom': '/react-dom/index.js',\n 'react-dom/client': '/react-dom/client.js',\n};\n\n/**\n * The vendorShared record used by the Next.js config to map React packages\n * to their webpack path-key string literals. Derived from CORE_REACT_PATH_MAP\n * but excludes `react-dom/client` to match the existing config behavior.\n */\nexport const VENDOR_SHARED: Record<string, string> = Object.fromEntries(\n Object.entries(CORE_REACT_PATH_MAP)\n .filter(([key]) => key !== 'react-dom/client')\n .map(([key, path]) => [key, `'${path}'`]),\n);\n\ntype SharedModuleFactory = (bundle?: string) => Promise<unknown>;\n\n/**\n * Builds the `coreShared` map for the Turbopack runtime's\n * `initializeSharedModules`. Each entry is an async factory that dynamically\n * imports the corresponding React package. User-provided shared modules\n * override core entries (e.g. to supply a pinned React version).\n */\nexport function buildCoreShared(\n userShared?: Record<string, SharedModuleFactory>,\n): Record<string, SharedModuleFactory> {\n return {\n react: async () => (await import('react')).default,\n 'react-dom': async () => (await import('react-dom')).default,\n 'react/jsx-dev-runtime': async () =>\n (await import('react/jsx-dev-runtime')).default,\n 'react/jsx-runtime': async () =>\n (await import('react/jsx-runtime')).default,\n 'react-dom/client': async () => (await import('react-dom/client')).default,\n ...userShared,\n };\n}\n\ninterface HostSharedGlobals {\n __remote_component_host_shared_modules__?: Record<\n string,\n SharedModuleFactory\n >;\n __remote_component_shared__?: Record<string, SharedModuleFactory>;\n}\n\n/**\n * Builds the merged host shared modules map with a consistent merge priority:\n * 1. Polyfills (lowest priority — fallback implementations)\n * 2. Global host shared modules (`__remote_component_host_shared_modules__`)\n * 3. User-provided shared modules (highest priority — explicit overrides)\n *\n * Some callers also include `__remote_component_shared__` (the pages router\n * global). Pass `includeRemoteComponentShared: true` to include it at the end.\n */\nexport function buildHostShared(\n userShared?: Record<string, SharedModuleFactory>,\n resolveClientUrl?: InternalResolveClientUrl,\n options?: { includeRemoteComponentShared?: boolean },\n): Record<string, SharedModuleFactory> {\n const self = globalThis as typeof globalThis & HostSharedGlobals;\n const result: Record<string, SharedModuleFactory> = {\n ...sharedPolyfills(userShared, resolveClientUrl),\n ...self.__remote_component_host_shared_modules__,\n ...userShared,\n };\n if (options?.includeRemoteComponentShared) {\n Object.assign(result, self.__remote_component_shared__);\n }\n return result;\n}\n\n/**\n * React module instances keyed by their webpack path, e.g.\n * `{ '/react/index.js': React }`. Passed into `buildWebpackResolve` so it\n * can populate the resolve map without importing React itself.\n */\nexport interface ReactModules {\n '/react/index.js': unknown;\n '/react/jsx-dev-runtime.js': unknown;\n '/react/jsx-runtime.js': unknown;\n '/react-dom/index.js': unknown;\n '/react-dom/client.js': unknown;\n}\n\n/**\n * Builds the `resolve` map passed to `applySharedModules` for the webpack\n * runtime. Combines:\n * - Static React module path keys (`/react/index.js`, etc.)\n * - Remote shared modules matched against host shared, with `(ssr)/` prefix stripped\n *\n * After building the map, resolves any factory functions by awaiting them\n * with the given bundle name.\n */\nexport async function buildWebpackResolve(\n hostShared: Record<string, SharedModuleFactory | unknown>,\n remoteShared: Record<string, string | number>,\n bundle: string,\n reactModules: ReactModules,\n callerTag: LogLocation = 'SharedModuleResolver',\n): Promise<Record<string, unknown>> {\n const resolve: Record<string, unknown> = {\n ...reactModules,\n ...Object.entries(remoteShared).reduce<Record<string, unknown>>(\n (acc, [key, value]) => {\n if (typeof hostShared[value] !== 'undefined') {\n acc[key.replace(/^\\(ssr\\)\\/(?<relative>\\.\\/)?/, '')] =\n hostShared[value];\n } else {\n logDebug(\n callerTag,\n `Remote requests \"${value}\" but host doesn't provide it`,\n );\n }\n return acc;\n },\n {},\n ),\n };\n await Promise.all(\n Object.entries(resolve).map(async ([key, value]) => {\n if (typeof value === 'function') {\n resolve[key] = await value(bundle);\n }\n return Promise.resolve(value);\n }),\n );\n return resolve;\n}\n"],"mappings":"AACA,SAAS,uBAAuB;AAEhC,SAAS,gBAAgB;AAOlB,MAAM,yBAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,MAAM,sBAA8C;AAAA,EACzD,OAAO;AAAA,EACP,yBAAyB;AAAA,EACzB,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,oBAAoB;AACtB;AAOO,MAAM,gBAAwC,OAAO;AAAA,EAC1D,OAAO,QAAQ,mBAAmB,EAC/B,OAAO,CAAC,CAAC,GAAG,MAAM,QAAQ,kBAAkB,EAC5C,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC;AAC5C;AAUO,SAAS,gBACd,YACqC;AACrC,SAAO;AAAA,IACL,OAAO,aAAa,MAAM,OAAO,OAAO,GAAG;AAAA,IAC3C,aAAa,aAAa,MAAM,OAAO,WAAW,GAAG;AAAA,IACrD,yBAAyB,aACtB,MAAM,OAAO,uBAAuB,GAAG;AAAA,IAC1C,qBAAqB,aAClB,MAAM,OAAO,mBAAmB,GAAG;AAAA,IACtC,oBAAoB,aAAa,MAAM,OAAO,kBAAkB,GAAG;AAAA,IACnE,GAAG;AAAA,EACL;AACF;AAmBO,SAAS,gBACd,YACA,kBACA,SACqC;AACrC,QAAM,OAAO;AACb,QAAM,SAA8C;AAAA,IAClD,GAAG,gBAAgB,YAAY,gBAAgB;AAAA,IAC/C,GAAG,KAAK;AAAA,IACR,GAAG;AAAA,EACL;AACA,MAAI,SAAS,8BAA8B;AACzC,WAAO,OAAO,QAAQ,KAAK,2BAA2B;AAAA,EACxD;AACA,SAAO;AACT;AAwBA,eAAsB,oBACpB,YACA,cACA,QACA,cACA,YAAyB,wBACS;AAClC,QAAM,UAAmC;AAAA,IACvC,GAAG;AAAA,IACH,GAAG,OAAO,QAAQ,YAAY,EAAE;AAAA,MAC9B,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM;AACrB,YAAI,OAAO,WAAW,KAAK,MAAM,aAAa;AAC5C,cAAI,IAAI,QAAQ,gCAAgC,EAAE,CAAC,IACjD,WAAW,KAAK;AAAA,QACpB,OAAO;AACL;AAAA,YACE;AAAA,YACA,oBAAoB;AAAA,UACtB;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,QAAQ;AAAA,IACZ,OAAO,QAAQ,OAAO,EAAE,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM;AAClD,UAAI,OAAO,UAAU,YAAY;AAC/B,gBAAQ,GAAG,IAAI,MAAM,MAAM,MAAM;AAAA,MACnC;AACA,aAAO,QAAQ,QAAQ,KAAK;AAAA,IAC9B,CAAC;AAAA,EACH;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../../src/host/shared/shared-module-resolver.ts"],"sourcesContent":["import type { InternalResolveClientUrl } from '#internal/host/server/types';\nimport { sharedPolyfills } from '#internal/host/shared/polyfill';\nimport {\n createSharedModulePlan,\n resolveSharedModulePlan,\n type SharedModuleFactory,\n} from '#internal/host/shared/shared-broker';\nimport type { LogLocation } from '#internal/utils/logger';\n\n/**\n * The core React packages that are always shared between host and remote.\n * These correspond to the `/react/*.js` and `/react-dom/*.js` path keys\n * used in the webpack module resolution map.\n */\nexport const CORE_REACT_SHARED_KEYS = [\n 'react',\n 'react/jsx-dev-runtime',\n 'react/jsx-runtime',\n 'react-dom',\n 'react-dom/client',\n] as const;\n\n/**\n * Maps each core React package to its webpack-style path key.\n * For example, `react` maps to `/react/index.js`.\n */\nexport const CORE_REACT_PATH_MAP: Record<string, string> = {\n react: '/react/index.js',\n 'react/jsx-dev-runtime': '/react/jsx-dev-runtime.js',\n 'react/jsx-runtime': '/react/jsx-runtime.js',\n 'react-dom': '/react-dom/index.js',\n 'react-dom/client': '/react-dom/client.js',\n};\n\n/**\n * The vendorShared record used by the Next.js config to map React packages\n * to their webpack path-key string literals. Derived from CORE_REACT_PATH_MAP\n * but excludes `react-dom/client` to match the existing config behavior.\n */\nexport const VENDOR_SHARED: Record<string, string> = Object.fromEntries(\n Object.entries(CORE_REACT_PATH_MAP)\n .filter(([key]) => key !== 'react-dom/client')\n .map(([key, path]) => [key, `'${path}'`]),\n);\n\n/**\n * Builds the `coreShared` map for the Turbopack runtime's\n * `initializeSharedModules`. Each entry is an async factory that dynamically\n * imports the corresponding React package. User-provided shared modules\n * override core entries (e.g. to supply a pinned React version).\n */\nexport function buildCoreShared(\n userShared?: Record<string, SharedModuleFactory>,\n): Record<string, SharedModuleFactory> {\n return {\n react: async () => (await import('react')).default,\n 'react-dom': async () => (await import('react-dom')).default,\n 'react/jsx-dev-runtime': async () =>\n (await import('react/jsx-dev-runtime')).default,\n 'react/jsx-runtime': async () =>\n (await import('react/jsx-runtime')).default,\n 'react-dom/client': async () => (await import('react-dom/client')).default,\n ...userShared,\n };\n}\n\ninterface HostSharedGlobals {\n __remote_component_host_shared_modules__?: Record<\n string,\n SharedModuleFactory\n >;\n __remote_component_shared__?: Record<string, SharedModuleFactory>;\n}\n\n/**\n * Builds the merged host shared modules map with a consistent merge priority:\n * 1. Polyfills (lowest priority — fallback implementations)\n * 2. Global host shared modules (`__remote_component_host_shared_modules__`)\n * 3. User-provided shared modules (highest priority — explicit overrides)\n *\n * Some callers also include `__remote_component_shared__` (the pages router\n * global). Pass `includeRemoteComponentShared: true` to include it at the end.\n */\nexport function buildHostShared(\n userShared?: Record<string, SharedModuleFactory>,\n resolveClientUrl?: InternalResolveClientUrl,\n options?: { includeRemoteComponentShared?: boolean },\n): Record<string, SharedModuleFactory> {\n const self = globalThis as typeof globalThis & HostSharedGlobals;\n const result: Record<string, SharedModuleFactory> = {\n ...sharedPolyfills(userShared, resolveClientUrl),\n ...self.__remote_component_host_shared_modules__,\n ...userShared,\n };\n if (options?.includeRemoteComponentShared) {\n Object.assign(result, self.__remote_component_shared__);\n }\n return result;\n}\n\n/**\n * React module instances keyed by their webpack path, e.g.\n * `{ '/react/index.js': React }`. Passed into `buildWebpackResolve` so it\n * can populate the resolve map without importing React itself.\n */\nexport interface ReactModules {\n '/react/index.js': unknown;\n '/react/jsx-dev-runtime.js': unknown;\n '/react/jsx-runtime.js': unknown;\n '/react-dom/index.js': unknown;\n '/react-dom/client.js': unknown;\n}\n\n/**\n * Builds the `resolve` map passed to `applySharedModules` for the webpack\n * runtime. Combines:\n * - Static React module path keys (`/react/index.js`, etc.)\n * - Remote shared modules matched against host shared, with `(ssr)/` prefix stripped\n *\n * After building the map, resolves any factory functions by awaiting them\n * with the given bundle name.\n */\nexport async function buildWebpackResolve(\n hostShared: Record<string, SharedModuleFactory | unknown>,\n remoteShared: Record<string, string | number>,\n bundle: string,\n reactModules: ReactModules,\n callerTag: LogLocation = 'SharedModuleResolver',\n): Promise<Record<string, unknown>> {\n const sharePlan = createSharedModulePlan({\n bundle,\n hostShared,\n remoteShared,\n callerTag,\n });\n const plannedResolve = await resolveSharedModulePlan(sharePlan);\n const resolve: Record<string, unknown> = {\n ...reactModules,\n ...Object.fromEntries(\n Object.entries(plannedResolve).map(([key, value]) => [\n key.replace(/^\\(ssr\\)\\/(?<relative>\\.\\/)?/, ''),\n value,\n ]),\n ),\n };\n return resolve;\n}\n"],"mappings":"AACA,SAAS,uBAAuB;AAChC;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AAQA,MAAM,yBAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,MAAM,sBAA8C;AAAA,EACzD,OAAO;AAAA,EACP,yBAAyB;AAAA,EACzB,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,oBAAoB;AACtB;AAOO,MAAM,gBAAwC,OAAO;AAAA,EAC1D,OAAO,QAAQ,mBAAmB,EAC/B,OAAO,CAAC,CAAC,GAAG,MAAM,QAAQ,kBAAkB,EAC5C,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC;AAC5C;AAQO,SAAS,gBACd,YACqC;AACrC,SAAO;AAAA,IACL,OAAO,aAAa,MAAM,OAAO,OAAO,GAAG;AAAA,IAC3C,aAAa,aAAa,MAAM,OAAO,WAAW,GAAG;AAAA,IACrD,yBAAyB,aACtB,MAAM,OAAO,uBAAuB,GAAG;AAAA,IAC1C,qBAAqB,aAClB,MAAM,OAAO,mBAAmB,GAAG;AAAA,IACtC,oBAAoB,aAAa,MAAM,OAAO,kBAAkB,GAAG;AAAA,IACnE,GAAG;AAAA,EACL;AACF;AAmBO,SAAS,gBACd,YACA,kBACA,SACqC;AACrC,QAAM,OAAO;AACb,QAAM,SAA8C;AAAA,IAClD,GAAG,gBAAgB,YAAY,gBAAgB;AAAA,IAC/C,GAAG,KAAK;AAAA,IACR,GAAG;AAAA,EACL;AACA,MAAI,SAAS,8BAA8B;AACzC,WAAO,OAAO,QAAQ,KAAK,2BAA2B;AAAA,EACxD;AACA,SAAO;AACT;AAwBA,eAAsB,oBACpB,YACA,cACA,QACA,cACA,YAAyB,wBACS;AAClC,QAAM,YAAY,uBAAuB;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,iBAAiB,MAAM,wBAAwB,SAAS;AAC9D,QAAM,UAAmC;AAAA,IACvC,GAAG;AAAA,IACH,GAAG,OAAO;AAAA,MACR,OAAO,QAAQ,cAAc,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAAA,QACnD,IAAI,QAAQ,gCAAgC,EAAE;AAAA,QAC9C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
@@ -97,7 +97,7 @@ async function loadRemoteComponent({
97
97
  remoteShared
98
98
  );
99
99
  }
100
- if (bundle) {
100
+ if (bundle && runtime === "webpack") {
101
101
  const resolve = await (0, import_shared_module_resolver.buildWebpackResolve)(
102
102
  hostShared,
103
103
  remoteShared,
@@ -112,6 +112,7 @@ async function loadRemoteComponent({
112
112
  "ComponentLoader"
113
113
  );
114
114
  (0, import_apply_shared_modules.applySharedModules)(bundle, resolve);
115
+ } else if (bundle && runtime === "turbopack") {
115
116
  } else {
116
117
  (0, import_logger.logWarn)(
117
118
  "ComponentLoader",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/runtime/loaders/component-loader.ts"],"sourcesContent":["import * as React from 'react';\nimport * as JSXDevRuntime from 'react/jsx-dev-runtime';\nimport * as JSXRuntime from 'react/jsx-runtime';\nimport * as ReactDOM from 'react-dom';\nimport * as ReactDOMClient from 'react-dom/client';\nimport { applySharedModules } from '#internal/config/webpack/apply-shared-modules';\nimport { nextClientPagesLoader } from '#internal/config/webpack/next-client-pages-loader';\nimport type { InternalResolveClientUrl } from '#internal/host/server/types';\nimport type { ConsumeLoaderPayload } from '#internal/host/shared/server-handoff';\nimport {\n buildCoreShared,\n buildWebpackResolve,\n} from '#internal/host/shared/shared-module-resolver';\nimport { createRSCStream } from '#internal/runtime/rsc';\nimport { importRSCClientBrowser } from '#internal/runtime/rsc-imports';\nimport { setupRemoteScope } from '#internal/runtime/turbopack/remote-scope-setup';\nimport { initializeSharedModules } from '#internal/runtime/turbopack/shared-modules';\nimport type { GlobalScope, LoaderResult } from '#internal/runtime/types';\nimport { RemoteComponentsError } from '#internal/utils/error';\nimport { logDebug, logWarn } from '#internal/utils/logger';\nimport { loadScripts } from './script-loader';\n\n/**\n * Props accepted by {@link loadRemoteComponent}.\n *\n * Extends {@link ConsumeLoaderPayload} (the SSR-resolved fields needed for\n * hydration) with loader-specific fields (`url`, `shared`, `container`, etc.).\n * `remoteShared` is narrowed from optional to required (defaults to `{}` at\n * the call site).\n */\nexport interface ConsumeLoaderProps extends ConsumeLoaderPayload {\n url: URL;\n shared:\n | Promise<Record<string, (bundle?: string) => Promise<unknown>>>\n | Record<string, (bundle?: string) => Promise<unknown>>;\n remoteShared: Record<string, string>;\n container?: HTMLHeadElement | ShadowRoot | null;\n rscName?: string;\n resolveClientUrl?: InternalResolveClientUrl;\n}\n\n/**\n * Main loader function that orchestrates the component loading process\n */\nexport async function loadRemoteComponent({\n url,\n name,\n rscName,\n bundle,\n route = '/',\n runtime = 'webpack',\n data,\n nextData,\n scripts = [],\n shared = Promise.resolve({}),\n remoteShared = {},\n container,\n resolveClientUrl,\n}: ConsumeLoaderProps): Promise<LoaderResult> {\n try {\n // Load scripts if using webpack runtime\n if (runtime === 'webpack') {\n const self = globalThis as GlobalScope;\n // disable webpack entrypoint execution for the remote\n if (!self.__DISABLE_WEBPACK_EXEC__) {\n self.__DISABLE_WEBPACK_EXEC__ = {};\n }\n // disable webpack entrypoint execution for the current remote bundle\n self.__DISABLE_WEBPACK_EXEC__[bundle] = true;\n await loadScripts(scripts, resolveClientUrl);\n }\n\n const hostShared = await shared;\n logDebug(\n 'ComponentLoader',\n `loadRemoteComponent: bundle=\"${bundle}\", name=\"${name}\"`,\n );\n logDebug(\n 'ComponentLoader',\n `Host shared modules available: ${Object.keys(hostShared)}`,\n );\n logDebug(\n 'ComponentLoader',\n `Remote shared modules requested: ${JSON.stringify(remoteShared)}`,\n );\n\n // Setup remote scope and load turbopack chunks\n const scope = await setupRemoteScope(\n runtime,\n scripts,\n url,\n bundle,\n resolveClientUrl,\n );\n\n // Initialize turbopack shared modules (React, etc.) now that chunks are loaded\n if (runtime === 'turbopack') {\n await initializeSharedModules(\n scope,\n buildCoreShared(hostShared),\n remoteShared,\n );\n }\n\n // Setup shared modules\n if (bundle) {\n const resolve = await buildWebpackResolve(\n hostShared,\n remoteShared,\n bundle,\n {\n '/react/index.js': React,\n '/react/jsx-dev-runtime.js': JSXDevRuntime,\n '/react/jsx-runtime.js': JSXRuntime,\n '/react-dom/index.js': ReactDOM,\n '/react-dom/client.js': ReactDOMClient,\n },\n 'ComponentLoader',\n );\n applySharedModules(bundle, resolve);\n } else {\n logWarn(\n 'ComponentLoader',\n 'No bundle specified, skipping shared module setup',\n );\n }\n\n // Rewrite plain bundle references in RSC data to the scoped name so\n // the client dispatchers resolve the correct scope.\n const scopedData = data.map((chunk) =>\n chunk.replaceAll(`[${bundle}]`, `[${scope.scopedName}]`),\n );\n\n // Load component based on data type\n if (scopedData.length > 0) {\n return await loadRSCComponent(rscName ?? name, scopedData);\n } else if (nextData) {\n return loadNextPagesComponent(bundle, route, nextData, name, container);\n }\n\n return loadRSCComponent(rscName ?? name, [`0:[null]\\n`]); // Fallback to empty RSC payload\n } catch (error) {\n return {\n component: null,\n error: new RemoteComponentsError(\n `Failed to load remote component \"${name}\".`,\n {\n cause: error instanceof Error ? error : new Error(String(error)),\n },\n ),\n };\n }\n}\n\n/**\n * Loads RSC (React Server Components) based component\n */\nasync function loadRSCComponent(\n rscName: string,\n data: string[],\n): Promise<LoaderResult> {\n const { createFromReadableStream } = await importRSCClientBrowser();\n if (typeof createFromReadableStream !== 'function') {\n throw new RemoteComponentsError(\n 'Failed to import \"react-server-dom-webpack\". Is Next.js installed correctly?',\n );\n }\n\n const stream = createRSCStream(rscName, data);\n const component = createFromReadableStream(stream);\n\n return { component };\n}\n\n/**\n * Loads Next.js Pages Router based component\n */\nfunction loadNextPagesComponent(\n bundle: string,\n route: string,\n nextData: NonNullable<ConsumeLoaderPayload['nextData']>,\n name: string,\n container?: HTMLHeadElement | ShadowRoot | null,\n): LoaderResult {\n const { Component, App } = nextClientPagesLoader(bundle, route, container);\n\n if (!Component) {\n throw new RemoteComponentsError(\n `Remote Component \"${name}\" is trying to load the component for route \"${route}\" but it is not available.`,\n );\n }\n\n // error tolerance when app component is not found\n const component = App\n ? React.createElement(App, { Component, ...nextData.props })\n : React.createElement(Component, nextData.props);\n\n return { component };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/runtime/loaders/component-loader.ts"],"sourcesContent":["import * as React from 'react';\nimport * as JSXDevRuntime from 'react/jsx-dev-runtime';\nimport * as JSXRuntime from 'react/jsx-runtime';\nimport * as ReactDOM from 'react-dom';\nimport * as ReactDOMClient from 'react-dom/client';\nimport { applySharedModules } from '#internal/config/webpack/apply-shared-modules';\nimport { nextClientPagesLoader } from '#internal/config/webpack/next-client-pages-loader';\nimport type { InternalResolveClientUrl } from '#internal/host/server/types';\nimport type { ConsumeLoaderPayload } from '#internal/host/shared/server-handoff';\nimport {\n buildCoreShared,\n buildWebpackResolve,\n} from '#internal/host/shared/shared-module-resolver';\nimport { createRSCStream } from '#internal/runtime/rsc';\nimport { importRSCClientBrowser } from '#internal/runtime/rsc-imports';\nimport { setupRemoteScope } from '#internal/runtime/turbopack/remote-scope-setup';\nimport { initializeSharedModules } from '#internal/runtime/turbopack/shared-modules';\nimport type { GlobalScope, LoaderResult } from '#internal/runtime/types';\nimport { RemoteComponentsError } from '#internal/utils/error';\nimport { logDebug, logWarn } from '#internal/utils/logger';\nimport { loadScripts } from './script-loader';\n\n/**\n * Props accepted by {@link loadRemoteComponent}.\n *\n * Extends {@link ConsumeLoaderPayload} (the SSR-resolved fields needed for\n * hydration) with loader-specific fields (`url`, `shared`, `container`, etc.).\n * `remoteShared` is narrowed from optional to required (defaults to `{}` at\n * the call site).\n */\nexport interface ConsumeLoaderProps extends ConsumeLoaderPayload {\n url: URL;\n shared:\n | Promise<Record<string, (bundle?: string) => Promise<unknown>>>\n | Record<string, (bundle?: string) => Promise<unknown>>;\n remoteShared: Record<string, string>;\n container?: HTMLHeadElement | ShadowRoot | null;\n rscName?: string;\n resolveClientUrl?: InternalResolveClientUrl;\n}\n\n/**\n * Main loader function that orchestrates the component loading process\n */\nexport async function loadRemoteComponent({\n url,\n name,\n rscName,\n bundle,\n route = '/',\n runtime = 'webpack',\n data,\n nextData,\n scripts = [],\n shared = Promise.resolve({}),\n remoteShared = {},\n container,\n resolveClientUrl,\n}: ConsumeLoaderProps): Promise<LoaderResult> {\n try {\n // Load scripts if using webpack runtime\n if (runtime === 'webpack') {\n const self = globalThis as GlobalScope;\n // disable webpack entrypoint execution for the remote\n if (!self.__DISABLE_WEBPACK_EXEC__) {\n self.__DISABLE_WEBPACK_EXEC__ = {};\n }\n // disable webpack entrypoint execution for the current remote bundle\n self.__DISABLE_WEBPACK_EXEC__[bundle] = true;\n await loadScripts(scripts, resolveClientUrl);\n }\n\n const hostShared = await shared;\n logDebug(\n 'ComponentLoader',\n `loadRemoteComponent: bundle=\"${bundle}\", name=\"${name}\"`,\n );\n logDebug(\n 'ComponentLoader',\n `Host shared modules available: ${Object.keys(hostShared)}`,\n );\n logDebug(\n 'ComponentLoader',\n `Remote shared modules requested: ${JSON.stringify(remoteShared)}`,\n );\n\n // Setup remote scope and load turbopack chunks\n const scope = await setupRemoteScope(\n runtime,\n scripts,\n url,\n bundle,\n resolveClientUrl,\n );\n\n // Initialize turbopack shared modules (React, etc.) now that chunks are loaded\n if (runtime === 'turbopack') {\n await initializeSharedModules(\n scope,\n buildCoreShared(hostShared),\n remoteShared,\n );\n }\n\n // Setup shared modules\n if (bundle && runtime === 'webpack') {\n const resolve = await buildWebpackResolve(\n hostShared,\n remoteShared,\n bundle,\n {\n '/react/index.js': React,\n '/react/jsx-dev-runtime.js': JSXDevRuntime,\n '/react/jsx-runtime.js': JSXRuntime,\n '/react-dom/index.js': ReactDOM,\n '/react-dom/client.js': ReactDOMClient,\n },\n 'ComponentLoader',\n );\n applySharedModules(bundle, resolve);\n } else if (bundle && runtime === 'turbopack') {\n // New shared-module architecture: Turbopack installs resolved modules\n // onto RemoteScope in initializeSharedModules(). Keep Webpack patching\n // isolated above so this branch can be deleted with the old\n // applySharedModules path once Webpack also moves to scope adapters.\n } else {\n logWarn(\n 'ComponentLoader',\n 'No bundle specified, skipping shared module setup',\n );\n }\n\n // Rewrite plain bundle references in RSC data to the scoped name so\n // the client dispatchers resolve the correct scope.\n const scopedData = data.map((chunk) =>\n chunk.replaceAll(`[${bundle}]`, `[${scope.scopedName}]`),\n );\n\n // Load component based on data type\n if (scopedData.length > 0) {\n return await loadRSCComponent(rscName ?? name, scopedData);\n } else if (nextData) {\n return loadNextPagesComponent(bundle, route, nextData, name, container);\n }\n\n return loadRSCComponent(rscName ?? name, [`0:[null]\\n`]); // Fallback to empty RSC payload\n } catch (error) {\n return {\n component: null,\n error: new RemoteComponentsError(\n `Failed to load remote component \"${name}\".`,\n {\n cause: error instanceof Error ? error : new Error(String(error)),\n },\n ),\n };\n }\n}\n\n/**\n * Loads RSC (React Server Components) based component\n */\nasync function loadRSCComponent(\n rscName: string,\n data: string[],\n): Promise<LoaderResult> {\n const { createFromReadableStream } = await importRSCClientBrowser();\n if (typeof createFromReadableStream !== 'function') {\n throw new RemoteComponentsError(\n 'Failed to import \"react-server-dom-webpack\". Is Next.js installed correctly?',\n );\n }\n\n const stream = createRSCStream(rscName, data);\n const component = createFromReadableStream(stream);\n\n return { component };\n}\n\n/**\n * Loads Next.js Pages Router based component\n */\nfunction loadNextPagesComponent(\n bundle: string,\n route: string,\n nextData: NonNullable<ConsumeLoaderPayload['nextData']>,\n name: string,\n container?: HTMLHeadElement | ShadowRoot | null,\n): LoaderResult {\n const { Component, App } = nextClientPagesLoader(bundle, route, container);\n\n if (!Component) {\n throw new RemoteComponentsError(\n `Remote Component \"${name}\" is trying to load the component for route \"${route}\" but it is not available.`,\n );\n }\n\n // error tolerance when app component is not found\n const component = App\n ? React.createElement(App, { Component, ...nextData.props })\n : React.createElement(Component, nextData.props);\n\n return { component };\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import { InternalResolveClientUrl } from '../url/resolve-client-url.js';
2
2
  import { a as ConsumeLoaderPayload } from '../../../server-handoff-8c89b856.js';
3
- import { L as LoaderResult } from '../../../types-8b0edd78.js';
3
+ import { L as LoaderResult } from '../../../types-bd7be268.js';
4
4
  import 'react';
5
5
  import '../../host/shared/asset-descriptors.js';
6
6
  import '../../host/shared/config.js';