remote-components 0.3.3 → 0.3.4
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.
- package/dist/config/nextjs.cjs +86 -37
- package/dist/config/nextjs.cjs.map +1 -1
- package/dist/config/nextjs.js +86 -37
- package/dist/config/nextjs.js.map +1 -1
- package/dist/config/webpack.cjs +5 -1
- package/dist/config/webpack.cjs.map +1 -1
- package/dist/config/webpack.js +5 -1
- package/dist/config/webpack.js.map +1 -1
- package/dist/host/html.cjs +524 -338
- package/dist/host/html.cjs.map +1 -1
- package/dist/host/html.js +524 -338
- package/dist/host/html.js.map +1 -1
- package/dist/host/nextjs/app/client-only.cjs +462 -259
- package/dist/host/nextjs/app/client-only.cjs.map +1 -1
- package/dist/host/nextjs/app/client-only.js +436 -233
- package/dist/host/nextjs/app/client-only.js.map +1 -1
- package/dist/host/react.cjs +403 -228
- package/dist/host/react.cjs.map +1 -1
- package/dist/host/react.js +403 -228
- package/dist/host/react.js.map +1 -1
- package/dist/internal/config/webpack/apply-shared-modules.cjs +6 -4
- package/dist/internal/config/webpack/apply-shared-modules.cjs.map +1 -1
- package/dist/internal/config/webpack/apply-shared-modules.js +6 -4
- package/dist/internal/config/webpack/apply-shared-modules.js.map +1 -1
- package/dist/internal/config/webpack/next-client-pages-loader.cjs +6 -7
- package/dist/internal/config/webpack/next-client-pages-loader.cjs.map +1 -1
- package/dist/internal/config/webpack/next-client-pages-loader.js +6 -7
- package/dist/internal/config/webpack/next-client-pages-loader.js.map +1 -1
- package/dist/internal/host/nextjs/app-client.cjs +4 -3
- package/dist/internal/host/nextjs/app-client.cjs.map +1 -1
- package/dist/internal/host/nextjs/app-client.js +4 -3
- package/dist/internal/host/nextjs/app-client.js.map +1 -1
- package/dist/internal/host/nextjs/dom-flight.cjs +19 -39
- package/dist/internal/host/nextjs/dom-flight.cjs.map +1 -1
- package/dist/internal/host/nextjs/dom-flight.js +31 -39
- package/dist/internal/host/nextjs/dom-flight.js.map +1 -1
- package/dist/internal/host/nextjs/image-shared.cjs +39 -3
- package/dist/internal/host/nextjs/image-shared.cjs.map +1 -1
- package/dist/internal/host/nextjs/image-shared.d.ts +5 -10
- package/dist/internal/host/nextjs/image-shared.js +29 -3
- package/dist/internal/host/nextjs/image-shared.js.map +1 -1
- package/dist/internal/host/server/fetch-remote-component.cjs +2 -1
- package/dist/internal/host/server/fetch-remote-component.cjs.map +1 -1
- package/dist/internal/host/server/fetch-remote-component.js +2 -1
- package/dist/internal/host/server/fetch-remote-component.js.map +1 -1
- package/dist/internal/host/shared/polyfill.cjs +8 -7
- package/dist/internal/host/shared/polyfill.cjs.map +1 -1
- package/dist/internal/host/shared/polyfill.js +8 -7
- package/dist/internal/host/shared/polyfill.js.map +1 -1
- package/dist/internal/host/shared/shared-module-resolver.cjs +117 -0
- package/dist/internal/host/shared/shared-module-resolver.cjs.map +1 -0
- package/dist/internal/host/shared/shared-module-resolver.d.ts +64 -0
- package/dist/internal/host/shared/shared-module-resolver.js +78 -0
- package/dist/internal/host/shared/shared-module-resolver.js.map +1 -0
- package/dist/internal/remote/nextjs/next-internals.cjs +53 -0
- package/dist/internal/remote/nextjs/next-internals.cjs.map +1 -0
- package/dist/internal/remote/nextjs/next-internals.d.ts +42 -0
- package/dist/internal/remote/nextjs/next-internals.js +26 -0
- package/dist/internal/remote/nextjs/next-internals.js.map +1 -0
- package/dist/internal/runtime/html/apply-origin.cjs +11 -32
- package/dist/internal/runtime/html/apply-origin.cjs.map +1 -1
- package/dist/internal/runtime/html/apply-origin.js +11 -32
- package/dist/internal/runtime/html/apply-origin.js.map +1 -1
- package/dist/internal/runtime/html/html-spec.cjs +78 -0
- package/dist/internal/runtime/html/html-spec.cjs.map +1 -0
- package/dist/internal/runtime/html/html-spec.d.ts +23 -0
- package/dist/internal/runtime/html/html-spec.js +41 -0
- package/dist/internal/runtime/html/html-spec.js.map +1 -0
- package/dist/internal/runtime/html/parse-remote-html.cjs +15 -12
- package/dist/internal/runtime/html/parse-remote-html.cjs.map +1 -1
- package/dist/internal/runtime/html/parse-remote-html.js +29 -12
- package/dist/internal/runtime/html/parse-remote-html.js.map +1 -1
- package/dist/internal/runtime/html/rewrite-srcset.cjs +38 -0
- package/dist/internal/runtime/html/rewrite-srcset.cjs.map +1 -0
- package/dist/internal/runtime/html/rewrite-srcset.d.ts +12 -0
- package/dist/internal/runtime/html/rewrite-srcset.js +14 -0
- package/dist/internal/runtime/html/rewrite-srcset.js.map +1 -0
- package/dist/internal/runtime/loaders/component-loader.cjs +25 -44
- package/dist/internal/runtime/loaders/component-loader.cjs.map +1 -1
- package/dist/internal/runtime/loaders/component-loader.d.ts +3 -1
- package/dist/internal/runtime/loaders/component-loader.js +28 -44
- package/dist/internal/runtime/loaders/component-loader.js.map +1 -1
- package/dist/internal/runtime/loaders/static-loader.cjs +15 -21
- package/dist/internal/runtime/loaders/static-loader.cjs.map +1 -1
- package/dist/internal/runtime/loaders/static-loader.d.ts +3 -1
- package/dist/internal/runtime/loaders/static-loader.js +15 -21
- package/dist/internal/runtime/loaders/static-loader.js.map +1 -1
- package/dist/internal/runtime/namespace.cjs +82 -0
- package/dist/internal/runtime/namespace.cjs.map +1 -0
- package/dist/internal/runtime/namespace.d.ts +5 -0
- package/dist/internal/runtime/namespace.js +58 -0
- package/dist/internal/runtime/namespace.js.map +1 -0
- package/dist/internal/runtime/rsc-imports.cjs +86 -0
- package/dist/internal/runtime/rsc-imports.cjs.map +1 -0
- package/dist/internal/runtime/rsc-imports.d.ts +39 -0
- package/dist/internal/runtime/rsc-imports.js +50 -0
- package/dist/internal/runtime/rsc-imports.js.map +1 -0
- package/dist/internal/runtime/rsc-runtime.cjs +17 -0
- package/dist/internal/runtime/rsc-runtime.cjs.map +1 -0
- package/dist/internal/runtime/rsc-runtime.d.ts +37 -0
- package/dist/internal/runtime/rsc-runtime.js +1 -0
- package/dist/internal/runtime/rsc-runtime.js.map +1 -0
- package/dist/internal/runtime/rsc.cjs +23 -12
- package/dist/internal/runtime/rsc.cjs.map +1 -1
- package/dist/internal/runtime/rsc.d.ts +19 -2
- package/dist/internal/runtime/rsc.js +20 -11
- package/dist/internal/runtime/rsc.js.map +1 -1
- package/dist/internal/runtime/turbopack/chunk-loader.cjs +53 -35
- package/dist/internal/runtime/turbopack/chunk-loader.cjs.map +1 -1
- package/dist/internal/runtime/turbopack/chunk-loader.d.ts +1 -1
- package/dist/internal/runtime/turbopack/chunk-loader.js +53 -35
- package/dist/internal/runtime/turbopack/chunk-loader.js.map +1 -1
- package/dist/internal/runtime/turbopack/module.cjs +17 -4
- package/dist/internal/runtime/turbopack/module.cjs.map +1 -1
- package/dist/internal/runtime/turbopack/module.d.ts +23 -1
- package/dist/internal/runtime/turbopack/module.js +16 -4
- package/dist/internal/runtime/turbopack/module.js.map +1 -1
- package/dist/internal/runtime/turbopack/patterns.cjs +26 -10
- package/dist/internal/runtime/turbopack/patterns.cjs.map +1 -1
- package/dist/internal/runtime/turbopack/patterns.d.ts +44 -49
- package/dist/internal/runtime/turbopack/patterns.js +23 -7
- package/dist/internal/runtime/turbopack/patterns.js.map +1 -1
- package/dist/internal/runtime/turbopack/{webpack-runtime.cjs → remote-scope-setup.cjs} +35 -32
- package/dist/internal/runtime/turbopack/remote-scope-setup.cjs.map +1 -0
- package/dist/internal/runtime/turbopack/remote-scope-setup.d.ts +25 -0
- package/dist/internal/runtime/turbopack/{webpack-runtime.js → remote-scope-setup.js} +36 -19
- package/dist/internal/runtime/turbopack/remote-scope-setup.js.map +1 -0
- package/dist/internal/runtime/turbopack/remote-scope.cjs +4 -6
- package/dist/internal/runtime/turbopack/remote-scope.cjs.map +1 -1
- package/dist/internal/runtime/turbopack/remote-scope.d.ts +20 -1
- package/dist/internal/runtime/turbopack/remote-scope.js +4 -6
- package/dist/internal/runtime/turbopack/remote-scope.js.map +1 -1
- package/dist/internal/runtime/turbopack/shared-modules.cjs +21 -15
- package/dist/internal/runtime/turbopack/shared-modules.cjs.map +1 -1
- package/dist/internal/runtime/turbopack/shared-modules.d.ts +9 -2
- package/dist/internal/runtime/turbopack/shared-modules.js +24 -18
- package/dist/internal/runtime/turbopack/shared-modules.js.map +1 -1
- package/dist/internal/runtime/types.cjs.map +1 -1
- package/dist/internal/runtime/types.d.ts +5 -41
- package/dist/internal/utils/logger.cjs +1 -1
- package/dist/internal/utils/logger.cjs.map +1 -1
- package/dist/internal/utils/logger.d.ts +2 -2
- package/dist/internal/utils/logger.js +1 -1
- package/dist/internal/utils/logger.js.map +1 -1
- package/dist/remote/html.cjs +78 -22
- package/dist/remote/html.cjs.map +1 -1
- package/dist/remote/html.js +78 -22
- package/dist/remote/html.js.map +1 -1
- package/dist/remote/nextjs/app.cjs +14 -55
- package/dist/remote/nextjs/app.cjs.map +1 -1
- package/dist/remote/nextjs/app.js +24 -45
- package/dist/remote/nextjs/app.js.map +1 -1
- package/dist/types-59251814.d.ts +94 -0
- package/package.json +1 -1
- package/dist/internal/runtime/turbopack/webpack-runtime.cjs.map +0 -1
- package/dist/internal/runtime/turbopack/webpack-runtime.d.ts +0 -23
- package/dist/internal/runtime/turbopack/webpack-runtime.js.map +0 -1
|
@@ -23,6 +23,7 @@ __export(chunk_loader_exports, {
|
|
|
23
23
|
});
|
|
24
24
|
module.exports = __toCommonJS(chunk_loader_exports);
|
|
25
25
|
var import_constants = require("#internal/runtime/constants");
|
|
26
|
+
var import_namespace = require("#internal/runtime/namespace");
|
|
26
27
|
var import_patterns = require("#internal/runtime/patterns");
|
|
27
28
|
var import_protected_rc_fallback = require("#internal/runtime/url/protected-rc-fallback");
|
|
28
29
|
var import_error = require("#internal/utils/error");
|
|
@@ -35,6 +36,7 @@ function loadChunkWithScope(scope, chunkId) {
|
|
|
35
36
|
`loadChunkWithScope: "${chunkId}" (scope: "${scope.scopedName}")`
|
|
36
37
|
);
|
|
37
38
|
const self = globalThis;
|
|
39
|
+
const ns = (0, import_namespace.getNamespace)();
|
|
38
40
|
const { bundle, path, prefix } = (0, import_remote_scope.parseRemoteId)(chunkId);
|
|
39
41
|
const remoteRuntime = self.__remote_webpack_require__?.[bundle ?? "default"] ? self.__remote_webpack_require__[bundle ?? "default"]?.type || "webpack" : scope.runtime;
|
|
40
42
|
if (remoteRuntime === import_constants.RUNTIME_WEBPACK) {
|
|
@@ -45,35 +47,31 @@ function loadChunkWithScope(scope, chunkId) {
|
|
|
45
47
|
if (url.endsWith(".css")) {
|
|
46
48
|
return;
|
|
47
49
|
}
|
|
48
|
-
if (
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
if (self.__remote_components_turbopack_chunk_loader_promise__[url]) {
|
|
52
|
-
return self.__remote_components_turbopack_chunk_loader_promise__[url];
|
|
50
|
+
if (ns.chunkCache[url]) {
|
|
51
|
+
(0, import_logger.logDebug)("ChunkLoader", `Cache hit for "${chunkId}" (url="${url}")`);
|
|
52
|
+
return ns.chunkCache[url];
|
|
53
53
|
}
|
|
54
54
|
const resolvedUrl = scope.resolveClientUrl?.(url) ?? url;
|
|
55
55
|
if (resolvedUrl !== url) {
|
|
56
56
|
(0, import_logger.logDebug)("ChunkLoader", `Proxied chunk URL: "${url}" \u2192 "${resolvedUrl}"`);
|
|
57
57
|
}
|
|
58
|
-
|
|
59
|
-
(
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
);
|
|
76
|
-
return self.__remote_components_turbopack_chunk_loader_promise__[url];
|
|
58
|
+
ns.chunkCache[url] = new Promise((resolve, reject) => {
|
|
59
|
+
fetch(resolvedUrl).then((res) => res.text()).then((code) => {
|
|
60
|
+
const hasTurbopack = import_patterns2.TURBOPACK_GLOBAL_RE.test(code);
|
|
61
|
+
if (hasTurbopack) {
|
|
62
|
+
return handleTurbopackChunk(code, scope, url);
|
|
63
|
+
}
|
|
64
|
+
}).then(resolve).catch((error) => {
|
|
65
|
+
const isProxied = (0, import_protected_rc_fallback.isProxiedUrl)(resolvedUrl);
|
|
66
|
+
if (isProxied) {
|
|
67
|
+
reject((0, import_error.failedProxiedAssetError)("chunk", url, resolvedUrl));
|
|
68
|
+
} else {
|
|
69
|
+
(0, import_logger.warnCrossOriginFetchError)("ChunkLoader", url);
|
|
70
|
+
reject(error);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
return ns.chunkCache[url];
|
|
77
75
|
}
|
|
78
76
|
function createChunkDispatcher() {
|
|
79
77
|
return function __chunk_dispatcher__(chunkId, scriptBundle) {
|
|
@@ -122,19 +120,39 @@ async function handleTurbopackChunk(code, scope, url) {
|
|
|
122
120
|
`//# sourceMappingURL=${new URL(".", new URL(url, scope.url)).href}$1$2.js.map`
|
|
123
121
|
);
|
|
124
122
|
if (!self[`TURBOPACK_${globalKey}`]) {
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
123
|
+
const wrapPush = (target) => {
|
|
124
|
+
const originalPush = target.push;
|
|
125
|
+
if (typeof originalPush !== "function")
|
|
126
|
+
return target;
|
|
127
|
+
target.push = (...items) => {
|
|
128
|
+
for (const item of items) {
|
|
129
|
+
if (Array.isArray(item)) {
|
|
130
|
+
for (const entry of item) {
|
|
131
|
+
scope.turbopackModules.push(entry);
|
|
132
|
+
}
|
|
133
|
+
} else {
|
|
134
|
+
scope.turbopackModules.push(item);
|
|
135
|
+
}
|
|
132
136
|
}
|
|
133
|
-
return
|
|
134
|
-
}
|
|
135
|
-
|
|
137
|
+
return originalPush.apply(target, items);
|
|
138
|
+
};
|
|
139
|
+
return target;
|
|
136
140
|
};
|
|
137
|
-
|
|
141
|
+
const globalProp = `TURBOPACK_${globalKey}`;
|
|
142
|
+
let currentValue = wrapPush([]);
|
|
143
|
+
Object.defineProperty(self, globalProp, {
|
|
144
|
+
get() {
|
|
145
|
+
return currentValue;
|
|
146
|
+
},
|
|
147
|
+
set(newValue) {
|
|
148
|
+
if (newValue && typeof newValue === "object") {
|
|
149
|
+
wrapPush(newValue);
|
|
150
|
+
}
|
|
151
|
+
currentValue = newValue;
|
|
152
|
+
},
|
|
153
|
+
configurable: true,
|
|
154
|
+
enumerable: true
|
|
155
|
+
});
|
|
138
156
|
}
|
|
139
157
|
await new Promise((scriptResolve, scriptReject) => {
|
|
140
158
|
const blob = new Blob([transformedCode], {
|
|
@@ -1 +1 @@
|
|
|
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":["import_patterns"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/runtime/turbopack/chunk-loader.ts"],"sourcesContent":["import { RUNTIME_WEBPACK } from '#internal/runtime/constants';\nimport { getNamespace } from '#internal/runtime/namespace';\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 * - setupRemoteScope (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 const ns = getNamespace();\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 if (ns.chunkCache[url]) {\n logDebug('ChunkLoader', `Cache hit for \"${chunkId}\" (url=\"${url}\")`);\n return ns.chunkCache[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 ns.chunkCache[url] = new Promise((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 return ns.chunkCache[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 as a real Array with a push interceptor.\n // Must be a true Array instance so Next.js 15.x turbopack runtimes whose\n // module-system IIFE guards with `Array.isArray(globalThis.TURBOPACK)`\n // don't bail out after we rewrite the global name.\n //\n // The interceptor captures module entries into scope.turbopackModules —\n // a flat array we control. We use Object.defineProperty to intercept\n // when the turbopack runtime replaces the global with a deferred-loading\n // dispatcher (canary builds), wrapping the replacement's push too.\n //\n // The scope is reused across loads of different components from the same\n // remote (see setupRemoteScope), so subsequent loads accumulate into\n // the same turbopackModules array. Chunk cache deduplication means\n // handleTurbopackChunk only runs once per unique chunk URL — all captured\n // modules remain available for any component that needs them.\n if (!self[`TURBOPACK_${globalKey}`]) {\n const wrapPush = <T extends { push?: (...args: unknown[]) => unknown }>(\n target: T,\n ): T => {\n const originalPush = target.push;\n if (typeof originalPush !== 'function') return target;\n target.push = (...items: unknown[]) => {\n for (const item of items) {\n if (Array.isArray(item)) {\n for (const entry of item) {\n scope.turbopackModules.push(entry);\n }\n } else {\n scope.turbopackModules.push(item);\n }\n }\n return originalPush.apply(target, items);\n };\n return target;\n };\n\n const globalProp = `TURBOPACK_${globalKey}`;\n let currentValue: unknown = wrapPush([] as unknown[]);\n Object.defineProperty(self, globalProp, {\n get() {\n return currentValue;\n },\n set(newValue: unknown) {\n // When the turbopack runtime replaces the array with a dispatcher,\n // wrap the new object's push so we keep capturing module entries.\n if (newValue && typeof newValue === 'object') {\n wrapPush(newValue as { push?: (...args: unknown[]) => unknown });\n }\n currentValue = newValue;\n },\n configurable: true,\n enumerable: true,\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":["import_patterns"]}
|
|
@@ -7,7 +7,7 @@ import '../constants.js';
|
|
|
7
7
|
* TURBOPACK global key) comes from the scope — no global lookups needed.
|
|
8
8
|
*
|
|
9
9
|
* This is the primary chunk loader called directly from:
|
|
10
|
-
* -
|
|
10
|
+
* - setupRemoteScope (initial chunks)
|
|
11
11
|
* - TurbopackContext.l (module-level chunk loading)
|
|
12
12
|
* - handleTurbopackChunk (CHUNK_LIST additional chunks)
|
|
13
13
|
*
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { RUNTIME_WEBPACK } from "#internal/runtime/constants";
|
|
2
|
+
import { getNamespace } from "#internal/runtime/namespace";
|
|
2
3
|
import { collapseDoubleSlashes } from "#internal/runtime/patterns";
|
|
3
4
|
import { isProxiedUrl } from "#internal/runtime/url/protected-rc-fallback";
|
|
4
5
|
import {
|
|
@@ -22,6 +23,7 @@ function loadChunkWithScope(scope, chunkId) {
|
|
|
22
23
|
`loadChunkWithScope: "${chunkId}" (scope: "${scope.scopedName}")`
|
|
23
24
|
);
|
|
24
25
|
const self = globalThis;
|
|
26
|
+
const ns = getNamespace();
|
|
25
27
|
const { bundle, path, prefix } = parseRemoteId(chunkId);
|
|
26
28
|
const remoteRuntime = self.__remote_webpack_require__?.[bundle ?? "default"] ? self.__remote_webpack_require__[bundle ?? "default"]?.type || "webpack" : scope.runtime;
|
|
27
29
|
if (remoteRuntime === RUNTIME_WEBPACK) {
|
|
@@ -32,35 +34,31 @@ function loadChunkWithScope(scope, chunkId) {
|
|
|
32
34
|
if (url.endsWith(".css")) {
|
|
33
35
|
return;
|
|
34
36
|
}
|
|
35
|
-
if (
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
if (self.__remote_components_turbopack_chunk_loader_promise__[url]) {
|
|
39
|
-
return self.__remote_components_turbopack_chunk_loader_promise__[url];
|
|
37
|
+
if (ns.chunkCache[url]) {
|
|
38
|
+
logDebug("ChunkLoader", `Cache hit for "${chunkId}" (url="${url}")`);
|
|
39
|
+
return ns.chunkCache[url];
|
|
40
40
|
}
|
|
41
41
|
const resolvedUrl = scope.resolveClientUrl?.(url) ?? url;
|
|
42
42
|
if (resolvedUrl !== url) {
|
|
43
43
|
logDebug("ChunkLoader", `Proxied chunk URL: "${url}" \u2192 "${resolvedUrl}"`);
|
|
44
44
|
}
|
|
45
|
-
|
|
46
|
-
(
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
);
|
|
63
|
-
return self.__remote_components_turbopack_chunk_loader_promise__[url];
|
|
45
|
+
ns.chunkCache[url] = new Promise((resolve, reject) => {
|
|
46
|
+
fetch(resolvedUrl).then((res) => res.text()).then((code) => {
|
|
47
|
+
const hasTurbopack = TURBOPACK_GLOBAL_RE.test(code);
|
|
48
|
+
if (hasTurbopack) {
|
|
49
|
+
return handleTurbopackChunk(code, scope, url);
|
|
50
|
+
}
|
|
51
|
+
}).then(resolve).catch((error) => {
|
|
52
|
+
const isProxied = isProxiedUrl(resolvedUrl);
|
|
53
|
+
if (isProxied) {
|
|
54
|
+
reject(failedProxiedAssetError("chunk", url, resolvedUrl));
|
|
55
|
+
} else {
|
|
56
|
+
warnCrossOriginFetchError("ChunkLoader", url);
|
|
57
|
+
reject(error);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
return ns.chunkCache[url];
|
|
64
62
|
}
|
|
65
63
|
function createChunkDispatcher() {
|
|
66
64
|
return function __chunk_dispatcher__(chunkId, scriptBundle) {
|
|
@@ -109,19 +107,39 @@ async function handleTurbopackChunk(code, scope, url) {
|
|
|
109
107
|
`//# sourceMappingURL=${new URL(".", new URL(url, scope.url)).href}$1$2.js.map`
|
|
110
108
|
);
|
|
111
109
|
if (!self[`TURBOPACK_${globalKey}`]) {
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
110
|
+
const wrapPush = (target) => {
|
|
111
|
+
const originalPush = target.push;
|
|
112
|
+
if (typeof originalPush !== "function")
|
|
113
|
+
return target;
|
|
114
|
+
target.push = (...items) => {
|
|
115
|
+
for (const item of items) {
|
|
116
|
+
if (Array.isArray(item)) {
|
|
117
|
+
for (const entry of item) {
|
|
118
|
+
scope.turbopackModules.push(entry);
|
|
119
|
+
}
|
|
120
|
+
} else {
|
|
121
|
+
scope.turbopackModules.push(item);
|
|
122
|
+
}
|
|
119
123
|
}
|
|
120
|
-
return
|
|
121
|
-
}
|
|
122
|
-
|
|
124
|
+
return originalPush.apply(target, items);
|
|
125
|
+
};
|
|
126
|
+
return target;
|
|
123
127
|
};
|
|
124
|
-
|
|
128
|
+
const globalProp = `TURBOPACK_${globalKey}`;
|
|
129
|
+
let currentValue = wrapPush([]);
|
|
130
|
+
Object.defineProperty(self, globalProp, {
|
|
131
|
+
get() {
|
|
132
|
+
return currentValue;
|
|
133
|
+
},
|
|
134
|
+
set(newValue) {
|
|
135
|
+
if (newValue && typeof newValue === "object") {
|
|
136
|
+
wrapPush(newValue);
|
|
137
|
+
}
|
|
138
|
+
currentValue = newValue;
|
|
139
|
+
},
|
|
140
|
+
configurable: true,
|
|
141
|
+
enumerable: true
|
|
142
|
+
});
|
|
125
143
|
}
|
|
126
144
|
await new Promise((scriptResolve, scriptReject) => {
|
|
127
145
|
const blob = new Blob([transformedCode], {
|
|
@@ -1 +1 @@
|
|
|
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":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/runtime/turbopack/chunk-loader.ts"],"sourcesContent":["import { RUNTIME_WEBPACK } from '#internal/runtime/constants';\nimport { getNamespace } from '#internal/runtime/namespace';\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 * - setupRemoteScope (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 const ns = getNamespace();\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 if (ns.chunkCache[url]) {\n logDebug('ChunkLoader', `Cache hit for \"${chunkId}\" (url=\"${url}\")`);\n return ns.chunkCache[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 ns.chunkCache[url] = new Promise((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 return ns.chunkCache[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 as a real Array with a push interceptor.\n // Must be a true Array instance so Next.js 15.x turbopack runtimes whose\n // module-system IIFE guards with `Array.isArray(globalThis.TURBOPACK)`\n // don't bail out after we rewrite the global name.\n //\n // The interceptor captures module entries into scope.turbopackModules —\n // a flat array we control. We use Object.defineProperty to intercept\n // when the turbopack runtime replaces the global with a deferred-loading\n // dispatcher (canary builds), wrapping the replacement's push too.\n //\n // The scope is reused across loads of different components from the same\n // remote (see setupRemoteScope), so subsequent loads accumulate into\n // the same turbopackModules array. Chunk cache deduplication means\n // handleTurbopackChunk only runs once per unique chunk URL — all captured\n // modules remain available for any component that needs them.\n if (!self[`TURBOPACK_${globalKey}`]) {\n const wrapPush = <T extends { push?: (...args: unknown[]) => unknown }>(\n target: T,\n ): T => {\n const originalPush = target.push;\n if (typeof originalPush !== 'function') return target;\n target.push = (...items: unknown[]) => {\n for (const item of items) {\n if (Array.isArray(item)) {\n for (const entry of item) {\n scope.turbopackModules.push(entry);\n }\n } else {\n scope.turbopackModules.push(item);\n }\n }\n return originalPush.apply(target, items);\n };\n return target;\n };\n\n const globalProp = `TURBOPACK_${globalKey}`;\n let currentValue: unknown = wrapPush([] as unknown[]);\n Object.defineProperty(self, globalProp, {\n get() {\n return currentValue;\n },\n set(newValue: unknown) {\n // When the turbopack runtime replaces the array with a dispatcher,\n // wrap the new object's push so we keep capturing module entries.\n if (newValue && typeof newValue === 'object') {\n wrapPush(newValue as { push?: (...args: unknown[]) => unknown });\n }\n currentValue = newValue;\n },\n configurable: true,\n enumerable: true,\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,6 +18,7 @@ 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
|
+
findModuleInit: () => findModuleInit,
|
|
21
22
|
handleTurbopackModule: () => handleTurbopackModule,
|
|
22
23
|
requireModule: () => requireModule
|
|
23
24
|
});
|
|
@@ -93,9 +94,17 @@ function findModuleInit(modules, moduleId) {
|
|
|
93
94
|
if (idx >= 0) {
|
|
94
95
|
return flat.slice(idx + 1).find((e) => typeof e === "function");
|
|
95
96
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
97
|
+
for (const entry of flat) {
|
|
98
|
+
if (!entry || typeof entry !== "object")
|
|
99
|
+
continue;
|
|
100
|
+
const obj = entry;
|
|
101
|
+
if (moduleId in obj)
|
|
102
|
+
return obj[moduleId];
|
|
103
|
+
const prefixKey = Object.keys(obj).find((k) => k.startsWith(moduleId));
|
|
104
|
+
if (prefixKey)
|
|
105
|
+
return obj[prefixKey];
|
|
106
|
+
}
|
|
107
|
+
return void 0;
|
|
99
108
|
}
|
|
100
109
|
function createTurbopackContext(scope, exports, moduleExports, modules, moduleInit, id) {
|
|
101
110
|
const scopedRequire = (moduleId) => requireModule(scope, moduleId, (0, import_remote_scope.formatRemoteId)(scope, String(moduleId)));
|
|
@@ -174,7 +183,10 @@ function createTurbopackContext(scope, exports, moduleExports, modules, moduleIn
|
|
|
174
183
|
}
|
|
175
184
|
if (typeof mod !== "object" || mod === null) {
|
|
176
185
|
mod = { default: mod };
|
|
177
|
-
} else if (!("default" in mod) &&
|
|
186
|
+
} else if (!("default" in mod) && // ES module namespace objects have a null prototype, so calling
|
|
187
|
+
// mod.toString() directly throws. Use Object.prototype.toString
|
|
188
|
+
// to safely detect them.
|
|
189
|
+
Object.prototype.toString.call(mod) !== "[object Module]") {
|
|
178
190
|
try {
|
|
179
191
|
mod.default = mod;
|
|
180
192
|
} catch {
|
|
@@ -239,6 +251,7 @@ function createTurbopackContext(scope, exports, moduleExports, modules, moduleIn
|
|
|
239
251
|
}
|
|
240
252
|
// Annotate the CommonJS export names for ESM import in node:
|
|
241
253
|
0 && (module.exports = {
|
|
254
|
+
findModuleInit,
|
|
242
255
|
handleTurbopackModule,
|
|
243
256
|
requireModule
|
|
244
257
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/runtime/turbopack/module.ts"],"sourcesContent":["import { logError } from '#internal/utils/logger';\nimport { loadChunkWithScope } from './chunk-loader';\nimport { formatRemoteId, type RemoteScope } from './remote-scope';\nimport { getSharedModule, getTurbopackModules } from './shared-modules';\n\n/**\n * Function signature for Turbopack module initializers.\n * These functions are generated by Turbopack and initialize module exports.\n */\nexport type TurbopackModuleInit = (\n turbopackContext: TurbopackContext,\n module: { exports: Record<string, unknown> },\n exports: Record<string, unknown>,\n) => void;\n\n/**\n * The context object passed to Turbopack module initializers.\n * This provides the runtime API that modules use for imports, exports, and HMR.\n */\ninterface TurbopackContext {\n /** HMR (Hot Module Replacement) - not implemented for remote components */\n k: {\n register(): void;\n registerExports(): void;\n signature(): (fn: unknown) => unknown;\n };\n /** ESM exports setup */\n s: (\n bindings:\n | Record<string, () => unknown>\n | [...([string, () => unknown] | [string, number, () => unknown])],\n esmId?: string | number,\n ) => void;\n /** Import module */\n i: (importId: string | number) => Record<string, unknown> | undefined;\n /** Require module */\n r: (requireId: string) => unknown;\n /** Value exports */\n v: (value: unknown) => void;\n /** Async module initializer */\n a: (\n mod: (\n handleDeps: unknown,\n setResult: (value: unknown) => void,\n ) => Promise<void>,\n ) => Promise<void>;\n /** Async module loader */\n A: (Aid: string) => Promise<unknown>;\n /**\n * Dynamic import tracking. Called in production chunks after ctx.s() to\n * register async/dynamic module relationships. e.g. t.j(importedMod, 58790)\n */\n j: (module: unknown, esmId?: string | number) => void;\n /** Chunk loader */\n l: (url: string) => Promise<unknown> | undefined;\n /** Global object for this bundle */\n g: unknown;\n /** Module object */\n m: { exports: Record<string, unknown> };\n /** Exports object */\n e: Record<string, unknown>;\n}\n\n/**\n * Turbopack pushes chunks as flat arrays in one of two shapes:\n *\n * Module chunk (common case):\n * [scriptElement, id1, factory1, id2, factory2, ...]\n * - index 0: the script Element (document.currentScript) or undefined\n * - alternating pairs: numeric ID (prod) or path string (dev), then factory function\n *\n * Runtime manifest (bootstrapper only, no module factories):\n * [scriptElement, { otherChunks: [...], runtimeModuleIds: [...] }]\n *\n * Newer Next.js canary versions may also store modules as a plain object\n * { [moduleId]: factory } rather than as an array.\n */\ntype BundleModules =\n | (\n | Element\n | string\n | number\n | TurbopackModuleInit\n | Record<string, TurbopackModuleInit>\n | null\n | undefined\n )[]\n | Record<string, TurbopackModuleInit>\n | undefined;\n\n/**\n * Resolves a module within a scope: checks shared modules first, then\n * falls back to Turbopack module resolution. This is the scope-local\n * equivalent of the global __webpack_require__ dispatcher.\n */\nexport function requireModule(\n scope: RemoteScope,\n moduleId: string | number,\n fullId?: string,\n): unknown {\n const idStr = String(moduleId);\n\n // moduleCache is checked first inside handleTurbopackModule too, but\n // checking here avoids the shared-module lookup on every re-entry.\n if (scope.moduleCache[idStr]) return scope.moduleCache[idStr];\n\n // Shared modules are NOT cached in moduleCache because ctx.s() also\n // uses moduleCache for esmId lookups. Caching the host's frozen module\n // object here would cause ctx.s() to attempt Object.defineProperty on\n // it, failing with \"Cannot redefine property\" for non-configurable\n // exports. Keeping shared modules in their own map avoids the collision.\n const sharedModule = getSharedModule(scope, moduleId);\n if (sharedModule) return sharedModule;\n\n return handleTurbopackModule(\n scope,\n idStr,\n fullId ?? formatRemoteId(scope, idStr),\n );\n}\n\n/**\n * Handles Turbopack module resolution and execution.\n * Finds a module in the Turbopack bundle, executes its initializer with a\n * custom runtime context, and returns the module exports.\n */\nexport function handleTurbopackModule(\n scope: RemoteScope,\n moduleId: string,\n id: string,\n): unknown {\n // Cache check must come before module init lookup. Module initializers\n // re-enter handleTurbopackModule for their own imports, so without this\n // guard circular dependencies would infinite-loop.\n if (scope.moduleCache[moduleId]) {\n return scope.moduleCache[moduleId];\n }\n\n const modules = getTurbopackModules(scope) as BundleModules;\n\n // Log only if bundle is completely missing (critical error)\n if (!modules) {\n logError(\n 'TurbopackModule',\n `TURBOPACK_${scope.globalKey} is undefined (scope: \"${scope.scopedName}\")`,\n );\n }\n\n const moduleInit = findModuleInit(modules, moduleId);\n const exports = {} as Record<string, unknown>;\n const moduleExports = { exports };\n\n if (typeof moduleInit !== 'function') {\n throw new Error(\n `Module ${id} not found in bundle ${scope.name} with id ${moduleId}`,\n );\n }\n\n // store a reference to the module exports in the cache before execution\n // to handle circular dependencies\n scope.moduleCache[moduleId] = moduleExports.exports;\n\n // execute the module initializer with our custom Turbopack context\n moduleInit(\n createTurbopackContext(\n scope,\n exports,\n moduleExports,\n modules,\n moduleInit,\n id,\n ),\n moduleExports,\n exports,\n );\n\n // update the cache with the final exports (may have changed during execution)\n if (scope.moduleCache[moduleId] !== moduleExports.exports) {\n scope.moduleCache[moduleId] = moduleExports.exports;\n }\n\n return moduleExports.exports;\n}\n\n/**\n * Finds the module initializer function in the Turbopack bundle.\n */\nfunction findModuleInit(\n modules: BundleModules,\n moduleId: string,\n): TurbopackModuleInit | undefined {\n if (!modules || typeof modules !== 'object') return;\n\n // Object format: { [id]: factory } (newer Next.js canary builds)\n if (!Array.isArray(modules)) {\n const key =\n moduleId in modules\n ? moduleId\n : Object.keys(modules).find((k) => k.startsWith(moduleId));\n return key !== undefined ? modules[key] : undefined;\n }\n\n const flat = modules.flat();\n\n // Two-pass ID search: exact match first to avoid prefix false positives.\n // The startsWith fallback handles dev-mode IDs with appended qualifiers\n // such as \"[project]/path.tsx [app-client] (ecmascript, async loader)\".\n let idx = flat.findIndex((e) => String(e) === String(moduleId));\n if (idx < 0) {\n idx = flat.findIndex(\n (e) => typeof e === 'string' && e.startsWith(moduleId),\n );\n }\n if (idx >= 0) {\n // Factory is the first function entry that follows the module ID\n return flat\n .slice(idx + 1)\n .find((e): e is TurbopackModuleInit => typeof e === 'function');\n }\n\n // Embedded object map: entries of the form { [moduleId]: factory }\n return flat.find((e): e is Record<string, TurbopackModuleInit> =>\n Boolean(e && typeof e === 'object' && moduleId in (e as object)),\n )?.[moduleId];\n}\n\n/**\n * Creates the Turbopack context object that provides the runtime API for modules.\n * All context methods close over the scope directly — no global dispatch needed\n * for internal module-to-module calls.\n */\nfunction createTurbopackContext(\n scope: RemoteScope,\n exports: Record<string, unknown>,\n moduleExports: { exports: Record<string, unknown> },\n modules: BundleModules,\n moduleInit: TurbopackModuleInit,\n id: string,\n): TurbopackContext {\n /** Scope-local require: shared modules → turbopack module resolution. */\n const scopedRequire = (moduleId: string | number): unknown =>\n requireModule(scope, moduleId, formatRemoteId(scope, String(moduleId)));\n\n return {\n // HMR not implemented for Remote Components\n k: {\n register() {\n // omit\n },\n registerExports() {\n // omit\n },\n signature() {\n return (fn: unknown) => fn;\n },\n },\n\n // ESM exports setup\n s(\n bindings:\n | Record<string, () => unknown>\n | [...([string, () => unknown] | [string, number, () => unknown])],\n esmId?: string | number,\n ) {\n let mod = exports;\n if (typeof esmId === 'string' || typeof esmId === 'number') {\n if (!scope.moduleCache[esmId]) {\n scope.moduleCache[esmId] = {} as Record<string, unknown>;\n }\n mod = scope.moduleCache[esmId] as Record<string, unknown>;\n }\n\n Object.defineProperty(mod, '__esModule', { value: true });\n if (Array.isArray(bindings)) {\n let i = 0;\n while (i < bindings.length) {\n const propName = bindings[i++] as string;\n const tagOrFunc = bindings[i++];\n if (typeof tagOrFunc === 'number') {\n Object.defineProperty(mod, propName, {\n value: bindings[i++],\n enumerable: true,\n writable: false,\n });\n } else {\n const getterFn = tagOrFunc as () => unknown;\n if (typeof bindings[i] === 'function') {\n const setterFn = bindings[i++] as (v: unknown) => unknown;\n Object.defineProperty(mod, propName, {\n get: getterFn,\n set: setterFn,\n enumerable: true,\n });\n } else {\n Object.defineProperty(mod, propName, {\n get: getterFn,\n enumerable: true,\n });\n }\n }\n }\n }\n },\n\n // import — resolves directly via scope, no global dispatch\n i(importId: string | number) {\n let mod: Record<string, unknown> | undefined;\n if (typeof importId === 'string') {\n // parse export syntax if present (e.g., \"module <export foo as bar>\")\n const { exportSource, exportName } =\n /\\s+<export (?<exportSource>.*?) as (?<exportName>.*?)>$/.exec(\n importId,\n )?.groups ?? {};\n const normalizedId = importId.replace(\n /\\s+<export(?<specifier>.*)>$/,\n '',\n );\n mod = scopedRequire(normalizedId) as\n | Record<string, unknown>\n | undefined;\n // map the requested export to the module exports\n if (\n mod &&\n exportSource &&\n exportName &&\n (exportSource === '*' || typeof mod[exportSource] !== 'undefined') &&\n typeof mod[exportName] === 'undefined'\n ) {\n if (exportSource === '*') {\n mod[exportName] = mod;\n } else {\n mod[exportName] = mod[exportSource];\n }\n }\n } else {\n mod = scopedRequire(importId) as Record<string, unknown> | undefined;\n }\n\n if (typeof mod !== 'object' || mod === null) {\n mod = { default: mod };\n } else if (!('default' in mod) && mod.toString() !== '[object Module]') {\n try {\n mod.default = mod;\n } catch {\n // ignore if mod is not extensible\n }\n }\n return mod;\n },\n\n // require — resolves directly via scope\n r(requireId: string) {\n return scopedRequire(requireId);\n },\n\n // value exports\n v(value: unknown) {\n if (typeof value === 'function') {\n exports.default = value((vid: string | number) => scopedRequire(vid));\n } else {\n moduleExports.exports = value as Record<string, unknown>;\n }\n },\n\n // async module initializer\n async a(\n mod: (\n handleDeps: unknown,\n setResult: (value: unknown) => void,\n ) => Promise<void>,\n ) {\n let result;\n await mod(\n () => {\n // not implemented\n },\n (value) => (result = value),\n );\n exports.default = result;\n },\n\n // async module loader — resolves directly via scope\n async A(Aid: string) {\n const mod = scopedRequire(Aid) as {\n default: (\n parentImport: (parentId: string) => unknown,\n ) => Promise<unknown>;\n };\n return mod.default((parentId: string) => scopedRequire(parentId));\n },\n\n // dynamic import tracking — no-op for remote components\n j() {\n // omit\n },\n\n // chunk loader — loads directly via scope, no global dispatch\n l(url: string) {\n // find the script tag that loaded the current module to determine base URL\n const flatModules = Array.isArray(modules) ? modules : [];\n const moduleInitIndex = flatModules.indexOf(moduleInit);\n if (moduleInitIndex !== -1) {\n const scriptIndex = flatModules\n .slice(0, moduleInitIndex)\n .findLastIndex((bundleEntry) => bundleEntry instanceof Element);\n if (scriptIndex !== -1) {\n const script = flatModules[scriptIndex] as HTMLScriptElement;\n const scriptSrc = script.getAttribute('data-turbopack-src') || '';\n const nextIndex = scriptSrc.indexOf('/_next');\n const baseUrl = nextIndex !== -1 ? scriptSrc.slice(0, nextIndex) : '';\n const chunkUrl = `${baseUrl}/_next/${url}`;\n return loadChunkWithScope(scope, formatRemoteId(scope, chunkUrl));\n }\n }\n throw new Error(\n `Failed to load Turbopack chunk \"${url}\" for module \"${id}\". Check the URL is correct.`,\n );\n },\n\n // globalThis substitute shared across all modules in this scope\n g: scope.moduleGlobal,\n m: moduleExports,\n e: exports,\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/runtime/turbopack/module.ts"],"sourcesContent":["import { logError } from '#internal/utils/logger';\nimport { loadChunkWithScope } from './chunk-loader';\nimport { formatRemoteId, type RemoteScope } from './remote-scope';\nimport { getSharedModule, getTurbopackModules } from './shared-modules';\n\n/**\n * Function signature for Turbopack module initializers.\n * These functions are generated by Turbopack and initialize module exports.\n */\nexport type TurbopackModuleInit = (\n turbopackContext: TurbopackContext,\n module: { exports: Record<string, unknown> },\n exports: Record<string, unknown>,\n) => void;\n\n/**\n * The context object passed to Turbopack module initializers.\n * This provides the runtime API that modules use for imports, exports, and HMR.\n */\ninterface TurbopackContext {\n /** HMR (Hot Module Replacement) - not implemented for remote components */\n k: {\n register(): void;\n registerExports(): void;\n signature(): (fn: unknown) => unknown;\n };\n /** ESM exports setup */\n s: (\n bindings:\n | Record<string, () => unknown>\n | [...([string, () => unknown] | [string, number, () => unknown])],\n esmId?: string | number,\n ) => void;\n /** Import module */\n i: (importId: string | number) => Record<string, unknown> | undefined;\n /** Require module */\n r: (requireId: string) => unknown;\n /** Value exports */\n v: (value: unknown) => void;\n /** Async module initializer */\n a: (\n mod: (\n handleDeps: unknown,\n setResult: (value: unknown) => void,\n ) => Promise<void>,\n ) => Promise<void>;\n /** Async module loader */\n A: (Aid: string) => Promise<unknown>;\n /**\n * Dynamic import tracking. Called in production chunks after ctx.s() to\n * register async/dynamic module relationships. e.g. t.j(importedMod, 58790)\n */\n j: (module: unknown, esmId?: string | number) => void;\n /** Chunk loader */\n l: (url: string) => Promise<unknown> | undefined;\n /** Global object for this bundle */\n g: unknown;\n /** Module object */\n m: { exports: Record<string, unknown> };\n /** Exports object */\n e: Record<string, unknown>;\n}\n\n/**\n * Turbopack pushes chunks as flat arrays in one of two shapes:\n *\n * Module chunk (common case):\n * [scriptElement, id1, factory1, id2, factory2, ...]\n * - index 0: the script Element (document.currentScript) or undefined\n * - alternating pairs: numeric ID (prod) or path string (dev), then factory function\n *\n * Runtime manifest (bootstrapper only, no module factories):\n * [scriptElement, { otherChunks: [...], runtimeModuleIds: [...] }]\n *\n * Newer Next.js canary versions may also store modules as a plain object\n * { [moduleId]: factory } rather than as an array.\n */\ntype BundleModules =\n | (\n | Element\n | string\n | number\n | TurbopackModuleInit\n | Record<string, TurbopackModuleInit>\n | null\n | undefined\n )[]\n | Record<string, TurbopackModuleInit>\n | undefined;\n\n/**\n * Resolves a module within a scope: checks shared modules first, then\n * falls back to Turbopack module resolution. This is the scope-local\n * equivalent of the global __webpack_require__ dispatcher.\n */\nexport function requireModule(\n scope: RemoteScope,\n moduleId: string | number,\n fullId?: string,\n): unknown {\n const idStr = String(moduleId);\n\n // moduleCache is checked first inside handleTurbopackModule too, but\n // checking here avoids the shared-module lookup on every re-entry.\n if (scope.moduleCache[idStr]) return scope.moduleCache[idStr];\n\n // Shared modules are NOT cached in moduleCache because ctx.s() also\n // uses moduleCache for esmId lookups. Caching the host's frozen module\n // object here would cause ctx.s() to attempt Object.defineProperty on\n // it, failing with \"Cannot redefine property\" for non-configurable\n // exports. Keeping shared modules in their own map avoids the collision.\n const sharedModule = getSharedModule(scope, moduleId);\n if (sharedModule) return sharedModule;\n\n return handleTurbopackModule(\n scope,\n idStr,\n fullId ?? formatRemoteId(scope, idStr),\n );\n}\n\n/**\n * Handles Turbopack module resolution and execution.\n * Finds a module in the Turbopack bundle, executes its initializer with a\n * custom runtime context, and returns the module exports.\n */\nexport function handleTurbopackModule(\n scope: RemoteScope,\n moduleId: string,\n id: string,\n): unknown {\n // Cache check must come before module init lookup. Module initializers\n // re-enter handleTurbopackModule for their own imports, so without this\n // guard circular dependencies would infinite-loop.\n if (scope.moduleCache[moduleId]) {\n return scope.moduleCache[moduleId];\n }\n\n const modules = getTurbopackModules(scope) as BundleModules;\n\n // Log only if bundle is completely missing (critical error)\n if (!modules) {\n logError(\n 'TurbopackModule',\n `TURBOPACK_${scope.globalKey} is undefined (scope: \"${scope.scopedName}\")`,\n );\n }\n\n const moduleInit = findModuleInit(modules, moduleId);\n const exports = {} as Record<string, unknown>;\n const moduleExports = { exports };\n\n if (typeof moduleInit !== 'function') {\n throw new Error(\n `Module ${id} not found in bundle ${scope.name} with id ${moduleId}`,\n );\n }\n\n // store a reference to the module exports in the cache before execution\n // to handle circular dependencies\n scope.moduleCache[moduleId] = moduleExports.exports;\n\n // execute the module initializer with our custom Turbopack context\n moduleInit(\n createTurbopackContext(\n scope,\n exports,\n moduleExports,\n modules,\n moduleInit,\n id,\n ),\n moduleExports,\n exports,\n );\n\n // update the cache with the final exports (may have changed during execution)\n if (scope.moduleCache[moduleId] !== moduleExports.exports) {\n scope.moduleCache[moduleId] = moduleExports.exports;\n }\n\n return moduleExports.exports;\n}\n\n/**\n * Finds the module initializer function for a given ID in the Turbopack bundle.\n * Handles all bundle shapes: flat array, object map, nested arrays, and\n * embedded object entries within arrays. Performs exact match first, then\n * falls back to startsWith for dev-mode IDs with appended qualifiers.\n */\nexport function findModuleInit(\n modules: BundleModules | unknown[] | undefined,\n moduleId: string,\n): TurbopackModuleInit | undefined {\n if (!modules || typeof modules !== 'object') return;\n\n // Object format: { [id]: factory } (newer Next.js canary builds)\n if (!Array.isArray(modules)) {\n const key =\n moduleId in modules\n ? moduleId\n : Object.keys(modules).find((k) => k.startsWith(moduleId));\n return key !== undefined ? modules[key] : undefined;\n }\n\n const flat = modules.flat();\n\n // Two-pass ID search: exact match first to avoid prefix false positives.\n // The startsWith fallback handles dev-mode IDs with appended qualifiers\n // such as \"[project]/path.tsx [app-client] (ecmascript, async loader)\".\n let idx = flat.findIndex((e) => String(e) === String(moduleId));\n if (idx < 0) {\n idx = flat.findIndex(\n (e) => typeof e === 'string' && e.startsWith(moduleId),\n );\n }\n if (idx >= 0) {\n // Factory is the first function entry that follows the module ID\n return flat\n .slice(idx + 1)\n .find((e): e is TurbopackModuleInit => typeof e === 'function');\n }\n\n // Embedded object map: entries of the form { [moduleId]: factory }\n for (const entry of flat) {\n if (!entry || typeof entry !== 'object') continue;\n const obj = entry as Record<string, TurbopackModuleInit>;\n if (moduleId in obj) return obj[moduleId];\n const prefixKey = Object.keys(obj).find((k) => k.startsWith(moduleId));\n if (prefixKey) return obj[prefixKey];\n }\n return undefined;\n}\n\n/**\n * Creates the Turbopack context object that provides the runtime API for modules.\n * All context methods close over the scope directly — no global dispatch needed\n * for internal module-to-module calls.\n */\nfunction createTurbopackContext(\n scope: RemoteScope,\n exports: Record<string, unknown>,\n moduleExports: { exports: Record<string, unknown> },\n modules: BundleModules,\n moduleInit: TurbopackModuleInit,\n id: string,\n): TurbopackContext {\n /** Scope-local require: shared modules → turbopack module resolution. */\n const scopedRequire = (moduleId: string | number): unknown =>\n requireModule(scope, moduleId, formatRemoteId(scope, String(moduleId)));\n\n return {\n // HMR not implemented for Remote Components\n k: {\n register() {\n // omit\n },\n registerExports() {\n // omit\n },\n signature() {\n return (fn: unknown) => fn;\n },\n },\n\n // ESM exports setup\n s(\n bindings:\n | Record<string, () => unknown>\n | [...([string, () => unknown] | [string, number, () => unknown])],\n esmId?: string | number,\n ) {\n let mod = exports;\n if (typeof esmId === 'string' || typeof esmId === 'number') {\n if (!scope.moduleCache[esmId]) {\n scope.moduleCache[esmId] = {} as Record<string, unknown>;\n }\n mod = scope.moduleCache[esmId] as Record<string, unknown>;\n }\n\n Object.defineProperty(mod, '__esModule', { value: true });\n if (Array.isArray(bindings)) {\n let i = 0;\n while (i < bindings.length) {\n const propName = bindings[i++] as string;\n const tagOrFunc = bindings[i++];\n if (typeof tagOrFunc === 'number') {\n Object.defineProperty(mod, propName, {\n value: bindings[i++],\n enumerable: true,\n writable: false,\n });\n } else {\n const getterFn = tagOrFunc as () => unknown;\n if (typeof bindings[i] === 'function') {\n const setterFn = bindings[i++] as (v: unknown) => unknown;\n Object.defineProperty(mod, propName, {\n get: getterFn,\n set: setterFn,\n enumerable: true,\n });\n } else {\n Object.defineProperty(mod, propName, {\n get: getterFn,\n enumerable: true,\n });\n }\n }\n }\n }\n },\n\n // import — resolves directly via scope, no global dispatch\n i(importId: string | number) {\n let mod: Record<string, unknown> | undefined;\n if (typeof importId === 'string') {\n // parse export syntax if present (e.g., \"module <export foo as bar>\")\n const { exportSource, exportName } =\n /\\s+<export (?<exportSource>.*?) as (?<exportName>.*?)>$/.exec(\n importId,\n )?.groups ?? {};\n const normalizedId = importId.replace(\n /\\s+<export(?<specifier>.*)>$/,\n '',\n );\n mod = scopedRequire(normalizedId) as\n | Record<string, unknown>\n | undefined;\n // map the requested export to the module exports\n if (\n mod &&\n exportSource &&\n exportName &&\n (exportSource === '*' || typeof mod[exportSource] !== 'undefined') &&\n typeof mod[exportName] === 'undefined'\n ) {\n if (exportSource === '*') {\n mod[exportName] = mod;\n } else {\n mod[exportName] = mod[exportSource];\n }\n }\n } else {\n mod = scopedRequire(importId) as Record<string, unknown> | undefined;\n }\n\n if (typeof mod !== 'object' || mod === null) {\n mod = { default: mod };\n } else if (\n !('default' in mod) &&\n // ES module namespace objects have a null prototype, so calling\n // mod.toString() directly throws. Use Object.prototype.toString\n // to safely detect them.\n Object.prototype.toString.call(mod) !== '[object Module]'\n ) {\n try {\n mod.default = mod;\n } catch {\n // ignore if mod is not extensible\n }\n }\n return mod;\n },\n\n // require — resolves directly via scope\n r(requireId: string) {\n return scopedRequire(requireId);\n },\n\n // value exports\n v(value: unknown) {\n if (typeof value === 'function') {\n exports.default = value((vid: string | number) => scopedRequire(vid));\n } else {\n moduleExports.exports = value as Record<string, unknown>;\n }\n },\n\n // async module initializer\n async a(\n mod: (\n handleDeps: unknown,\n setResult: (value: unknown) => void,\n ) => Promise<void>,\n ) {\n let result;\n await mod(\n () => {\n // not implemented\n },\n (value) => (result = value),\n );\n exports.default = result;\n },\n\n // async module loader — resolves directly via scope\n async A(Aid: string) {\n const mod = scopedRequire(Aid) as {\n default: (\n parentImport: (parentId: string) => unknown,\n ) => Promise<unknown>;\n };\n return mod.default((parentId: string) => scopedRequire(parentId));\n },\n\n // dynamic import tracking — no-op for remote components\n j() {\n // omit\n },\n\n // chunk loader — loads directly via scope, no global dispatch\n l(url: string) {\n // find the script tag that loaded the current module to determine base URL\n const flatModules = Array.isArray(modules) ? modules : [];\n const moduleInitIndex = flatModules.indexOf(moduleInit);\n if (moduleInitIndex !== -1) {\n const scriptIndex = flatModules\n .slice(0, moduleInitIndex)\n .findLastIndex((bundleEntry) => bundleEntry instanceof Element);\n if (scriptIndex !== -1) {\n const script = flatModules[scriptIndex] as HTMLScriptElement;\n const scriptSrc = script.getAttribute('data-turbopack-src') || '';\n const nextIndex = scriptSrc.indexOf('/_next');\n const baseUrl = nextIndex !== -1 ? scriptSrc.slice(0, nextIndex) : '';\n const chunkUrl = `${baseUrl}/_next/${url}`;\n return loadChunkWithScope(scope, formatRemoteId(scope, chunkUrl));\n }\n }\n throw new Error(\n `Failed to load Turbopack chunk \"${url}\" for module \"${id}\". Check the URL is correct.`,\n );\n },\n\n // globalThis substitute shared across all modules in this scope\n g: scope.moduleGlobal,\n m: moduleExports,\n e: exports,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAyB;AACzB,0BAAmC;AACnC,0BAAiD;AACjD,4BAAqD;AA4F9C,SAAS,cACd,OACA,UACA,QACS;AACT,QAAM,QAAQ,OAAO,QAAQ;AAI7B,MAAI,MAAM,YAAY,KAAK;AAAG,WAAO,MAAM,YAAY,KAAK;AAO5D,QAAM,mBAAe,uCAAgB,OAAO,QAAQ;AACpD,MAAI;AAAc,WAAO;AAEzB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,cAAU,oCAAe,OAAO,KAAK;AAAA,EACvC;AACF;AAOO,SAAS,sBACd,OACA,UACA,IACS;AAIT,MAAI,MAAM,YAAY,QAAQ,GAAG;AAC/B,WAAO,MAAM,YAAY,QAAQ;AAAA,EACnC;AAEA,QAAM,cAAU,2CAAoB,KAAK;AAGzC,MAAI,CAAC,SAAS;AACZ;AAAA,MACE;AAAA,MACA,aAAa,MAAM,mCAAmC,MAAM;AAAA,IAC9D;AAAA,EACF;AAEA,QAAM,aAAa,eAAe,SAAS,QAAQ;AACnD,QAAM,UAAU,CAAC;AACjB,QAAM,gBAAgB,EAAE,QAAQ;AAEhC,MAAI,OAAO,eAAe,YAAY;AACpC,UAAM,IAAI;AAAA,MACR,UAAU,0BAA0B,MAAM,gBAAgB;AAAA,IAC5D;AAAA,EACF;AAIA,QAAM,YAAY,QAAQ,IAAI,cAAc;AAG5C;AAAA,IACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,MAAI,MAAM,YAAY,QAAQ,MAAM,cAAc,SAAS;AACzD,UAAM,YAAY,QAAQ,IAAI,cAAc;AAAA,EAC9C;AAEA,SAAO,cAAc;AACvB;AAQO,SAAS,eACd,SACA,UACiC;AACjC,MAAI,CAAC,WAAW,OAAO,YAAY;AAAU;AAG7C,MAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B,UAAM,MACJ,YAAY,UACR,WACA,OAAO,KAAK,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,QAAQ,CAAC;AAC7D,WAAO,QAAQ,SAAY,QAAQ,GAAG,IAAI;AAAA,EAC5C;AAEA,QAAM,OAAO,QAAQ,KAAK;AAK1B,MAAI,MAAM,KAAK,UAAU,CAAC,MAAM,OAAO,CAAC,MAAM,OAAO,QAAQ,CAAC;AAC9D,MAAI,MAAM,GAAG;AACX,UAAM,KAAK;AAAA,MACT,CAAC,MAAM,OAAO,MAAM,YAAY,EAAE,WAAW,QAAQ;AAAA,IACvD;AAAA,EACF;AACA,MAAI,OAAO,GAAG;AAEZ,WAAO,KACJ,MAAM,MAAM,CAAC,EACb,KAAK,CAAC,MAAgC,OAAO,MAAM,UAAU;AAAA,EAClE;AAGA,aAAW,SAAS,MAAM;AACxB,QAAI,CAAC,SAAS,OAAO,UAAU;AAAU;AACzC,UAAM,MAAM;AACZ,QAAI,YAAY;AAAK,aAAO,IAAI,QAAQ;AACxC,UAAM,YAAY,OAAO,KAAK,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,QAAQ,CAAC;AACrE,QAAI;AAAW,aAAO,IAAI,SAAS;AAAA,EACrC;AACA,SAAO;AACT;AAOA,SAAS,uBACP,OACA,SACA,eACA,SACA,YACA,IACkB;AAElB,QAAM,gBAAgB,CAAC,aACrB,cAAc,OAAO,cAAU,oCAAe,OAAO,OAAO,QAAQ,CAAC,CAAC;AAExE,SAAO;AAAA;AAAA,IAEL,GAAG;AAAA,MACD,WAAW;AAAA,MAEX;AAAA,MACA,kBAAkB;AAAA,MAElB;AAAA,MACA,YAAY;AACV,eAAO,CAAC,OAAgB;AAAA,MAC1B;AAAA,IACF;AAAA;AAAA,IAGA,EACE,UAGA,OACA;AACA,UAAI,MAAM;AACV,UAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;AAC1D,YAAI,CAAC,MAAM,YAAY,KAAK,GAAG;AAC7B,gBAAM,YAAY,KAAK,IAAI,CAAC;AAAA,QAC9B;AACA,cAAM,MAAM,YAAY,KAAK;AAAA,MAC/B;AAEA,aAAO,eAAe,KAAK,cAAc,EAAE,OAAO,KAAK,CAAC;AACxD,UAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,YAAI,IAAI;AACR,eAAO,IAAI,SAAS,QAAQ;AAC1B,gBAAM,WAAW,SAAS,GAAG;AAC7B,gBAAM,YAAY,SAAS,GAAG;AAC9B,cAAI,OAAO,cAAc,UAAU;AACjC,mBAAO,eAAe,KAAK,UAAU;AAAA,cACnC,OAAO,SAAS,GAAG;AAAA,cACnB,YAAY;AAAA,cACZ,UAAU;AAAA,YACZ,CAAC;AAAA,UACH,OAAO;AACL,kBAAM,WAAW;AACjB,gBAAI,OAAO,SAAS,CAAC,MAAM,YAAY;AACrC,oBAAM,WAAW,SAAS,GAAG;AAC7B,qBAAO,eAAe,KAAK,UAAU;AAAA,gBACnC,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,YAAY;AAAA,cACd,CAAC;AAAA,YACH,OAAO;AACL,qBAAO,eAAe,KAAK,UAAU;AAAA,gBACnC,KAAK;AAAA,gBACL,YAAY;AAAA,cACd,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA,IAGA,EAAE,UAA2B;AAC3B,UAAI;AACJ,UAAI,OAAO,aAAa,UAAU;AAEhC,cAAM,EAAE,cAAc,WAAW,IAC/B,0DAA0D;AAAA,UACxD;AAAA,QACF,GAAG,UAAU,CAAC;AAChB,cAAM,eAAe,SAAS;AAAA,UAC5B;AAAA,UACA;AAAA,QACF;AACA,cAAM,cAAc,YAAY;AAIhC,YACE,OACA,gBACA,eACC,iBAAiB,OAAO,OAAO,IAAI,YAAY,MAAM,gBACtD,OAAO,IAAI,UAAU,MAAM,aAC3B;AACA,cAAI,iBAAiB,KAAK;AACxB,gBAAI,UAAU,IAAI;AAAA,UACpB,OAAO;AACL,gBAAI,UAAU,IAAI,IAAI,YAAY;AAAA,UACpC;AAAA,QACF;AAAA,MACF,OAAO;AACL,cAAM,cAAc,QAAQ;AAAA,MAC9B;AAEA,UAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAC3C,cAAM,EAAE,SAAS,IAAI;AAAA,MACvB,WACE,EAAE,aAAa;AAAA;AAAA;AAAA,MAIf,OAAO,UAAU,SAAS,KAAK,GAAG,MAAM,mBACxC;AACA,YAAI;AACF,cAAI,UAAU;AAAA,QAChB,QAAE;AAAA,QAEF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA;AAAA,IAGA,EAAE,WAAmB;AACnB,aAAO,cAAc,SAAS;AAAA,IAChC;AAAA;AAAA,IAGA,EAAE,OAAgB;AAChB,UAAI,OAAO,UAAU,YAAY;AAC/B,gBAAQ,UAAU,MAAM,CAAC,QAAyB,cAAc,GAAG,CAAC;AAAA,MACtE,OAAO;AACL,sBAAc,UAAU;AAAA,MAC1B;AAAA,IACF;AAAA;AAAA,IAGA,MAAM,EACJ,KAIA;AACA,UAAI;AACJ,YAAM;AAAA,QACJ,MAAM;AAAA,QAEN;AAAA,QACA,CAAC,UAAW,SAAS;AAAA,MACvB;AACA,cAAQ,UAAU;AAAA,IACpB;AAAA;AAAA,IAGA,MAAM,EAAE,KAAa;AACnB,YAAM,MAAM,cAAc,GAAG;AAK7B,aAAO,IAAI,QAAQ,CAAC,aAAqB,cAAc,QAAQ,CAAC;AAAA,IAClE;AAAA;AAAA,IAGA,IAAI;AAAA,IAEJ;AAAA;AAAA,IAGA,EAAE,KAAa;AAEb,YAAM,cAAc,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC;AACxD,YAAM,kBAAkB,YAAY,QAAQ,UAAU;AACtD,UAAI,oBAAoB,IAAI;AAC1B,cAAM,cAAc,YACjB,MAAM,GAAG,eAAe,EACxB,cAAc,CAAC,gBAAgB,uBAAuB,OAAO;AAChE,YAAI,gBAAgB,IAAI;AACtB,gBAAM,SAAS,YAAY,WAAW;AACtC,gBAAM,YAAY,OAAO,aAAa,oBAAoB,KAAK;AAC/D,gBAAM,YAAY,UAAU,QAAQ,QAAQ;AAC5C,gBAAM,UAAU,cAAc,KAAK,UAAU,MAAM,GAAG,SAAS,IAAI;AACnE,gBAAM,WAAW,GAAG,iBAAiB;AACrC,qBAAO,wCAAmB,WAAO,oCAAe,OAAO,QAAQ,CAAC;AAAA,QAClE;AAAA,MACF;AACA,YAAM,IAAI;AAAA,QACR,mCAAmC,oBAAoB;AAAA,MACzD;AAAA,IACF;AAAA;AAAA,IAGA,GAAG,MAAM;AAAA,IACT,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;","names":[]}
|
|
@@ -48,6 +48,21 @@ interface TurbopackContext {
|
|
|
48
48
|
/** Exports object */
|
|
49
49
|
e: Record<string, unknown>;
|
|
50
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Turbopack pushes chunks as flat arrays in one of two shapes:
|
|
53
|
+
*
|
|
54
|
+
* Module chunk (common case):
|
|
55
|
+
* [scriptElement, id1, factory1, id2, factory2, ...]
|
|
56
|
+
* - index 0: the script Element (document.currentScript) or undefined
|
|
57
|
+
* - alternating pairs: numeric ID (prod) or path string (dev), then factory function
|
|
58
|
+
*
|
|
59
|
+
* Runtime manifest (bootstrapper only, no module factories):
|
|
60
|
+
* [scriptElement, { otherChunks: [...], runtimeModuleIds: [...] }]
|
|
61
|
+
*
|
|
62
|
+
* Newer Next.js canary versions may also store modules as a plain object
|
|
63
|
+
* { [moduleId]: factory } rather than as an array.
|
|
64
|
+
*/
|
|
65
|
+
type BundleModules = (Element | string | number | TurbopackModuleInit | Record<string, TurbopackModuleInit> | null | undefined)[] | Record<string, TurbopackModuleInit> | undefined;
|
|
51
66
|
/**
|
|
52
67
|
* Resolves a module within a scope: checks shared modules first, then
|
|
53
68
|
* falls back to Turbopack module resolution. This is the scope-local
|
|
@@ -60,5 +75,12 @@ declare function requireModule(scope: RemoteScope, moduleId: string | number, fu
|
|
|
60
75
|
* custom runtime context, and returns the module exports.
|
|
61
76
|
*/
|
|
62
77
|
declare function handleTurbopackModule(scope: RemoteScope, moduleId: string, id: string): unknown;
|
|
78
|
+
/**
|
|
79
|
+
* Finds the module initializer function for a given ID in the Turbopack bundle.
|
|
80
|
+
* Handles all bundle shapes: flat array, object map, nested arrays, and
|
|
81
|
+
* embedded object entries within arrays. Performs exact match first, then
|
|
82
|
+
* falls back to startsWith for dev-mode IDs with appended qualifiers.
|
|
83
|
+
*/
|
|
84
|
+
declare function findModuleInit(modules: BundleModules | unknown[] | undefined, moduleId: string): TurbopackModuleInit | undefined;
|
|
63
85
|
|
|
64
|
-
export { TurbopackModuleInit, handleTurbopackModule, requireModule };
|
|
86
|
+
export { TurbopackModuleInit, findModuleInit, handleTurbopackModule, requireModule };
|
|
@@ -69,9 +69,17 @@ function findModuleInit(modules, moduleId) {
|
|
|
69
69
|
if (idx >= 0) {
|
|
70
70
|
return flat.slice(idx + 1).find((e) => typeof e === "function");
|
|
71
71
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
72
|
+
for (const entry of flat) {
|
|
73
|
+
if (!entry || typeof entry !== "object")
|
|
74
|
+
continue;
|
|
75
|
+
const obj = entry;
|
|
76
|
+
if (moduleId in obj)
|
|
77
|
+
return obj[moduleId];
|
|
78
|
+
const prefixKey = Object.keys(obj).find((k) => k.startsWith(moduleId));
|
|
79
|
+
if (prefixKey)
|
|
80
|
+
return obj[prefixKey];
|
|
81
|
+
}
|
|
82
|
+
return void 0;
|
|
75
83
|
}
|
|
76
84
|
function createTurbopackContext(scope, exports, moduleExports, modules, moduleInit, id) {
|
|
77
85
|
const scopedRequire = (moduleId) => requireModule(scope, moduleId, formatRemoteId(scope, String(moduleId)));
|
|
@@ -150,7 +158,10 @@ function createTurbopackContext(scope, exports, moduleExports, modules, moduleIn
|
|
|
150
158
|
}
|
|
151
159
|
if (typeof mod !== "object" || mod === null) {
|
|
152
160
|
mod = { default: mod };
|
|
153
|
-
} else if (!("default" in mod) &&
|
|
161
|
+
} else if (!("default" in mod) && // ES module namespace objects have a null prototype, so calling
|
|
162
|
+
// mod.toString() directly throws. Use Object.prototype.toString
|
|
163
|
+
// to safely detect them.
|
|
164
|
+
Object.prototype.toString.call(mod) !== "[object Module]") {
|
|
154
165
|
try {
|
|
155
166
|
mod.default = mod;
|
|
156
167
|
} catch {
|
|
@@ -214,6 +225,7 @@ function createTurbopackContext(scope, exports, moduleExports, modules, moduleIn
|
|
|
214
225
|
};
|
|
215
226
|
}
|
|
216
227
|
export {
|
|
228
|
+
findModuleInit,
|
|
217
229
|
handleTurbopackModule,
|
|
218
230
|
requireModule
|
|
219
231
|
};
|