remote-components 0.4.2 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-KVQI55BZ.cjs → chunk-2W7JBTID.cjs} +37 -36
- package/dist/chunk-2W7JBTID.cjs.map +1 -0
- package/dist/{chunk-TZT7DLO5.cjs → chunk-3AX5WLZD.cjs} +4 -4
- package/dist/{chunk-4O3EOST4.cjs → chunk-4AH3KXDW.cjs} +27 -27
- package/dist/{chunk-MTMDXJLM.js → chunk-4NW46ZVD.js} +410 -146
- package/dist/chunk-4NW46ZVD.js.map +1 -0
- package/dist/{chunk-SAGYPGIQ.js → chunk-55TEMSB5.js} +92 -23
- package/dist/chunk-55TEMSB5.js.map +1 -0
- package/dist/{chunk-RLI4YTBJ.cjs → chunk-7XXO2DLF.cjs} +96 -27
- package/dist/chunk-7XXO2DLF.cjs.map +1 -0
- package/dist/{chunk-RUWR74XQ.cjs → chunk-BBXVML3D.cjs} +1 -1
- package/dist/{chunk-RUWR74XQ.cjs.map → chunk-BBXVML3D.cjs.map} +1 -1
- package/dist/{chunk-42TVDI3G.cjs → chunk-C5EYU7EQ.cjs} +7 -7
- package/dist/{chunk-CC3WOSDO.js → chunk-DGZVFKSQ.js} +10 -9
- package/dist/chunk-DGZVFKSQ.js.map +1 -0
- package/dist/{chunk-AKOMV2UF.js → chunk-HL6BL5HY.js} +3 -3
- package/dist/chunk-HMB3SIVJ.cjs +973 -0
- package/dist/chunk-HMB3SIVJ.cjs.map +1 -0
- package/dist/{chunk-LOYJP2V2.js → chunk-HYVNEUIK.js} +5 -5
- package/dist/chunk-KV5J7PNM.js +152 -0
- package/dist/chunk-KV5J7PNM.js.map +1 -0
- package/dist/{chunk-LQ7VQ74E.js → chunk-LEKG4YWI.js} +2 -2
- package/dist/chunk-SECN7UAL.cjs +152 -0
- package/dist/chunk-SECN7UAL.cjs.map +1 -0
- package/dist/{chunk-S2A4TFLS.js → chunk-ULXU6XWH.js} +1 -1
- package/dist/{chunk-S2A4TFLS.js.map → chunk-ULXU6XWH.js.map} +1 -1
- package/dist/config/nextjs.cjs +7 -7
- package/dist/config/nextjs.js +2 -2
- package/dist/host/html.cjs +36 -36
- package/dist/host/html.js +10 -10
- package/dist/host/nextjs/app/client-only.cjs +17 -17
- package/dist/host/nextjs/app/client-only.js +8 -8
- package/dist/host/react.cjs +9 -9
- package/dist/host/react.js +8 -8
- package/dist/internal/config/webpack/next-client-pages-loader.cjs +151 -53
- package/dist/internal/config/webpack/next-client-pages-loader.cjs.map +1 -1
- package/dist/internal/config/webpack/next-client-pages-loader.d.ts +8 -4
- package/dist/internal/config/webpack/next-client-pages-loader.js +153 -53
- package/dist/internal/config/webpack/next-client-pages-loader.js.map +1 -1
- package/dist/internal/host/shared/pipeline.d.ts +1 -1
- package/dist/internal/host/shared/shared-broker.cjs +106 -0
- package/dist/internal/host/shared/shared-broker.cjs.map +1 -0
- package/dist/internal/host/shared/shared-broker.d.ts +35 -0
- package/dist/internal/host/shared/shared-broker.js +80 -0
- package/dist/internal/host/shared/shared-broker.js.map +1 -0
- package/dist/internal/host/shared/shared-module-resolver.cjs +13 -22
- package/dist/internal/host/shared/shared-module-resolver.cjs.map +1 -1
- package/dist/internal/host/shared/shared-module-resolver.d.ts +1 -1
- package/dist/internal/host/shared/shared-module-resolver.js +16 -22
- package/dist/internal/host/shared/shared-module-resolver.js.map +1 -1
- package/dist/internal/runtime/loaders/component-loader.cjs +2 -1
- package/dist/internal/runtime/loaders/component-loader.cjs.map +1 -1
- package/dist/internal/runtime/loaders/component-loader.d.ts +1 -1
- package/dist/internal/runtime/loaders/component-loader.js +2 -1
- package/dist/internal/runtime/loaders/component-loader.js.map +1 -1
- package/dist/internal/runtime/loaders/static-loader.d.ts +1 -1
- package/dist/internal/runtime/namespace.d.ts +1 -1
- package/dist/internal/runtime/turbopack/module.cjs +26 -4
- package/dist/internal/runtime/turbopack/module.cjs.map +1 -1
- package/dist/internal/runtime/turbopack/module.d.ts +14 -7
- package/dist/internal/runtime/turbopack/module.js +27 -5
- package/dist/internal/runtime/turbopack/module.js.map +1 -1
- package/dist/internal/runtime/turbopack/remote-scope-setup.cjs +5 -4
- package/dist/internal/runtime/turbopack/remote-scope-setup.cjs.map +1 -1
- package/dist/internal/runtime/turbopack/remote-scope-setup.js +5 -4
- package/dist/internal/runtime/turbopack/remote-scope-setup.js.map +1 -1
- package/dist/internal/runtime/turbopack/shared-modules.cjs +113 -26
- package/dist/internal/runtime/turbopack/shared-modules.cjs.map +1 -1
- package/dist/internal/runtime/turbopack/shared-modules.d.ts +3 -1
- package/dist/internal/runtime/turbopack/shared-modules.js +116 -26
- 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 +1 -1
- package/dist/internal/utils/logger.cjs.map +1 -1
- package/dist/internal/utils/logger.d.ts +1 -1
- package/dist/internal/utils/logger.js.map +1 -1
- package/dist/remote/html.cjs +6 -6
- package/dist/remote/html.js +2 -2
- package/dist/{script-VPOI7ARP.js → script-ISAHSV3X.js} +3 -3
- package/dist/{script-D5AD7HLV.cjs → script-YQCDUYDP.cjs} +4 -4
- package/dist/static-loader-EOJQHFZ6.cjs +11 -0
- package/dist/{static-loader-OHSAUD62.js → static-loader-Z24427MK.js} +3 -3
- package/dist/{turbopack-5N44NVPT.js → turbopack-7F757Z7V.js} +6 -6
- package/dist/{turbopack-EPXGK4EV.cjs → turbopack-DULMVTWV.cjs} +12 -12
- package/dist/{types-8b0edd78.d.ts → types-bd7be268.d.ts} +1 -5
- package/dist/{webpack-SIFRCBIN.cjs → webpack-6LXCB7WA.cjs} +14 -14
- package/dist/{webpack-KSDNIXMS.js → webpack-WGVTKJ3W.js} +5 -5
- package/package.json +1 -1
- package/dist/chunk-CC3WOSDO.js.map +0 -1
- package/dist/chunk-JJTCFQHE.cjs +0 -202
- package/dist/chunk-JJTCFQHE.cjs.map +0 -1
- package/dist/chunk-KVQI55BZ.cjs.map +0 -1
- package/dist/chunk-MKO52FRO.js +0 -202
- package/dist/chunk-MKO52FRO.js.map +0 -1
- package/dist/chunk-MQ2BBSL4.cjs +0 -709
- package/dist/chunk-MQ2BBSL4.cjs.map +0 -1
- package/dist/chunk-MTMDXJLM.js.map +0 -1
- package/dist/chunk-RLI4YTBJ.cjs.map +0 -1
- package/dist/chunk-SAGYPGIQ.js.map +0 -1
- package/dist/static-loader-UDIXK5MV.cjs +0 -11
- /package/dist/{chunk-TZT7DLO5.cjs.map → chunk-3AX5WLZD.cjs.map} +0 -0
- /package/dist/{chunk-4O3EOST4.cjs.map → chunk-4AH3KXDW.cjs.map} +0 -0
- /package/dist/{chunk-42TVDI3G.cjs.map → chunk-C5EYU7EQ.cjs.map} +0 -0
- /package/dist/{chunk-AKOMV2UF.js.map → chunk-HL6BL5HY.js.map} +0 -0
- /package/dist/{chunk-LOYJP2V2.js.map → chunk-HYVNEUIK.js.map} +0 -0
- /package/dist/{chunk-LQ7VQ74E.js.map → chunk-LEKG4YWI.js.map} +0 -0
- /package/dist/{script-VPOI7ARP.js.map → script-ISAHSV3X.js.map} +0 -0
- /package/dist/{script-D5AD7HLV.cjs.map → script-YQCDUYDP.cjs.map} +0 -0
- /package/dist/{static-loader-UDIXK5MV.cjs.map → static-loader-EOJQHFZ6.cjs.map} +0 -0
- /package/dist/{static-loader-OHSAUD62.js.map → static-loader-Z24427MK.js.map} +0 -0
- /package/dist/{turbopack-5N44NVPT.js.map → turbopack-7F757Z7V.js.map} +0 -0
- /package/dist/{turbopack-EPXGK4EV.cjs.map → turbopack-DULMVTWV.cjs.map} +0 -0
- /package/dist/{webpack-SIFRCBIN.cjs.map → webpack-6LXCB7WA.cjs.map} +0 -0
- /package/dist/{webpack-KSDNIXMS.js.map → webpack-WGVTKJ3W.js.map} +0 -0
|
@@ -23,11 +23,13 @@ __export(shared_modules_exports, {
|
|
|
23
23
|
initializeSharedModules: () => initializeSharedModules
|
|
24
24
|
});
|
|
25
25
|
module.exports = __toCommonJS(shared_modules_exports);
|
|
26
|
+
var import_shared_broker = require("#internal/host/shared/shared-broker");
|
|
26
27
|
var import_logger = require("#internal/utils/logger");
|
|
27
28
|
var import_module = require("./module");
|
|
28
29
|
var import_patterns = require("./patterns");
|
|
29
30
|
var import_remote_scope = require("./remote-scope");
|
|
30
31
|
const DEDUPLICATION_WARNING = "This module will not be deduplicated \u2014 the remote may load its own copy, which can cause duplicate instance errors (e.g. invalid hook calls if React is loaded twice).";
|
|
32
|
+
const INLINE_REMOTE_SHARED_RE = /["']?__remote_shared_module_(?<specifier>[^"':]+)["']?\s*:\s*\(\)\s*=>\s*(?:__turbopack_context__|[a-z])\.A\((?<asyncSharedModuleId>"[^"]+"|[0-9]+)\)/g;
|
|
31
33
|
function getTurbopackModules(scope) {
|
|
32
34
|
if (scope.turbopackModules.length > 0) {
|
|
33
35
|
return scope.turbopackModules;
|
|
@@ -80,17 +82,27 @@ async function initializeSharedModules(scope, hostShared = {}, remoteShared = {}
|
|
|
80
82
|
"SharedModules",
|
|
81
83
|
`Resolved shared modules for scope="${scope.scopedName}": ${JSON.stringify(sharedModuleIds)}`
|
|
82
84
|
);
|
|
83
|
-
return
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
85
|
+
return installSharedModules(
|
|
86
|
+
scope,
|
|
87
|
+
hostShared,
|
|
88
|
+
sharedModuleIds,
|
|
89
|
+
(id, module2) => `Host shared module "${module2}" not found for ID ${id}. ${DEDUPLICATION_WARNING}`
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
const inlineSharedModuleIds = extractInlineSharedModuleIds(
|
|
93
|
+
allModules,
|
|
94
|
+
scope
|
|
95
|
+
);
|
|
96
|
+
if (Object.keys(inlineSharedModuleIds).length > 0) {
|
|
97
|
+
(0, import_logger.logDebug)(
|
|
98
|
+
"SharedModules",
|
|
99
|
+
`Resolved inline shared modules for scope="${scope.scopedName}": ${JSON.stringify(inlineSharedModuleIds)}`
|
|
100
|
+
);
|
|
101
|
+
return installSharedModules(
|
|
102
|
+
scope,
|
|
103
|
+
hostShared,
|
|
104
|
+
inlineSharedModuleIds,
|
|
105
|
+
(id, module2) => `Host shared module "${module2}" not found for inline ID ${id}. ${DEDUPLICATION_WARNING}`
|
|
94
106
|
);
|
|
95
107
|
}
|
|
96
108
|
(0, import_logger.logWarn)(
|
|
@@ -103,20 +115,17 @@ async function initializeSharedModules(scope, hostShared = {}, remoteShared = {}
|
|
|
103
115
|
`No TURBOPACK modules found for scope="${scope.scopedName}" (TURBOPACK_${scope.globalKey} is empty)`
|
|
104
116
|
);
|
|
105
117
|
}
|
|
106
|
-
|
|
107
|
-
Object.entries(remoteShared).map(
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
);
|
|
118
|
-
}
|
|
119
|
-
})
|
|
118
|
+
const normalizedRemoteShared = Object.fromEntries(
|
|
119
|
+
Object.entries(remoteShared).map(([id, module2]) => [
|
|
120
|
+
id.replace("[app-ssr]", "[app-client]"),
|
|
121
|
+
module2
|
|
122
|
+
])
|
|
123
|
+
);
|
|
124
|
+
return installSharedModules(
|
|
125
|
+
scope,
|
|
126
|
+
hostShared,
|
|
127
|
+
normalizedRemoteShared,
|
|
128
|
+
(_id, module2) => `Shared module "${module2}" not found for "${scope.name}". ${DEDUPLICATION_WARNING}`
|
|
120
129
|
);
|
|
121
130
|
}
|
|
122
131
|
function extractSharedModuleIds(shared, scope) {
|
|
@@ -146,18 +155,96 @@ function extractSharedModuleIds(shared, scope) {
|
|
|
146
155
|
return acc;
|
|
147
156
|
}, {});
|
|
148
157
|
}
|
|
158
|
+
function extractInlineSharedModuleIds(allModules, scope) {
|
|
159
|
+
const sharedModuleIds = {};
|
|
160
|
+
for (const idOrFunc of allModules) {
|
|
161
|
+
if (typeof idOrFunc !== "function")
|
|
162
|
+
continue;
|
|
163
|
+
const funcCode = idOrFunc.toString();
|
|
164
|
+
if (!funcCode.includes("__remote_shared_module_"))
|
|
165
|
+
continue;
|
|
166
|
+
INLINE_REMOTE_SHARED_RE.lastIndex = 0;
|
|
167
|
+
for (const match of funcCode.matchAll(INLINE_REMOTE_SHARED_RE)) {
|
|
168
|
+
const specifier = match.groups?.specifier;
|
|
169
|
+
const asyncSharedModuleId = stripQuotes(
|
|
170
|
+
match.groups?.asyncSharedModuleId
|
|
171
|
+
);
|
|
172
|
+
if (!specifier || !asyncSharedModuleId)
|
|
173
|
+
continue;
|
|
174
|
+
const asyncSharedModule = (0, import_module.findModuleInit)(
|
|
175
|
+
getTurbopackModules(scope),
|
|
176
|
+
asyncSharedModuleId
|
|
177
|
+
);
|
|
178
|
+
if (!asyncSharedModule)
|
|
179
|
+
continue;
|
|
180
|
+
const sharedModuleId = (0, import_patterns.extractGroup)(
|
|
181
|
+
import_patterns.ASYNC_MODULE_CALLBACK_RE,
|
|
182
|
+
asyncSharedModule.toString(),
|
|
183
|
+
"sharedModuleId"
|
|
184
|
+
);
|
|
185
|
+
sharedModuleIds[sharedModuleId ?? asyncSharedModuleId] = specifier;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return sharedModuleIds;
|
|
189
|
+
}
|
|
190
|
+
function stripQuotes(value) {
|
|
191
|
+
if (value?.startsWith('"') && value.endsWith('"')) {
|
|
192
|
+
return value.slice(1, -1);
|
|
193
|
+
}
|
|
194
|
+
return value;
|
|
195
|
+
}
|
|
196
|
+
function installSharedModules(scope, hostShared, sharedModuleIds, missingMessage) {
|
|
197
|
+
const plan = (0, import_shared_broker.createSharedModulePlan)({
|
|
198
|
+
bundle: scope.name,
|
|
199
|
+
hostShared,
|
|
200
|
+
remoteShared: sharedModuleIds,
|
|
201
|
+
scope: `remote:${scope.scopedName}`,
|
|
202
|
+
callerTag: "SharedModules"
|
|
203
|
+
});
|
|
204
|
+
for (const entry of plan.entries) {
|
|
205
|
+
if (entry.status === "resolved") {
|
|
206
|
+
delete scope.moduleCache[entry.id];
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return (0, import_shared_broker.installSharedModulePlan)({
|
|
210
|
+
plan,
|
|
211
|
+
target: scope.sharedModules,
|
|
212
|
+
callerTag: "SharedModules",
|
|
213
|
+
onMissing: (entry) => {
|
|
214
|
+
(0, import_logger.logError)("SharedModules", missingMessage(entry.id, entry.specifier));
|
|
215
|
+
}
|
|
216
|
+
}).then((results) => {
|
|
217
|
+
for (const entry of plan.entries) {
|
|
218
|
+
if (entry.status === "resolved") {
|
|
219
|
+
delete scope.moduleCache[entry.id];
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return results;
|
|
223
|
+
});
|
|
224
|
+
}
|
|
149
225
|
function getSharedModule(scope, id) {
|
|
150
226
|
const idStr = String(id);
|
|
151
227
|
if (scope.sharedModules[idStr] !== void 0) {
|
|
152
228
|
return scope.sharedModules[idStr];
|
|
153
229
|
}
|
|
154
230
|
for (const [key, value] of Object.entries(scope.sharedModules)) {
|
|
155
|
-
if (typeof value !== "undefined" && idStr !== key && idStr
|
|
231
|
+
if (typeof value !== "undefined" && idStr !== key && matchesSharedModuleKey(idStr, key)) {
|
|
156
232
|
return value;
|
|
157
233
|
}
|
|
158
234
|
}
|
|
159
235
|
return null;
|
|
160
236
|
}
|
|
237
|
+
function matchesSharedModuleKey(id, key) {
|
|
238
|
+
if (id.endsWith(key))
|
|
239
|
+
return true;
|
|
240
|
+
if (!key.includes("/") && !key.endsWith(".js"))
|
|
241
|
+
return false;
|
|
242
|
+
const index = id.lastIndexOf(key);
|
|
243
|
+
if (index < 0)
|
|
244
|
+
return false;
|
|
245
|
+
const afterKey = id.slice(index + key.length);
|
|
246
|
+
return /^\s+(?:\[[^\]]+\]\s*)?(?:\([^)]*\))?$/.test(afterKey);
|
|
247
|
+
}
|
|
161
248
|
// Annotate the CommonJS export names for ESM import in node:
|
|
162
249
|
0 && (module.exports = {
|
|
163
250
|
getSharedModule,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/runtime/turbopack/shared-modules.ts"],"sourcesContent":["import type { GlobalScope } from '#internal/runtime/types';\nimport { logDebug, logError, logWarn } from '#internal/utils/logger';\nimport { findModuleInit, handleTurbopackModule } from './module';\nimport {\n ASYNC_MODULE_CALLBACK_RE,\n ASYNC_MODULE_LOADER_RE,\n extractGroup,\n REMOTE_SHARED_ASSIGNMENT_RE,\n REMOTE_SHARED_MARKER_RE,\n} from './patterns';\nimport { formatRemoteId, type RemoteScope } from './remote-scope';\n\nconst DEDUPLICATION_WARNING =\n 'This module will not be deduplicated — the remote may load its own copy, ' +\n 'which can cause duplicate instance errors (e.g. invalid hook calls if React is loaded twice).';\n\n/**\n * Returns the flat module list for a scope.\n *\n * The primary source is `scope.turbopackModules` — a flat array populated by\n * the push interceptor in handleTurbopackChunk. This is immune to the\n * turbopack runtime replacing the TURBOPACK global (canary builds swap the\n * array for a deferred-loading dispatcher object).\n *\n * Falls back to reading the global for pre-populated bundles where the push\n * interceptor was never installed.\n */\nexport function getTurbopackModules(scope: RemoteScope): unknown[] | undefined {\n if (scope.turbopackModules.length > 0) {\n return scope.turbopackModules;\n }\n\n // Fallback: read the global for pre-populated bundles or legacy setups.\n const self = globalThis as GlobalScope;\n const raw = self[`TURBOPACK_${scope.globalKey}`];\n if (!raw) return undefined;\n\n if (Array.isArray(raw)) {\n return (raw as unknown[]).flat();\n }\n return Object.entries(raw as Record<string, unknown>).flat();\n}\n\n/**\n * Initializes shared modules between the host application and remote components.\n * This enables sharing of common dependencies like React to avoid duplicate instances.\n *\n * The function works by:\n * 1. Looking for a shared module initializer in the Turbopack bundle\n * 2. Extracting module IDs from the initializer\n * 3. Loading the corresponding host modules and mapping them to the remote's expected IDs\n */\nexport async function initializeSharedModules(\n scope: RemoteScope,\n hostShared: Record<string, (bundle?: string) => Promise<unknown>> = {},\n remoteShared: Record<string, string> = {},\n // biome-ignore lint/suspicious/noConfusingVoidType: Runtime is undefined but in TS land service it is void\n): Promise<void[]> {\n const allModules = getTurbopackModules(scope);\n\n logDebug(\n 'SharedModules',\n `initializeSharedModules: scope=\"${scope.scopedName}\", ` +\n `allModules=${allModules ? allModules.length : 'null'}, ` +\n `hostShared=[${Object.keys(hostShared).join(', ')}], ` +\n `remoteShared=${JSON.stringify(remoteShared)}`,\n );\n\n let sharedModuleInitializer: Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }> | null = null;\n\n // find the shared module initializer in the Turbopack bundle\n if (allModules) {\n // find the shared module initializer module id by looking for\n // a function that contains the TURBOPACK_REMOTE_SHARED pattern\n const sharedModuleInitializerIndex = allModules.findIndex((idOrFunc) => {\n if (typeof idOrFunc !== 'function') {\n return false;\n }\n const funcCode = idOrFunc.toString();\n return REMOTE_SHARED_MARKER_RE.test(funcCode);\n });\n\n // if found, extract the shared module initializer\n // first element in the array is always the source script element\n if (sharedModuleInitializerIndex > 0) {\n const sharedModuleInitializerCode = (\n allModules[sharedModuleInitializerIndex] as () => unknown\n ).toString();\n const sharedModuleInitializerId = allModules[\n sharedModuleInitializerIndex - 1\n ] as string | number;\n // extract the shared module id from the function code\n const sharedModuleId = extractGroup(\n REMOTE_SHARED_ASSIGNMENT_RE,\n sharedModuleInitializerCode,\n 'sharedModuleId',\n );\n // load the shared module initializer using the extracted module id\n if (sharedModuleId) {\n const { default: sharedModuleInitializerInstance } =\n handleTurbopackModule(\n scope,\n sharedModuleId,\n formatRemoteId(scope, String(sharedModuleInitializerId)),\n ) as {\n default: Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }>;\n };\n sharedModuleInitializer = sharedModuleInitializerInstance;\n }\n }\n\n // if we have a shared module initializer, load the shared modules from the host application\n if (sharedModuleInitializer) {\n const { shared } = await sharedModuleInitializer;\n // map shared module ids to their initializer functions\n const sharedModuleIds = extractSharedModuleIds(shared, scope);\n logDebug(\n 'SharedModules',\n `Resolved shared modules for scope=\"${scope.scopedName}\": ${JSON.stringify(sharedModuleIds)}`,\n );\n\n // load shared modules from the host application\n return Promise.all(\n Object.entries(sharedModuleIds).map(async ([id, module]) => {\n if (hostShared[module]) {\n scope.sharedModules[id] = await hostShared[module](scope.name);\n } else {\n logError(\n 'SharedModules',\n `Host shared module \"${module}\" not found for ID ${id}. ${DEDUPLICATION_WARNING}`,\n );\n }\n }),\n );\n }\n\n logWarn(\n 'SharedModules',\n `No shared module initializer found in bundle for scope=\"${scope.scopedName}\" — falling back to remoteShared mapping`,\n );\n } else {\n logWarn(\n 'SharedModules',\n `No TURBOPACK modules found for scope=\"${scope.scopedName}\" (TURBOPACK_${scope.globalKey} is empty)`,\n );\n }\n\n // fallback: ensure that the shared modules are initialized using remoteShared mapping\n return Promise.all(\n Object.entries(remoteShared).map(async ([id, module]) => {\n if (hostShared[module]) {\n const normalizedId = id.replace('[app-ssr]', '[app-client]');\n scope.sharedModules[normalizedId] = await hostShared[module](\n scope.name,\n );\n } else {\n logError(\n 'SharedModules',\n `Shared module \"${module}\" not found for \"${scope.name}\". ${DEDUPLICATION_WARNING}`,\n );\n }\n }),\n );\n}\n\n/**\n * Extracts shared module IDs from the shared module initializer functions.\n * This parses the minified Turbopack code to find the module ID mappings.\n */\nfunction extractSharedModuleIds(\n shared: Record<string, string | (() => Promise<unknown>)>,\n scope: RemoteScope,\n): Record<string, string> {\n return Object.entries(shared)\n .filter(([, value]) => typeof value === 'function')\n .reduce<Record<string, string>>((acc, [key, value]) => {\n const asyncSharedModuleId = extractGroup(\n ASYNC_MODULE_LOADER_RE,\n value.toString(),\n 'asyncSharedModuleId',\n );\n\n if (asyncSharedModuleId) {\n const asyncSharedModule = findModuleInit(\n getTurbopackModules(scope),\n asyncSharedModuleId,\n );\n if (asyncSharedModule) {\n const sharedModuleId = extractGroup(\n ASYNC_MODULE_CALLBACK_RE,\n asyncSharedModule.toString(),\n 'sharedModuleId',\n );\n // map the shared module id to the actual module name\n acc[sharedModuleId ?? asyncSharedModuleId] = key.replace(\n '__remote_shared_module_',\n '',\n );\n }\n }\n return acc;\n }, {});\n}\n\n/**\n * Returns a shared module for the given scope and module ID.\n * Shared modules are common dependencies like React that are provided by the host.\n */\nexport function getSharedModule(\n scope: RemoteScope,\n id: string | number,\n): unknown {\n const idStr = String(id);\n\n // Exact match first (covers both string and numeric IDs)\n if (scope.sharedModules[idStr] !== undefined) {\n return scope.sharedModules[idStr];\n }\n\n // Fallback: the id may be a bundle-prefixed string like \"[bundle] /react/index.js\"\n // that contains the shared module key as a suffix. Only match when the key\n // appears as a complete suffix segment to avoid \"react\" matching \"react-dom\".\n for (const [key, value] of Object.entries(scope.sharedModules)) {\n if (typeof value !== 'undefined' && idStr !== key && idStr.endsWith(key)) {\n return value;\n }\n }\n\n return null;\n}\n"],"mappings":"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","names":["module"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/runtime/turbopack/shared-modules.ts"],"sourcesContent":["import {\n createSharedModulePlan,\n installSharedModulePlan,\n type SharedModuleFactory,\n} from '#internal/host/shared/shared-broker';\nimport type { GlobalScope } from '#internal/runtime/types';\nimport { logDebug, logError, logWarn } from '#internal/utils/logger';\nimport { findModuleInit, handleTurbopackModule } from './module';\nimport {\n ASYNC_MODULE_CALLBACK_RE,\n ASYNC_MODULE_LOADER_RE,\n extractGroup,\n REMOTE_SHARED_ASSIGNMENT_RE,\n REMOTE_SHARED_MARKER_RE,\n} from './patterns';\nimport { formatRemoteId, type RemoteScope } from './remote-scope';\n\nconst DEDUPLICATION_WARNING =\n 'This module will not be deduplicated — the remote may load its own copy, ' +\n 'which can cause duplicate instance errors (e.g. invalid hook calls if React is loaded twice).';\nconst INLINE_REMOTE_SHARED_RE =\n /[\"']?__remote_shared_module_(?<specifier>[^\"':]+)[\"']?\\s*:\\s*\\(\\)\\s*=>\\s*(?:__turbopack_context__|[a-z])\\.A\\((?<asyncSharedModuleId>\"[^\"]+\"|[0-9]+)\\)/g;\n\n/**\n * Returns the flat module list for a scope.\n *\n * The primary source is `scope.turbopackModules` — a flat array populated by\n * the push interceptor in handleTurbopackChunk. This is immune to the\n * turbopack runtime replacing the TURBOPACK global (canary builds swap the\n * array for a deferred-loading dispatcher object).\n *\n * Falls back to reading the global for pre-populated bundles where the push\n * interceptor was never installed.\n */\nexport function getTurbopackModules(scope: RemoteScope): unknown[] | undefined {\n if (scope.turbopackModules.length > 0) {\n return scope.turbopackModules;\n }\n\n // Fallback: read the global for pre-populated bundles or legacy setups.\n const self = globalThis as GlobalScope;\n const raw = self[`TURBOPACK_${scope.globalKey}`];\n if (!raw) return undefined;\n\n if (Array.isArray(raw)) {\n return (raw as unknown[]).flat();\n }\n return Object.entries(raw as Record<string, unknown>).flat();\n}\n\n/**\n * Initializes shared modules between the host application and remote components.\n * This enables sharing of common dependencies like React to avoid duplicate instances.\n *\n * The function works by:\n * 1. Looking for a shared module initializer in the Turbopack bundle\n * 2. Extracting module IDs from the initializer\n * 3. Loading the corresponding host modules and mapping them to the remote's expected IDs\n */\nexport async function initializeSharedModules(\n scope: RemoteScope,\n hostShared: Record<string, SharedModuleFactory> = {},\n remoteShared: Record<string, string> = {},\n // biome-ignore lint/suspicious/noConfusingVoidType: Runtime is undefined but in TS land service it is void\n): Promise<void[]> {\n const allModules = getTurbopackModules(scope);\n\n logDebug(\n 'SharedModules',\n `initializeSharedModules: scope=\"${scope.scopedName}\", ` +\n `allModules=${allModules ? allModules.length : 'null'}, ` +\n `hostShared=[${Object.keys(hostShared).join(', ')}], ` +\n `remoteShared=${JSON.stringify(remoteShared)}`,\n );\n\n let sharedModuleInitializer: Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }> | null = null;\n\n // find the shared module initializer in the Turbopack bundle\n if (allModules) {\n // find the shared module initializer module id by looking for\n // a function that contains the TURBOPACK_REMOTE_SHARED pattern\n const sharedModuleInitializerIndex = allModules.findIndex((idOrFunc) => {\n if (typeof idOrFunc !== 'function') {\n return false;\n }\n const funcCode = idOrFunc.toString();\n return REMOTE_SHARED_MARKER_RE.test(funcCode);\n });\n\n // if found, extract the shared module initializer\n // first element in the array is always the source script element\n if (sharedModuleInitializerIndex > 0) {\n const sharedModuleInitializerCode = (\n allModules[sharedModuleInitializerIndex] as () => unknown\n ).toString();\n const sharedModuleInitializerId = allModules[\n sharedModuleInitializerIndex - 1\n ] as string | number;\n // extract the shared module id from the function code\n const sharedModuleId = extractGroup(\n REMOTE_SHARED_ASSIGNMENT_RE,\n sharedModuleInitializerCode,\n 'sharedModuleId',\n );\n // load the shared module initializer using the extracted module id\n if (sharedModuleId) {\n const { default: sharedModuleInitializerInstance } =\n handleTurbopackModule(\n scope,\n sharedModuleId,\n formatRemoteId(scope, String(sharedModuleInitializerId)),\n ) as {\n default: Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }>;\n };\n sharedModuleInitializer = sharedModuleInitializerInstance;\n }\n }\n\n // if we have a shared module initializer, load the shared modules from the host application\n if (sharedModuleInitializer) {\n const { shared } = await sharedModuleInitializer;\n // map shared module ids to their initializer functions\n const sharedModuleIds = extractSharedModuleIds(shared, scope);\n logDebug(\n 'SharedModules',\n `Resolved shared modules for scope=\"${scope.scopedName}\": ${JSON.stringify(sharedModuleIds)}`,\n );\n\n return installSharedModules(\n scope,\n hostShared,\n sharedModuleIds,\n (id, module) =>\n `Host shared module \"${module}\" not found for ID ${id}. ${DEDUPLICATION_WARNING}`,\n );\n }\n\n const inlineSharedModuleIds = extractInlineSharedModuleIds(\n allModules,\n scope,\n );\n if (Object.keys(inlineSharedModuleIds).length > 0) {\n logDebug(\n 'SharedModules',\n `Resolved inline shared modules for scope=\"${scope.scopedName}\": ${JSON.stringify(inlineSharedModuleIds)}`,\n );\n\n return installSharedModules(\n scope,\n hostShared,\n inlineSharedModuleIds,\n (id, module) =>\n `Host shared module \"${module}\" not found for inline ID ${id}. ${DEDUPLICATION_WARNING}`,\n );\n }\n\n logWarn(\n 'SharedModules',\n `No shared module initializer found in bundle for scope=\"${scope.scopedName}\" — falling back to remoteShared mapping`,\n );\n } else {\n logWarn(\n 'SharedModules',\n `No TURBOPACK modules found for scope=\"${scope.scopedName}\" (TURBOPACK_${scope.globalKey} is empty)`,\n );\n }\n\n // fallback: ensure that the shared modules are initialized using remoteShared mapping\n const normalizedRemoteShared = Object.fromEntries(\n Object.entries(remoteShared).map(([id, module]) => [\n id.replace('[app-ssr]', '[app-client]'),\n module,\n ]),\n );\n return installSharedModules(\n scope,\n hostShared,\n normalizedRemoteShared,\n (_id, module) =>\n `Shared module \"${module}\" not found for \"${scope.name}\". ${DEDUPLICATION_WARNING}`,\n );\n}\n\n/**\n * Extracts shared module IDs from the shared module initializer functions.\n * This parses the minified Turbopack code to find the module ID mappings.\n */\nfunction extractSharedModuleIds(\n shared: Record<string, string | (() => Promise<unknown>)>,\n scope: RemoteScope,\n): Record<string, string> {\n return Object.entries(shared)\n .filter(([, value]) => typeof value === 'function')\n .reduce<Record<string, string>>((acc, [key, value]) => {\n const asyncSharedModuleId = extractGroup(\n ASYNC_MODULE_LOADER_RE,\n value.toString(),\n 'asyncSharedModuleId',\n );\n\n if (asyncSharedModuleId) {\n const asyncSharedModule = findModuleInit(\n getTurbopackModules(scope),\n asyncSharedModuleId,\n );\n if (asyncSharedModule) {\n const sharedModuleId = extractGroup(\n ASYNC_MODULE_CALLBACK_RE,\n asyncSharedModule.toString(),\n 'sharedModuleId',\n );\n // map the shared module id to the actual module name\n acc[sharedModuleId ?? asyncSharedModuleId] = key.replace(\n '__remote_shared_module_',\n '',\n );\n }\n }\n return acc;\n }, {});\n}\n\nfunction extractInlineSharedModuleIds(\n allModules: unknown[],\n scope: RemoteScope,\n): Record<string, string> {\n const sharedModuleIds: Record<string, string> = {};\n\n for (const idOrFunc of allModules) {\n if (typeof idOrFunc !== 'function') continue;\n\n const funcCode = idOrFunc.toString();\n if (!funcCode.includes('__remote_shared_module_')) continue;\n\n INLINE_REMOTE_SHARED_RE.lastIndex = 0;\n for (const match of funcCode.matchAll(INLINE_REMOTE_SHARED_RE)) {\n const specifier = match.groups?.specifier;\n const asyncSharedModuleId = stripQuotes(\n match.groups?.asyncSharedModuleId,\n );\n if (!specifier || !asyncSharedModuleId) continue;\n\n const asyncSharedModule = findModuleInit(\n getTurbopackModules(scope),\n asyncSharedModuleId,\n );\n if (!asyncSharedModule) continue;\n\n const sharedModuleId = extractGroup(\n ASYNC_MODULE_CALLBACK_RE,\n asyncSharedModule.toString(),\n 'sharedModuleId',\n );\n sharedModuleIds[sharedModuleId ?? asyncSharedModuleId] = specifier;\n }\n }\n\n return sharedModuleIds;\n}\n\nfunction stripQuotes(value: string | undefined): string | undefined {\n if (value?.startsWith('\"') && value.endsWith('\"')) {\n return value.slice(1, -1);\n }\n return value;\n}\n\nfunction installSharedModules(\n scope: RemoteScope,\n hostShared: Record<string, SharedModuleFactory>,\n sharedModuleIds: Record<string, string>,\n missingMessage: (id: string, module: string) => string,\n): Promise<undefined[]> {\n const plan = createSharedModulePlan({\n bundle: scope.name,\n hostShared,\n remoteShared: sharedModuleIds,\n scope: `remote:${scope.scopedName}`,\n callerTag: 'SharedModules',\n });\n\n for (const entry of plan.entries) {\n if (entry.status === 'resolved') {\n // Compatibility with the old shared-modules architecture: a remote\n // factory may have already cached its own implementation for this ID.\n // The broker-owned scope.sharedModules entry must replace it. Remove\n // this cache cleanup once Turbopack remotes cannot execute shared\n // factories before the scoped share plan is installed.\n delete scope.moduleCache[entry.id];\n }\n }\n\n return installSharedModulePlan({\n plan,\n target: scope.sharedModules,\n callerTag: 'SharedModules',\n onMissing: (entry) => {\n logError('SharedModules', missingMessage(entry.id, entry.specifier));\n },\n }).then((results) => {\n for (const entry of plan.entries) {\n if (entry.status === 'resolved') {\n delete scope.moduleCache[entry.id];\n }\n }\n return results;\n });\n}\n\n/**\n * Returns a shared module for the given scope and module ID.\n * Shared modules are common dependencies like React that are provided by the host.\n */\nexport function getSharedModule(\n scope: RemoteScope,\n id: string | number,\n): unknown {\n const idStr = String(id);\n\n // Exact match first (covers both string and numeric IDs)\n if (scope.sharedModules[idStr] !== undefined) {\n return scope.sharedModules[idStr];\n }\n\n // Fallback: the id may be a bundle-prefixed string like \"[bundle] /react/index.js\"\n // or a Turbopack dev id like \"[project]/node_modules/react/index.js [client]\".\n // Only path-like keys use the dev-id qualifier match to avoid \"react\"\n // matching \"react-dom\".\n for (const [key, value] of Object.entries(scope.sharedModules)) {\n if (\n typeof value !== 'undefined' &&\n idStr !== key &&\n matchesSharedModuleKey(idStr, key)\n ) {\n return value;\n }\n }\n\n return null;\n}\n\nfunction matchesSharedModuleKey(id: string, key: string): boolean {\n if (id.endsWith(key)) return true;\n if (!key.includes('/') && !key.endsWith('.js')) return false;\n\n const index = id.lastIndexOf(key);\n if (index < 0) return false;\n\n const afterKey = id.slice(index + key.length);\n return /^\\s+(?:\\[[^\\]]+\\]\\s*)?(?:\\([^)]*\\))?$/.test(afterKey);\n}\n"],"mappings":"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","names":["module"]}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { SharedModuleFactory } from '../../host/shared/shared-broker.js';
|
|
1
2
|
import { RemoteScope } from './remote-scope.js';
|
|
3
|
+
import '../../utils/logger.js';
|
|
2
4
|
import '../url/resolve-client-url.js';
|
|
3
5
|
import '../constants.js';
|
|
4
6
|
|
|
@@ -23,7 +25,7 @@ declare function getTurbopackModules(scope: RemoteScope): unknown[] | undefined;
|
|
|
23
25
|
* 2. Extracting module IDs from the initializer
|
|
24
26
|
* 3. Loading the corresponding host modules and mapping them to the remote's expected IDs
|
|
25
27
|
*/
|
|
26
|
-
declare function initializeSharedModules(scope: RemoteScope, hostShared?: Record<string,
|
|
28
|
+
declare function initializeSharedModules(scope: RemoteScope, hostShared?: Record<string, SharedModuleFactory>, remoteShared?: Record<string, string>): Promise<void[]>;
|
|
27
29
|
/**
|
|
28
30
|
* Returns a shared module for the given scope and module ID.
|
|
29
31
|
* Shared modules are common dependencies like React that are provided by the host.
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createSharedModulePlan,
|
|
3
|
+
installSharedModulePlan
|
|
4
|
+
} from "#internal/host/shared/shared-broker";
|
|
1
5
|
import { logDebug, logError, logWarn } from "#internal/utils/logger";
|
|
2
6
|
import { findModuleInit, handleTurbopackModule } from "./module";
|
|
3
7
|
import {
|
|
@@ -9,6 +13,7 @@ import {
|
|
|
9
13
|
} from "./patterns";
|
|
10
14
|
import { formatRemoteId } from "./remote-scope";
|
|
11
15
|
const DEDUPLICATION_WARNING = "This module will not be deduplicated \u2014 the remote may load its own copy, which can cause duplicate instance errors (e.g. invalid hook calls if React is loaded twice).";
|
|
16
|
+
const INLINE_REMOTE_SHARED_RE = /["']?__remote_shared_module_(?<specifier>[^"':]+)["']?\s*:\s*\(\)\s*=>\s*(?:__turbopack_context__|[a-z])\.A\((?<asyncSharedModuleId>"[^"]+"|[0-9]+)\)/g;
|
|
12
17
|
function getTurbopackModules(scope) {
|
|
13
18
|
if (scope.turbopackModules.length > 0) {
|
|
14
19
|
return scope.turbopackModules;
|
|
@@ -61,17 +66,27 @@ async function initializeSharedModules(scope, hostShared = {}, remoteShared = {}
|
|
|
61
66
|
"SharedModules",
|
|
62
67
|
`Resolved shared modules for scope="${scope.scopedName}": ${JSON.stringify(sharedModuleIds)}`
|
|
63
68
|
);
|
|
64
|
-
return
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
69
|
+
return installSharedModules(
|
|
70
|
+
scope,
|
|
71
|
+
hostShared,
|
|
72
|
+
sharedModuleIds,
|
|
73
|
+
(id, module) => `Host shared module "${module}" not found for ID ${id}. ${DEDUPLICATION_WARNING}`
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
const inlineSharedModuleIds = extractInlineSharedModuleIds(
|
|
77
|
+
allModules,
|
|
78
|
+
scope
|
|
79
|
+
);
|
|
80
|
+
if (Object.keys(inlineSharedModuleIds).length > 0) {
|
|
81
|
+
logDebug(
|
|
82
|
+
"SharedModules",
|
|
83
|
+
`Resolved inline shared modules for scope="${scope.scopedName}": ${JSON.stringify(inlineSharedModuleIds)}`
|
|
84
|
+
);
|
|
85
|
+
return installSharedModules(
|
|
86
|
+
scope,
|
|
87
|
+
hostShared,
|
|
88
|
+
inlineSharedModuleIds,
|
|
89
|
+
(id, module) => `Host shared module "${module}" not found for inline ID ${id}. ${DEDUPLICATION_WARNING}`
|
|
75
90
|
);
|
|
76
91
|
}
|
|
77
92
|
logWarn(
|
|
@@ -84,20 +99,17 @@ async function initializeSharedModules(scope, hostShared = {}, remoteShared = {}
|
|
|
84
99
|
`No TURBOPACK modules found for scope="${scope.scopedName}" (TURBOPACK_${scope.globalKey} is empty)`
|
|
85
100
|
);
|
|
86
101
|
}
|
|
87
|
-
|
|
88
|
-
Object.entries(remoteShared).map(
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
);
|
|
99
|
-
}
|
|
100
|
-
})
|
|
102
|
+
const normalizedRemoteShared = Object.fromEntries(
|
|
103
|
+
Object.entries(remoteShared).map(([id, module]) => [
|
|
104
|
+
id.replace("[app-ssr]", "[app-client]"),
|
|
105
|
+
module
|
|
106
|
+
])
|
|
107
|
+
);
|
|
108
|
+
return installSharedModules(
|
|
109
|
+
scope,
|
|
110
|
+
hostShared,
|
|
111
|
+
normalizedRemoteShared,
|
|
112
|
+
(_id, module) => `Shared module "${module}" not found for "${scope.name}". ${DEDUPLICATION_WARNING}`
|
|
101
113
|
);
|
|
102
114
|
}
|
|
103
115
|
function extractSharedModuleIds(shared, scope) {
|
|
@@ -127,18 +139,96 @@ function extractSharedModuleIds(shared, scope) {
|
|
|
127
139
|
return acc;
|
|
128
140
|
}, {});
|
|
129
141
|
}
|
|
142
|
+
function extractInlineSharedModuleIds(allModules, scope) {
|
|
143
|
+
const sharedModuleIds = {};
|
|
144
|
+
for (const idOrFunc of allModules) {
|
|
145
|
+
if (typeof idOrFunc !== "function")
|
|
146
|
+
continue;
|
|
147
|
+
const funcCode = idOrFunc.toString();
|
|
148
|
+
if (!funcCode.includes("__remote_shared_module_"))
|
|
149
|
+
continue;
|
|
150
|
+
INLINE_REMOTE_SHARED_RE.lastIndex = 0;
|
|
151
|
+
for (const match of funcCode.matchAll(INLINE_REMOTE_SHARED_RE)) {
|
|
152
|
+
const specifier = match.groups?.specifier;
|
|
153
|
+
const asyncSharedModuleId = stripQuotes(
|
|
154
|
+
match.groups?.asyncSharedModuleId
|
|
155
|
+
);
|
|
156
|
+
if (!specifier || !asyncSharedModuleId)
|
|
157
|
+
continue;
|
|
158
|
+
const asyncSharedModule = findModuleInit(
|
|
159
|
+
getTurbopackModules(scope),
|
|
160
|
+
asyncSharedModuleId
|
|
161
|
+
);
|
|
162
|
+
if (!asyncSharedModule)
|
|
163
|
+
continue;
|
|
164
|
+
const sharedModuleId = extractGroup(
|
|
165
|
+
ASYNC_MODULE_CALLBACK_RE,
|
|
166
|
+
asyncSharedModule.toString(),
|
|
167
|
+
"sharedModuleId"
|
|
168
|
+
);
|
|
169
|
+
sharedModuleIds[sharedModuleId ?? asyncSharedModuleId] = specifier;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return sharedModuleIds;
|
|
173
|
+
}
|
|
174
|
+
function stripQuotes(value) {
|
|
175
|
+
if (value?.startsWith('"') && value.endsWith('"')) {
|
|
176
|
+
return value.slice(1, -1);
|
|
177
|
+
}
|
|
178
|
+
return value;
|
|
179
|
+
}
|
|
180
|
+
function installSharedModules(scope, hostShared, sharedModuleIds, missingMessage) {
|
|
181
|
+
const plan = createSharedModulePlan({
|
|
182
|
+
bundle: scope.name,
|
|
183
|
+
hostShared,
|
|
184
|
+
remoteShared: sharedModuleIds,
|
|
185
|
+
scope: `remote:${scope.scopedName}`,
|
|
186
|
+
callerTag: "SharedModules"
|
|
187
|
+
});
|
|
188
|
+
for (const entry of plan.entries) {
|
|
189
|
+
if (entry.status === "resolved") {
|
|
190
|
+
delete scope.moduleCache[entry.id];
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return installSharedModulePlan({
|
|
194
|
+
plan,
|
|
195
|
+
target: scope.sharedModules,
|
|
196
|
+
callerTag: "SharedModules",
|
|
197
|
+
onMissing: (entry) => {
|
|
198
|
+
logError("SharedModules", missingMessage(entry.id, entry.specifier));
|
|
199
|
+
}
|
|
200
|
+
}).then((results) => {
|
|
201
|
+
for (const entry of plan.entries) {
|
|
202
|
+
if (entry.status === "resolved") {
|
|
203
|
+
delete scope.moduleCache[entry.id];
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return results;
|
|
207
|
+
});
|
|
208
|
+
}
|
|
130
209
|
function getSharedModule(scope, id) {
|
|
131
210
|
const idStr = String(id);
|
|
132
211
|
if (scope.sharedModules[idStr] !== void 0) {
|
|
133
212
|
return scope.sharedModules[idStr];
|
|
134
213
|
}
|
|
135
214
|
for (const [key, value] of Object.entries(scope.sharedModules)) {
|
|
136
|
-
if (typeof value !== "undefined" && idStr !== key && idStr
|
|
215
|
+
if (typeof value !== "undefined" && idStr !== key && matchesSharedModuleKey(idStr, key)) {
|
|
137
216
|
return value;
|
|
138
217
|
}
|
|
139
218
|
}
|
|
140
219
|
return null;
|
|
141
220
|
}
|
|
221
|
+
function matchesSharedModuleKey(id, key) {
|
|
222
|
+
if (id.endsWith(key))
|
|
223
|
+
return true;
|
|
224
|
+
if (!key.includes("/") && !key.endsWith(".js"))
|
|
225
|
+
return false;
|
|
226
|
+
const index = id.lastIndexOf(key);
|
|
227
|
+
if (index < 0)
|
|
228
|
+
return false;
|
|
229
|
+
const afterKey = id.slice(index + key.length);
|
|
230
|
+
return /^\s+(?:\[[^\]]+\]\s*)?(?:\([^)]*\))?$/.test(afterKey);
|
|
231
|
+
}
|
|
142
232
|
export {
|
|
143
233
|
getSharedModule,
|
|
144
234
|
getTurbopackModules,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/runtime/turbopack/shared-modules.ts"],"sourcesContent":["import type { GlobalScope } from '#internal/runtime/types';\nimport { logDebug, logError, logWarn } from '#internal/utils/logger';\nimport { findModuleInit, handleTurbopackModule } from './module';\nimport {\n ASYNC_MODULE_CALLBACK_RE,\n ASYNC_MODULE_LOADER_RE,\n extractGroup,\n REMOTE_SHARED_ASSIGNMENT_RE,\n REMOTE_SHARED_MARKER_RE,\n} from './patterns';\nimport { formatRemoteId, type RemoteScope } from './remote-scope';\n\nconst DEDUPLICATION_WARNING =\n 'This module will not be deduplicated — the remote may load its own copy, ' +\n 'which can cause duplicate instance errors (e.g. invalid hook calls if React is loaded twice).';\n\n/**\n * Returns the flat module list for a scope.\n *\n * The primary source is `scope.turbopackModules` — a flat array populated by\n * the push interceptor in handleTurbopackChunk. This is immune to the\n * turbopack runtime replacing the TURBOPACK global (canary builds swap the\n * array for a deferred-loading dispatcher object).\n *\n * Falls back to reading the global for pre-populated bundles where the push\n * interceptor was never installed.\n */\nexport function getTurbopackModules(scope: RemoteScope): unknown[] | undefined {\n if (scope.turbopackModules.length > 0) {\n return scope.turbopackModules;\n }\n\n // Fallback: read the global for pre-populated bundles or legacy setups.\n const self = globalThis as GlobalScope;\n const raw = self[`TURBOPACK_${scope.globalKey}`];\n if (!raw) return undefined;\n\n if (Array.isArray(raw)) {\n return (raw as unknown[]).flat();\n }\n return Object.entries(raw as Record<string, unknown>).flat();\n}\n\n/**\n * Initializes shared modules between the host application and remote components.\n * This enables sharing of common dependencies like React to avoid duplicate instances.\n *\n * The function works by:\n * 1. Looking for a shared module initializer in the Turbopack bundle\n * 2. Extracting module IDs from the initializer\n * 3. Loading the corresponding host modules and mapping them to the remote's expected IDs\n */\nexport async function initializeSharedModules(\n scope: RemoteScope,\n hostShared: Record<string, (bundle?: string) => Promise<unknown>> = {},\n remoteShared: Record<string, string> = {},\n // biome-ignore lint/suspicious/noConfusingVoidType: Runtime is undefined but in TS land service it is void\n): Promise<void[]> {\n const allModules = getTurbopackModules(scope);\n\n logDebug(\n 'SharedModules',\n `initializeSharedModules: scope=\"${scope.scopedName}\", ` +\n `allModules=${allModules ? allModules.length : 'null'}, ` +\n `hostShared=[${Object.keys(hostShared).join(', ')}], ` +\n `remoteShared=${JSON.stringify(remoteShared)}`,\n );\n\n let sharedModuleInitializer: Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }> | null = null;\n\n // find the shared module initializer in the Turbopack bundle\n if (allModules) {\n // find the shared module initializer module id by looking for\n // a function that contains the TURBOPACK_REMOTE_SHARED pattern\n const sharedModuleInitializerIndex = allModules.findIndex((idOrFunc) => {\n if (typeof idOrFunc !== 'function') {\n return false;\n }\n const funcCode = idOrFunc.toString();\n return REMOTE_SHARED_MARKER_RE.test(funcCode);\n });\n\n // if found, extract the shared module initializer\n // first element in the array is always the source script element\n if (sharedModuleInitializerIndex > 0) {\n const sharedModuleInitializerCode = (\n allModules[sharedModuleInitializerIndex] as () => unknown\n ).toString();\n const sharedModuleInitializerId = allModules[\n sharedModuleInitializerIndex - 1\n ] as string | number;\n // extract the shared module id from the function code\n const sharedModuleId = extractGroup(\n REMOTE_SHARED_ASSIGNMENT_RE,\n sharedModuleInitializerCode,\n 'sharedModuleId',\n );\n // load the shared module initializer using the extracted module id\n if (sharedModuleId) {\n const { default: sharedModuleInitializerInstance } =\n handleTurbopackModule(\n scope,\n sharedModuleId,\n formatRemoteId(scope, String(sharedModuleInitializerId)),\n ) as {\n default: Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }>;\n };\n sharedModuleInitializer = sharedModuleInitializerInstance;\n }\n }\n\n // if we have a shared module initializer, load the shared modules from the host application\n if (sharedModuleInitializer) {\n const { shared } = await sharedModuleInitializer;\n // map shared module ids to their initializer functions\n const sharedModuleIds = extractSharedModuleIds(shared, scope);\n logDebug(\n 'SharedModules',\n `Resolved shared modules for scope=\"${scope.scopedName}\": ${JSON.stringify(sharedModuleIds)}`,\n );\n\n // load shared modules from the host application\n return Promise.all(\n Object.entries(sharedModuleIds).map(async ([id, module]) => {\n if (hostShared[module]) {\n scope.sharedModules[id] = await hostShared[module](scope.name);\n } else {\n logError(\n 'SharedModules',\n `Host shared module \"${module}\" not found for ID ${id}. ${DEDUPLICATION_WARNING}`,\n );\n }\n }),\n );\n }\n\n logWarn(\n 'SharedModules',\n `No shared module initializer found in bundle for scope=\"${scope.scopedName}\" — falling back to remoteShared mapping`,\n );\n } else {\n logWarn(\n 'SharedModules',\n `No TURBOPACK modules found for scope=\"${scope.scopedName}\" (TURBOPACK_${scope.globalKey} is empty)`,\n );\n }\n\n // fallback: ensure that the shared modules are initialized using remoteShared mapping\n return Promise.all(\n Object.entries(remoteShared).map(async ([id, module]) => {\n if (hostShared[module]) {\n const normalizedId = id.replace('[app-ssr]', '[app-client]');\n scope.sharedModules[normalizedId] = await hostShared[module](\n scope.name,\n );\n } else {\n logError(\n 'SharedModules',\n `Shared module \"${module}\" not found for \"${scope.name}\". ${DEDUPLICATION_WARNING}`,\n );\n }\n }),\n );\n}\n\n/**\n * Extracts shared module IDs from the shared module initializer functions.\n * This parses the minified Turbopack code to find the module ID mappings.\n */\nfunction extractSharedModuleIds(\n shared: Record<string, string | (() => Promise<unknown>)>,\n scope: RemoteScope,\n): Record<string, string> {\n return Object.entries(shared)\n .filter(([, value]) => typeof value === 'function')\n .reduce<Record<string, string>>((acc, [key, value]) => {\n const asyncSharedModuleId = extractGroup(\n ASYNC_MODULE_LOADER_RE,\n value.toString(),\n 'asyncSharedModuleId',\n );\n\n if (asyncSharedModuleId) {\n const asyncSharedModule = findModuleInit(\n getTurbopackModules(scope),\n asyncSharedModuleId,\n );\n if (asyncSharedModule) {\n const sharedModuleId = extractGroup(\n ASYNC_MODULE_CALLBACK_RE,\n asyncSharedModule.toString(),\n 'sharedModuleId',\n );\n // map the shared module id to the actual module name\n acc[sharedModuleId ?? asyncSharedModuleId] = key.replace(\n '__remote_shared_module_',\n '',\n );\n }\n }\n return acc;\n }, {});\n}\n\n/**\n * Returns a shared module for the given scope and module ID.\n * Shared modules are common dependencies like React that are provided by the host.\n */\nexport function getSharedModule(\n scope: RemoteScope,\n id: string | number,\n): unknown {\n const idStr = String(id);\n\n // Exact match first (covers both string and numeric IDs)\n if (scope.sharedModules[idStr] !== undefined) {\n return scope.sharedModules[idStr];\n }\n\n // Fallback: the id may be a bundle-prefixed string like \"[bundle] /react/index.js\"\n // that contains the shared module key as a suffix. Only match when the key\n // appears as a complete suffix segment to avoid \"react\" matching \"react-dom\".\n for (const [key, value] of Object.entries(scope.sharedModules)) {\n if (typeof value !== 'undefined' && idStr !== key && idStr.endsWith(key)) {\n return value;\n }\n }\n\n return null;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/runtime/turbopack/shared-modules.ts"],"sourcesContent":["import {\n createSharedModulePlan,\n installSharedModulePlan,\n type SharedModuleFactory,\n} from '#internal/host/shared/shared-broker';\nimport type { GlobalScope } from '#internal/runtime/types';\nimport { logDebug, logError, logWarn } from '#internal/utils/logger';\nimport { findModuleInit, handleTurbopackModule } from './module';\nimport {\n ASYNC_MODULE_CALLBACK_RE,\n ASYNC_MODULE_LOADER_RE,\n extractGroup,\n REMOTE_SHARED_ASSIGNMENT_RE,\n REMOTE_SHARED_MARKER_RE,\n} from './patterns';\nimport { formatRemoteId, type RemoteScope } from './remote-scope';\n\nconst DEDUPLICATION_WARNING =\n 'This module will not be deduplicated — the remote may load its own copy, ' +\n 'which can cause duplicate instance errors (e.g. invalid hook calls if React is loaded twice).';\nconst INLINE_REMOTE_SHARED_RE =\n /[\"']?__remote_shared_module_(?<specifier>[^\"':]+)[\"']?\\s*:\\s*\\(\\)\\s*=>\\s*(?:__turbopack_context__|[a-z])\\.A\\((?<asyncSharedModuleId>\"[^\"]+\"|[0-9]+)\\)/g;\n\n/**\n * Returns the flat module list for a scope.\n *\n * The primary source is `scope.turbopackModules` — a flat array populated by\n * the push interceptor in handleTurbopackChunk. This is immune to the\n * turbopack runtime replacing the TURBOPACK global (canary builds swap the\n * array for a deferred-loading dispatcher object).\n *\n * Falls back to reading the global for pre-populated bundles where the push\n * interceptor was never installed.\n */\nexport function getTurbopackModules(scope: RemoteScope): unknown[] | undefined {\n if (scope.turbopackModules.length > 0) {\n return scope.turbopackModules;\n }\n\n // Fallback: read the global for pre-populated bundles or legacy setups.\n const self = globalThis as GlobalScope;\n const raw = self[`TURBOPACK_${scope.globalKey}`];\n if (!raw) return undefined;\n\n if (Array.isArray(raw)) {\n return (raw as unknown[]).flat();\n }\n return Object.entries(raw as Record<string, unknown>).flat();\n}\n\n/**\n * Initializes shared modules between the host application and remote components.\n * This enables sharing of common dependencies like React to avoid duplicate instances.\n *\n * The function works by:\n * 1. Looking for a shared module initializer in the Turbopack bundle\n * 2. Extracting module IDs from the initializer\n * 3. Loading the corresponding host modules and mapping them to the remote's expected IDs\n */\nexport async function initializeSharedModules(\n scope: RemoteScope,\n hostShared: Record<string, SharedModuleFactory> = {},\n remoteShared: Record<string, string> = {},\n // biome-ignore lint/suspicious/noConfusingVoidType: Runtime is undefined but in TS land service it is void\n): Promise<void[]> {\n const allModules = getTurbopackModules(scope);\n\n logDebug(\n 'SharedModules',\n `initializeSharedModules: scope=\"${scope.scopedName}\", ` +\n `allModules=${allModules ? allModules.length : 'null'}, ` +\n `hostShared=[${Object.keys(hostShared).join(', ')}], ` +\n `remoteShared=${JSON.stringify(remoteShared)}`,\n );\n\n let sharedModuleInitializer: Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }> | null = null;\n\n // find the shared module initializer in the Turbopack bundle\n if (allModules) {\n // find the shared module initializer module id by looking for\n // a function that contains the TURBOPACK_REMOTE_SHARED pattern\n const sharedModuleInitializerIndex = allModules.findIndex((idOrFunc) => {\n if (typeof idOrFunc !== 'function') {\n return false;\n }\n const funcCode = idOrFunc.toString();\n return REMOTE_SHARED_MARKER_RE.test(funcCode);\n });\n\n // if found, extract the shared module initializer\n // first element in the array is always the source script element\n if (sharedModuleInitializerIndex > 0) {\n const sharedModuleInitializerCode = (\n allModules[sharedModuleInitializerIndex] as () => unknown\n ).toString();\n const sharedModuleInitializerId = allModules[\n sharedModuleInitializerIndex - 1\n ] as string | number;\n // extract the shared module id from the function code\n const sharedModuleId = extractGroup(\n REMOTE_SHARED_ASSIGNMENT_RE,\n sharedModuleInitializerCode,\n 'sharedModuleId',\n );\n // load the shared module initializer using the extracted module id\n if (sharedModuleId) {\n const { default: sharedModuleInitializerInstance } =\n handleTurbopackModule(\n scope,\n sharedModuleId,\n formatRemoteId(scope, String(sharedModuleInitializerId)),\n ) as {\n default: Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }>;\n };\n sharedModuleInitializer = sharedModuleInitializerInstance;\n }\n }\n\n // if we have a shared module initializer, load the shared modules from the host application\n if (sharedModuleInitializer) {\n const { shared } = await sharedModuleInitializer;\n // map shared module ids to their initializer functions\n const sharedModuleIds = extractSharedModuleIds(shared, scope);\n logDebug(\n 'SharedModules',\n `Resolved shared modules for scope=\"${scope.scopedName}\": ${JSON.stringify(sharedModuleIds)}`,\n );\n\n return installSharedModules(\n scope,\n hostShared,\n sharedModuleIds,\n (id, module) =>\n `Host shared module \"${module}\" not found for ID ${id}. ${DEDUPLICATION_WARNING}`,\n );\n }\n\n const inlineSharedModuleIds = extractInlineSharedModuleIds(\n allModules,\n scope,\n );\n if (Object.keys(inlineSharedModuleIds).length > 0) {\n logDebug(\n 'SharedModules',\n `Resolved inline shared modules for scope=\"${scope.scopedName}\": ${JSON.stringify(inlineSharedModuleIds)}`,\n );\n\n return installSharedModules(\n scope,\n hostShared,\n inlineSharedModuleIds,\n (id, module) =>\n `Host shared module \"${module}\" not found for inline ID ${id}. ${DEDUPLICATION_WARNING}`,\n );\n }\n\n logWarn(\n 'SharedModules',\n `No shared module initializer found in bundle for scope=\"${scope.scopedName}\" — falling back to remoteShared mapping`,\n );\n } else {\n logWarn(\n 'SharedModules',\n `No TURBOPACK modules found for scope=\"${scope.scopedName}\" (TURBOPACK_${scope.globalKey} is empty)`,\n );\n }\n\n // fallback: ensure that the shared modules are initialized using remoteShared mapping\n const normalizedRemoteShared = Object.fromEntries(\n Object.entries(remoteShared).map(([id, module]) => [\n id.replace('[app-ssr]', '[app-client]'),\n module,\n ]),\n );\n return installSharedModules(\n scope,\n hostShared,\n normalizedRemoteShared,\n (_id, module) =>\n `Shared module \"${module}\" not found for \"${scope.name}\". ${DEDUPLICATION_WARNING}`,\n );\n}\n\n/**\n * Extracts shared module IDs from the shared module initializer functions.\n * This parses the minified Turbopack code to find the module ID mappings.\n */\nfunction extractSharedModuleIds(\n shared: Record<string, string | (() => Promise<unknown>)>,\n scope: RemoteScope,\n): Record<string, string> {\n return Object.entries(shared)\n .filter(([, value]) => typeof value === 'function')\n .reduce<Record<string, string>>((acc, [key, value]) => {\n const asyncSharedModuleId = extractGroup(\n ASYNC_MODULE_LOADER_RE,\n value.toString(),\n 'asyncSharedModuleId',\n );\n\n if (asyncSharedModuleId) {\n const asyncSharedModule = findModuleInit(\n getTurbopackModules(scope),\n asyncSharedModuleId,\n );\n if (asyncSharedModule) {\n const sharedModuleId = extractGroup(\n ASYNC_MODULE_CALLBACK_RE,\n asyncSharedModule.toString(),\n 'sharedModuleId',\n );\n // map the shared module id to the actual module name\n acc[sharedModuleId ?? asyncSharedModuleId] = key.replace(\n '__remote_shared_module_',\n '',\n );\n }\n }\n return acc;\n }, {});\n}\n\nfunction extractInlineSharedModuleIds(\n allModules: unknown[],\n scope: RemoteScope,\n): Record<string, string> {\n const sharedModuleIds: Record<string, string> = {};\n\n for (const idOrFunc of allModules) {\n if (typeof idOrFunc !== 'function') continue;\n\n const funcCode = idOrFunc.toString();\n if (!funcCode.includes('__remote_shared_module_')) continue;\n\n INLINE_REMOTE_SHARED_RE.lastIndex = 0;\n for (const match of funcCode.matchAll(INLINE_REMOTE_SHARED_RE)) {\n const specifier = match.groups?.specifier;\n const asyncSharedModuleId = stripQuotes(\n match.groups?.asyncSharedModuleId,\n );\n if (!specifier || !asyncSharedModuleId) continue;\n\n const asyncSharedModule = findModuleInit(\n getTurbopackModules(scope),\n asyncSharedModuleId,\n );\n if (!asyncSharedModule) continue;\n\n const sharedModuleId = extractGroup(\n ASYNC_MODULE_CALLBACK_RE,\n asyncSharedModule.toString(),\n 'sharedModuleId',\n );\n sharedModuleIds[sharedModuleId ?? asyncSharedModuleId] = specifier;\n }\n }\n\n return sharedModuleIds;\n}\n\nfunction stripQuotes(value: string | undefined): string | undefined {\n if (value?.startsWith('\"') && value.endsWith('\"')) {\n return value.slice(1, -1);\n }\n return value;\n}\n\nfunction installSharedModules(\n scope: RemoteScope,\n hostShared: Record<string, SharedModuleFactory>,\n sharedModuleIds: Record<string, string>,\n missingMessage: (id: string, module: string) => string,\n): Promise<undefined[]> {\n const plan = createSharedModulePlan({\n bundle: scope.name,\n hostShared,\n remoteShared: sharedModuleIds,\n scope: `remote:${scope.scopedName}`,\n callerTag: 'SharedModules',\n });\n\n for (const entry of plan.entries) {\n if (entry.status === 'resolved') {\n // Compatibility with the old shared-modules architecture: a remote\n // factory may have already cached its own implementation for this ID.\n // The broker-owned scope.sharedModules entry must replace it. Remove\n // this cache cleanup once Turbopack remotes cannot execute shared\n // factories before the scoped share plan is installed.\n delete scope.moduleCache[entry.id];\n }\n }\n\n return installSharedModulePlan({\n plan,\n target: scope.sharedModules,\n callerTag: 'SharedModules',\n onMissing: (entry) => {\n logError('SharedModules', missingMessage(entry.id, entry.specifier));\n },\n }).then((results) => {\n for (const entry of plan.entries) {\n if (entry.status === 'resolved') {\n delete scope.moduleCache[entry.id];\n }\n }\n return results;\n });\n}\n\n/**\n * Returns a shared module for the given scope and module ID.\n * Shared modules are common dependencies like React that are provided by the host.\n */\nexport function getSharedModule(\n scope: RemoteScope,\n id: string | number,\n): unknown {\n const idStr = String(id);\n\n // Exact match first (covers both string and numeric IDs)\n if (scope.sharedModules[idStr] !== undefined) {\n return scope.sharedModules[idStr];\n }\n\n // Fallback: the id may be a bundle-prefixed string like \"[bundle] /react/index.js\"\n // or a Turbopack dev id like \"[project]/node_modules/react/index.js [client]\".\n // Only path-like keys use the dev-id qualifier match to avoid \"react\"\n // matching \"react-dom\".\n for (const [key, value] of Object.entries(scope.sharedModules)) {\n if (\n typeof value !== 'undefined' &&\n idStr !== key &&\n matchesSharedModuleKey(idStr, key)\n ) {\n return value;\n }\n }\n\n return null;\n}\n\nfunction matchesSharedModuleKey(id: string, key: string): boolean {\n if (id.endsWith(key)) return true;\n if (!key.includes('/') && !key.endsWith('.js')) return false;\n\n const index = id.lastIndexOf(key);\n if (index < 0) return false;\n\n const afterKey = id.slice(index + key.length);\n return /^\\s+(?:\\[[^\\]]+\\]\\s*)?(?:\\([^)]*\\))?$/.test(afterKey);\n}\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AAEP,SAAS,UAAU,UAAU,eAAe;AAC5C,SAAS,gBAAgB,6BAA6B;AACtD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,sBAAwC;AAEjD,MAAM,wBACJ;AAEF,MAAM,0BACJ;AAaK,SAAS,oBAAoB,OAA2C;AAC7E,MAAI,MAAM,iBAAiB,SAAS,GAAG;AACrC,WAAO,MAAM;AAAA,EACf;AAGA,QAAM,OAAO;AACb,QAAM,MAAM,KAAK,aAAa,MAAM,WAAW;AAC/C,MAAI,CAAC;AAAK,WAAO;AAEjB,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,WAAQ,IAAkB,KAAK;AAAA,EACjC;AACA,SAAO,OAAO,QAAQ,GAA8B,EAAE,KAAK;AAC7D;AAWA,eAAsB,wBACpB,OACA,aAAkD,CAAC,GACnD,eAAuC,CAAC,GAEvB;AACjB,QAAM,aAAa,oBAAoB,KAAK;AAE5C;AAAA,IACE;AAAA,IACA,mCAAmC,MAAM,2BACzB,aAAa,WAAW,SAAS,uBAChC,OAAO,KAAK,UAAU,EAAE,KAAK,IAAI,oBAChC,KAAK,UAAU,YAAY;AAAA,EAC/C;AAEA,MAAI,0BAEQ;AAGZ,MAAI,YAAY;AAGd,UAAM,+BAA+B,WAAW,UAAU,CAAC,aAAa;AACtE,UAAI,OAAO,aAAa,YAAY;AAClC,eAAO;AAAA,MACT;AACA,YAAM,WAAW,SAAS,SAAS;AACnC,aAAO,wBAAwB,KAAK,QAAQ;AAAA,IAC9C,CAAC;AAID,QAAI,+BAA+B,GAAG;AACpC,YAAM,8BACJ,WAAW,4BAA4B,EACvC,SAAS;AACX,YAAM,4BAA4B,WAChC,+BAA+B,CACjC;AAEA,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,gBAAgB;AAClB,cAAM,EAAE,SAAS,gCAAgC,IAC/C;AAAA,UACE;AAAA,UACA;AAAA,UACA,eAAe,OAAO,OAAO,yBAAyB,CAAC;AAAA,QACzD;AAKF,kCAA0B;AAAA,MAC5B;AAAA,IACF;AAGA,QAAI,yBAAyB;AAC3B,YAAM,EAAE,OAAO,IAAI,MAAM;AAEzB,YAAM,kBAAkB,uBAAuB,QAAQ,KAAK;AAC5D;AAAA,QACE;AAAA,QACA,sCAAsC,MAAM,gBAAgB,KAAK,UAAU,eAAe;AAAA,MAC5F;AAEA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC,IAAI,WACH,uBAAuB,4BAA4B,OAAO;AAAA,MAC9D;AAAA,IACF;AAEA,UAAM,wBAAwB;AAAA,MAC5B;AAAA,MACA;AAAA,IACF;AACA,QAAI,OAAO,KAAK,qBAAqB,EAAE,SAAS,GAAG;AACjD;AAAA,QACE;AAAA,QACA,6CAA6C,MAAM,gBAAgB,KAAK,UAAU,qBAAqB;AAAA,MACzG;AAEA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC,IAAI,WACH,uBAAuB,mCAAmC,OAAO;AAAA,MACrE;AAAA,IACF;AAEA;AAAA,MACE;AAAA,MACA,2DAA2D,MAAM;AAAA,IACnE;AAAA,EACF,OAAO;AACL;AAAA,MACE;AAAA,MACA,yCAAyC,MAAM,0BAA0B,MAAM;AAAA,IACjF;AAAA,EACF;AAGA,QAAM,yBAAyB,OAAO;AAAA,IACpC,OAAO,QAAQ,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM,MAAM;AAAA,MACjD,GAAG,QAAQ,aAAa,cAAc;AAAA,MACtC;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,KAAK,WACJ,kBAAkB,0BAA0B,MAAM,UAAU;AAAA,EAChE;AACF;AAMA,SAAS,uBACP,QACA,OACwB;AACxB,SAAO,OAAO,QAAQ,MAAM,EACzB,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,OAAO,UAAU,UAAU,EACjD,OAA+B,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM;AACrD,UAAM,sBAAsB;AAAA,MAC1B;AAAA,MACA,MAAM,SAAS;AAAA,MACf;AAAA,IACF;AAEA,QAAI,qBAAqB;AACvB,YAAM,oBAAoB;AAAA,QACxB,oBAAoB,KAAK;AAAA,QACzB;AAAA,MACF;AACA,UAAI,mBAAmB;AACrB,cAAM,iBAAiB;AAAA,UACrB;AAAA,UACA,kBAAkB,SAAS;AAAA,UAC3B;AAAA,QACF;AAEA,YAAI,kBAAkB,mBAAmB,IAAI,IAAI;AAAA,UAC/C;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACT;AAEA,SAAS,6BACP,YACA,OACwB;AACxB,QAAM,kBAA0C,CAAC;AAEjD,aAAW,YAAY,YAAY;AACjC,QAAI,OAAO,aAAa;AAAY;AAEpC,UAAM,WAAW,SAAS,SAAS;AACnC,QAAI,CAAC,SAAS,SAAS,yBAAyB;AAAG;AAEnD,4BAAwB,YAAY;AACpC,eAAW,SAAS,SAAS,SAAS,uBAAuB,GAAG;AAC9D,YAAM,YAAY,MAAM,QAAQ;AAChC,YAAM,sBAAsB;AAAA,QAC1B,MAAM,QAAQ;AAAA,MAChB;AACA,UAAI,CAAC,aAAa,CAAC;AAAqB;AAExC,YAAM,oBAAoB;AAAA,QACxB,oBAAoB,KAAK;AAAA,QACzB;AAAA,MACF;AACA,UAAI,CAAC;AAAmB;AAExB,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA,kBAAkB,SAAS;AAAA,QAC3B;AAAA,MACF;AACA,sBAAgB,kBAAkB,mBAAmB,IAAI;AAAA,IAC3D;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,OAA+C;AAClE,MAAI,OAAO,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAAG;AACjD,WAAO,MAAM,MAAM,GAAG,EAAE;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,SAAS,qBACP,OACA,YACA,iBACA,gBACsB;AACtB,QAAM,OAAO,uBAAuB;AAAA,IAClC,QAAQ,MAAM;AAAA,IACd;AAAA,IACA,cAAc;AAAA,IACd,OAAO,UAAU,MAAM;AAAA,IACvB,WAAW;AAAA,EACb,CAAC;AAED,aAAW,SAAS,KAAK,SAAS;AAChC,QAAI,MAAM,WAAW,YAAY;AAM/B,aAAO,MAAM,YAAY,MAAM,EAAE;AAAA,IACnC;AAAA,EACF;AAEA,SAAO,wBAAwB;AAAA,IAC7B;AAAA,IACA,QAAQ,MAAM;AAAA,IACd,WAAW;AAAA,IACX,WAAW,CAAC,UAAU;AACpB,eAAS,iBAAiB,eAAe,MAAM,IAAI,MAAM,SAAS,CAAC;AAAA,IACrE;AAAA,EACF,CAAC,EAAE,KAAK,CAAC,YAAY;AACnB,eAAW,SAAS,KAAK,SAAS;AAChC,UAAI,MAAM,WAAW,YAAY;AAC/B,eAAO,MAAM,YAAY,MAAM,EAAE;AAAA,MACnC;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAMO,SAAS,gBACd,OACA,IACS;AACT,QAAM,QAAQ,OAAO,EAAE;AAGvB,MAAI,MAAM,cAAc,KAAK,MAAM,QAAW;AAC5C,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC;AAMA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,aAAa,GAAG;AAC9D,QACE,OAAO,UAAU,eACjB,UAAU,OACV,uBAAuB,OAAO,GAAG,GACjC;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,IAAY,KAAsB;AAChE,MAAI,GAAG,SAAS,GAAG;AAAG,WAAO;AAC7B,MAAI,CAAC,IAAI,SAAS,GAAG,KAAK,CAAC,IAAI,SAAS,KAAK;AAAG,WAAO;AAEvD,QAAM,QAAQ,GAAG,YAAY,GAAG;AAChC,MAAI,QAAQ;AAAG,WAAO;AAEtB,QAAM,WAAW,GAAG,MAAM,QAAQ,IAAI,MAAM;AAC5C,SAAO,wCAAwC,KAAK,QAAQ;AAC9D;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/runtime/types.ts"],"sourcesContent":["import type { RemoteComponentMetadata } from '#internal/runtime/metadata';\nimport type { RemoteComponentsNamespace } from '#internal/runtime/namespace';\n\nexport interface GlobalScope {\n /** Consolidated namespace — prefer `getNamespace()` over individual globals. */\n __remote_components__?: RemoteComponentsNamespace;\n __DISABLE_WEBPACK_EXEC__?: Record<string, boolean>;\n __webpack_chunk_load__?: (\n chunkId: string,\n scriptBundle?: string,\n ) => Promise<unknown> | undefined;\n __original_webpack_chunk_load__?: (\n chunkId: string,\n scriptBundle?: string,\n ) => Promise<unknown> | undefined;\n __webpack_require__?: (id: string) => unknown;\n __webpack_get_script_filename__?: (id: string) => string | null | undefined;\n __original_webpack_require__?: (id: string) => unknown;\n __remote_webpack_require__?: Record<\n string,\n ((remoteId: string | number) => unknown) & {\n c?: Record
|
|
1
|
+
{"version":3,"sources":["../../../src/runtime/types.ts"],"sourcesContent":["import type { RemoteComponentMetadata } from '#internal/runtime/metadata';\nimport type { RemoteComponentsNamespace } from '#internal/runtime/namespace';\n\nexport interface GlobalScope {\n /** Consolidated namespace — prefer `getNamespace()` over individual globals. */\n __remote_components__?: RemoteComponentsNamespace;\n __DISABLE_WEBPACK_EXEC__?: Record<string, boolean>;\n __webpack_chunk_load__?: (\n chunkId: string,\n scriptBundle?: string,\n ) => Promise<unknown> | undefined;\n __original_webpack_chunk_load__?: (\n chunkId: string,\n scriptBundle?: string,\n ) => Promise<unknown> | undefined;\n __webpack_require__?: (id: string) => unknown;\n __webpack_get_script_filename__?: (id: string) => string | null | undefined;\n __original_webpack_require__?: (id: string) => unknown;\n __remote_webpack_require__?: Record<\n string,\n ((remoteId: string | number) => unknown) & {\n c?: Record<string | number, unknown>;\n m?: Record<string | number, (module: { exports: unknown }) => void>;\n type?: 'turbopack' | 'webpack' | 'script';\n }\n >;\n /** @deprecated since 0.3.4 — use `getNamespace().dispatcherRuntime` instead. */\n __webpack_require_type__?: RemoteComponentMetadata['runtime'];\n /** @deprecated since 0.3.4 — use `getNamespace().bundleUrls` instead. */\n __remote_bundle_url__?: Record<string, string | URL>;\n /** @deprecated since 0.3.4 — use `getNamespace().chunkCache` instead. */\n __remote_components_turbopack_chunk_loader_promise__?: Record<\n string,\n Promise<unknown>\n >;\n /** @deprecated since 0.3.4 — use `getNamespace().scopes` instead. */\n __remote_component_scopes__?: Map<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface LoaderResult {\n component: React.ReactNode;\n error?: Error;\n}\n\nexport type RSCKey = `__remote_component_rsc_${string}__`;\n\nexport type MountOrUnmountFunction = (\n el?: ShadowRoot | DocumentFragment | HTMLElement | HTMLCollection | null,\n) => Promise<void> | void;\n\nexport interface MountUnmountFunctions {\n /** @deprecated since 0.3.4 — use `getNamespace().mountFns` instead. */\n __remote_script_entrypoint_mount__?: Record<\n string,\n Set<MountOrUnmountFunction>\n >;\n /** @deprecated since 0.3.4 — use `getNamespace().unmountFns` instead. */\n __remote_script_entrypoint_unmount__?: Record<\n string,\n Set<MountOrUnmountFunction>\n >;\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import './metadata.js';
|
|
2
|
-
export { G as GlobalScope, L as LoaderResult, M as MountOrUnmountFunction, b as MountUnmountFunctions, a as RSCKey } from '../../types-
|
|
2
|
+
export { G as GlobalScope, L as LoaderResult, M as MountOrUnmountFunction, b as MountUnmountFunctions, a as RSCKey } from '../../types-bd7be268.js';
|
|
3
3
|
import 'react';
|
|
4
4
|
import './turbopack/remote-scope.js';
|
|
5
5
|
import './url/resolve-client-url.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/logger.ts"],"sourcesContent":["import { CORS_DOCS_URL } from '#internal/utils/constants';\nimport { RemoteComponentsError } from '#internal/utils/error';\n\nexport type LogLocation =\n | 'ChunkLoader'\n | 'ChunkDispatcher'\n | 'ComponentLoader'\n | 'ModuleDispatcher'\n | 'RemoteScope'\n | 'SharedModules'\n | 'WebpackRuntime'\n | 'TurbopackModule'\n | 'StaticLoader'\n | 'ScriptLoader'\n | 'Polyfill'\n | 'HtmlRemote'\n | 'HtmlHost'\n | 'Config'\n | 'NextAppRouter'\n | 'NextAppRouterCompat'\n | 'FetchRemoteComponent'\n | 'SharedModuleResolver';\n\nconst PREFIX = 'remote-components';\nconst DEBUG =\n (typeof window !== 'undefined' &&\n localStorage.getItem('RC_DEBUG') === 'true') ||\n (typeof process !== 'undefined' && process.env.RC_DEBUG === 'true');\n\nexport function logDebug(location: LogLocation, message: string) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.debug(`[${PREFIX}:${location}]: ${message}`);\n }\n}\n\nexport function logInfo(location: LogLocation, message: string) {\n // eslint-disable-next-line no-console\n console.info(`[${PREFIX}:${location}]: ${message}`);\n}\n\nexport function logWarn(location: LogLocation, message: string) {\n // eslint-disable-next-line no-console\n console.warn(`[${PREFIX}:${location}]: ${message}`);\n}\n\nexport function logError(\n location: LogLocation,\n message: string,\n cause?: unknown,\n) {\n // eslint-disable-next-line no-console\n console.error(\n new RemoteComponentsError(`[${PREFIX}:${location}]: ${message}`, {\n cause,\n }),\n );\n}\n\n/**\n * Logs a warning when a cross-origin asset request fails, guiding users\n * to configure the proxy middleware and resolveClientUrl on their host.\n */\nexport function warnCrossOriginFetchError(\n logLocation: LogLocation,\n url: string | URL,\n): void {\n try {\n const parsed = typeof url === 'string' ? new URL(url) : url;\n if (typeof location === 'undefined' || parsed.origin === location.origin) {\n return;\n }\n logWarn(\n logLocation,\n `Failed to fetch cross-origin resource \"${parsed.href}\". ` +\n 'To load assets from a protected deployment, two steps are required: ' +\n '(1) configure withRemoteComponentsHostProxy middleware in your host with the remote URL in allowedProxyUrls, ' +\n 'and (2) provide a resolveClientUrl prop that rewrites cross-origin asset URLs to go through the proxy. ' +\n `See: ${CORS_DOCS_URL}`,\n );\n } catch {\n // URL parsing failed — skip the warning\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAA8B;AAC9B,mBAAsC;
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/logger.ts"],"sourcesContent":["import { CORS_DOCS_URL } from '#internal/utils/constants';\nimport { RemoteComponentsError } from '#internal/utils/error';\n\nexport type LogLocation =\n | 'ChunkLoader'\n | 'ChunkDispatcher'\n | 'ComponentLoader'\n | 'ModuleDispatcher'\n | 'RemoteScope'\n | 'SharedModules'\n | 'WebpackRuntime'\n | 'TurbopackModule'\n | 'StaticLoader'\n | 'ScriptLoader'\n | 'Polyfill'\n | 'HtmlRemote'\n | 'HtmlHost'\n | 'Config'\n | 'NextAppRouter'\n | 'NextAppRouterCompat'\n | 'FetchRemoteComponent'\n | 'SharedModuleResolver'\n | 'SharedBroker';\n\nconst PREFIX = 'remote-components';\nconst DEBUG =\n (typeof window !== 'undefined' &&\n localStorage.getItem('RC_DEBUG') === 'true') ||\n (typeof process !== 'undefined' && process.env.RC_DEBUG === 'true');\n\nexport function logDebug(location: LogLocation, message: string) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.debug(`[${PREFIX}:${location}]: ${message}`);\n }\n}\n\nexport function logInfo(location: LogLocation, message: string) {\n // eslint-disable-next-line no-console\n console.info(`[${PREFIX}:${location}]: ${message}`);\n}\n\nexport function logWarn(location: LogLocation, message: string) {\n // eslint-disable-next-line no-console\n console.warn(`[${PREFIX}:${location}]: ${message}`);\n}\n\nexport function logError(\n location: LogLocation,\n message: string,\n cause?: unknown,\n) {\n // eslint-disable-next-line no-console\n console.error(\n new RemoteComponentsError(`[${PREFIX}:${location}]: ${message}`, {\n cause,\n }),\n );\n}\n\n/**\n * Logs a warning when a cross-origin asset request fails, guiding users\n * to configure the proxy middleware and resolveClientUrl on their host.\n */\nexport function warnCrossOriginFetchError(\n logLocation: LogLocation,\n url: string | URL,\n): void {\n try {\n const parsed = typeof url === 'string' ? new URL(url) : url;\n if (typeof location === 'undefined' || parsed.origin === location.origin) {\n return;\n }\n logWarn(\n logLocation,\n `Failed to fetch cross-origin resource \"${parsed.href}\". ` +\n 'To load assets from a protected deployment, two steps are required: ' +\n '(1) configure withRemoteComponentsHostProxy middleware in your host with the remote URL in allowedProxyUrls, ' +\n 'and (2) provide a resolveClientUrl prop that rewrites cross-origin asset URLs to go through the proxy. ' +\n `See: ${CORS_DOCS_URL}`,\n );\n } catch {\n // URL parsing failed — skip the warning\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAA8B;AAC9B,mBAAsC;AAuBtC,MAAM,SAAS;AACf,MAAM,QACH,OAAO,WAAW,eACjB,aAAa,QAAQ,UAAU,MAAM,UACtC,OAAO,YAAY,eAAe,QAAQ,IAAI,aAAa;AAEvD,SAAS,SAASA,WAAuB,SAAiB;AAC/D,MAAI,OAAO;AAET,YAAQ,MAAM,IAAI,UAAUA,eAAc,SAAS;AAAA,EACrD;AACF;AAEO,SAAS,QAAQA,WAAuB,SAAiB;AAE9D,UAAQ,KAAK,IAAI,UAAUA,eAAc,SAAS;AACpD;AAEO,SAAS,QAAQA,WAAuB,SAAiB;AAE9D,UAAQ,KAAK,IAAI,UAAUA,eAAc,SAAS;AACpD;AAEO,SAAS,SACdA,WACA,SACA,OACA;AAEA,UAAQ;AAAA,IACN,IAAI,mCAAsB,IAAI,UAAUA,eAAc,WAAW;AAAA,MAC/D;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAMO,SAAS,0BACd,aACA,KACM;AACN,MAAI;AACF,UAAM,SAAS,OAAO,QAAQ,WAAW,IAAI,IAAI,GAAG,IAAI;AACxD,QAAI,OAAO,aAAa,eAAe,OAAO,WAAW,SAAS,QAAQ;AACxE;AAAA,IACF;AACA;AAAA,MACE;AAAA,MACA,0CAA0C,OAAO,uSAIvC;AAAA,IACZ;AAAA,EACF,QAAE;AAAA,EAEF;AACF;","names":["location"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
type LogLocation = 'ChunkLoader' | 'ChunkDispatcher' | 'ComponentLoader' | 'ModuleDispatcher' | 'RemoteScope' | 'SharedModules' | 'WebpackRuntime' | 'TurbopackModule' | 'StaticLoader' | 'ScriptLoader' | 'Polyfill' | 'HtmlRemote' | 'HtmlHost' | 'Config' | 'NextAppRouter' | 'NextAppRouterCompat' | 'FetchRemoteComponent' | 'SharedModuleResolver';
|
|
1
|
+
type LogLocation = 'ChunkLoader' | 'ChunkDispatcher' | 'ComponentLoader' | 'ModuleDispatcher' | 'RemoteScope' | 'SharedModules' | 'WebpackRuntime' | 'TurbopackModule' | 'StaticLoader' | 'ScriptLoader' | 'Polyfill' | 'HtmlRemote' | 'HtmlHost' | 'Config' | 'NextAppRouter' | 'NextAppRouterCompat' | 'FetchRemoteComponent' | 'SharedModuleResolver' | 'SharedBroker';
|
|
2
2
|
declare function logDebug(location: LogLocation, message: string): void;
|
|
3
3
|
declare function logInfo(location: LogLocation, message: string): void;
|
|
4
4
|
declare function logWarn(location: LogLocation, message: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/logger.ts"],"sourcesContent":["import { CORS_DOCS_URL } from '#internal/utils/constants';\nimport { RemoteComponentsError } from '#internal/utils/error';\n\nexport type LogLocation =\n | 'ChunkLoader'\n | 'ChunkDispatcher'\n | 'ComponentLoader'\n | 'ModuleDispatcher'\n | 'RemoteScope'\n | 'SharedModules'\n | 'WebpackRuntime'\n | 'TurbopackModule'\n | 'StaticLoader'\n | 'ScriptLoader'\n | 'Polyfill'\n | 'HtmlRemote'\n | 'HtmlHost'\n | 'Config'\n | 'NextAppRouter'\n | 'NextAppRouterCompat'\n | 'FetchRemoteComponent'\n | 'SharedModuleResolver';\n\nconst PREFIX = 'remote-components';\nconst DEBUG =\n (typeof window !== 'undefined' &&\n localStorage.getItem('RC_DEBUG') === 'true') ||\n (typeof process !== 'undefined' && process.env.RC_DEBUG === 'true');\n\nexport function logDebug(location: LogLocation, message: string) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.debug(`[${PREFIX}:${location}]: ${message}`);\n }\n}\n\nexport function logInfo(location: LogLocation, message: string) {\n // eslint-disable-next-line no-console\n console.info(`[${PREFIX}:${location}]: ${message}`);\n}\n\nexport function logWarn(location: LogLocation, message: string) {\n // eslint-disable-next-line no-console\n console.warn(`[${PREFIX}:${location}]: ${message}`);\n}\n\nexport function logError(\n location: LogLocation,\n message: string,\n cause?: unknown,\n) {\n // eslint-disable-next-line no-console\n console.error(\n new RemoteComponentsError(`[${PREFIX}:${location}]: ${message}`, {\n cause,\n }),\n );\n}\n\n/**\n * Logs a warning when a cross-origin asset request fails, guiding users\n * to configure the proxy middleware and resolveClientUrl on their host.\n */\nexport function warnCrossOriginFetchError(\n logLocation: LogLocation,\n url: string | URL,\n): void {\n try {\n const parsed = typeof url === 'string' ? new URL(url) : url;\n if (typeof location === 'undefined' || parsed.origin === location.origin) {\n return;\n }\n logWarn(\n logLocation,\n `Failed to fetch cross-origin resource \"${parsed.href}\". ` +\n 'To load assets from a protected deployment, two steps are required: ' +\n '(1) configure withRemoteComponentsHostProxy middleware in your host with the remote URL in allowedProxyUrls, ' +\n 'and (2) provide a resolveClientUrl prop that rewrites cross-origin asset URLs to go through the proxy. ' +\n `See: ${CORS_DOCS_URL}`,\n );\n } catch {\n // URL parsing failed — skip the warning\n }\n}\n"],"mappings":"AAAA,SAAS,qBAAqB;AAC9B,SAAS,6BAA6B;
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/logger.ts"],"sourcesContent":["import { CORS_DOCS_URL } from '#internal/utils/constants';\nimport { RemoteComponentsError } from '#internal/utils/error';\n\nexport type LogLocation =\n | 'ChunkLoader'\n | 'ChunkDispatcher'\n | 'ComponentLoader'\n | 'ModuleDispatcher'\n | 'RemoteScope'\n | 'SharedModules'\n | 'WebpackRuntime'\n | 'TurbopackModule'\n | 'StaticLoader'\n | 'ScriptLoader'\n | 'Polyfill'\n | 'HtmlRemote'\n | 'HtmlHost'\n | 'Config'\n | 'NextAppRouter'\n | 'NextAppRouterCompat'\n | 'FetchRemoteComponent'\n | 'SharedModuleResolver'\n | 'SharedBroker';\n\nconst PREFIX = 'remote-components';\nconst DEBUG =\n (typeof window !== 'undefined' &&\n localStorage.getItem('RC_DEBUG') === 'true') ||\n (typeof process !== 'undefined' && process.env.RC_DEBUG === 'true');\n\nexport function logDebug(location: LogLocation, message: string) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.debug(`[${PREFIX}:${location}]: ${message}`);\n }\n}\n\nexport function logInfo(location: LogLocation, message: string) {\n // eslint-disable-next-line no-console\n console.info(`[${PREFIX}:${location}]: ${message}`);\n}\n\nexport function logWarn(location: LogLocation, message: string) {\n // eslint-disable-next-line no-console\n console.warn(`[${PREFIX}:${location}]: ${message}`);\n}\n\nexport function logError(\n location: LogLocation,\n message: string,\n cause?: unknown,\n) {\n // eslint-disable-next-line no-console\n console.error(\n new RemoteComponentsError(`[${PREFIX}:${location}]: ${message}`, {\n cause,\n }),\n );\n}\n\n/**\n * Logs a warning when a cross-origin asset request fails, guiding users\n * to configure the proxy middleware and resolveClientUrl on their host.\n */\nexport function warnCrossOriginFetchError(\n logLocation: LogLocation,\n url: string | URL,\n): void {\n try {\n const parsed = typeof url === 'string' ? new URL(url) : url;\n if (typeof location === 'undefined' || parsed.origin === location.origin) {\n return;\n }\n logWarn(\n logLocation,\n `Failed to fetch cross-origin resource \"${parsed.href}\". ` +\n 'To load assets from a protected deployment, two steps are required: ' +\n '(1) configure withRemoteComponentsHostProxy middleware in your host with the remote URL in allowedProxyUrls, ' +\n 'and (2) provide a resolveClientUrl prop that rewrites cross-origin asset URLs to go through the proxy. ' +\n `See: ${CORS_DOCS_URL}`,\n );\n } catch {\n // URL parsing failed — skip the warning\n }\n}\n"],"mappings":"AAAA,SAAS,qBAAqB;AAC9B,SAAS,6BAA6B;AAuBtC,MAAM,SAAS;AACf,MAAM,QACH,OAAO,WAAW,eACjB,aAAa,QAAQ,UAAU,MAAM,UACtC,OAAO,YAAY,eAAe,QAAQ,IAAI,aAAa;AAEvD,SAAS,SAASA,WAAuB,SAAiB;AAC/D,MAAI,OAAO;AAET,YAAQ,MAAM,IAAI,UAAUA,eAAc,SAAS;AAAA,EACrD;AACF;AAEO,SAAS,QAAQA,WAAuB,SAAiB;AAE9D,UAAQ,KAAK,IAAI,UAAUA,eAAc,SAAS;AACpD;AAEO,SAAS,QAAQA,WAAuB,SAAiB;AAE9D,UAAQ,KAAK,IAAI,UAAUA,eAAc,SAAS;AACpD;AAEO,SAAS,SACdA,WACA,SACA,OACA;AAEA,UAAQ;AAAA,IACN,IAAI,sBAAsB,IAAI,UAAUA,eAAc,WAAW;AAAA,MAC/D;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAMO,SAAS,0BACd,aACA,KACM;AACN,MAAI;AACF,UAAM,SAAS,OAAO,QAAQ,WAAW,IAAI,IAAI,GAAG,IAAI;AACxD,QAAI,OAAO,aAAa,eAAe,OAAO,WAAW,SAAS,QAAQ;AACxE;AAAA,IACF;AACA;AAAA,MACE;AAAA,MACA,0CAA0C,OAAO,uSAIvC;AAAA,IACZ;AAAA,EACF,QAAE;AAAA,EAEF;AACF;","names":["location"]}
|