remote-components 0.3.7 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/{chunk-LCXO7BUY.cjs → chunk-42TVDI3G.cjs} +5 -4
  2. package/dist/chunk-42TVDI3G.cjs.map +1 -0
  3. package/dist/chunk-5KTAEO52.cjs +28 -0
  4. package/dist/chunk-5KTAEO52.cjs.map +1 -0
  5. package/dist/{chunk-NZAB7REE.js → chunk-5WL3FP4V.js} +5 -5
  6. package/dist/{chunk-SZFCBE54.js → chunk-AKOMV2UF.js} +4 -3
  7. package/dist/chunk-AKOMV2UF.js.map +1 -0
  8. package/dist/{chunk-I47KE3EC.cjs → chunk-AYC2AWUG.cjs} +21 -21
  9. package/dist/{chunk-RJW3EZJP.cjs → chunk-EYALF655.cjs} +23 -23
  10. package/dist/{chunk-T64P7BAG.cjs → chunk-JJTCFQHE.cjs} +3 -3
  11. package/dist/{chunk-52BJ7VFA.js → chunk-MKO52FRO.js} +2 -2
  12. package/dist/{chunk-QKB74MLO.js → chunk-N3KPUFOB.js} +2 -2
  13. package/dist/chunk-N3SQTOSE.cjs +25 -0
  14. package/dist/chunk-N3SQTOSE.cjs.map +1 -0
  15. package/dist/{chunk-GBFUPMMI.js → chunk-NN5V3FVD.js} +25 -13
  16. package/dist/chunk-NN5V3FVD.js.map +1 -0
  17. package/dist/chunk-RHGEBXPL.js +25 -0
  18. package/dist/chunk-RHGEBXPL.js.map +1 -0
  19. package/dist/{chunk-X6W464D6.cjs → chunk-RLI4YTBJ.cjs} +17 -1
  20. package/dist/chunk-RLI4YTBJ.cjs.map +1 -0
  21. package/dist/{chunk-SJM7AAGU.js → chunk-SAGYPGIQ.js} +17 -1
  22. package/dist/chunk-SAGYPGIQ.js.map +1 -0
  23. package/dist/chunk-STIJO4AG.js +28 -0
  24. package/dist/chunk-STIJO4AG.js.map +1 -0
  25. package/dist/{chunk-AWWWK2ZY.cjs → chunk-Y4GMYUJT.cjs} +32 -20
  26. package/dist/chunk-Y4GMYUJT.cjs.map +1 -0
  27. package/dist/config/nextjs.cjs +6 -5
  28. package/dist/config/nextjs.cjs.map +1 -1
  29. package/dist/config/nextjs.js +3 -2
  30. package/dist/config/nextjs.js.map +1 -1
  31. package/dist/host/html.cjs +21 -20
  32. package/dist/host/html.cjs.map +1 -1
  33. package/dist/host/html.js +9 -8
  34. package/dist/host/html.js.map +1 -1
  35. package/dist/host/navigation.cjs +8 -0
  36. package/dist/host/navigation.cjs.map +1 -0
  37. package/dist/host/navigation.d.ts +30 -0
  38. package/dist/host/navigation.js +8 -0
  39. package/dist/host/navigation.js.map +1 -0
  40. package/dist/host/nextjs/app/client-only.cjs +14 -12
  41. package/dist/host/nextjs/app/client-only.cjs.map +1 -1
  42. package/dist/host/nextjs/app/client-only.d.ts +2 -1
  43. package/dist/host/nextjs/app/client-only.js +9 -7
  44. package/dist/host/nextjs/app/client-only.js.map +1 -1
  45. package/dist/host/react.cjs +12 -8
  46. package/dist/host/react.d.ts +2 -1
  47. package/dist/host/react.js +13 -9
  48. package/dist/{index-4c65355c.d.ts → index-d2ce8a3f.d.ts} +22 -2
  49. package/dist/internal/host/shared/navigate-event.cjs +51 -0
  50. package/dist/internal/host/shared/navigate-event.cjs.map +1 -0
  51. package/dist/internal/host/shared/navigate-event.d.ts +21 -0
  52. package/dist/internal/host/shared/navigate-event.js +26 -0
  53. package/dist/internal/host/shared/navigate-event.js.map +1 -0
  54. package/dist/internal/host/shared/polyfill.cjs +14 -0
  55. package/dist/internal/host/shared/polyfill.cjs.map +1 -1
  56. package/dist/internal/host/shared/polyfill.js +16 -0
  57. package/dist/internal/host/shared/polyfill.js.map +1 -1
  58. package/dist/internal/runtime/loaders/script-loader.cjs +2 -1
  59. package/dist/internal/runtime/loaders/script-loader.cjs.map +1 -1
  60. package/dist/internal/runtime/loaders/script-loader.js +2 -1
  61. package/dist/internal/runtime/loaders/script-loader.js.map +1 -1
  62. package/dist/navigate-event-baee0b63.d.ts +14 -0
  63. package/dist/{turbopack-5LW6V6IT.js → turbopack-DK6L7P3J.js} +5 -4
  64. package/dist/{turbopack-5LW6V6IT.js.map → turbopack-DK6L7P3J.js.map} +1 -1
  65. package/dist/{turbopack-KRKECGY2.cjs → turbopack-PSD4THQE.cjs} +12 -11
  66. package/dist/turbopack-PSD4THQE.cjs.map +1 -0
  67. package/dist/{webpack-NPZNXRNL.js → webpack-KSDNIXMS.js} +5 -4
  68. package/dist/{webpack-NPZNXRNL.js.map → webpack-KSDNIXMS.js.map} +1 -1
  69. package/dist/{webpack-TTZDARNY.cjs → webpack-SIFRCBIN.cjs} +12 -11
  70. package/dist/webpack-SIFRCBIN.cjs.map +1 -0
  71. package/package.json +9 -1
  72. package/dist/chunk-AWWWK2ZY.cjs.map +0 -1
  73. package/dist/chunk-GBFUPMMI.js.map +0 -1
  74. package/dist/chunk-LCXO7BUY.cjs.map +0 -1
  75. package/dist/chunk-SJM7AAGU.js.map +0 -1
  76. package/dist/chunk-SZFCBE54.js.map +0 -1
  77. package/dist/chunk-X6W464D6.cjs.map +0 -1
  78. package/dist/turbopack-KRKECGY2.cjs.map +0 -1
  79. package/dist/webpack-TTZDARNY.cjs.map +0 -1
  80. /package/dist/{chunk-NZAB7REE.js.map → chunk-5WL3FP4V.js.map} +0 -0
  81. /package/dist/{chunk-I47KE3EC.cjs.map → chunk-AYC2AWUG.cjs.map} +0 -0
  82. /package/dist/{chunk-RJW3EZJP.cjs.map → chunk-EYALF655.cjs.map} +0 -0
  83. /package/dist/{chunk-T64P7BAG.cjs.map → chunk-JJTCFQHE.cjs.map} +0 -0
  84. /package/dist/{chunk-52BJ7VFA.js.map → chunk-MKO52FRO.js.map} +0 -0
  85. /package/dist/{chunk-QKB74MLO.js.map → chunk-N3KPUFOB.js.map} +0 -0
@@ -1,18 +1,22 @@
1
1
  import {
2
- ConsumeRemoteComponent
3
- } from "../chunk-GBFUPMMI.js";
4
- import "../chunk-NZAB7REE.js";
5
- import "../chunk-SZFCBE54.js";
6
- import "../chunk-QKB74MLO.js";
7
- import "../chunk-52BJ7VFA.js";
2
+ ConsumeRemoteComponent,
3
+ useRemoteNavigate
4
+ } from "../chunk-NN5V3FVD.js";
5
+ import "../chunk-5WL3FP4V.js";
6
+ import "../chunk-AKOMV2UF.js";
7
+ import "../chunk-N3KPUFOB.js";
8
+ import "../chunk-MKO52FRO.js";
8
9
  import "../chunk-LQ7VQ74E.js";
9
- import "../chunk-SJM7AAGU.js";
10
+ import "../chunk-RHGEBXPL.js";
11
+ import "../chunk-SAGYPGIQ.js";
10
12
  import "../chunk-D5GNZB6O.js";
13
+ import "../chunk-STIJO4AG.js";
11
14
  import "../chunk-S2A4TFLS.js";
12
- import "../chunk-GAXJTFBV.js";
13
15
  import "../chunk-X6YKUJKH.js";
16
+ import "../chunk-GAXJTFBV.js";
14
17
  import "../chunk-ENYGL5CO.js";
15
18
  export {
16
- ConsumeRemoteComponent
19
+ ConsumeRemoteComponent,
20
+ useRemoteNavigate
17
21
  };
18
22
  //# sourceMappingURL=react.js.map
@@ -1,4 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { R as RemoteNavigateEvent } from './navigate-event-baee0b63.js';
2
3
 
3
4
  /**
4
5
  * Intercepts client-side URL resolution for remote component resources.
@@ -248,10 +249,29 @@ interface ConsumeLifecycleCallbacks {
248
249
  onChange?: (info: ChangeInfo) => void;
249
250
  }
250
251
 
252
+ /**
253
+ * Subscribe to remote component navigations. The callback is captured in a ref
254
+ * so the listener is registered once — no `useCallback` or dep array needed.
255
+ *
256
+ * @example React Router
257
+ * ```tsx
258
+ * const navigate = useNavigate();
259
+ * // Always replace — the polyfill already pushed/replaced the browser history entry.
260
+ * useRemoteNavigate((e) => navigate(e.pathname + e.search, { replace: true }));
261
+ * ```
262
+ */
263
+ declare function useRemoteNavigate(callback: (event: RemoteNavigateEvent) => void): void;
264
+
251
265
  /**
252
266
  * Props for the React remote component host.
253
267
  *
254
- * Extends {@link ConsumeRemoteComponentConfig} with `children` for loading fallback content.
268
+ * Extends {@link ConsumeRemoteComponentConfig} with `children` for loading
269
+ * fallback content.
270
+ *
271
+ * To react to navigations originating from embedded remote components, set up
272
+ * a single top-level subscription with `onRemoteNavigate` from
273
+ * `remote-components/host/navigation` and route the event to your host's
274
+ * router.
255
275
  */
256
276
  interface ConsumeRemoteComponentProps extends ConsumeRemoteComponentConfig {
257
277
  /** Loading fallback content displayed while the remote component is being fetched. */
@@ -295,4 +315,4 @@ interface ConsumeRemoteComponentProps extends ConsumeRemoteComponentConfig {
295
315
  */
296
316
  declare function ConsumeRemoteComponent({ src, isolate, mode, reset, credentials: credentialsProp, name: nameProp, shared: sharedProp, children, onBeforeLoad, onLoad, onError, onChange, onRequest, onResponse, resolveClientUrl: resolveClientUrlProp, }: ConsumeRemoteComponentProps): react_jsx_runtime.JSX.Element;
297
317
 
298
- export { ConsumeClientOnlyConfig as C, HookOptions as H, OnRequestHook as O, ConsumeRemoteComponentProps as a, ConsumeRemoteComponent as b, OnResponseHook as c };
318
+ export { ConsumeClientOnlyConfig as C, HookOptions as H, OnRequestHook as O, ConsumeRemoteComponentProps as a, ConsumeRemoteComponent as b, OnResponseHook as c, useRemoteNavigate as u };
@@ -0,0 +1,51 @@
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 navigate_event_exports = {};
20
+ __export(navigate_event_exports, {
21
+ REMOTE_NAVIGATE_EVENT: () => REMOTE_NAVIGATE_EVENT,
22
+ parseRemoteNavigateDetail: () => parseRemoteNavigateDetail
23
+ });
24
+ module.exports = __toCommonJS(navigate_event_exports);
25
+ const REMOTE_NAVIGATE_EVENT = "remote-components:navigate";
26
+ function parseRemoteNavigateDetail(detail) {
27
+ try {
28
+ const parsed = new URL(detail.url, window.location.origin);
29
+ return {
30
+ url: detail.url,
31
+ pathname: parsed.pathname,
32
+ search: parsed.search,
33
+ hash: parsed.hash,
34
+ type: detail.type
35
+ };
36
+ } catch {
37
+ return {
38
+ url: detail.url,
39
+ pathname: detail.url,
40
+ search: "",
41
+ hash: "",
42
+ type: detail.type
43
+ };
44
+ }
45
+ }
46
+ // Annotate the CommonJS export names for ESM import in node:
47
+ 0 && (module.exports = {
48
+ REMOTE_NAVIGATE_EVENT,
49
+ parseRemoteNavigateDetail
50
+ });
51
+ //# sourceMappingURL=navigate-event.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/host/shared/navigate-event.ts"],"sourcesContent":["export const REMOTE_NAVIGATE_EVENT = 'remote-components:navigate';\n\nexport interface RemoteNavigateDetail {\n url: string;\n type: 'push' | 'replace';\n}\n\n/** Parsed navigation request surfaced to `onRemoteNavigate` / `useRemoteNavigate` callbacks. */\nexport interface RemoteNavigateEvent {\n /** Raw value from the remote; may be absolute or relative. */\n url: string;\n pathname: string;\n /** Includes leading `?`, or `''` if none. */\n search: string;\n /** Includes leading `#`, or `''` if none. */\n hash: string;\n /** `'push'` / `'replace'` mirror the remote's history call. */\n type: 'push' | 'replace';\n}\n\n/** Handles both absolute URLs and relative paths; falls back to pathname-only on parse failure. */\nexport function parseRemoteNavigateDetail(\n detail: RemoteNavigateDetail,\n): RemoteNavigateEvent {\n try {\n const parsed = new URL(detail.url, window.location.origin);\n return {\n url: detail.url,\n pathname: parsed.pathname,\n search: parsed.search,\n hash: parsed.hash,\n type: detail.type,\n };\n } catch {\n return {\n url: detail.url,\n pathname: detail.url,\n search: '',\n hash: '',\n type: detail.type,\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,wBAAwB;AAqB9B,SAAS,0BACd,QACqB;AACrB,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,OAAO,KAAK,OAAO,SAAS,MAAM;AACzD,WAAO;AAAA,MACL,KAAK,OAAO;AAAA,MACZ,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,MACf,MAAM,OAAO;AAAA,MACb,MAAM,OAAO;AAAA,IACf;AAAA,EACF,QAAE;AACA,WAAO;AAAA,MACL,KAAK,OAAO;AAAA,MACZ,UAAU,OAAO;AAAA,MACjB,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM,OAAO;AAAA,IACf;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,21 @@
1
+ declare const REMOTE_NAVIGATE_EVENT = "remote-components:navigate";
2
+ interface RemoteNavigateDetail {
3
+ url: string;
4
+ type: 'push' | 'replace';
5
+ }
6
+ /** Parsed navigation request surfaced to `onRemoteNavigate` / `useRemoteNavigate` callbacks. */
7
+ interface RemoteNavigateEvent {
8
+ /** Raw value from the remote; may be absolute or relative. */
9
+ url: string;
10
+ pathname: string;
11
+ /** Includes leading `?`, or `''` if none. */
12
+ search: string;
13
+ /** Includes leading `#`, or `''` if none. */
14
+ hash: string;
15
+ /** `'push'` / `'replace'` mirror the remote's history call. */
16
+ type: 'push' | 'replace';
17
+ }
18
+ /** Handles both absolute URLs and relative paths; falls back to pathname-only on parse failure. */
19
+ declare function parseRemoteNavigateDetail(detail: RemoteNavigateDetail): RemoteNavigateEvent;
20
+
21
+ export { REMOTE_NAVIGATE_EVENT, RemoteNavigateDetail, RemoteNavigateEvent, parseRemoteNavigateDetail };
@@ -0,0 +1,26 @@
1
+ const REMOTE_NAVIGATE_EVENT = "remote-components:navigate";
2
+ function parseRemoteNavigateDetail(detail) {
3
+ try {
4
+ const parsed = new URL(detail.url, window.location.origin);
5
+ return {
6
+ url: detail.url,
7
+ pathname: parsed.pathname,
8
+ search: parsed.search,
9
+ hash: parsed.hash,
10
+ type: detail.type
11
+ };
12
+ } catch {
13
+ return {
14
+ url: detail.url,
15
+ pathname: detail.url,
16
+ search: "",
17
+ hash: "",
18
+ type: detail.type
19
+ };
20
+ }
21
+ }
22
+ export {
23
+ REMOTE_NAVIGATE_EVENT,
24
+ parseRemoteNavigateDetail
25
+ };
26
+ //# sourceMappingURL=navigate-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/host/shared/navigate-event.ts"],"sourcesContent":["export const REMOTE_NAVIGATE_EVENT = 'remote-components:navigate';\n\nexport interface RemoteNavigateDetail {\n url: string;\n type: 'push' | 'replace';\n}\n\n/** Parsed navigation request surfaced to `onRemoteNavigate` / `useRemoteNavigate` callbacks. */\nexport interface RemoteNavigateEvent {\n /** Raw value from the remote; may be absolute or relative. */\n url: string;\n pathname: string;\n /** Includes leading `?`, or `''` if none. */\n search: string;\n /** Includes leading `#`, or `''` if none. */\n hash: string;\n /** `'push'` / `'replace'` mirror the remote's history call. */\n type: 'push' | 'replace';\n}\n\n/** Handles both absolute URLs and relative paths; falls back to pathname-only on parse failure. */\nexport function parseRemoteNavigateDetail(\n detail: RemoteNavigateDetail,\n): RemoteNavigateEvent {\n try {\n const parsed = new URL(detail.url, window.location.origin);\n return {\n url: detail.url,\n pathname: parsed.pathname,\n search: parsed.search,\n hash: parsed.hash,\n type: detail.type,\n };\n } catch {\n return {\n url: detail.url,\n pathname: detail.url,\n search: '',\n hash: '',\n type: detail.type,\n };\n }\n}\n"],"mappings":"AAAO,MAAM,wBAAwB;AAqB9B,SAAS,0BACd,QACqB;AACrB,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,OAAO,KAAK,OAAO,SAAS,MAAM;AACzD,WAAO;AAAA,MACL,KAAK,OAAO;AAAA,MACZ,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,MACf,MAAM,OAAO;AAAA,MACb,MAAM,OAAO;AAAA,IACf;AAAA,EACF,QAAE;AACA,WAAO;AAAA,MACL,KAAK,OAAO;AAAA,MACZ,UAAU,OAAO;AAAA,MACjB,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM,OAAO;AAAA,IACf;AAAA,EACF;AACF;","names":[]}
@@ -22,9 +22,15 @@ __export(polyfill_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(polyfill_exports);
24
24
  var import_jsx_runtime = require("react/jsx-runtime");
25
+ var import_navigate_event = require("#internal/host/shared/navigate-event");
25
26
  var import_remote_image_loader = require("#internal/host/shared/remote-image-loader");
26
27
  var import_namespace = require("#internal/runtime/namespace");
27
28
  var import_logger = require("#internal/utils/logger");
29
+ function dispatchRemoteNavigate(detail) {
30
+ window.dispatchEvent(
31
+ new CustomEvent(import_navigate_event.REMOTE_NAVIGATE_EVENT, { detail })
32
+ );
33
+ }
28
34
  function sharedPolyfills(shared, resolveClientUrl) {
29
35
  const hostShared = (0, import_namespace.getNamespace)().hostSharedModules;
30
36
  const polyfill = {
@@ -33,9 +39,11 @@ function sharedPolyfills(shared, resolveClientUrl) {
33
39
  return {
34
40
  push: (routerUrl) => {
35
41
  history.pushState({}, "", routerUrl);
42
+ dispatchRemoteNavigate({ url: routerUrl, type: "push" });
36
43
  },
37
44
  replace: (routerUrl) => {
38
45
  history.replaceState({}, "", routerUrl);
46
+ dispatchRemoteNavigate({ url: routerUrl, type: "replace" });
39
47
  },
40
48
  back: () => {
41
49
  history.back();
@@ -98,6 +106,10 @@ function sharedPolyfills(shared, resolveClientUrl) {
98
106
  } else {
99
107
  history.pushState({}, "", props.href);
100
108
  }
109
+ dispatchRemoteNavigate({
110
+ url: props.href,
111
+ type: replace ? "replace" : "push"
112
+ });
101
113
  },
102
114
  suppressHydrationWarning: true,
103
115
  children: children ?? null
@@ -137,9 +149,11 @@ function sharedPolyfills(shared, resolveClientUrl) {
137
149
  return {
138
150
  push: (routerUrl) => {
139
151
  history.pushState({}, "", routerUrl);
152
+ dispatchRemoteNavigate({ url: routerUrl, type: "push" });
140
153
  },
141
154
  replace: (routerUrl) => {
142
155
  history.replaceState({}, "", routerUrl);
156
+ dispatchRemoteNavigate({ url: routerUrl, type: "replace" });
143
157
  },
144
158
  back: () => {
145
159
  history.back();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/host/shared/polyfill.tsx"],"sourcesContent":["import type { LinkProps } from 'next/link';\nimport { createRemoteImageLoader } from '#internal/host/shared/remote-image-loader';\nimport { getNamespace } from '#internal/runtime/namespace';\nimport type { InternalResolveClientUrl } from '#internal/runtime/url/resolve-client-url';\nimport { logWarn } from '#internal/utils/logger';\n\n// polyfill Next.js App Router client API (minimal)\n// implementations are minimal and do not cover all use cases\n// developer can override these shared modules from configuration\nexport function sharedPolyfills(\n shared?: Record<string, () => Promise<unknown>>,\n resolveClientUrl?: InternalResolveClientUrl,\n) {\n const hostShared = getNamespace().hostSharedModules;\n const polyfill = {\n 'next/dist/client/components/navigation':\n hostShared['next/navigation'] ??\n shared?.['next/navigation'] ??\n (() =>\n Promise.resolve({\n useRouter() {\n return {\n push: (routerUrl: string) => {\n history.pushState({}, '', routerUrl);\n },\n replace: (routerUrl: string) => {\n history.replaceState({}, '', routerUrl);\n },\n back: () => {\n history.back();\n },\n };\n },\n usePathname() {\n return location.pathname;\n },\n useParams() {\n return {};\n },\n useSearchParams() {\n return new URLSearchParams(location.search);\n },\n useSelectedLayoutSegment() {\n return null;\n },\n useSelectedLayoutSegments() {\n return [];\n },\n __esModule: true,\n })),\n 'next/dist/client/app-dir/link':\n hostShared['next/link'] ??\n shared?.['next/link'] ??\n (() =>\n Promise.resolve({\n default: ({\n scroll: _,\n replace,\n prefetch,\n onNavigate,\n children,\n ...props\n }: React.PropsWithChildren<LinkProps>) => {\n if (prefetch) {\n logWarn(\n 'Polyfill',\n 'Next.js Link prefetch is not supported in remote components',\n );\n }\n return (\n <a\n {...props}\n href={props.href as string}\n onClick={(e) => {\n e.preventDefault();\n let preventDefaulted = false;\n e.preventDefault = () => {\n preventDefaulted = true;\n e.defaultPrevented = true;\n };\n if (typeof props.onClick === 'function') {\n props.onClick(e);\n }\n onNavigate?.(e);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (preventDefaulted) {\n return;\n }\n if (replace) {\n history.replaceState({}, '', props.href as string);\n } else {\n history.pushState({}, '', props.href as string);\n }\n }}\n suppressHydrationWarning\n >\n {children ?? null}\n </a>\n );\n },\n useLinkStatus() {\n return { pending: false };\n },\n __esModule: true,\n })),\n 'next/dist/client/app-dir/form':\n hostShared['next/form'] ??\n shared?.['next/form'] ??\n (() =>\n Promise.resolve({\n default: () => {\n // TODO: implement <Form> component for non-Next.js host applications\n throw new Error('Next.js <Form> component not implemented');\n },\n __esModule: true,\n })),\n // Instead of replacing next/image entirely, we let the real Next.js Image\n // component load from the remote bundle and only replace its default loader.\n // This gives us full next/image fidelity (fill, priority, srcSet, blur\n // placeholders, error handling) while routing image optimization through the\n // remote app's /_next/image endpoint.\n 'next/dist/shared/lib/image-loader':\n hostShared['next/dist/shared/lib/image-loader'] ??\n shared?.['next/dist/shared/lib/image-loader'] ??\n ((bundle: string) =>\n Promise.resolve({\n default: createRemoteImageLoader(bundle, resolveClientUrl),\n __esModule: true,\n })),\n 'next/dist/client/script':\n hostShared['next/script'] ??\n shared?.['next/script'] ??\n (() =>\n Promise.resolve({\n // TODO: implement <Script> component for non-Next.js host applications\n // do not throw an error for now\n default: () => null,\n __esModule: true,\n })),\n 'next/router':\n hostShared['next/router'] ??\n shared?.['next/router'] ??\n (() =>\n // TODO: incomplete implementation\n Promise.resolve({\n useRouter() {\n return {\n push: (routerUrl: string) => {\n history.pushState({}, '', routerUrl);\n },\n replace: (routerUrl: string) => {\n history.replaceState({}, '', routerUrl);\n },\n back: () => {\n history.back();\n },\n };\n },\n __esModule: true,\n })),\n 'next/dist/build/polyfills/process': () =>\n Promise.resolve({\n default: {\n env: {\n NODE_ENV: 'production',\n },\n },\n __esModule: true,\n }),\n } as Record<string, () => Promise<unknown>>;\n\n polyfill['next/navigation'] = polyfill[\n 'next/dist/client/components/navigation'\n ] as () => Promise<unknown>;\n polyfill['next/link'] = polyfill[\n 'next/dist/client/app-dir/link'\n ] as () => Promise<unknown>;\n polyfill['next/form'] = polyfill[\n 'next/dist/client/app-dir/form'\n ] as () => Promise<unknown>;\n polyfill['next/dist/esm/shared/lib/image-loader'] = polyfill[\n 'next/dist/shared/lib/image-loader'\n ] as () => Promise<unknown>;\n polyfill['next/script'] = polyfill[\n 'next/dist/client/script'\n ] as () => Promise<unknown>;\n\n return polyfill;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/host/shared/polyfill.tsx"],"sourcesContent":["import type { LinkProps } from 'next/link';\nimport {\n REMOTE_NAVIGATE_EVENT,\n type RemoteNavigateDetail,\n} from '#internal/host/shared/navigate-event';\nimport { createRemoteImageLoader } from '#internal/host/shared/remote-image-loader';\nimport { getNamespace } from '#internal/runtime/namespace';\nimport type { InternalResolveClientUrl } from '#internal/runtime/url/resolve-client-url';\nimport { logWarn } from '#internal/utils/logger';\n\nfunction dispatchRemoteNavigate(detail: RemoteNavigateDetail) {\n window.dispatchEvent(\n new CustomEvent<RemoteNavigateDetail>(REMOTE_NAVIGATE_EVENT, { detail }),\n );\n}\n\n// polyfill Next.js App Router client API (minimal)\n// implementations are minimal and do not cover all use cases\n// developer can override these shared modules from configuration\nexport function sharedPolyfills(\n shared?: Record<string, () => Promise<unknown>>,\n resolveClientUrl?: InternalResolveClientUrl,\n) {\n const hostShared = getNamespace().hostSharedModules;\n const polyfill = {\n 'next/dist/client/components/navigation':\n hostShared['next/navigation'] ??\n shared?.['next/navigation'] ??\n (() =>\n Promise.resolve({\n useRouter() {\n return {\n push: (routerUrl: string) => {\n history.pushState({}, '', routerUrl);\n dispatchRemoteNavigate({ url: routerUrl, type: 'push' });\n },\n replace: (routerUrl: string) => {\n history.replaceState({}, '', routerUrl);\n dispatchRemoteNavigate({ url: routerUrl, type: 'replace' });\n },\n back: () => {\n history.back();\n },\n };\n },\n usePathname() {\n return location.pathname;\n },\n useParams() {\n return {};\n },\n useSearchParams() {\n return new URLSearchParams(location.search);\n },\n useSelectedLayoutSegment() {\n return null;\n },\n useSelectedLayoutSegments() {\n return [];\n },\n __esModule: true,\n })),\n 'next/dist/client/app-dir/link':\n hostShared['next/link'] ??\n shared?.['next/link'] ??\n (() =>\n Promise.resolve({\n default: ({\n scroll: _,\n replace,\n prefetch,\n onNavigate,\n children,\n ...props\n }: React.PropsWithChildren<LinkProps>) => {\n if (prefetch) {\n logWarn(\n 'Polyfill',\n 'Next.js Link prefetch is not supported in remote components',\n );\n }\n return (\n <a\n {...props}\n href={props.href as string}\n onClick={(e) => {\n e.preventDefault();\n let preventDefaulted = false;\n e.preventDefault = () => {\n preventDefaulted = true;\n e.defaultPrevented = true;\n };\n if (typeof props.onClick === 'function') {\n props.onClick(e);\n }\n onNavigate?.(e);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (preventDefaulted) {\n return;\n }\n if (replace) {\n history.replaceState({}, '', props.href as string);\n } else {\n history.pushState({}, '', props.href as string);\n }\n dispatchRemoteNavigate({\n url: props.href as string,\n type: replace ? 'replace' : 'push',\n });\n }}\n suppressHydrationWarning\n >\n {children ?? null}\n </a>\n );\n },\n useLinkStatus() {\n return { pending: false };\n },\n __esModule: true,\n })),\n 'next/dist/client/app-dir/form':\n hostShared['next/form'] ??\n shared?.['next/form'] ??\n (() =>\n Promise.resolve({\n default: () => {\n // TODO: implement <Form> component for non-Next.js host applications\n throw new Error('Next.js <Form> component not implemented');\n },\n __esModule: true,\n })),\n // Instead of replacing next/image entirely, we let the real Next.js Image\n // component load from the remote bundle and only replace its default loader.\n // This gives us full next/image fidelity (fill, priority, srcSet, blur\n // placeholders, error handling) while routing image optimization through the\n // remote app's /_next/image endpoint.\n 'next/dist/shared/lib/image-loader':\n hostShared['next/dist/shared/lib/image-loader'] ??\n shared?.['next/dist/shared/lib/image-loader'] ??\n ((bundle: string) =>\n Promise.resolve({\n default: createRemoteImageLoader(bundle, resolveClientUrl),\n __esModule: true,\n })),\n 'next/dist/client/script':\n hostShared['next/script'] ??\n shared?.['next/script'] ??\n (() =>\n Promise.resolve({\n // TODO: implement <Script> component for non-Next.js host applications\n // do not throw an error for now\n default: () => null,\n __esModule: true,\n })),\n 'next/router':\n hostShared['next/router'] ??\n shared?.['next/router'] ??\n (() =>\n // TODO: incomplete implementation\n Promise.resolve({\n useRouter() {\n return {\n push: (routerUrl: string) => {\n history.pushState({}, '', routerUrl);\n dispatchRemoteNavigate({ url: routerUrl, type: 'push' });\n },\n replace: (routerUrl: string) => {\n history.replaceState({}, '', routerUrl);\n dispatchRemoteNavigate({ url: routerUrl, type: 'replace' });\n },\n back: () => {\n history.back();\n },\n };\n },\n __esModule: true,\n })),\n 'next/dist/build/polyfills/process': () =>\n Promise.resolve({\n default: {\n env: {\n NODE_ENV: 'production',\n },\n },\n __esModule: true,\n }),\n } as Record<string, () => Promise<unknown>>;\n\n polyfill['next/navigation'] = polyfill[\n 'next/dist/client/components/navigation'\n ] as () => Promise<unknown>;\n polyfill['next/link'] = polyfill[\n 'next/dist/client/app-dir/link'\n ] as () => Promise<unknown>;\n polyfill['next/form'] = polyfill[\n 'next/dist/client/app-dir/form'\n ] as () => Promise<unknown>;\n polyfill['next/dist/esm/shared/lib/image-loader'] = polyfill[\n 'next/dist/shared/lib/image-loader'\n ] as () => Promise<unknown>;\n polyfill['next/script'] = polyfill[\n 'next/dist/client/script'\n ] as () => Promise<unknown>;\n\n return polyfill;\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,15 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
+ import {
3
+ REMOTE_NAVIGATE_EVENT
4
+ } from "#internal/host/shared/navigate-event";
2
5
  import { createRemoteImageLoader } from "#internal/host/shared/remote-image-loader";
3
6
  import { getNamespace } from "#internal/runtime/namespace";
4
7
  import { logWarn } from "#internal/utils/logger";
8
+ function dispatchRemoteNavigate(detail) {
9
+ window.dispatchEvent(
10
+ new CustomEvent(REMOTE_NAVIGATE_EVENT, { detail })
11
+ );
12
+ }
5
13
  function sharedPolyfills(shared, resolveClientUrl) {
6
14
  const hostShared = getNamespace().hostSharedModules;
7
15
  const polyfill = {
@@ -10,9 +18,11 @@ function sharedPolyfills(shared, resolveClientUrl) {
10
18
  return {
11
19
  push: (routerUrl) => {
12
20
  history.pushState({}, "", routerUrl);
21
+ dispatchRemoteNavigate({ url: routerUrl, type: "push" });
13
22
  },
14
23
  replace: (routerUrl) => {
15
24
  history.replaceState({}, "", routerUrl);
25
+ dispatchRemoteNavigate({ url: routerUrl, type: "replace" });
16
26
  },
17
27
  back: () => {
18
28
  history.back();
@@ -75,6 +85,10 @@ function sharedPolyfills(shared, resolveClientUrl) {
75
85
  } else {
76
86
  history.pushState({}, "", props.href);
77
87
  }
88
+ dispatchRemoteNavigate({
89
+ url: props.href,
90
+ type: replace ? "replace" : "push"
91
+ });
78
92
  },
79
93
  suppressHydrationWarning: true,
80
94
  children: children ?? null
@@ -114,9 +128,11 @@ function sharedPolyfills(shared, resolveClientUrl) {
114
128
  return {
115
129
  push: (routerUrl) => {
116
130
  history.pushState({}, "", routerUrl);
131
+ dispatchRemoteNavigate({ url: routerUrl, type: "push" });
117
132
  },
118
133
  replace: (routerUrl) => {
119
134
  history.replaceState({}, "", routerUrl);
135
+ dispatchRemoteNavigate({ url: routerUrl, type: "replace" });
120
136
  },
121
137
  back: () => {
122
138
  history.back();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/host/shared/polyfill.tsx"],"sourcesContent":["import type { LinkProps } from 'next/link';\nimport { createRemoteImageLoader } from '#internal/host/shared/remote-image-loader';\nimport { getNamespace } from '#internal/runtime/namespace';\nimport type { InternalResolveClientUrl } from '#internal/runtime/url/resolve-client-url';\nimport { logWarn } from '#internal/utils/logger';\n\n// polyfill Next.js App Router client API (minimal)\n// implementations are minimal and do not cover all use cases\n// developer can override these shared modules from configuration\nexport function sharedPolyfills(\n shared?: Record<string, () => Promise<unknown>>,\n resolveClientUrl?: InternalResolveClientUrl,\n) {\n const hostShared = getNamespace().hostSharedModules;\n const polyfill = {\n 'next/dist/client/components/navigation':\n hostShared['next/navigation'] ??\n shared?.['next/navigation'] ??\n (() =>\n Promise.resolve({\n useRouter() {\n return {\n push: (routerUrl: string) => {\n history.pushState({}, '', routerUrl);\n },\n replace: (routerUrl: string) => {\n history.replaceState({}, '', routerUrl);\n },\n back: () => {\n history.back();\n },\n };\n },\n usePathname() {\n return location.pathname;\n },\n useParams() {\n return {};\n },\n useSearchParams() {\n return new URLSearchParams(location.search);\n },\n useSelectedLayoutSegment() {\n return null;\n },\n useSelectedLayoutSegments() {\n return [];\n },\n __esModule: true,\n })),\n 'next/dist/client/app-dir/link':\n hostShared['next/link'] ??\n shared?.['next/link'] ??\n (() =>\n Promise.resolve({\n default: ({\n scroll: _,\n replace,\n prefetch,\n onNavigate,\n children,\n ...props\n }: React.PropsWithChildren<LinkProps>) => {\n if (prefetch) {\n logWarn(\n 'Polyfill',\n 'Next.js Link prefetch is not supported in remote components',\n );\n }\n return (\n <a\n {...props}\n href={props.href as string}\n onClick={(e) => {\n e.preventDefault();\n let preventDefaulted = false;\n e.preventDefault = () => {\n preventDefaulted = true;\n e.defaultPrevented = true;\n };\n if (typeof props.onClick === 'function') {\n props.onClick(e);\n }\n onNavigate?.(e);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (preventDefaulted) {\n return;\n }\n if (replace) {\n history.replaceState({}, '', props.href as string);\n } else {\n history.pushState({}, '', props.href as string);\n }\n }}\n suppressHydrationWarning\n >\n {children ?? null}\n </a>\n );\n },\n useLinkStatus() {\n return { pending: false };\n },\n __esModule: true,\n })),\n 'next/dist/client/app-dir/form':\n hostShared['next/form'] ??\n shared?.['next/form'] ??\n (() =>\n Promise.resolve({\n default: () => {\n // TODO: implement <Form> component for non-Next.js host applications\n throw new Error('Next.js <Form> component not implemented');\n },\n __esModule: true,\n })),\n // Instead of replacing next/image entirely, we let the real Next.js Image\n // component load from the remote bundle and only replace its default loader.\n // This gives us full next/image fidelity (fill, priority, srcSet, blur\n // placeholders, error handling) while routing image optimization through the\n // remote app's /_next/image endpoint.\n 'next/dist/shared/lib/image-loader':\n hostShared['next/dist/shared/lib/image-loader'] ??\n shared?.['next/dist/shared/lib/image-loader'] ??\n ((bundle: string) =>\n Promise.resolve({\n default: createRemoteImageLoader(bundle, resolveClientUrl),\n __esModule: true,\n })),\n 'next/dist/client/script':\n hostShared['next/script'] ??\n shared?.['next/script'] ??\n (() =>\n Promise.resolve({\n // TODO: implement <Script> component for non-Next.js host applications\n // do not throw an error for now\n default: () => null,\n __esModule: true,\n })),\n 'next/router':\n hostShared['next/router'] ??\n shared?.['next/router'] ??\n (() =>\n // TODO: incomplete implementation\n Promise.resolve({\n useRouter() {\n return {\n push: (routerUrl: string) => {\n history.pushState({}, '', routerUrl);\n },\n replace: (routerUrl: string) => {\n history.replaceState({}, '', routerUrl);\n },\n back: () => {\n history.back();\n },\n };\n },\n __esModule: true,\n })),\n 'next/dist/build/polyfills/process': () =>\n Promise.resolve({\n default: {\n env: {\n NODE_ENV: 'production',\n },\n },\n __esModule: true,\n }),\n } as Record<string, () => Promise<unknown>>;\n\n polyfill['next/navigation'] = polyfill[\n 'next/dist/client/components/navigation'\n ] as () => Promise<unknown>;\n polyfill['next/link'] = polyfill[\n 'next/dist/client/app-dir/link'\n ] as () => Promise<unknown>;\n polyfill['next/form'] = polyfill[\n 'next/dist/client/app-dir/form'\n ] as () => Promise<unknown>;\n polyfill['next/dist/esm/shared/lib/image-loader'] = polyfill[\n 'next/dist/shared/lib/image-loader'\n ] as () => Promise<unknown>;\n polyfill['next/script'] = polyfill[\n 'next/dist/client/script'\n ] as () => Promise<unknown>;\n\n return polyfill;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/host/shared/polyfill.tsx"],"sourcesContent":["import type { LinkProps } from 'next/link';\nimport {\n REMOTE_NAVIGATE_EVENT,\n type RemoteNavigateDetail,\n} from '#internal/host/shared/navigate-event';\nimport { createRemoteImageLoader } from '#internal/host/shared/remote-image-loader';\nimport { getNamespace } from '#internal/runtime/namespace';\nimport type { InternalResolveClientUrl } from '#internal/runtime/url/resolve-client-url';\nimport { logWarn } from '#internal/utils/logger';\n\nfunction dispatchRemoteNavigate(detail: RemoteNavigateDetail) {\n window.dispatchEvent(\n new CustomEvent<RemoteNavigateDetail>(REMOTE_NAVIGATE_EVENT, { detail }),\n );\n}\n\n// polyfill Next.js App Router client API (minimal)\n// implementations are minimal and do not cover all use cases\n// developer can override these shared modules from configuration\nexport function sharedPolyfills(\n shared?: Record<string, () => Promise<unknown>>,\n resolveClientUrl?: InternalResolveClientUrl,\n) {\n const hostShared = getNamespace().hostSharedModules;\n const polyfill = {\n 'next/dist/client/components/navigation':\n hostShared['next/navigation'] ??\n shared?.['next/navigation'] ??\n (() =>\n Promise.resolve({\n useRouter() {\n return {\n push: (routerUrl: string) => {\n history.pushState({}, '', routerUrl);\n dispatchRemoteNavigate({ url: routerUrl, type: 'push' });\n },\n replace: (routerUrl: string) => {\n history.replaceState({}, '', routerUrl);\n dispatchRemoteNavigate({ url: routerUrl, type: 'replace' });\n },\n back: () => {\n history.back();\n },\n };\n },\n usePathname() {\n return location.pathname;\n },\n useParams() {\n return {};\n },\n useSearchParams() {\n return new URLSearchParams(location.search);\n },\n useSelectedLayoutSegment() {\n return null;\n },\n useSelectedLayoutSegments() {\n return [];\n },\n __esModule: true,\n })),\n 'next/dist/client/app-dir/link':\n hostShared['next/link'] ??\n shared?.['next/link'] ??\n (() =>\n Promise.resolve({\n default: ({\n scroll: _,\n replace,\n prefetch,\n onNavigate,\n children,\n ...props\n }: React.PropsWithChildren<LinkProps>) => {\n if (prefetch) {\n logWarn(\n 'Polyfill',\n 'Next.js Link prefetch is not supported in remote components',\n );\n }\n return (\n <a\n {...props}\n href={props.href as string}\n onClick={(e) => {\n e.preventDefault();\n let preventDefaulted = false;\n e.preventDefault = () => {\n preventDefaulted = true;\n e.defaultPrevented = true;\n };\n if (typeof props.onClick === 'function') {\n props.onClick(e);\n }\n onNavigate?.(e);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (preventDefaulted) {\n return;\n }\n if (replace) {\n history.replaceState({}, '', props.href as string);\n } else {\n history.pushState({}, '', props.href as string);\n }\n dispatchRemoteNavigate({\n url: props.href as string,\n type: replace ? 'replace' : 'push',\n });\n }}\n suppressHydrationWarning\n >\n {children ?? null}\n </a>\n );\n },\n useLinkStatus() {\n return { pending: false };\n },\n __esModule: true,\n })),\n 'next/dist/client/app-dir/form':\n hostShared['next/form'] ??\n shared?.['next/form'] ??\n (() =>\n Promise.resolve({\n default: () => {\n // TODO: implement <Form> component for non-Next.js host applications\n throw new Error('Next.js <Form> component not implemented');\n },\n __esModule: true,\n })),\n // Instead of replacing next/image entirely, we let the real Next.js Image\n // component load from the remote bundle and only replace its default loader.\n // This gives us full next/image fidelity (fill, priority, srcSet, blur\n // placeholders, error handling) while routing image optimization through the\n // remote app's /_next/image endpoint.\n 'next/dist/shared/lib/image-loader':\n hostShared['next/dist/shared/lib/image-loader'] ??\n shared?.['next/dist/shared/lib/image-loader'] ??\n ((bundle: string) =>\n Promise.resolve({\n default: createRemoteImageLoader(bundle, resolveClientUrl),\n __esModule: true,\n })),\n 'next/dist/client/script':\n hostShared['next/script'] ??\n shared?.['next/script'] ??\n (() =>\n Promise.resolve({\n // TODO: implement <Script> component for non-Next.js host applications\n // do not throw an error for now\n default: () => null,\n __esModule: true,\n })),\n 'next/router':\n hostShared['next/router'] ??\n shared?.['next/router'] ??\n (() =>\n // TODO: incomplete implementation\n Promise.resolve({\n useRouter() {\n return {\n push: (routerUrl: string) => {\n history.pushState({}, '', routerUrl);\n dispatchRemoteNavigate({ url: routerUrl, type: 'push' });\n },\n replace: (routerUrl: string) => {\n history.replaceState({}, '', routerUrl);\n dispatchRemoteNavigate({ url: routerUrl, type: 'replace' });\n },\n back: () => {\n history.back();\n },\n };\n },\n __esModule: true,\n })),\n 'next/dist/build/polyfills/process': () =>\n Promise.resolve({\n default: {\n env: {\n NODE_ENV: 'production',\n },\n },\n __esModule: true,\n }),\n } as Record<string, () => Promise<unknown>>;\n\n polyfill['next/navigation'] = polyfill[\n 'next/dist/client/components/navigation'\n ] as () => Promise<unknown>;\n polyfill['next/link'] = polyfill[\n 'next/dist/client/app-dir/link'\n ] as () => Promise<unknown>;\n polyfill['next/form'] = polyfill[\n 'next/dist/client/app-dir/form'\n ] as () => Promise<unknown>;\n polyfill['next/dist/esm/shared/lib/image-loader'] = polyfill[\n 'next/dist/shared/lib/image-loader'\n ] as () => Promise<unknown>;\n polyfill['next/script'] = polyfill[\n 'next/dist/client/script'\n ] as () => Promise<unknown>;\n\n return polyfill;\n}\n"],"mappings":"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","names":[]}
@@ -34,7 +34,8 @@ async function loadScripts(scripts, resolveClientUrl) {
34
34
  script.src.replace(import_patterns.NEXT_BUNDLE_PATH_RE, "/_next/"),
35
35
  location.origin
36
36
  ).href;
37
- const resolvedSrc = resolveClientUrl?.(newSrc) ?? newSrc;
37
+ const rawResolved = resolveClientUrl?.(newSrc) ?? newSrc;
38
+ const resolvedSrc = new URL(rawResolved, location.href).href;
38
39
  const alreadyLoaded = Array.from(
39
40
  document.querySelectorAll("script[src]")
40
41
  ).some((s) => s.src === resolvedSrc);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/runtime/loaders/script-loader.ts"],"sourcesContent":["import type { InternalResolveClientUrl } from '#internal/host/server/types';\nimport { NEXT_BUNDLE_PATH_RE } from '#internal/runtime/patterns';\nimport { isProxiedUrl } from '#internal/runtime/url/protected-rc-fallback';\nimport {\n failedProxiedAssetError,\n RemoteComponentsError,\n} from '#internal/utils/error';\nimport { warnCrossOriginFetchError } from '#internal/utils/logger';\n\n/**\n * Loads external scripts for remote components\n */\nexport async function loadScripts(\n scripts: { src: string }[],\n resolveClientUrl?: InternalResolveClientUrl,\n): Promise<void> {\n await Promise.all(\n scripts.map((script) => {\n return new Promise<void>((resolve, reject) => {\n const newSrc = new URL(\n // remove the remote component bundle name identifier from the script src\n script.src.replace(NEXT_BUNDLE_PATH_RE, '/_next/'),\n location.origin,\n ).href;\n\n const resolvedSrc = resolveClientUrl?.(newSrc) ?? newSrc;\n\n const alreadyLoaded = Array.from(\n document.querySelectorAll<HTMLScriptElement>('script[src]'),\n ).some((s) => s.src === resolvedSrc);\n if (alreadyLoaded) {\n resolve();\n return;\n }\n\n const newScript = document.createElement('script');\n newScript.onload = () => resolve();\n newScript.onerror = () => {\n const isProxied = isProxiedUrl(resolvedSrc);\n if (isProxied) {\n reject(failedProxiedAssetError('script', newSrc, resolvedSrc));\n } else {\n warnCrossOriginFetchError('ScriptLoader', newSrc);\n reject(\n new RemoteComponentsError(\n `Failed to load <script src=\"${newSrc}\"> for Remote Component. Check the URL is correct.`,\n ),\n );\n }\n };\n newScript.src = resolvedSrc;\n newScript.async = true;\n document.head.appendChild(newScript);\n });\n }),\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,sBAAoC;AACpC,mCAA6B;AAC7B,mBAGO;AACP,oBAA0C;AAK1C,eAAsB,YACpB,SACA,kBACe;AACf,QAAM,QAAQ;AAAA,IACZ,QAAQ,IAAI,CAAC,WAAW;AACtB,aAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,cAAM,SAAS,IAAI;AAAA;AAAA,UAEjB,OAAO,IAAI,QAAQ,qCAAqB,SAAS;AAAA,UACjD,SAAS;AAAA,QACX,EAAE;AAEF,cAAM,cAAc,mBAAmB,MAAM,KAAK;AAElD,cAAM,gBAAgB,MAAM;AAAA,UAC1B,SAAS,iBAAoC,aAAa;AAAA,QAC5D,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,WAAW;AACnC,YAAI,eAAe;AACjB,kBAAQ;AACR;AAAA,QACF;AAEA,cAAM,YAAY,SAAS,cAAc,QAAQ;AACjD,kBAAU,SAAS,MAAM,QAAQ;AACjC,kBAAU,UAAU,MAAM;AACxB,gBAAM,gBAAY,2CAAa,WAAW;AAC1C,cAAI,WAAW;AACb,uBAAO,sCAAwB,UAAU,QAAQ,WAAW,CAAC;AAAA,UAC/D,OAAO;AACL,yDAA0B,gBAAgB,MAAM;AAChD;AAAA,cACE,IAAI;AAAA,gBACF,+BAA+B;AAAA,cACjC;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,kBAAU,MAAM;AAChB,kBAAU,QAAQ;AAClB,iBAAS,KAAK,YAAY,SAAS;AAAA,MACrC,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/runtime/loaders/script-loader.ts"],"sourcesContent":["import type { InternalResolveClientUrl } from '#internal/host/server/types';\nimport { NEXT_BUNDLE_PATH_RE } from '#internal/runtime/patterns';\nimport { isProxiedUrl } from '#internal/runtime/url/protected-rc-fallback';\nimport {\n failedProxiedAssetError,\n RemoteComponentsError,\n} from '#internal/utils/error';\nimport { warnCrossOriginFetchError } from '#internal/utils/logger';\n\n/**\n * Loads external scripts for remote components\n */\nexport async function loadScripts(\n scripts: { src: string }[],\n resolveClientUrl?: InternalResolveClientUrl,\n): Promise<void> {\n await Promise.all(\n scripts.map((script) => {\n return new Promise<void>((resolve, reject) => {\n const newSrc = new URL(\n // remove the remote component bundle name identifier from the script src\n script.src.replace(NEXT_BUNDLE_PATH_RE, '/_next/'),\n location.origin,\n ).href;\n\n // resolveClientUrl may return a relative URL (e.g. the host-proxy\n // path \"/rc-fetch-protected-remote?url=...\"). Normalize to absolute\n // before comparing with s.src, which browsers always expose as\n // absolute, so the deduplication check works in deployed contexts.\n const rawResolved = resolveClientUrl?.(newSrc) ?? newSrc;\n const resolvedSrc = new URL(rawResolved, location.href).href;\n\n const alreadyLoaded = Array.from(\n document.querySelectorAll<HTMLScriptElement>('script[src]'),\n ).some((s) => s.src === resolvedSrc);\n if (alreadyLoaded) {\n resolve();\n return;\n }\n\n const newScript = document.createElement('script');\n newScript.onload = () => resolve();\n newScript.onerror = () => {\n const isProxied = isProxiedUrl(resolvedSrc);\n if (isProxied) {\n reject(failedProxiedAssetError('script', newSrc, resolvedSrc));\n } else {\n warnCrossOriginFetchError('ScriptLoader', newSrc);\n reject(\n new RemoteComponentsError(\n `Failed to load <script src=\"${newSrc}\"> for Remote Component. Check the URL is correct.`,\n ),\n );\n }\n };\n newScript.src = resolvedSrc;\n newScript.async = true;\n document.head.appendChild(newScript);\n });\n }),\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,sBAAoC;AACpC,mCAA6B;AAC7B,mBAGO;AACP,oBAA0C;AAK1C,eAAsB,YACpB,SACA,kBACe;AACf,QAAM,QAAQ;AAAA,IACZ,QAAQ,IAAI,CAAC,WAAW;AACtB,aAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,cAAM,SAAS,IAAI;AAAA;AAAA,UAEjB,OAAO,IAAI,QAAQ,qCAAqB,SAAS;AAAA,UACjD,SAAS;AAAA,QACX,EAAE;AAMF,cAAM,cAAc,mBAAmB,MAAM,KAAK;AAClD,cAAM,cAAc,IAAI,IAAI,aAAa,SAAS,IAAI,EAAE;AAExD,cAAM,gBAAgB,MAAM;AAAA,UAC1B,SAAS,iBAAoC,aAAa;AAAA,QAC5D,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,WAAW;AACnC,YAAI,eAAe;AACjB,kBAAQ;AACR;AAAA,QACF;AAEA,cAAM,YAAY,SAAS,cAAc,QAAQ;AACjD,kBAAU,SAAS,MAAM,QAAQ;AACjC,kBAAU,UAAU,MAAM;AACxB,gBAAM,gBAAY,2CAAa,WAAW;AAC1C,cAAI,WAAW;AACb,uBAAO,sCAAwB,UAAU,QAAQ,WAAW,CAAC;AAAA,UAC/D,OAAO;AACL,yDAA0B,gBAAgB,MAAM;AAChD;AAAA,cACE,IAAI;AAAA,gBACF,+BAA+B;AAAA,cACjC;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,kBAAU,MAAM;AAChB,kBAAU,QAAQ;AAClB,iBAAS,KAAK,YAAY,SAAS;AAAA,MACrC,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -14,7 +14,8 @@ async function loadScripts(scripts, resolveClientUrl) {
14
14
  script.src.replace(NEXT_BUNDLE_PATH_RE, "/_next/"),
15
15
  location.origin
16
16
  ).href;
17
- const resolvedSrc = resolveClientUrl?.(newSrc) ?? newSrc;
17
+ const rawResolved = resolveClientUrl?.(newSrc) ?? newSrc;
18
+ const resolvedSrc = new URL(rawResolved, location.href).href;
18
19
  const alreadyLoaded = Array.from(
19
20
  document.querySelectorAll("script[src]")
20
21
  ).some((s) => s.src === resolvedSrc);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/runtime/loaders/script-loader.ts"],"sourcesContent":["import type { InternalResolveClientUrl } from '#internal/host/server/types';\nimport { NEXT_BUNDLE_PATH_RE } from '#internal/runtime/patterns';\nimport { isProxiedUrl } from '#internal/runtime/url/protected-rc-fallback';\nimport {\n failedProxiedAssetError,\n RemoteComponentsError,\n} from '#internal/utils/error';\nimport { warnCrossOriginFetchError } from '#internal/utils/logger';\n\n/**\n * Loads external scripts for remote components\n */\nexport async function loadScripts(\n scripts: { src: string }[],\n resolveClientUrl?: InternalResolveClientUrl,\n): Promise<void> {\n await Promise.all(\n scripts.map((script) => {\n return new Promise<void>((resolve, reject) => {\n const newSrc = new URL(\n // remove the remote component bundle name identifier from the script src\n script.src.replace(NEXT_BUNDLE_PATH_RE, '/_next/'),\n location.origin,\n ).href;\n\n const resolvedSrc = resolveClientUrl?.(newSrc) ?? newSrc;\n\n const alreadyLoaded = Array.from(\n document.querySelectorAll<HTMLScriptElement>('script[src]'),\n ).some((s) => s.src === resolvedSrc);\n if (alreadyLoaded) {\n resolve();\n return;\n }\n\n const newScript = document.createElement('script');\n newScript.onload = () => resolve();\n newScript.onerror = () => {\n const isProxied = isProxiedUrl(resolvedSrc);\n if (isProxied) {\n reject(failedProxiedAssetError('script', newSrc, resolvedSrc));\n } else {\n warnCrossOriginFetchError('ScriptLoader', newSrc);\n reject(\n new RemoteComponentsError(\n `Failed to load <script src=\"${newSrc}\"> for Remote Component. Check the URL is correct.`,\n ),\n );\n }\n };\n newScript.src = resolvedSrc;\n newScript.async = true;\n document.head.appendChild(newScript);\n });\n }),\n );\n}\n"],"mappings":"AACA,SAAS,2BAA2B;AACpC,SAAS,oBAAoB;AAC7B;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,iCAAiC;AAK1C,eAAsB,YACpB,SACA,kBACe;AACf,QAAM,QAAQ;AAAA,IACZ,QAAQ,IAAI,CAAC,WAAW;AACtB,aAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,cAAM,SAAS,IAAI;AAAA;AAAA,UAEjB,OAAO,IAAI,QAAQ,qBAAqB,SAAS;AAAA,UACjD,SAAS;AAAA,QACX,EAAE;AAEF,cAAM,cAAc,mBAAmB,MAAM,KAAK;AAElD,cAAM,gBAAgB,MAAM;AAAA,UAC1B,SAAS,iBAAoC,aAAa;AAAA,QAC5D,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,WAAW;AACnC,YAAI,eAAe;AACjB,kBAAQ;AACR;AAAA,QACF;AAEA,cAAM,YAAY,SAAS,cAAc,QAAQ;AACjD,kBAAU,SAAS,MAAM,QAAQ;AACjC,kBAAU,UAAU,MAAM;AACxB,gBAAM,YAAY,aAAa,WAAW;AAC1C,cAAI,WAAW;AACb,mBAAO,wBAAwB,UAAU,QAAQ,WAAW,CAAC;AAAA,UAC/D,OAAO;AACL,sCAA0B,gBAAgB,MAAM;AAChD;AAAA,cACE,IAAI;AAAA,gBACF,+BAA+B;AAAA,cACjC;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,kBAAU,MAAM;AAChB,kBAAU,QAAQ;AAClB,iBAAS,KAAK,YAAY,SAAS;AAAA,MACrC,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/runtime/loaders/script-loader.ts"],"sourcesContent":["import type { InternalResolveClientUrl } from '#internal/host/server/types';\nimport { NEXT_BUNDLE_PATH_RE } from '#internal/runtime/patterns';\nimport { isProxiedUrl } from '#internal/runtime/url/protected-rc-fallback';\nimport {\n failedProxiedAssetError,\n RemoteComponentsError,\n} from '#internal/utils/error';\nimport { warnCrossOriginFetchError } from '#internal/utils/logger';\n\n/**\n * Loads external scripts for remote components\n */\nexport async function loadScripts(\n scripts: { src: string }[],\n resolveClientUrl?: InternalResolveClientUrl,\n): Promise<void> {\n await Promise.all(\n scripts.map((script) => {\n return new Promise<void>((resolve, reject) => {\n const newSrc = new URL(\n // remove the remote component bundle name identifier from the script src\n script.src.replace(NEXT_BUNDLE_PATH_RE, '/_next/'),\n location.origin,\n ).href;\n\n // resolveClientUrl may return a relative URL (e.g. the host-proxy\n // path \"/rc-fetch-protected-remote?url=...\"). Normalize to absolute\n // before comparing with s.src, which browsers always expose as\n // absolute, so the deduplication check works in deployed contexts.\n const rawResolved = resolveClientUrl?.(newSrc) ?? newSrc;\n const resolvedSrc = new URL(rawResolved, location.href).href;\n\n const alreadyLoaded = Array.from(\n document.querySelectorAll<HTMLScriptElement>('script[src]'),\n ).some((s) => s.src === resolvedSrc);\n if (alreadyLoaded) {\n resolve();\n return;\n }\n\n const newScript = document.createElement('script');\n newScript.onload = () => resolve();\n newScript.onerror = () => {\n const isProxied = isProxiedUrl(resolvedSrc);\n if (isProxied) {\n reject(failedProxiedAssetError('script', newSrc, resolvedSrc));\n } else {\n warnCrossOriginFetchError('ScriptLoader', newSrc);\n reject(\n new RemoteComponentsError(\n `Failed to load <script src=\"${newSrc}\"> for Remote Component. Check the URL is correct.`,\n ),\n );\n }\n };\n newScript.src = resolvedSrc;\n newScript.async = true;\n document.head.appendChild(newScript);\n });\n }),\n );\n}\n"],"mappings":"AACA,SAAS,2BAA2B;AACpC,SAAS,oBAAoB;AAC7B;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,iCAAiC;AAK1C,eAAsB,YACpB,SACA,kBACe;AACf,QAAM,QAAQ;AAAA,IACZ,QAAQ,IAAI,CAAC,WAAW;AACtB,aAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,cAAM,SAAS,IAAI;AAAA;AAAA,UAEjB,OAAO,IAAI,QAAQ,qBAAqB,SAAS;AAAA,UACjD,SAAS;AAAA,QACX,EAAE;AAMF,cAAM,cAAc,mBAAmB,MAAM,KAAK;AAClD,cAAM,cAAc,IAAI,IAAI,aAAa,SAAS,IAAI,EAAE;AAExD,cAAM,gBAAgB,MAAM;AAAA,UAC1B,SAAS,iBAAoC,aAAa;AAAA,QAC5D,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,WAAW;AACnC,YAAI,eAAe;AACjB,kBAAQ;AACR;AAAA,QACF;AAEA,cAAM,YAAY,SAAS,cAAc,QAAQ;AACjD,kBAAU,SAAS,MAAM,QAAQ;AACjC,kBAAU,UAAU,MAAM;AACxB,gBAAM,YAAY,aAAa,WAAW;AAC1C,cAAI,WAAW;AACb,mBAAO,wBAAwB,UAAU,QAAQ,WAAW,CAAC;AAAA,UAC/D,OAAO;AACL,sCAA0B,gBAAgB,MAAM;AAChD;AAAA,cACE,IAAI;AAAA,gBACF,+BAA+B;AAAA,cACjC;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,kBAAU,MAAM;AAChB,kBAAU,QAAQ;AAClB,iBAAS,KAAK,YAAY,SAAS;AAAA,MACrC,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -0,0 +1,14 @@
1
+ /** Parsed navigation request surfaced to `onRemoteNavigate` / `useRemoteNavigate` callbacks. */
2
+ interface RemoteNavigateEvent {
3
+ /** Raw value from the remote; may be absolute or relative. */
4
+ url: string;
5
+ pathname: string;
6
+ /** Includes leading `?`, or `''` if none. */
7
+ search: string;
8
+ /** Includes leading `#`, or `''` if none. */
9
+ hash: string;
10
+ /** `'push'` / `'replace'` mirror the remote's history call. */
11
+ type: 'push' | 'replace';
12
+ }
13
+
14
+ export { RemoteNavigateEvent as R };
@@ -1,16 +1,17 @@
1
1
  import {
2
2
  initializeSharedModules,
3
3
  setupRemoteScope
4
- } from "./chunk-QKB74MLO.js";
4
+ } from "./chunk-N3KPUFOB.js";
5
5
  import {
6
6
  applySharedModules,
7
7
  nextClientPagesLoader
8
- } from "./chunk-52BJ7VFA.js";
8
+ } from "./chunk-MKO52FRO.js";
9
9
  import {
10
10
  buildCoreShared,
11
11
  buildHostShared
12
- } from "./chunk-SJM7AAGU.js";
12
+ } from "./chunk-SAGYPGIQ.js";
13
13
  import "./chunk-D5GNZB6O.js";
14
+ import "./chunk-STIJO4AG.js";
14
15
  import "./chunk-S2A4TFLS.js";
15
16
  import "./chunk-X6YKUJKH.js";
16
17
  import "./chunk-ENYGL5CO.js";
@@ -52,4 +53,4 @@ async function turbopackRuntime(url, bundle, shared, remoteShared, resolveClient
52
53
  export {
53
54
  turbopackRuntime
54
55
  };
55
- //# sourceMappingURL=turbopack-5LW6V6IT.js.map
56
+ //# sourceMappingURL=turbopack-DK6L7P3J.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/host/html/runtime/turbopack.ts"],"sourcesContent":["import { 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 {\n buildCoreShared,\n buildHostShared,\n} from '#internal/host/shared/shared-module-resolver';\nimport { setupRemoteScope } from '#internal/runtime/turbopack/remote-scope-setup';\nimport { initializeSharedModules } from '#internal/runtime/turbopack/shared-modules';\nimport type { MountUnmountFunctions, RSCKey } from '#internal/runtime/types';\n\n// initializer for the turbopack runtime to be able to access modules\n// required to run exposed client components of the remote component\nexport async function turbopackRuntime(\n url: URL,\n bundle?: string,\n shared?: Record<string, () => Promise<unknown>>,\n remoteShared?: Record<string, string>,\n resolveClientUrl?: InternalResolveClientUrl,\n) {\n // make a typed reference to the global scope\n const self = globalThis as typeof globalThis & {\n // webpack runtime globals\n __webpack_require__: (remoteId: string) => unknown;\n // webpack remote module loading function scoped for each bundle\n __remote_webpack_require__?: Record<\n string,\n ((remoteId: string) => unknown) & {\n m?: Record<string | number, (module: { exports: unknown }) => void>;\n }\n >;\n // webpack module map for each bundle used in production builds\n __remote_webpack_module_map__?: Record<string, Record<string, number>>;\n // conditional flag to disable webpack exec\n __DISABLE_WEBPACK_EXEC__: boolean;\n // webpack chunk loading function\n __webpack_chunk_load__: () => Promise<[]>;\n } & MountUnmountFunctions &\n Record<RSCKey, string[]>;\n\n const hostShared = buildHostShared(shared, resolveClientUrl, {\n includeRemoteComponentShared: true,\n });\n\n // Phase 1: Set up globals (__webpack_require__, __webpack_chunk_load__).\n // Called with empty scripts because we need the globals to exist before\n // importing react-server-dom-webpack. Shared module initialization is\n // deferred to preloadScripts where turbopack chunks are actually loaded.\n await setupRemoteScope('turbopack', [], url, bundle, resolveClientUrl);\n\n // we can only import react-server-dom-webpack after initializing the __webpack_require__ and __webpack_chunk_load__ functions\n const {\n default: { createFromReadableStream },\n } = await import('react-server-dom-webpack/client.browser');\n\n async function preloadScripts(scripts: HTMLScriptElement[], __: URL) {\n // Phase 2: Load turbopack chunks (scope is reused from phase 1).\n const scope = await setupRemoteScope(\n 'turbopack',\n scripts.map((script) => ({\n src:\n script.getAttribute('src') ||\n script.getAttribute('data-src') ||\n script.src,\n })),\n url,\n bundle,\n resolveClientUrl,\n );\n\n // Phase 3: Initialize shared modules now that turbopackModules is\n // populated. This uses the primary bundle-introspection path which\n // maps shared modules by numeric turbopack ID — unlike the fallback\n // path that uses file-path keys which can't match at runtime.\n await initializeSharedModules(\n scope,\n buildCoreShared(hostShared),\n remoteShared ?? {},\n );\n }\n\n return {\n self,\n createFromReadableStream,\n applySharedModules,\n nextClientPagesLoader,\n preloadScripts,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAaA,eAAsB,iBACpB,KACA,QACA,QACA,cACA,kBACA;AAEA,QAAM,OAAO;AAmBb,QAAM,aAAa,gBAAgB,QAAQ,kBAAkB;AAAA,IAC3D,8BAA8B;AAAA,EAChC,CAAC;AAMD,QAAM,iBAAiB,aAAa,CAAC,GAAG,KAAK,QAAQ,gBAAgB;AAGrE,QAAM;AAAA,IACJ,SAAS,EAAE,yBAAyB;AAAA,EACtC,IAAI,MAAM,OAAO,yCAAyC;AAE1D,iBAAe,eAAe,SAA8B,IAAS;AAEnE,UAAM,QAAQ,MAAM;AAAA,MAClB;AAAA,MACA,QAAQ,IAAI,CAAC,YAAY;AAAA,QACvB,KACE,OAAO,aAAa,KAAK,KACzB,OAAO,aAAa,UAAU,KAC9B,OAAO;AAAA,MACX,EAAE;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAMA,UAAM;AAAA,MACJ;AAAA,MACA,gBAAgB,UAAU;AAAA,MAC1B,gBAAgB,CAAC;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/host/html/runtime/turbopack.ts"],"sourcesContent":["import { 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 {\n buildCoreShared,\n buildHostShared,\n} from '#internal/host/shared/shared-module-resolver';\nimport { setupRemoteScope } from '#internal/runtime/turbopack/remote-scope-setup';\nimport { initializeSharedModules } from '#internal/runtime/turbopack/shared-modules';\nimport type { MountUnmountFunctions, RSCKey } from '#internal/runtime/types';\n\n// initializer for the turbopack runtime to be able to access modules\n// required to run exposed client components of the remote component\nexport async function turbopackRuntime(\n url: URL,\n bundle?: string,\n shared?: Record<string, () => Promise<unknown>>,\n remoteShared?: Record<string, string>,\n resolveClientUrl?: InternalResolveClientUrl,\n) {\n // make a typed reference to the global scope\n const self = globalThis as typeof globalThis & {\n // webpack runtime globals\n __webpack_require__: (remoteId: string) => unknown;\n // webpack remote module loading function scoped for each bundle\n __remote_webpack_require__?: Record<\n string,\n ((remoteId: string) => unknown) & {\n m?: Record<string | number, (module: { exports: unknown }) => void>;\n }\n >;\n // webpack module map for each bundle used in production builds\n __remote_webpack_module_map__?: Record<string, Record<string, number>>;\n // conditional flag to disable webpack exec\n __DISABLE_WEBPACK_EXEC__: boolean;\n // webpack chunk loading function\n __webpack_chunk_load__: () => Promise<[]>;\n } & MountUnmountFunctions &\n Record<RSCKey, string[]>;\n\n const hostShared = buildHostShared(shared, resolveClientUrl, {\n includeRemoteComponentShared: true,\n });\n\n // Phase 1: Set up globals (__webpack_require__, __webpack_chunk_load__).\n // Called with empty scripts because we need the globals to exist before\n // importing react-server-dom-webpack. Shared module initialization is\n // deferred to preloadScripts where turbopack chunks are actually loaded.\n await setupRemoteScope('turbopack', [], url, bundle, resolveClientUrl);\n\n // we can only import react-server-dom-webpack after initializing the __webpack_require__ and __webpack_chunk_load__ functions\n const {\n default: { createFromReadableStream },\n } = await import('react-server-dom-webpack/client.browser');\n\n async function preloadScripts(scripts: HTMLScriptElement[], __: URL) {\n // Phase 2: Load turbopack chunks (scope is reused from phase 1).\n const scope = await setupRemoteScope(\n 'turbopack',\n scripts.map((script) => ({\n src:\n script.getAttribute('src') ||\n script.getAttribute('data-src') ||\n script.src,\n })),\n url,\n bundle,\n resolveClientUrl,\n );\n\n // Phase 3: Initialize shared modules now that turbopackModules is\n // populated. This uses the primary bundle-introspection path which\n // maps shared modules by numeric turbopack ID — unlike the fallback\n // path that uses file-path keys which can't match at runtime.\n await initializeSharedModules(\n scope,\n buildCoreShared(hostShared),\n remoteShared ?? {},\n );\n }\n\n return {\n self,\n createFromReadableStream,\n applySharedModules,\n nextClientPagesLoader,\n preloadScripts,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAaA,eAAsB,iBACpB,KACA,QACA,QACA,cACA,kBACA;AAEA,QAAM,OAAO;AAmBb,QAAM,aAAa,gBAAgB,QAAQ,kBAAkB;AAAA,IAC3D,8BAA8B;AAAA,EAChC,CAAC;AAMD,QAAM,iBAAiB,aAAa,CAAC,GAAG,KAAK,QAAQ,gBAAgB;AAGrE,QAAM;AAAA,IACJ,SAAS,EAAE,yBAAyB;AAAA,EACtC,IAAI,MAAM,OAAO,yCAAyC;AAE1D,iBAAe,eAAe,SAA8B,IAAS;AAEnE,UAAM,QAAQ,MAAM;AAAA,MAClB;AAAA,MACA,QAAQ,IAAI,CAAC,YAAY;AAAA,QACvB,KACE,OAAO,aAAa,KAAK,KACzB,OAAO,aAAa,UAAU,KAC9B,OAAO;AAAA,MACX,EAAE;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAMA,UAAM;AAAA,MACJ;AAAA,MACA,gBAAgB,UAAU;AAAA,MAC1B,gBAAgB,CAAC;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
@@ -1,16 +1,17 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
2
2
 
3
3
 
4
- var _chunkRJW3EZJPcjs = require('./chunk-RJW3EZJP.cjs');
4
+ var _chunkEYALF655cjs = require('./chunk-EYALF655.cjs');
5
5
 
6
6
 
7
7
 
8
- var _chunkT64P7BAGcjs = require('./chunk-T64P7BAG.cjs');
8
+ var _chunkJJTCFQHEcjs = require('./chunk-JJTCFQHE.cjs');
9
9
 
10
10
 
11
11
 
12
- var _chunkX6W464D6cjs = require('./chunk-X6W464D6.cjs');
12
+ var _chunkRLI4YTBJcjs = require('./chunk-RLI4YTBJ.cjs');
13
13
  require('./chunk-Z2SLBFQL.cjs');
14
+ require('./chunk-5KTAEO52.cjs');
14
15
  require('./chunk-RUWR74XQ.cjs');
15
16
  require('./chunk-KE7QPAQ4.cjs');
16
17
  require('./chunk-SHFJ5OQA.cjs');
@@ -18,15 +19,15 @@ require('./chunk-SHFJ5OQA.cjs');
18
19
  // src/host/html/runtime/turbopack.ts
19
20
  async function turbopackRuntime(url, bundle, shared, remoteShared, resolveClientUrl) {
20
21
  const self = globalThis;
21
- const hostShared = _chunkX6W464D6cjs.buildHostShared.call(void 0, shared, resolveClientUrl, {
22
+ const hostShared = _chunkRLI4YTBJcjs.buildHostShared.call(void 0, shared, resolveClientUrl, {
22
23
  includeRemoteComponentShared: true
23
24
  });
24
- await _chunkRJW3EZJPcjs.setupRemoteScope.call(void 0, "turbopack", [], url, bundle, resolveClientUrl);
25
+ await _chunkEYALF655cjs.setupRemoteScope.call(void 0, "turbopack", [], url, bundle, resolveClientUrl);
25
26
  const {
26
27
  default: { createFromReadableStream }
27
28
  } = await Promise.resolve().then(() => _interopRequireWildcard(require("react-server-dom-webpack/client.browser")));
28
29
  async function preloadScripts(scripts, __) {
29
- const scope = await _chunkRJW3EZJPcjs.setupRemoteScope.call(void 0,
30
+ const scope = await _chunkEYALF655cjs.setupRemoteScope.call(void 0,
30
31
  "turbopack",
31
32
  scripts.map((script) => ({
32
33
  src: script.getAttribute("src") || script.getAttribute("data-src") || script.src
@@ -35,21 +36,21 @@ async function turbopackRuntime(url, bundle, shared, remoteShared, resolveClient
35
36
  bundle,
36
37
  resolveClientUrl
37
38
  );
38
- await _chunkRJW3EZJPcjs.initializeSharedModules.call(void 0,
39
+ await _chunkEYALF655cjs.initializeSharedModules.call(void 0,
39
40
  scope,
40
- _chunkX6W464D6cjs.buildCoreShared.call(void 0, hostShared),
41
+ _chunkRLI4YTBJcjs.buildCoreShared.call(void 0, hostShared),
41
42
  _nullishCoalesce(remoteShared, () => ( {}))
42
43
  );
43
44
  }
44
45
  return {
45
46
  self,
46
47
  createFromReadableStream,
47
- applySharedModules: _chunkT64P7BAGcjs.applySharedModules,
48
- nextClientPagesLoader: _chunkT64P7BAGcjs.nextClientPagesLoader,
48
+ applySharedModules: _chunkJJTCFQHEcjs.applySharedModules,
49
+ nextClientPagesLoader: _chunkJJTCFQHEcjs.nextClientPagesLoader,
49
50
  preloadScripts
50
51
  };
51
52
  }
52
53
 
53
54
 
54
55
  exports.turbopackRuntime = turbopackRuntime;
55
- //# sourceMappingURL=turbopack-KRKECGY2.cjs.map
56
+ //# sourceMappingURL=turbopack-PSD4THQE.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/host/html/runtime/turbopack.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAaA,eAAsB,iBACpB,KACA,QACA,QACA,cACA,kBACA;AAEA,QAAM,OAAO;AAmBb,QAAM,aAAa,gBAAgB,QAAQ,kBAAkB;AAAA,IAC3D,8BAA8B;AAAA,EAChC,CAAC;AAMD,QAAM,iBAAiB,aAAa,CAAC,GAAG,KAAK,QAAQ,gBAAgB;AAGrE,QAAM;AAAA,IACJ,SAAS,EAAE,yBAAyB;AAAA,EACtC,IAAI,MAAM,OAAO,yCAAyC;AAE1D,iBAAe,eAAe,SAA8B,IAAS;AAEnE,UAAM,QAAQ,MAAM;AAAA,MAClB;AAAA,MACA,QAAQ,IAAI,CAAC,YAAY;AAAA,QACvB,KACE,OAAO,aAAa,KAAK,KACzB,OAAO,aAAa,UAAU,KAC9B,OAAO;AAAA,MACX,EAAE;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAMA,UAAM;AAAA,MACJ;AAAA,MACA,gBAAgB,UAAU;AAAA,MAC1B,gBAAgB,CAAC;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF","sourcesContent":["import { 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 {\n buildCoreShared,\n buildHostShared,\n} from '#internal/host/shared/shared-module-resolver';\nimport { setupRemoteScope } from '#internal/runtime/turbopack/remote-scope-setup';\nimport { initializeSharedModules } from '#internal/runtime/turbopack/shared-modules';\nimport type { MountUnmountFunctions, RSCKey } from '#internal/runtime/types';\n\n// initializer for the turbopack runtime to be able to access modules\n// required to run exposed client components of the remote component\nexport async function turbopackRuntime(\n url: URL,\n bundle?: string,\n shared?: Record<string, () => Promise<unknown>>,\n remoteShared?: Record<string, string>,\n resolveClientUrl?: InternalResolveClientUrl,\n) {\n // make a typed reference to the global scope\n const self = globalThis as typeof globalThis & {\n // webpack runtime globals\n __webpack_require__: (remoteId: string) => unknown;\n // webpack remote module loading function scoped for each bundle\n __remote_webpack_require__?: Record<\n string,\n ((remoteId: string) => unknown) & {\n m?: Record<string | number, (module: { exports: unknown }) => void>;\n }\n >;\n // webpack module map for each bundle used in production builds\n __remote_webpack_module_map__?: Record<string, Record<string, number>>;\n // conditional flag to disable webpack exec\n __DISABLE_WEBPACK_EXEC__: boolean;\n // webpack chunk loading function\n __webpack_chunk_load__: () => Promise<[]>;\n } & MountUnmountFunctions &\n Record<RSCKey, string[]>;\n\n const hostShared = buildHostShared(shared, resolveClientUrl, {\n includeRemoteComponentShared: true,\n });\n\n // Phase 1: Set up globals (__webpack_require__, __webpack_chunk_load__).\n // Called with empty scripts because we need the globals to exist before\n // importing react-server-dom-webpack. Shared module initialization is\n // deferred to preloadScripts where turbopack chunks are actually loaded.\n await setupRemoteScope('turbopack', [], url, bundle, resolveClientUrl);\n\n // we can only import react-server-dom-webpack after initializing the __webpack_require__ and __webpack_chunk_load__ functions\n const {\n default: { createFromReadableStream },\n } = await import('react-server-dom-webpack/client.browser');\n\n async function preloadScripts(scripts: HTMLScriptElement[], __: URL) {\n // Phase 2: Load turbopack chunks (scope is reused from phase 1).\n const scope = await setupRemoteScope(\n 'turbopack',\n scripts.map((script) => ({\n src:\n script.getAttribute('src') ||\n script.getAttribute('data-src') ||\n script.src,\n })),\n url,\n bundle,\n resolveClientUrl,\n );\n\n // Phase 3: Initialize shared modules now that turbopackModules is\n // populated. This uses the primary bundle-introspection path which\n // maps shared modules by numeric turbopack ID — unlike the fallback\n // path that uses file-path keys which can't match at runtime.\n await initializeSharedModules(\n scope,\n buildCoreShared(hostShared),\n remoteShared ?? {},\n );\n }\n\n return {\n self,\n createFromReadableStream,\n applySharedModules,\n nextClientPagesLoader,\n preloadScripts,\n };\n}\n"]}