remote-components 0.3.0 → 0.3.2

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 (105) hide show
  1. package/dist/config/nextjs.cjs.map +1 -1
  2. package/dist/config/nextjs.js.map +1 -1
  3. package/dist/host/html.cjs +467 -395
  4. package/dist/host/html.cjs.map +1 -1
  5. package/dist/host/html.js +467 -395
  6. package/dist/host/html.js.map +1 -1
  7. package/dist/host/nextjs/app/client-only.cjs +507 -447
  8. package/dist/host/nextjs/app/client-only.cjs.map +1 -1
  9. package/dist/host/nextjs/app/client-only.js +515 -455
  10. package/dist/host/nextjs/app/client-only.js.map +1 -1
  11. package/dist/host/nextjs/app.cjs +5 -6
  12. package/dist/host/nextjs/app.cjs.map +1 -1
  13. package/dist/host/nextjs/app.js +5 -6
  14. package/dist/host/nextjs/app.js.map +1 -1
  15. package/dist/host/nextjs/pages.cjs +6 -11
  16. package/dist/host/nextjs/pages.cjs.map +1 -1
  17. package/dist/host/nextjs/pages.js +9 -11
  18. package/dist/host/nextjs/pages.js.map +1 -1
  19. package/dist/host/react.cjs +435 -374
  20. package/dist/host/react.cjs.map +1 -1
  21. package/dist/host/react.js +435 -374
  22. package/dist/host/react.js.map +1 -1
  23. package/dist/internal/host/nextjs/dom-flight.cjs +16 -7
  24. package/dist/internal/host/nextjs/dom-flight.cjs.map +1 -1
  25. package/dist/internal/host/nextjs/dom-flight.d.ts +2 -2
  26. package/dist/internal/host/nextjs/dom-flight.js +16 -7
  27. package/dist/internal/host/nextjs/dom-flight.js.map +1 -1
  28. package/dist/internal/host/nextjs/image-shared.cjs +2 -2
  29. package/dist/internal/host/nextjs/image-shared.cjs.map +1 -1
  30. package/dist/internal/host/nextjs/image-shared.js +2 -2
  31. package/dist/internal/host/nextjs/image-shared.js.map +1 -1
  32. package/dist/internal/host/server/fetch-remote-component.cjs +183 -149
  33. package/dist/internal/host/server/fetch-remote-component.cjs.map +1 -1
  34. package/dist/internal/host/server/fetch-remote-component.js +185 -149
  35. package/dist/internal/host/server/fetch-remote-component.js.map +1 -1
  36. package/dist/internal/host/shared/remote-image-loader.cjs +2 -5
  37. package/dist/internal/host/shared/remote-image-loader.cjs.map +1 -1
  38. package/dist/internal/host/shared/remote-image-loader.js +2 -5
  39. package/dist/internal/host/shared/remote-image-loader.js.map +1 -1
  40. package/dist/internal/runtime/constants.cjs +6 -6
  41. package/dist/internal/runtime/constants.cjs.map +1 -1
  42. package/dist/internal/runtime/constants.d.ts +3 -3
  43. package/dist/internal/runtime/constants.js +4 -4
  44. package/dist/internal/runtime/constants.js.map +1 -1
  45. package/dist/internal/runtime/html/parse-remote-html.cjs +11 -15
  46. package/dist/internal/runtime/html/parse-remote-html.cjs.map +1 -1
  47. package/dist/internal/runtime/html/parse-remote-html.d.ts +2 -12
  48. package/dist/internal/runtime/html/parse-remote-html.js +17 -15
  49. package/dist/internal/runtime/html/parse-remote-html.js.map +1 -1
  50. package/dist/internal/runtime/loaders/script-loader.cjs +2 -2
  51. package/dist/internal/runtime/loaders/script-loader.cjs.map +1 -1
  52. package/dist/internal/runtime/loaders/script-loader.js +1 -1
  53. package/dist/internal/runtime/loaders/script-loader.js.map +1 -1
  54. package/dist/internal/runtime/metadata.cjs +42 -0
  55. package/dist/internal/runtime/metadata.cjs.map +1 -1
  56. package/dist/internal/runtime/metadata.d.ts +21 -1
  57. package/dist/internal/runtime/metadata.js +38 -0
  58. package/dist/internal/runtime/metadata.js.map +1 -1
  59. package/dist/internal/runtime/patterns.cjs +38 -0
  60. package/dist/internal/runtime/patterns.cjs.map +1 -0
  61. package/dist/internal/runtime/patterns.d.ts +5 -0
  62. package/dist/internal/runtime/patterns.js +12 -0
  63. package/dist/internal/runtime/patterns.js.map +1 -0
  64. package/dist/internal/runtime/turbopack/chunk-loader.cjs +79 -128
  65. package/dist/internal/runtime/turbopack/chunk-loader.cjs.map +1 -1
  66. package/dist/internal/runtime/turbopack/chunk-loader.d.ts +22 -7
  67. package/dist/internal/runtime/turbopack/chunk-loader.js +85 -131
  68. package/dist/internal/runtime/turbopack/chunk-loader.js.map +1 -1
  69. package/dist/internal/runtime/turbopack/module.cjs +56 -57
  70. package/dist/internal/runtime/turbopack/module.cjs.map +1 -1
  71. package/dist/internal/runtime/turbopack/module.d.ts +14 -11
  72. package/dist/internal/runtime/turbopack/module.js +54 -56
  73. package/dist/internal/runtime/turbopack/module.js.map +1 -1
  74. package/dist/internal/runtime/turbopack/remote-scope.cjs +101 -0
  75. package/dist/internal/runtime/turbopack/remote-scope.cjs.map +1 -0
  76. package/dist/internal/runtime/turbopack/remote-scope.d.ts +55 -0
  77. package/dist/internal/runtime/turbopack/remote-scope.js +73 -0
  78. package/dist/internal/runtime/turbopack/remote-scope.js.map +1 -0
  79. package/dist/internal/runtime/turbopack/shared-modules.cjs +62 -56
  80. package/dist/internal/runtime/turbopack/shared-modules.cjs.map +1 -1
  81. package/dist/internal/runtime/turbopack/shared-modules.d.ts +7 -3
  82. package/dist/internal/runtime/turbopack/shared-modules.js +63 -57
  83. package/dist/internal/runtime/turbopack/shared-modules.js.map +1 -1
  84. package/dist/internal/runtime/turbopack/webpack-runtime.cjs +50 -31
  85. package/dist/internal/runtime/turbopack/webpack-runtime.cjs.map +1 -1
  86. package/dist/internal/runtime/turbopack/webpack-runtime.d.ts +5 -2
  87. package/dist/internal/runtime/turbopack/webpack-runtime.js +52 -34
  88. package/dist/internal/runtime/turbopack/webpack-runtime.js.map +1 -1
  89. package/dist/internal/runtime/types.cjs.map +1 -1
  90. package/dist/internal/runtime/types.d.ts +4 -3
  91. package/dist/internal/utils/logger.cjs.map +1 -1
  92. package/dist/internal/utils/logger.d.ts +1 -1
  93. package/dist/internal/utils/logger.js.map +1 -1
  94. package/dist/internal/utils.cjs +5 -0
  95. package/dist/internal/utils.cjs.map +1 -1
  96. package/dist/internal/utils.d.ts +15 -1
  97. package/dist/internal/utils.js +4 -0
  98. package/dist/internal/utils.js.map +1 -1
  99. package/dist/remote/html.cjs.map +1 -1
  100. package/dist/remote/html.js.map +1 -1
  101. package/dist/remote/nextjs/app.cjs +2 -1
  102. package/dist/remote/nextjs/app.cjs.map +1 -1
  103. package/dist/remote/nextjs/app.js +2 -1
  104. package/dist/remote/nextjs/app.js.map +1 -1
  105. package/package.json +1 -1
@@ -1,71 +1,54 @@
1
- import {
2
- getBundleKey,
3
- REMOTE_COMPONENT_REGEX,
4
- RUNTIME_WEBPACK
5
- } from "#internal/runtime/constants";
1
+ import { RUNTIME_WEBPACK } from "#internal/runtime/constants";
2
+ import { collapseDoubleSlashes } from "#internal/runtime/patterns";
6
3
  import { isProxiedUrl } from "#internal/runtime/url/protected-rc-fallback";
7
4
  import {
8
5
  failedProxiedAssetError,
9
6
  RemoteComponentsError
10
7
  } from "#internal/utils/error";
11
- import { logDebug, warnCrossOriginFetchError } from "#internal/utils/logger";
8
+ import {
9
+ logDebug,
10
+ logWarn,
11
+ warnCrossOriginFetchError
12
+ } from "#internal/utils/logger";
12
13
  import { TURBOPACK_GLOBAL_RE } from "./patterns";
13
- function createChunkLoader(runtime, resolveClientUrl) {
14
- return function __turbopack_chunk_load__(chunkId, scriptBundle) {
15
- logDebug("ChunkLoader", `Loading chunk: "${chunkId}"`);
16
- const self = globalThis;
17
- const {
18
- bundle,
19
- id: path,
20
- prefix
21
- } = REMOTE_COMPONENT_REGEX.exec(chunkId)?.groups ?? {
22
- bundle: scriptBundle ?? "",
23
- id: chunkId
24
- };
25
- logDebug(
26
- "ChunkLoader",
27
- `Parsed chunk - bundle: "${bundle}", path: "${path}", prefix: "${prefix}"`
28
- );
29
- const remoteRuntime = self.__remote_webpack_require__?.[bundle ?? "default"] ? self.__remote_webpack_require__[bundle ?? "default"]?.type || "webpack" : runtime;
30
- logDebug("ChunkLoader", `Remote runtime: "${remoteRuntime}"`);
31
- if (remoteRuntime === RUNTIME_WEBPACK) {
32
- logDebug("ChunkLoader", "Skipping chunk load - webpack runtime detected");
33
- return Promise.resolve(void 0);
34
- }
35
- const url = new URL(
36
- path ? `${prefix ?? ""}${path}`.replace(
37
- /(?<char>[^:])(?<double>\/\/)/g,
38
- "$1/"
39
- ) : "/",
40
- self.__remote_bundle_url__?.[bundle ?? "default"] ?? new URL(location.origin)
41
- ).href;
42
- if (url.endsWith(".css")) {
43
- logDebug("ChunkLoader", `Skipping CSS file: "${url}"`);
44
- return;
45
- }
46
- if (!self.__remote_components_turbopack_chunk_loader_promise__) {
47
- self.__remote_components_turbopack_chunk_loader_promise__ = {};
48
- }
49
- if (self.__remote_components_turbopack_chunk_loader_promise__[url]) {
50
- logDebug("ChunkLoader", `Returning cached promise for: "${url}"`);
51
- return self.__remote_components_turbopack_chunk_loader_promise__[url];
52
- }
53
- const resolvedUrl = resolveClientUrl?.(url) ?? url;
54
- logDebug("ChunkLoader", `Fetching chunk from: "${resolvedUrl}"`);
55
- self.__remote_components_turbopack_chunk_loader_promise__[url] = new Promise((resolve, reject) => {
14
+ import {
15
+ formatRemoteId,
16
+ getScope,
17
+ parseRemoteId
18
+ } from "./remote-scope";
19
+ function loadChunkWithScope(scope, chunkId) {
20
+ logDebug(
21
+ "ChunkLoader",
22
+ `loadChunkWithScope: "${chunkId}" (scope: "${scope.scopedName}")`
23
+ );
24
+ const self = globalThis;
25
+ const { bundle, path, prefix } = parseRemoteId(chunkId);
26
+ const remoteRuntime = self.__remote_webpack_require__?.[bundle ?? "default"] ? self.__remote_webpack_require__[bundle ?? "default"]?.type || "webpack" : scope.runtime;
27
+ if (remoteRuntime === RUNTIME_WEBPACK) {
28
+ return Promise.resolve(void 0);
29
+ }
30
+ const rawPath = path ? collapseDoubleSlashes(`${prefix}${path}`) : "/";
31
+ const url = new URL(rawPath, scope.url).href;
32
+ if (url.endsWith(".css")) {
33
+ return;
34
+ }
35
+ if (!self.__remote_components_turbopack_chunk_loader_promise__) {
36
+ self.__remote_components_turbopack_chunk_loader_promise__ = {};
37
+ }
38
+ if (self.__remote_components_turbopack_chunk_loader_promise__[url]) {
39
+ return self.__remote_components_turbopack_chunk_loader_promise__[url];
40
+ }
41
+ const resolvedUrl = scope.resolveClientUrl?.(url) ?? url;
42
+ if (resolvedUrl !== url) {
43
+ logDebug("ChunkLoader", `Proxied chunk URL: "${url}" \u2192 "${resolvedUrl}"`);
44
+ }
45
+ self.__remote_components_turbopack_chunk_loader_promise__[url] = new Promise(
46
+ (resolve, reject) => {
56
47
  fetch(resolvedUrl).then((res) => res.text()).then((code) => {
57
48
  const hasTurbopack = TURBOPACK_GLOBAL_RE.test(code);
58
49
  if (hasTurbopack) {
59
- return handleTurbopackChunk(code, bundle ?? "", url);
50
+ return handleTurbopackChunk(code, scope, url);
60
51
  }
61
- logDebug(
62
- "ChunkLoader",
63
- `Chunk does not contain globalThis.TURBOPACK or self.TURBOPACK: "${url}"`
64
- );
65
- logDebug(
66
- "ChunkLoader",
67
- `First 500 chars of chunk: ${code.slice(0, 500)}`
68
- );
69
52
  }).then(resolve).catch((error) => {
70
53
  const isProxied = isProxiedUrl(resolvedUrl);
71
54
  if (isProxied) {
@@ -75,17 +58,29 @@ function createChunkLoader(runtime, resolveClientUrl) {
75
58
  reject(error);
76
59
  }
77
60
  });
78
- });
79
- return self.__remote_components_turbopack_chunk_loader_promise__[url];
61
+ }
62
+ );
63
+ return self.__remote_components_turbopack_chunk_loader_promise__[url];
64
+ }
65
+ function createChunkDispatcher() {
66
+ return function __chunk_dispatcher__(chunkId, scriptBundle) {
67
+ logDebug("ChunkDispatcher", `Dispatching chunk: "${chunkId}"`);
68
+ const { bundle } = parseRemoteId(chunkId);
69
+ const bundleName = bundle || scriptBundle || "default";
70
+ const scope = getScope(bundleName);
71
+ logDebug(
72
+ "ChunkDispatcher",
73
+ `Scope resolution: bundle="${bundleName}", scope=${scope?.scopedName ?? "null"}`
74
+ );
75
+ if (!scope) {
76
+ logWarn("ChunkDispatcher", `No scope found for bundle "${bundleName}"`);
77
+ return Promise.resolve(void 0);
78
+ }
79
+ return loadChunkWithScope(scope, chunkId);
80
80
  };
81
81
  }
82
- async function handleTurbopackChunk(code, bundle, url) {
83
- logDebug(
84
- "ChunkLoader",
85
- `Handling Turbopack chunk - bundle: "${bundle}", url: "${url}"`
86
- );
82
+ async function handleTurbopackChunk(code, scope, url) {
87
83
  if (/importScripts\(\.\.\.self.TURBOPACK_NEXT_CHUNK_URLS/.test(code)) {
88
- logDebug("ChunkLoader", `Skipping worker chunk: "${url}"`);
89
84
  const preloadLinks = document.querySelectorAll(
90
85
  `link[rel="preload"][href="${new URL(url).pathname}"]`
91
86
  );
@@ -93,58 +88,41 @@ async function handleTurbopackChunk(code, bundle, url) {
93
88
  return;
94
89
  }
95
90
  const self = globalThis;
96
- const bundleKey = getBundleKey(bundle);
97
- logDebug("ChunkLoader", `Bundle key: "${bundleKey}"`);
91
+ const { globalKey } = scope;
98
92
  const transformedCode = code.replace(
99
93
  /globalThis\[\s*["']TURBOPACK["']\s*\]/g,
100
- `globalThis["TURBOPACK_${bundleKey}"]`
94
+ `globalThis["TURBOPACK_${globalKey}"]`
101
95
  ).replace(
102
96
  /self\[\s*["']TURBOPACK["']\s*\]/g,
103
- `self["TURBOPACK_${bundleKey}"]`
104
- ).replace(/globalThis\.TURBOPACK/g, `globalThis.TURBOPACK_${bundleKey}`).replace(/self\.TURBOPACK(?!_)/g, `self.TURBOPACK_${bundleKey}`).replace(
97
+ `self["TURBOPACK_${globalKey}"]`
98
+ ).replace(/globalThis\.TURBOPACK/g, `globalThis.TURBOPACK_${globalKey}`).replace(/self\.TURBOPACK(?!_)/g, `self.TURBOPACK_${globalKey}`).replace(
105
99
  /TURBOPACK_WORKER_LOCATION/g,
106
- `TURBOPACK_WORKER_LOCATION_${bundleKey}`
100
+ `TURBOPACK_WORKER_LOCATION_${globalKey}`
107
101
  ).replace(
108
102
  /TURBOPACK_NEXT_CHUNK_URLS/g,
109
- `TURBOPACK_NEXT_CHUNK_URLS_${bundleKey}`
103
+ `TURBOPACK_NEXT_CHUNK_URLS_${globalKey}`
110
104
  ).replace(
111
105
  /TURBOPACK_CHUNK_UPDATE_LISTENERS/g,
112
- `TURBOPACK_CHUNK_UPDATE_LISTENERS_${bundleKey}`
113
- ).replace(/__next_require__/g, `__${bundleKey}_next_require__`).replace(
106
+ `TURBOPACK_CHUNK_UPDATE_LISTENERS_${globalKey}`
107
+ ).replace(/__next_require__/g, `__${globalKey}_next_require__`).replace(
114
108
  /\/\/# sourceMappingURL=(?<name>.+)(?<optional>\._)?\.js\.map/g,
115
- `//# sourceMappingURL=${new URL(
116
- ".",
117
- new URL(
118
- url,
119
- self.__remote_bundle_url__?.[bundle] ?? new URL(location.origin)
120
- )
121
- ).href}$1$2.js.map`
109
+ `//# sourceMappingURL=${new URL(".", new URL(url, scope.url)).href}$1$2.js.map`
122
110
  );
123
- if (!self[`TURBOPACK_${bundleKey}`]) {
111
+ if (!self[`TURBOPACK_${globalKey}`]) {
124
112
  const chunkData = [];
125
113
  const turbopackObject = {
126
114
  push: (item) => {
127
- logDebug(
128
- "ChunkLoader",
129
- `TURBOPACK_${bundleKey}.push() called with item type: ${Array.isArray(item) ? "array" : typeof item}`
130
- );
131
115
  if (Array.isArray(item)) {
132
116
  chunkData.push(item);
133
- logDebug(
134
- "ChunkLoader",
135
- `TURBOPACK_${bundleKey} now has ${chunkData.length} chunks`
136
- );
137
117
  } else {
138
118
  chunkData.push([item]);
139
119
  }
140
120
  return chunkData.length;
141
121
  },
142
- // Store chunks for later access
143
122
  __chunks__: chunkData
144
123
  };
145
- self[`TURBOPACK_${bundleKey}`] = turbopackObject;
124
+ self[`TURBOPACK_${globalKey}`] = turbopackObject;
146
125
  }
147
- logDebug("ChunkLoader", `Creating blob script for: "${url}"`);
148
126
  await new Promise((scriptResolve, scriptReject) => {
149
127
  const blob = new Blob([transformedCode], {
150
128
  type: "application/javascript; charset=UTF-8"
@@ -156,21 +134,6 @@ async function handleTurbopackChunk(code, bundle, url) {
156
134
  script.async = true;
157
135
  script.onload = () => {
158
136
  URL.revokeObjectURL(scriptUrl);
159
- logDebug(
160
- "ChunkLoader",
161
- `Script loaded successfully for bundle "${bundle}"`
162
- );
163
- const turbopackBundle = self[`TURBOPACK_${bundleKey}`];
164
- logDebug(
165
- "ChunkLoader",
166
- `TURBOPACK_${bundleKey} type: ${typeof turbopackBundle}, isArray: ${Array.isArray(turbopackBundle)}, keys: ${turbopackBundle ? Object.keys(turbopackBundle).slice(0, 10).join(", ") : "none"}`
167
- );
168
- if (turbopackBundle && typeof turbopackBundle === "object") {
169
- logDebug(
170
- "ChunkLoader",
171
- `TURBOPACK_${bundleKey} length/size: ${Array.isArray(turbopackBundle) ? turbopackBundle.length : Object.keys(turbopackBundle).length}`
172
- );
173
- }
174
137
  scriptResolve(void 0);
175
138
  script.remove();
176
139
  };
@@ -185,38 +148,29 @@ async function handleTurbopackChunk(code, bundle, url) {
185
148
  };
186
149
  document.head.appendChild(script);
187
150
  });
188
- const chunkLists = self[`TURBOPACK_${bundleKey}_CHUNK_LISTS`];
189
- logDebug(
190
- "ChunkLoader",
191
- `Processing chunk lists for bundle "${bundle}": ${chunkLists?.length ?? 0} lists`
192
- );
193
- const loadChunkLists = [];
151
+ const chunkLists = self[`TURBOPACK_${globalKey}_CHUNK_LISTS`];
152
+ const loadChunkPromises = [];
194
153
  while (chunkLists?.length) {
195
154
  const { chunks } = chunkLists.shift() ?? { chunks: [] };
196
155
  if (chunks.length > 0) {
197
- logDebug(
198
- "ChunkLoader",
199
- `Loading ${chunks.length} additional chunks for bundle "${bundle}": [${chunks.join(", ")}]`
200
- );
201
- chunks.forEach((id) => {
202
- const chunkLoadResult = self.__webpack_chunk_load__?.(
203
- `[${bundle}] ${url.slice(0, url.indexOf("/_next"))}/_next/${id}`
156
+ for (const id of chunks) {
157
+ const baseUrl = url.slice(0, url.indexOf("/_next"));
158
+ const chunkLoadResult = loadChunkWithScope(
159
+ scope,
160
+ formatRemoteId(scope, `${baseUrl}/_next/${id}`)
204
161
  );
205
162
  if (chunkLoadResult) {
206
- loadChunkLists.push(chunkLoadResult);
163
+ loadChunkPromises.push(chunkLoadResult);
207
164
  }
208
- });
165
+ }
209
166
  }
210
167
  }
211
- if (loadChunkLists.length > 0) {
212
- logDebug(
213
- "ChunkLoader",
214
- `Waiting for ${loadChunkLists.length} additional chunks to load`
215
- );
216
- await Promise.all(loadChunkLists);
168
+ if (loadChunkPromises.length > 0) {
169
+ await Promise.all(loadChunkPromises);
217
170
  }
218
171
  }
219
172
  export {
220
- createChunkLoader
173
+ createChunkDispatcher,
174
+ loadChunkWithScope
221
175
  };
222
176
  //# sourceMappingURL=chunk-loader.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/runtime/turbopack/chunk-loader.ts"],"sourcesContent":["import type { InternalResolveClientUrl } from '#internal/host/server/types';\nimport {\n getBundleKey,\n REMOTE_COMPONENT_REGEX,\n RUNTIME_WEBPACK,\n type Runtime,\n} from '#internal/runtime/constants';\nimport type { GlobalScope } from '#internal/runtime/types';\nimport { isProxiedUrl } from '#internal/runtime/url/protected-rc-fallback';\nimport {\n failedProxiedAssetError,\n RemoteComponentsError,\n} from '#internal/utils/error';\nimport { logDebug, warnCrossOriginFetchError } from '#internal/utils/logger';\nimport { TURBOPACK_GLOBAL_RE } from './patterns';\n\n/**\n * Creates chunk loader function for webpack runtime.\n * This function is responsible for loading JavaScript chunks from remote applications\n * and transforming Turbopack-specific code to work in the host environment.\n */\nexport function createChunkLoader(\n runtime: Runtime,\n resolveClientUrl?: InternalResolveClientUrl,\n): (chunkId: string, scriptBundle?: string) => Promise<unknown> | undefined {\n return function __turbopack_chunk_load__(\n chunkId: string,\n scriptBundle?: string,\n ) {\n logDebug('ChunkLoader', `Loading chunk: \"${chunkId}\"`);\n const self = globalThis as GlobalScope;\n const {\n bundle,\n id: path,\n prefix,\n } = REMOTE_COMPONENT_REGEX.exec(chunkId)?.groups ?? {\n bundle: scriptBundle ?? '',\n id: chunkId,\n };\n logDebug(\n 'ChunkLoader',\n `Parsed chunk - bundle: \"${bundle}\", path: \"${path}\", prefix: \"${prefix}\"`,\n );\n const remoteRuntime = self.__remote_webpack_require__?.[bundle ?? 'default']\n ? self.__remote_webpack_require__[bundle ?? 'default']?.type || 'webpack'\n : runtime;\n logDebug('ChunkLoader', `Remote runtime: \"${remoteRuntime}\"`);\n if (remoteRuntime === RUNTIME_WEBPACK) {\n logDebug('ChunkLoader', 'Skipping chunk load - webpack runtime detected');\n return Promise.resolve(undefined);\n }\n\n const url = new URL(\n path\n ? `${prefix ?? ''}${path}`.replace(\n /(?<char>[^:])(?<double>\\/\\/)/g,\n '$1/',\n )\n : '/',\n self.__remote_bundle_url__?.[bundle ?? 'default'] ??\n new URL(location.origin),\n ).href;\n if (url.endsWith('.css')) {\n logDebug('ChunkLoader', `Skipping CSS file: \"${url}\"`);\n return;\n }\n\n if (!self.__remote_components_turbopack_chunk_loader_promise__) {\n self.__remote_components_turbopack_chunk_loader_promise__ = {};\n }\n if (self.__remote_components_turbopack_chunk_loader_promise__[url]) {\n logDebug('ChunkLoader', `Returning cached promise for: \"${url}\"`);\n return self.__remote_components_turbopack_chunk_loader_promise__[url];\n }\n\n const resolvedUrl = resolveClientUrl?.(url) ?? url;\n logDebug('ChunkLoader', `Fetching chunk from: \"${resolvedUrl}\"`);\n self.__remote_components_turbopack_chunk_loader_promise__[url] =\n new Promise((resolve, reject) => {\n fetch(resolvedUrl)\n .then((res) => res.text())\n .then((code) => {\n // Turbopack runtime uses either dot-notation or bracket-notation globals.\n const hasTurbopack = TURBOPACK_GLOBAL_RE.test(code);\n if (hasTurbopack) {\n return handleTurbopackChunk(code, bundle ?? '', url);\n }\n logDebug(\n 'ChunkLoader',\n `Chunk does not contain globalThis.TURBOPACK or self.TURBOPACK: \"${url}\"`,\n );\n logDebug(\n 'ChunkLoader',\n `First 500 chars of chunk: ${code.slice(0, 500)}`,\n );\n })\n .then(resolve)\n .catch((error) => {\n const isProxied = isProxiedUrl(resolvedUrl);\n if (isProxied) {\n reject(failedProxiedAssetError('chunk', url, resolvedUrl));\n } else {\n warnCrossOriginFetchError('ChunkLoader', url);\n reject(error);\n }\n });\n });\n\n return self.__remote_components_turbopack_chunk_loader_promise__[url];\n };\n}\n\n/**\n * Handles Turbopack chunk loading by transforming the chunk code to isolate\n * global variables per bundle and dynamically loading the transformed script.\n */\nasync function handleTurbopackChunk(\n code: string,\n bundle: string,\n url: string,\n): Promise<void> {\n logDebug(\n 'ChunkLoader',\n `Handling Turbopack chunk - bundle: \"${bundle}\", url: \"${url}\"`,\n );\n // skip this chunk as it is not needed for remote components\n if (/importScripts\\(\\.\\.\\.self.TURBOPACK_NEXT_CHUNK_URLS/.test(code)) {\n logDebug('ChunkLoader', `Skipping worker chunk: \"${url}\"`);\n // remove preload links for this chunk\n const preloadLinks = document.querySelectorAll(\n `link[rel=\"preload\"][href=\"${new URL(url).pathname}\"]`,\n );\n preloadLinks.forEach((preloadLink) => preloadLink.remove());\n return;\n }\n\n const self = globalThis as GlobalScope;\n const bundleKey = getBundleKey(bundle);\n logDebug('ChunkLoader', `Bundle key: \"${bundleKey}\"`);\n\n // replace global variables with bundle-specific ones to prevent collisions\n // between multiple remote component bundles\n const transformedCode = code\n // Turbopack runtime can reference TURBOPACK via bracket-notation (common in newer Next.js)\n // e.g. globalThis[\"TURBOPACK\"] / self['TURBOPACK']\n .replace(\n /globalThis\\[\\s*[\"']TURBOPACK[\"']\\s*\\]/g,\n `globalThis[\"TURBOPACK_${bundleKey}\"]`,\n )\n .replace(\n /self\\[\\s*[\"']TURBOPACK[\"']\\s*\\]/g,\n `self[\"TURBOPACK_${bundleKey}\"]`,\n )\n .replace(/globalThis\\.TURBOPACK/g, `globalThis.TURBOPACK_${bundleKey}`)\n .replace(/self\\.TURBOPACK(?!_)/g, `self.TURBOPACK_${bundleKey}`)\n .replace(\n /TURBOPACK_WORKER_LOCATION/g,\n `TURBOPACK_WORKER_LOCATION_${bundleKey}`,\n )\n .replace(\n /TURBOPACK_NEXT_CHUNK_URLS/g,\n `TURBOPACK_NEXT_CHUNK_URLS_${bundleKey}`,\n )\n .replace(\n /TURBOPACK_CHUNK_UPDATE_LISTENERS/g,\n `TURBOPACK_CHUNK_UPDATE_LISTENERS_${bundleKey}`,\n )\n .replace(/__next_require__/g, `__${bundleKey}_next_require__`)\n .replace(\n /\\/\\/# sourceMappingURL=(?<name>.+)(?<optional>\\._)?\\.js\\.map/g,\n `//# sourceMappingURL=${\n new URL(\n '.',\n new URL(\n url,\n self.__remote_bundle_url__?.[bundle] ?? new URL(location.origin),\n ),\n ).href\n }$1$2.js.map`,\n );\n\n // Initialize TURBOPACK bundle with push interceptor for Next.js 16.2.0-canary\n // Use webpack-style chunk loading pattern\n if (!self[`TURBOPACK_${bundleKey}`]) {\n const chunkData: unknown[][] = [];\n const turbopackObject = {\n push: (item: unknown) => {\n logDebug(\n 'ChunkLoader',\n `TURBOPACK_${bundleKey}.push() called with item type: ${Array.isArray(item) ? 'array' : typeof item}`,\n );\n if (Array.isArray(item)) {\n chunkData.push(item);\n logDebug(\n 'ChunkLoader',\n `TURBOPACK_${bundleKey} now has ${chunkData.length} chunks`,\n );\n } else {\n chunkData.push([item]);\n }\n return chunkData.length;\n },\n // Store chunks for later access\n __chunks__: chunkData,\n };\n self[`TURBOPACK_${bundleKey}`] = turbopackObject as unknown as Record<\n string,\n unknown\n >;\n }\n\n // load the script dynamically using a Blob URL\n logDebug('ChunkLoader', `Creating blob script for: \"${url}\"`);\n await new Promise<void>((scriptResolve, scriptReject) => {\n const blob = new Blob([transformedCode], {\n type: 'application/javascript; charset=UTF-8',\n });\n const scriptUrl = URL.createObjectURL(blob);\n const script = document.createElement('script');\n script.setAttribute('data-turbopack-src', url);\n script.src = scriptUrl;\n script.async = true;\n script.onload = () => {\n URL.revokeObjectURL(scriptUrl);\n logDebug(\n 'ChunkLoader',\n `Script loaded successfully for bundle \"${bundle}\"`,\n );\n const turbopackBundle = self[`TURBOPACK_${bundleKey}`];\n logDebug(\n 'ChunkLoader',\n `TURBOPACK_${bundleKey} type: ${typeof turbopackBundle}, isArray: ${Array.isArray(turbopackBundle)}, keys: ${\n turbopackBundle\n ? Object.keys(turbopackBundle as object)\n .slice(0, 10)\n .join(', ')\n : 'none'\n }`,\n );\n if (turbopackBundle && typeof turbopackBundle === 'object') {\n logDebug(\n 'ChunkLoader',\n `TURBOPACK_${bundleKey} length/size: ${Array.isArray(turbopackBundle) ? turbopackBundle.length : Object.keys(turbopackBundle as object).length}`,\n );\n }\n scriptResolve(undefined);\n script.remove();\n };\n script.onerror = () => {\n URL.revokeObjectURL(scriptUrl);\n scriptReject(\n new RemoteComponentsError(\n `Failed to load <script src=\"${script.src}\"> for Remote Component. Check the URL is correct.`,\n ),\n );\n script.remove();\n };\n document.head.appendChild(script);\n });\n\n // process any additional chunks that were registered during script execution\n const chunkLists = self[`TURBOPACK_${bundleKey}_CHUNK_LISTS`] as\n | { chunks: string[] }[]\n | undefined;\n logDebug(\n 'ChunkLoader',\n `Processing chunk lists for bundle \"${bundle}\": ${chunkLists?.length ?? 0} lists`,\n );\n const loadChunkLists = [] as (Promise<unknown> | undefined)[];\n while (chunkLists?.length) {\n const { chunks } = chunkLists.shift() ?? { chunks: [] };\n if (chunks.length > 0) {\n logDebug(\n 'ChunkLoader',\n `Loading ${chunks.length} additional chunks for bundle \"${bundle}\": [${chunks.join(', ')}]`,\n );\n chunks.forEach((id: string) => {\n const chunkLoadResult = self.__webpack_chunk_load__?.(\n `[${bundle}] ${url.slice(0, url.indexOf('/_next'))}/_next/${id}`,\n );\n if (chunkLoadResult) {\n loadChunkLists.push(chunkLoadResult);\n }\n });\n }\n }\n if (loadChunkLists.length > 0) {\n logDebug(\n 'ChunkLoader',\n `Waiting for ${loadChunkLists.length} additional chunks to load`,\n );\n await Promise.all(loadChunkLists);\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/runtime/turbopack/chunk-loader.ts"],"sourcesContent":["import { RUNTIME_WEBPACK } from '#internal/runtime/constants';\nimport { collapseDoubleSlashes } from '#internal/runtime/patterns';\nimport type { GlobalScope } from '#internal/runtime/types';\nimport { isProxiedUrl } from '#internal/runtime/url/protected-rc-fallback';\nimport {\n failedProxiedAssetError,\n RemoteComponentsError,\n} from '#internal/utils/error';\nimport {\n logDebug,\n logWarn,\n warnCrossOriginFetchError,\n} from '#internal/utils/logger';\nimport { TURBOPACK_GLOBAL_RE } from './patterns';\nimport {\n formatRemoteId,\n getScope,\n parseRemoteId,\n type RemoteScope,\n} from './remote-scope';\n\n/**\n * Loads a chunk using a specific scope. All state (base URL, proxy callback,\n * TURBOPACK global key) comes from the scope — no global lookups needed.\n *\n * This is the primary chunk loader called directly from:\n * - setupWebpackRuntime (initial chunks)\n * - TurbopackContext.l (module-level chunk loading)\n * - handleTurbopackChunk (CHUNK_LIST additional chunks)\n *\n * The global chunk dedup cache is keyed by absolute URL, so different origins\n * naturally get separate cache entries even when sharing a bundle name.\n */\nexport function loadChunkWithScope(\n scope: RemoteScope,\n chunkId: string,\n): Promise<unknown> | undefined {\n logDebug(\n 'ChunkLoader',\n `loadChunkWithScope: \"${chunkId}\" (scope: \"${scope.scopedName}\")`,\n );\n const self = globalThis as GlobalScope;\n\n const { bundle, path, prefix } = parseRemoteId(chunkId);\n\n // Skip webpack runtime chunks\n const remoteRuntime = self.__remote_webpack_require__?.[bundle ?? 'default']\n ? self.__remote_webpack_require__[bundle ?? 'default']?.type || 'webpack'\n : scope.runtime;\n if (remoteRuntime === RUNTIME_WEBPACK) {\n return Promise.resolve(undefined);\n }\n\n const rawPath = path ? collapseDoubleSlashes(`${prefix}${path}`) : '/';\n const url = new URL(rawPath, scope.url).href;\n\n if (url.endsWith('.css')) {\n return;\n }\n\n // Global dedup cache keyed by absolute URL\n if (!self.__remote_components_turbopack_chunk_loader_promise__) {\n self.__remote_components_turbopack_chunk_loader_promise__ = {};\n }\n if (self.__remote_components_turbopack_chunk_loader_promise__[url]) {\n return self.__remote_components_turbopack_chunk_loader_promise__[url];\n }\n\n const resolvedUrl = scope.resolveClientUrl?.(url) ?? url;\n if (resolvedUrl !== url) {\n logDebug('ChunkLoader', `Proxied chunk URL: \"${url}\" → \"${resolvedUrl}\"`);\n }\n\n self.__remote_components_turbopack_chunk_loader_promise__[url] = new Promise(\n (resolve, reject) => {\n fetch(resolvedUrl)\n .then((res) => res.text())\n .then((code) => {\n const hasTurbopack = TURBOPACK_GLOBAL_RE.test(code);\n if (hasTurbopack) {\n return handleTurbopackChunk(code, scope, url);\n }\n // Chunk doesn't contain Turbopack globals — nothing to process\n })\n .then(resolve)\n .catch((error) => {\n const isProxied = isProxiedUrl(resolvedUrl);\n if (isProxied) {\n reject(failedProxiedAssetError('chunk', url, resolvedUrl));\n } else {\n warnCrossOriginFetchError('ChunkLoader', url);\n reject(error);\n }\n });\n },\n );\n\n return self.__remote_components_turbopack_chunk_loader_promise__[url];\n}\n\n/**\n * Creates the global `__webpack_chunk_load__` dispatcher.\n * This is a thin wrapper called only by external code (React's RSC runtime).\n * It parses the chunkId, resolves the correct scope, and delegates to\n * `loadChunkWithScope`.\n */\nexport function createChunkDispatcher(): (\n chunkId: string,\n scriptBundle?: string,\n) => Promise<unknown> | undefined {\n return function __chunk_dispatcher__(chunkId: string, scriptBundle?: string) {\n logDebug('ChunkDispatcher', `Dispatching chunk: \"${chunkId}\"`);\n\n const { bundle } = parseRemoteId(chunkId);\n const bundleName = bundle || scriptBundle || 'default';\n\n // Works with both the scoped name (Next.js hosts with server-side\n // rewriting) and the plain bundle name (static/HTML hosts).\n const scope = getScope(bundleName);\n\n logDebug(\n 'ChunkDispatcher',\n `Scope resolution: bundle=\"${bundleName}\", scope=${scope?.scopedName ?? 'null'}`,\n );\n\n if (!scope) {\n logWarn('ChunkDispatcher', `No scope found for bundle \"${bundleName}\"`);\n return Promise.resolve(undefined);\n }\n\n return loadChunkWithScope(scope, chunkId);\n };\n}\n\n/**\n * Handles Turbopack chunk loading by transforming the chunk code to isolate\n * global variables per bundle and dynamically loading the transformed script.\n * Receives scope directly — no global state lookups needed.\n */\nasync function handleTurbopackChunk(\n code: string,\n scope: RemoteScope,\n url: string,\n): Promise<void> {\n // skip this chunk as it is not needed for remote components\n if (/importScripts\\(\\.\\.\\.self.TURBOPACK_NEXT_CHUNK_URLS/.test(code)) {\n const preloadLinks = document.querySelectorAll(\n `link[rel=\"preload\"][href=\"${new URL(url).pathname}\"]`,\n );\n preloadLinks.forEach((preloadLink) => preloadLink.remove());\n return;\n }\n\n const self = globalThis as GlobalScope;\n const { globalKey } = scope;\n\n // replace global variables with scope-specific ones to prevent collisions\n // between multiple remote component bundles\n const transformedCode = code\n .replace(\n /globalThis\\[\\s*[\"']TURBOPACK[\"']\\s*\\]/g,\n `globalThis[\"TURBOPACK_${globalKey}\"]`,\n )\n .replace(\n /self\\[\\s*[\"']TURBOPACK[\"']\\s*\\]/g,\n `self[\"TURBOPACK_${globalKey}\"]`,\n )\n .replace(/globalThis\\.TURBOPACK/g, `globalThis.TURBOPACK_${globalKey}`)\n .replace(/self\\.TURBOPACK(?!_)/g, `self.TURBOPACK_${globalKey}`)\n .replace(\n /TURBOPACK_WORKER_LOCATION/g,\n `TURBOPACK_WORKER_LOCATION_${globalKey}`,\n )\n .replace(\n /TURBOPACK_NEXT_CHUNK_URLS/g,\n `TURBOPACK_NEXT_CHUNK_URLS_${globalKey}`,\n )\n .replace(\n /TURBOPACK_CHUNK_UPDATE_LISTENERS/g,\n `TURBOPACK_CHUNK_UPDATE_LISTENERS_${globalKey}`,\n )\n .replace(/__next_require__/g, `__${globalKey}_next_require__`)\n .replace(\n /\\/\\/# sourceMappingURL=(?<name>.+)(?<optional>\\._)?\\.js\\.map/g,\n `//# sourceMappingURL=${new URL('.', new URL(url, scope.url)).href}$1$2.js.map`,\n );\n\n // Initialize TURBOPACK bundle with push interceptor\n if (!self[`TURBOPACK_${globalKey}`]) {\n const chunkData: unknown[][] = [];\n const turbopackObject = {\n push: (item: unknown) => {\n if (Array.isArray(item)) {\n chunkData.push(item);\n } else {\n chunkData.push([item]);\n }\n return chunkData.length;\n },\n __chunks__: chunkData,\n };\n self[`TURBOPACK_${globalKey}`] = turbopackObject as unknown as Record<\n string,\n unknown\n >;\n }\n\n // load the script dynamically using a Blob URL\n await new Promise<void>((scriptResolve, scriptReject) => {\n const blob = new Blob([transformedCode], {\n type: 'application/javascript; charset=UTF-8',\n });\n const scriptUrl = URL.createObjectURL(blob);\n const script = document.createElement('script');\n script.setAttribute('data-turbopack-src', url);\n script.src = scriptUrl;\n script.async = true;\n script.onload = () => {\n URL.revokeObjectURL(scriptUrl);\n scriptResolve(undefined);\n script.remove();\n };\n script.onerror = () => {\n URL.revokeObjectURL(scriptUrl);\n scriptReject(\n new RemoteComponentsError(\n `Failed to load <script src=\"${script.src}\"> for Remote Component. Check the URL is correct.`,\n ),\n );\n script.remove();\n };\n document.head.appendChild(script);\n });\n\n // process any additional chunks that were registered during script execution\n // These CHUNK_LIST chunks load directly via scope — no global dispatch needed.\n const chunkLists = self[`TURBOPACK_${globalKey}_CHUNK_LISTS`] as\n | { chunks: string[] }[]\n | undefined;\n const loadChunkPromises: (Promise<unknown> | undefined)[] = [];\n while (chunkLists?.length) {\n const { chunks } = chunkLists.shift() ?? { chunks: [] };\n if (chunks.length > 0) {\n for (const id of chunks) {\n const baseUrl = url.slice(0, url.indexOf('/_next'));\n const chunkLoadResult = loadChunkWithScope(\n scope,\n formatRemoteId(scope, `${baseUrl}/_next/${id}`),\n );\n if (chunkLoadResult) {\n loadChunkPromises.push(chunkLoadResult);\n }\n }\n }\n }\n if (loadChunkPromises.length > 0) {\n await Promise.all(loadChunkPromises);\n }\n}\n"],"mappings":"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","names":[]}
@@ -18,15 +18,35 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var module_exports = {};
20
20
  __export(module_exports, {
21
- handleTurbopackModule: () => handleTurbopackModule
21
+ handleTurbopackModule: () => handleTurbopackModule,
22
+ requireModule: () => requireModule
22
23
  });
23
24
  module.exports = __toCommonJS(module_exports);
24
- var import_constants = require("#internal/runtime/constants");
25
25
  var import_logger = require("#internal/utils/logger");
26
- function handleTurbopackModule(bundle, moduleId, id) {
26
+ var import_chunk_loader = require("./chunk-loader");
27
+ var import_remote_scope = require("./remote-scope");
28
+ var import_shared_modules = require("./shared-modules");
29
+ function requireModule(scope, moduleId, fullId) {
30
+ const idStr = String(moduleId);
31
+ if (scope.moduleCache[idStr])
32
+ return scope.moduleCache[idStr];
33
+ const sharedModule = (0, import_shared_modules.getSharedModule)(scope, moduleId);
34
+ if (sharedModule) {
35
+ scope.moduleCache[idStr] = sharedModule;
36
+ return sharedModule;
37
+ }
38
+ return handleTurbopackModule(
39
+ scope,
40
+ idStr,
41
+ fullId ?? (0, import_remote_scope.formatRemoteId)(scope, idStr)
42
+ );
43
+ }
44
+ function handleTurbopackModule(scope, moduleId, id) {
27
45
  const self = globalThis;
28
- const bundleKey = (0, import_constants.getBundleKey)(bundle);
29
- const raw = self[`TURBOPACK_${bundleKey}`];
46
+ if (scope.moduleCache[moduleId]) {
47
+ return scope.moduleCache[moduleId];
48
+ }
49
+ const raw = self[`TURBOPACK_${scope.globalKey}`];
30
50
  let modules;
31
51
  if (raw && typeof raw === "object" && "__chunks__" in raw) {
32
52
  modules = raw.__chunks__.flat();
@@ -35,48 +55,35 @@ function handleTurbopackModule(bundle, moduleId, id) {
35
55
  } else {
36
56
  modules = raw;
37
57
  }
38
- if (!self.__remote_components_turbopack_modules__) {
39
- self.__remote_components_turbopack_modules__ = {};
40
- }
41
- if (!self.__remote_components_turbopack_modules__[bundle]) {
42
- self.__remote_components_turbopack_modules__[bundle] = {};
43
- }
44
- if (self.__remote_components_turbopack_modules__[bundle][moduleId]) {
45
- return self.__remote_components_turbopack_modules__[bundle][moduleId];
46
- }
47
58
  if (!modules) {
48
- (0, import_logger.logError)("TurbopackModule", `TURBOPACK_${bundleKey} is undefined`);
59
+ (0, import_logger.logError)(
60
+ "TurbopackModule",
61
+ `TURBOPACK_${scope.globalKey} is undefined (scope: "${scope.scopedName}")`
62
+ );
49
63
  }
50
64
  const moduleInit = findModuleInit(modules, moduleId);
51
65
  const exports = {};
52
66
  const moduleExports = { exports };
53
67
  if (typeof moduleInit !== "function") {
54
68
  throw new Error(
55
- `Module ${id} not found in bundle ${bundle} with id ${moduleId}`
69
+ `Module ${id} not found in bundle ${scope.name} with id ${moduleId}`
56
70
  );
57
71
  }
58
- self.__remote_components_turbopack_modules__[bundle][moduleId] = moduleExports.exports;
59
- if (!self.__remote_components_turbopack_global__) {
60
- self.__remote_components_turbopack_global__ = {};
61
- }
62
- if (!self.__remote_components_turbopack_global__[bundle]) {
63
- self.__remote_components_turbopack_global__[bundle] = {};
64
- }
72
+ scope.moduleCache[moduleId] = moduleExports.exports;
65
73
  moduleInit(
66
74
  createTurbopackContext(
67
- bundle,
75
+ scope,
68
76
  exports,
69
77
  moduleExports,
70
78
  modules,
71
79
  moduleInit,
72
- id,
73
- self
80
+ id
74
81
  ),
75
82
  moduleExports,
76
83
  exports
77
84
  );
78
- if (self.__remote_components_turbopack_modules__[bundle][moduleId] !== moduleExports.exports) {
79
- self.__remote_components_turbopack_modules__[bundle][moduleId] = moduleExports.exports;
85
+ if (scope.moduleCache[moduleId] !== moduleExports.exports) {
86
+ scope.moduleCache[moduleId] = moduleExports.exports;
80
87
  }
81
88
  return moduleExports.exports;
82
89
  }
@@ -101,7 +108,8 @@ function findModuleInit(modules, moduleId) {
101
108
  (e) => Boolean(e && typeof e === "object" && moduleId in e)
102
109
  )?.[moduleId];
103
110
  }
104
- function createTurbopackContext(bundle, exports, moduleExports, modules, moduleInit, id, self) {
111
+ function createTurbopackContext(scope, exports, moduleExports, modules, moduleInit, id) {
112
+ const scopedRequire = (moduleId) => requireModule(scope, moduleId, (0, import_remote_scope.formatRemoteId)(scope, String(moduleId)));
105
113
  return {
106
114
  // HMR not implemented for Remote Components
107
115
  k: {
@@ -117,16 +125,10 @@ function createTurbopackContext(bundle, exports, moduleExports, modules, moduleI
117
125
  s(bindings, esmId) {
118
126
  let mod = exports;
119
127
  if (typeof esmId === "string" || typeof esmId === "number") {
120
- if (!self.__remote_components_turbopack_modules__) {
121
- self.__remote_components_turbopack_modules__ = {};
128
+ if (!scope.moduleCache[esmId]) {
129
+ scope.moduleCache[esmId] = {};
122
130
  }
123
- if (!self.__remote_components_turbopack_modules__[bundle]) {
124
- self.__remote_components_turbopack_modules__[bundle] = {};
125
- }
126
- if (!self.__remote_components_turbopack_modules__[bundle][esmId]) {
127
- self.__remote_components_turbopack_modules__[bundle][esmId] = {};
128
- }
129
- mod = self.__remote_components_turbopack_modules__[bundle][esmId];
131
+ mod = scope.moduleCache[esmId];
130
132
  }
131
133
  Object.defineProperty(mod, "__esModule", { value: true });
132
134
  if (Array.isArray(bindings)) {
@@ -159,7 +161,7 @@ function createTurbopackContext(bundle, exports, moduleExports, modules, moduleI
159
161
  }
160
162
  }
161
163
  },
162
- // import
164
+ // import — resolves directly via scope, no global dispatch
163
165
  i(importId) {
164
166
  let mod;
165
167
  if (typeof importId === "string") {
@@ -170,7 +172,7 @@ function createTurbopackContext(bundle, exports, moduleExports, modules, moduleI
170
172
  /\s+<export(?<specifier>.*)>$/,
171
173
  ""
172
174
  );
173
- mod = self.__webpack_require__?.(`[${bundle}] ${normalizedId}`);
175
+ mod = scopedRequire(normalizedId);
174
176
  if (mod && exportSource && exportName && (exportSource === "*" || typeof mod[exportSource] !== "undefined") && typeof mod[exportName] === "undefined") {
175
177
  if (exportSource === "*") {
176
178
  mod[exportName] = mod;
@@ -179,7 +181,7 @@ function createTurbopackContext(bundle, exports, moduleExports, modules, moduleI
179
181
  }
180
182
  }
181
183
  } else {
182
- mod = self.__webpack_require__?.(`[${bundle}] ${importId}`);
184
+ mod = scopedRequire(importId);
183
185
  }
184
186
  if (typeof mod !== "object" || mod === null) {
185
187
  mod = { default: mod };
@@ -191,16 +193,14 @@ function createTurbopackContext(bundle, exports, moduleExports, modules, moduleI
191
193
  }
192
194
  return mod;
193
195
  },
194
- // require
196
+ // require — resolves directly via scope
195
197
  r(requireId) {
196
- return self.__webpack_require__?.(`[${bundle}] ${requireId}`);
198
+ return scopedRequire(requireId);
197
199
  },
198
200
  // value exports
199
201
  v(value) {
200
202
  if (typeof value === "function") {
201
- exports.default = value((vid) => {
202
- return self.__webpack_require__?.(`[${bundle}] ${vid}`);
203
- });
203
+ exports.default = value((vid) => scopedRequire(vid));
204
204
  } else {
205
205
  moduleExports.exports = value;
206
206
  }
@@ -215,17 +215,15 @@ function createTurbopackContext(bundle, exports, moduleExports, modules, moduleI
215
215
  );
216
216
  exports.default = result;
217
217
  },
218
- // async module loader
218
+ // async module loader — resolves directly via scope
219
219
  async A(Aid) {
220
- const mod = self.__webpack_require__?.(`[${bundle}] ${Aid}`);
221
- return mod.default(
222
- (parentId) => self.__webpack_require__?.(`[${bundle}] ${parentId}`)
223
- );
220
+ const mod = scopedRequire(Aid);
221
+ return mod.default((parentId) => scopedRequire(parentId));
224
222
  },
225
223
  // dynamic import tracking — no-op for remote components
226
224
  j() {
227
225
  },
228
- // chunk loader
226
+ // chunk loader — loads directly via scope, no global dispatch
229
227
  l(url) {
230
228
  const flatModules = Array.isArray(modules) ? modules : [];
231
229
  const moduleInitIndex = flatModules.indexOf(moduleInit);
@@ -236,22 +234,23 @@ function createTurbopackContext(bundle, exports, moduleExports, modules, moduleI
236
234
  const scriptSrc = script.getAttribute("data-turbopack-src") || "";
237
235
  const nextIndex = scriptSrc.indexOf("/_next");
238
236
  const baseUrl = nextIndex !== -1 ? scriptSrc.slice(0, nextIndex) : "";
239
- const bundleUrl = `[${bundle}] ${baseUrl}/_next/${url}`;
240
- return self.__webpack_chunk_load__?.(bundleUrl, bundle);
237
+ const chunkUrl = `${baseUrl}/_next/${url}`;
238
+ return (0, import_chunk_loader.loadChunkWithScope)(scope, (0, import_remote_scope.formatRemoteId)(scope, chunkUrl));
241
239
  }
242
240
  }
243
241
  throw new Error(
244
242
  `Failed to load Turbopack chunk "${url}" for module "${id}". Check the URL is correct.`
245
243
  );
246
244
  },
247
- // global object for this bundle
248
- g: self.__remote_components_turbopack_global__?.[bundle],
245
+ // globalThis substitute shared across all modules in this scope
246
+ g: scope.moduleGlobal,
249
247
  m: moduleExports,
250
248
  e: exports
251
249
  };
252
250
  }
253
251
  // Annotate the CommonJS export names for ESM import in node:
254
252
  0 && (module.exports = {
255
- handleTurbopackModule
253
+ handleTurbopackModule,
254
+ requireModule
256
255
  });
257
256
  //# sourceMappingURL=module.cjs.map