remote-components 0.4.11 → 0.4.12
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-GR5FN73U.js → chunk-24LEEDHP.js} +2 -2
- package/dist/{chunk-VFK4HGZT.js → chunk-BEGVH64U.js} +13 -4
- package/dist/chunk-BEGVH64U.js.map +1 -0
- package/dist/{chunk-RHRDUJ3K.js → chunk-CLO56ON2.js} +2 -2
- package/dist/{chunk-HZP4FWPG.cjs → chunk-HXCW3WDT.cjs} +8 -8
- package/dist/{chunk-N6AJM72A.js → chunk-RZGFQTX6.js} +3 -3
- package/dist/{chunk-PCHSF5LH.cjs → chunk-SULMNRMJ.cjs} +13 -4
- package/dist/chunk-SULMNRMJ.cjs.map +1 -0
- package/dist/{chunk-RZ224NSH.cjs → chunk-TGE3K3TR.cjs} +6 -6
- package/dist/{chunk-OSSMJQFE.cjs → chunk-YSJ4FKGI.cjs} +10 -10
- package/dist/host/html.cjs +13 -13
- package/dist/host/html.js +5 -5
- package/dist/host/nextjs/app/client-only.cjs +6 -6
- package/dist/host/nextjs/app/client-only.js +4 -4
- package/dist/host/react.cjs +5 -5
- package/dist/host/react.js +4 -4
- package/dist/internal/host/shared/provider.cjs +10 -1
- package/dist/internal/host/shared/provider.cjs.map +1 -1
- package/dist/internal/host/shared/provider.js +10 -1
- package/dist/internal/host/shared/provider.js.map +1 -1
- package/dist/internal/runtime/turbopack/shared-modules.cjs +2 -2
- package/dist/internal/runtime/turbopack/shared-modules.cjs.map +1 -1
- package/dist/internal/runtime/turbopack/shared-modules.js +2 -2
- package/dist/internal/runtime/turbopack/shared-modules.js.map +1 -1
- package/dist/{turbopack-6BSS3SYN.js → turbopack-43N2UJNN.js} +3 -3
- package/dist/{turbopack-UMJ7SLJL.cjs → turbopack-5VGMYUL4.cjs} +8 -8
- package/dist/{webpack-65BVWX2U.cjs → webpack-FSN5UBA2.cjs} +6 -6
- package/dist/{webpack-4QYGIVE6.js → webpack-LXE2UWTA.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-PCHSF5LH.cjs.map +0 -1
- package/dist/chunk-VFK4HGZT.js.map +0 -1
- /package/dist/{chunk-GR5FN73U.js.map → chunk-24LEEDHP.js.map} +0 -0
- /package/dist/{chunk-RHRDUJ3K.js.map → chunk-CLO56ON2.js.map} +0 -0
- /package/dist/{chunk-HZP4FWPG.cjs.map → chunk-HXCW3WDT.cjs.map} +0 -0
- /package/dist/{chunk-N6AJM72A.js.map → chunk-RZGFQTX6.js.map} +0 -0
- /package/dist/{chunk-RZ224NSH.cjs.map → chunk-TGE3K3TR.cjs.map} +0 -0
- /package/dist/{chunk-OSSMJQFE.cjs.map → chunk-YSJ4FKGI.cjs.map} +0 -0
- /package/dist/{turbopack-6BSS3SYN.js.map → turbopack-43N2UJNN.js.map} +0 -0
- /package/dist/{turbopack-UMJ7SLJL.cjs.map → turbopack-5VGMYUL4.cjs.map} +0 -0
- /package/dist/{webpack-65BVWX2U.cjs.map → webpack-FSN5UBA2.cjs.map} +0 -0
- /package/dist/{webpack-4QYGIVE6.js.map → webpack-LXE2UWTA.js.map} +0 -0
package/dist/host/react.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ConsumeRemoteComponent,
|
|
3
3
|
useRemoteNavigate
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-CLO56ON2.js";
|
|
5
|
+
import "../chunk-RZGFQTX6.js";
|
|
6
6
|
import "../chunk-M6ACTSVB.js";
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
7
|
+
import "../chunk-24LEEDHP.js";
|
|
8
|
+
import "../chunk-BEGVH64U.js";
|
|
9
9
|
import "../chunk-LEKG4YWI.js";
|
|
10
10
|
import "../chunk-RHGEBXPL.js";
|
|
11
11
|
import "../chunk-3PR3SWYZ.js";
|
|
@@ -75,9 +75,18 @@ async function buildSharedProviderPlan({
|
|
|
75
75
|
additionalEntries = [],
|
|
76
76
|
onMissing
|
|
77
77
|
}) {
|
|
78
|
+
let hostSharedForPlan = hostShared;
|
|
79
|
+
if (additionalEntries.length > 0) {
|
|
80
|
+
hostSharedForPlan = { ...hostShared };
|
|
81
|
+
for (const entry of additionalEntries) {
|
|
82
|
+
if (typeof entry.value !== "undefined" && !(entry.specifier in hostSharedForPlan)) {
|
|
83
|
+
hostSharedForPlan[entry.specifier] = entry.value;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
78
87
|
const sharedModulePlan = (0, import_shared_broker.createSharedModulePlan)({
|
|
79
88
|
bundle,
|
|
80
|
-
hostShared,
|
|
89
|
+
hostShared: hostSharedForPlan,
|
|
81
90
|
remoteShared,
|
|
82
91
|
scope,
|
|
83
92
|
callerTag
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/host/shared/provider.ts"],"sourcesContent":["import {\n createSharedModulePlan,\n type RemoteSharedModules,\n resolveSharedModulePlan,\n SHARED_MODULE_MANIFEST_PROTOCOL,\n type SharedModuleFactory,\n type SharedModuleResolution,\n} from '#internal/host/shared/shared-broker';\nimport type { LogLocation } from '#internal/utils/logger';\n\nconst DEFAULT_VERSION = '0';\nconst GLOBAL_PROVIDER_SCOPES_KEY =\n '__remote_components_shared_provider_scopes__';\n\nexport interface SharedProvider {\n get: () => unknown;\n from: string;\n eager?: boolean;\n loaded?: boolean | number;\n}\n\nexport type SharedProviderScope = Record<\n string,\n Record<string, SharedProvider>\n>;\n\nexport type SharedProviderScopes = Record<string, SharedProviderScope>;\n\nexport interface SharedProviderEntry {\n id: string;\n specifier: string;\n provider: SharedProvider;\n required: boolean;\n singleton: boolean;\n scope: string;\n}\n\nexport interface SharedProviderPlan {\n protocol: 'legacy' | typeof SHARED_MODULE_MANIFEST_PROTOCOL;\n entries: SharedProviderEntry[];\n}\n\nexport interface AdditionalSharedProviderEntry {\n id: string;\n specifier: string;\n value: unknown;\n required?: boolean;\n singleton?: boolean;\n scope?: string;\n from?: string;\n}\n\nfunction getProviderScopes(): SharedProviderScopes {\n const self = globalThis as typeof globalThis & {\n [GLOBAL_PROVIDER_SCOPES_KEY]?: SharedProviderScopes;\n };\n self[GLOBAL_PROVIDER_SCOPES_KEY] ??= {};\n return self[GLOBAL_PROVIDER_SCOPES_KEY];\n}\n\nexport function createSharedProvider({\n value,\n from,\n}: {\n value: unknown;\n from: string;\n}): SharedProvider {\n return {\n get: () => value,\n from,\n eager: true,\n loaded: 1,\n };\n}\n\nexport function createSharedProviderEntry({\n id,\n specifier,\n value,\n required = true,\n singleton = true,\n scope,\n from = 'host',\n}: AdditionalSharedProviderEntry & { scope: string }): SharedProviderEntry {\n return {\n id,\n specifier,\n provider: createSharedProvider({ value, from }),\n required,\n singleton,\n scope,\n };\n}\n\nexport async function buildSharedProviderPlan({\n bundle,\n hostShared,\n remoteShared,\n scope = `remote:${bundle}`,\n callerTag = 'SharedBroker',\n normalizeId = (id) => id,\n additionalEntries = [],\n onMissing,\n}: {\n bundle: string;\n hostShared: Record<string, SharedModuleFactory | unknown>;\n remoteShared: RemoteSharedModules;\n scope?: string;\n callerTag?: LogLocation;\n normalizeId?: (id: string) => string;\n additionalEntries?: AdditionalSharedProviderEntry[];\n onMissing?: (entry: SharedModuleResolution) => void;\n}): Promise<SharedProviderPlan> {\n const sharedModulePlan = createSharedModulePlan({\n bundle,\n hostShared,\n remoteShared,\n scope,\n callerTag,\n });\n const resolved = await resolveSharedModulePlan(sharedModulePlan);\n const entriesByIdAndSpecifier = new Map<string, SharedProviderEntry>();\n const addEntry = (entry: SharedProviderEntry) => {\n entriesByIdAndSpecifier.set(`${entry.id}\\0${entry.specifier}`, entry);\n };\n\n for (const entry of additionalEntries) {\n addEntry(\n createSharedProviderEntry({\n ...entry,\n scope: entry.scope ?? scope,\n }),\n );\n }\n\n for (const entry of sharedModulePlan.entries) {\n if (entry.status !== 'resolved') {\n if (\n onMissing &&\n !(\n sharedModulePlan.protocol === SHARED_MODULE_MANIFEST_PROTOCOL &&\n entry.required\n )\n ) {\n onMissing(entry);\n }\n continue;\n }\n\n const value = resolved[entry.id];\n if (typeof value === 'undefined') continue;\n addEntry(\n createSharedProviderEntry({\n id: normalizeId(entry.id),\n specifier: entry.specifier,\n value,\n required: entry.required,\n singleton: entry.singleton,\n scope: entry.scope,\n }),\n );\n }\n\n return {\n protocol: sharedModulePlan.protocol,\n entries: Array.from(entriesByIdAndSpecifier.values()),\n };\n}\n\nexport function installSharedProvider({\n scope,\n specifier,\n value,\n from,\n provider,\n version = DEFAULT_VERSION,\n}: {\n scope: string;\n specifier: string;\n value?: unknown;\n from?: string;\n provider?: SharedProvider;\n version?: string;\n}): SharedProvider {\n const scopes = getProviderScopes();\n const providerScope = (scopes[scope] ??= {});\n const versions = (providerScope[specifier] ??= {});\n const sharedProvider =\n provider ??\n createSharedProvider({\n value,\n from: from ?? 'host',\n });\n versions[version] = sharedProvider;\n return sharedProvider;\n}\n\nexport function installSharedProviderEntry(\n entry: SharedProviderEntry,\n): SharedProvider {\n return installSharedProvider({\n scope: entry.scope,\n specifier: entry.specifier,\n provider: entry.provider,\n });\n}\n\nexport function getSharedProvider({\n scope,\n specifier,\n version = DEFAULT_VERSION,\n}: {\n scope: string;\n specifier: string;\n version?: string;\n}): SharedProvider | undefined {\n const versions = getProviderScopes()[scope]?.[specifier];\n if (!versions) return undefined;\n\n // This provider scope does not implement semver negotiation. Use an exact\n // version match, then the host default provider when a constrained version is\n // unavailable.\n return (\n versions[version] ??\n (version === DEFAULT_VERSION ? undefined : versions[DEFAULT_VERSION])\n );\n}\n\nexport function getSharedProviderModule({\n scope,\n specifier,\n version,\n}: {\n scope: string;\n specifier: string;\n version?: string;\n}): unknown {\n const provider = getSharedProvider({ scope, specifier, version });\n if (!provider) {\n throw new Error(\n `Shared module \"${specifier}\" not found in provider scope \"${scope}\".`,\n );\n }\n provider.loaded = 1;\n return provider.get();\n}\n\nexport function resetSharedProviderScopesForTest(): void {\n const self = globalThis as typeof globalThis & {\n [GLOBAL_PROVIDER_SCOPES_KEY]?: SharedProviderScopes;\n };\n delete self[GLOBAL_PROVIDER_SCOPES_KEY];\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/host/shared/provider.ts"],"sourcesContent":["import {\n createSharedModulePlan,\n type RemoteSharedModules,\n resolveSharedModulePlan,\n SHARED_MODULE_MANIFEST_PROTOCOL,\n type SharedModuleFactory,\n type SharedModuleResolution,\n} from '#internal/host/shared/shared-broker';\nimport type { LogLocation } from '#internal/utils/logger';\n\nconst DEFAULT_VERSION = '0';\nconst GLOBAL_PROVIDER_SCOPES_KEY =\n '__remote_components_shared_provider_scopes__';\n\nexport interface SharedProvider {\n get: () => unknown;\n from: string;\n eager?: boolean;\n loaded?: boolean | number;\n}\n\nexport type SharedProviderScope = Record<\n string,\n Record<string, SharedProvider>\n>;\n\nexport type SharedProviderScopes = Record<string, SharedProviderScope>;\n\nexport interface SharedProviderEntry {\n id: string;\n specifier: string;\n provider: SharedProvider;\n required: boolean;\n singleton: boolean;\n scope: string;\n}\n\nexport interface SharedProviderPlan {\n protocol: 'legacy' | typeof SHARED_MODULE_MANIFEST_PROTOCOL;\n entries: SharedProviderEntry[];\n}\n\nexport interface AdditionalSharedProviderEntry {\n id: string;\n specifier: string;\n value: unknown;\n required?: boolean;\n singleton?: boolean;\n scope?: string;\n from?: string;\n}\n\nfunction getProviderScopes(): SharedProviderScopes {\n const self = globalThis as typeof globalThis & {\n [GLOBAL_PROVIDER_SCOPES_KEY]?: SharedProviderScopes;\n };\n self[GLOBAL_PROVIDER_SCOPES_KEY] ??= {};\n return self[GLOBAL_PROVIDER_SCOPES_KEY];\n}\n\nexport function createSharedProvider({\n value,\n from,\n}: {\n value: unknown;\n from: string;\n}): SharedProvider {\n return {\n get: () => value,\n from,\n eager: true,\n loaded: 1,\n };\n}\n\nexport function createSharedProviderEntry({\n id,\n specifier,\n value,\n required = true,\n singleton = true,\n scope,\n from = 'host',\n}: AdditionalSharedProviderEntry & { scope: string }): SharedProviderEntry {\n return {\n id,\n specifier,\n provider: createSharedProvider({ value, from }),\n required,\n singleton,\n scope,\n };\n}\n\nexport async function buildSharedProviderPlan({\n bundle,\n hostShared,\n remoteShared,\n scope = `remote:${bundle}`,\n callerTag = 'SharedBroker',\n normalizeId = (id) => id,\n additionalEntries = [],\n onMissing,\n}: {\n bundle: string;\n hostShared: Record<string, SharedModuleFactory | unknown>;\n remoteShared: RemoteSharedModules;\n scope?: string;\n callerTag?: LogLocation;\n normalizeId?: (id: string) => string;\n additionalEntries?: AdditionalSharedProviderEntry[];\n onMissing?: (entry: SharedModuleResolution) => void;\n}): Promise<SharedProviderPlan> {\n // `additionalEntries` are host-provided fallbacks (e.g. the host's own React\n // in the Webpack runtime, where core React is supplied here rather than\n // through `hostShared`). They satisfy remote requirements just like\n // `hostShared`, so fold them into the lookup the broker uses to build the\n // plan. Without this, a requirement met only by an additional entry is\n // marked \"missing\" and `resolveSharedModulePlan` emits a spurious\n // \"requires shared module ... but the host does not provide it\" diagnostic,\n // even though the module is provided a few lines below. Explicit `hostShared`\n // entries take precedence over these fallbacks.\n let hostSharedForPlan = hostShared;\n if (additionalEntries.length > 0) {\n hostSharedForPlan = { ...hostShared };\n for (const entry of additionalEntries) {\n if (\n typeof entry.value !== 'undefined' &&\n !(entry.specifier in hostSharedForPlan)\n ) {\n hostSharedForPlan[entry.specifier] = entry.value;\n }\n }\n }\n\n const sharedModulePlan = createSharedModulePlan({\n bundle,\n hostShared: hostSharedForPlan,\n remoteShared,\n scope,\n callerTag,\n });\n const resolved = await resolveSharedModulePlan(sharedModulePlan);\n const entriesByIdAndSpecifier = new Map<string, SharedProviderEntry>();\n const addEntry = (entry: SharedProviderEntry) => {\n entriesByIdAndSpecifier.set(`${entry.id}\\0${entry.specifier}`, entry);\n };\n\n for (const entry of additionalEntries) {\n addEntry(\n createSharedProviderEntry({\n ...entry,\n scope: entry.scope ?? scope,\n }),\n );\n }\n\n for (const entry of sharedModulePlan.entries) {\n if (entry.status !== 'resolved') {\n if (\n onMissing &&\n !(\n sharedModulePlan.protocol === SHARED_MODULE_MANIFEST_PROTOCOL &&\n entry.required\n )\n ) {\n onMissing(entry);\n }\n continue;\n }\n\n const value = resolved[entry.id];\n if (typeof value === 'undefined') continue;\n addEntry(\n createSharedProviderEntry({\n id: normalizeId(entry.id),\n specifier: entry.specifier,\n value,\n required: entry.required,\n singleton: entry.singleton,\n scope: entry.scope,\n }),\n );\n }\n\n return {\n protocol: sharedModulePlan.protocol,\n entries: Array.from(entriesByIdAndSpecifier.values()),\n };\n}\n\nexport function installSharedProvider({\n scope,\n specifier,\n value,\n from,\n provider,\n version = DEFAULT_VERSION,\n}: {\n scope: string;\n specifier: string;\n value?: unknown;\n from?: string;\n provider?: SharedProvider;\n version?: string;\n}): SharedProvider {\n const scopes = getProviderScopes();\n const providerScope = (scopes[scope] ??= {});\n const versions = (providerScope[specifier] ??= {});\n const sharedProvider =\n provider ??\n createSharedProvider({\n value,\n from: from ?? 'host',\n });\n versions[version] = sharedProvider;\n return sharedProvider;\n}\n\nexport function installSharedProviderEntry(\n entry: SharedProviderEntry,\n): SharedProvider {\n return installSharedProvider({\n scope: entry.scope,\n specifier: entry.specifier,\n provider: entry.provider,\n });\n}\n\nexport function getSharedProvider({\n scope,\n specifier,\n version = DEFAULT_VERSION,\n}: {\n scope: string;\n specifier: string;\n version?: string;\n}): SharedProvider | undefined {\n const versions = getProviderScopes()[scope]?.[specifier];\n if (!versions) return undefined;\n\n // This provider scope does not implement semver negotiation. Use an exact\n // version match, then the host default provider when a constrained version is\n // unavailable.\n return (\n versions[version] ??\n (version === DEFAULT_VERSION ? undefined : versions[DEFAULT_VERSION])\n );\n}\n\nexport function getSharedProviderModule({\n scope,\n specifier,\n version,\n}: {\n scope: string;\n specifier: string;\n version?: string;\n}): unknown {\n const provider = getSharedProvider({ scope, specifier, version });\n if (!provider) {\n throw new Error(\n `Shared module \"${specifier}\" not found in provider scope \"${scope}\".`,\n );\n }\n provider.loaded = 1;\n return provider.get();\n}\n\nexport function resetSharedProviderScopesForTest(): void {\n const self = globalThis as typeof globalThis & {\n [GLOBAL_PROVIDER_SCOPES_KEY]?: SharedProviderScopes;\n };\n delete self[GLOBAL_PROVIDER_SCOPES_KEY];\n}\n"],"mappings":"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","names":[]}
|
|
@@ -49,9 +49,18 @@ async function buildSharedProviderPlan({
|
|
|
49
49
|
additionalEntries = [],
|
|
50
50
|
onMissing
|
|
51
51
|
}) {
|
|
52
|
+
let hostSharedForPlan = hostShared;
|
|
53
|
+
if (additionalEntries.length > 0) {
|
|
54
|
+
hostSharedForPlan = { ...hostShared };
|
|
55
|
+
for (const entry of additionalEntries) {
|
|
56
|
+
if (typeof entry.value !== "undefined" && !(entry.specifier in hostSharedForPlan)) {
|
|
57
|
+
hostSharedForPlan[entry.specifier] = entry.value;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
52
61
|
const sharedModulePlan = createSharedModulePlan({
|
|
53
62
|
bundle,
|
|
54
|
-
hostShared,
|
|
63
|
+
hostShared: hostSharedForPlan,
|
|
55
64
|
remoteShared,
|
|
56
65
|
scope,
|
|
57
66
|
callerTag
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/host/shared/provider.ts"],"sourcesContent":["import {\n createSharedModulePlan,\n type RemoteSharedModules,\n resolveSharedModulePlan,\n SHARED_MODULE_MANIFEST_PROTOCOL,\n type SharedModuleFactory,\n type SharedModuleResolution,\n} from '#internal/host/shared/shared-broker';\nimport type { LogLocation } from '#internal/utils/logger';\n\nconst DEFAULT_VERSION = '0';\nconst GLOBAL_PROVIDER_SCOPES_KEY =\n '__remote_components_shared_provider_scopes__';\n\nexport interface SharedProvider {\n get: () => unknown;\n from: string;\n eager?: boolean;\n loaded?: boolean | number;\n}\n\nexport type SharedProviderScope = Record<\n string,\n Record<string, SharedProvider>\n>;\n\nexport type SharedProviderScopes = Record<string, SharedProviderScope>;\n\nexport interface SharedProviderEntry {\n id: string;\n specifier: string;\n provider: SharedProvider;\n required: boolean;\n singleton: boolean;\n scope: string;\n}\n\nexport interface SharedProviderPlan {\n protocol: 'legacy' | typeof SHARED_MODULE_MANIFEST_PROTOCOL;\n entries: SharedProviderEntry[];\n}\n\nexport interface AdditionalSharedProviderEntry {\n id: string;\n specifier: string;\n value: unknown;\n required?: boolean;\n singleton?: boolean;\n scope?: string;\n from?: string;\n}\n\nfunction getProviderScopes(): SharedProviderScopes {\n const self = globalThis as typeof globalThis & {\n [GLOBAL_PROVIDER_SCOPES_KEY]?: SharedProviderScopes;\n };\n self[GLOBAL_PROVIDER_SCOPES_KEY] ??= {};\n return self[GLOBAL_PROVIDER_SCOPES_KEY];\n}\n\nexport function createSharedProvider({\n value,\n from,\n}: {\n value: unknown;\n from: string;\n}): SharedProvider {\n return {\n get: () => value,\n from,\n eager: true,\n loaded: 1,\n };\n}\n\nexport function createSharedProviderEntry({\n id,\n specifier,\n value,\n required = true,\n singleton = true,\n scope,\n from = 'host',\n}: AdditionalSharedProviderEntry & { scope: string }): SharedProviderEntry {\n return {\n id,\n specifier,\n provider: createSharedProvider({ value, from }),\n required,\n singleton,\n scope,\n };\n}\n\nexport async function buildSharedProviderPlan({\n bundle,\n hostShared,\n remoteShared,\n scope = `remote:${bundle}`,\n callerTag = 'SharedBroker',\n normalizeId = (id) => id,\n additionalEntries = [],\n onMissing,\n}: {\n bundle: string;\n hostShared: Record<string, SharedModuleFactory | unknown>;\n remoteShared: RemoteSharedModules;\n scope?: string;\n callerTag?: LogLocation;\n normalizeId?: (id: string) => string;\n additionalEntries?: AdditionalSharedProviderEntry[];\n onMissing?: (entry: SharedModuleResolution) => void;\n}): Promise<SharedProviderPlan> {\n const sharedModulePlan = createSharedModulePlan({\n bundle,\n hostShared,\n remoteShared,\n scope,\n callerTag,\n });\n const resolved = await resolveSharedModulePlan(sharedModulePlan);\n const entriesByIdAndSpecifier = new Map<string, SharedProviderEntry>();\n const addEntry = (entry: SharedProviderEntry) => {\n entriesByIdAndSpecifier.set(`${entry.id}\\0${entry.specifier}`, entry);\n };\n\n for (const entry of additionalEntries) {\n addEntry(\n createSharedProviderEntry({\n ...entry,\n scope: entry.scope ?? scope,\n }),\n );\n }\n\n for (const entry of sharedModulePlan.entries) {\n if (entry.status !== 'resolved') {\n if (\n onMissing &&\n !(\n sharedModulePlan.protocol === SHARED_MODULE_MANIFEST_PROTOCOL &&\n entry.required\n )\n ) {\n onMissing(entry);\n }\n continue;\n }\n\n const value = resolved[entry.id];\n if (typeof value === 'undefined') continue;\n addEntry(\n createSharedProviderEntry({\n id: normalizeId(entry.id),\n specifier: entry.specifier,\n value,\n required: entry.required,\n singleton: entry.singleton,\n scope: entry.scope,\n }),\n );\n }\n\n return {\n protocol: sharedModulePlan.protocol,\n entries: Array.from(entriesByIdAndSpecifier.values()),\n };\n}\n\nexport function installSharedProvider({\n scope,\n specifier,\n value,\n from,\n provider,\n version = DEFAULT_VERSION,\n}: {\n scope: string;\n specifier: string;\n value?: unknown;\n from?: string;\n provider?: SharedProvider;\n version?: string;\n}): SharedProvider {\n const scopes = getProviderScopes();\n const providerScope = (scopes[scope] ??= {});\n const versions = (providerScope[specifier] ??= {});\n const sharedProvider =\n provider ??\n createSharedProvider({\n value,\n from: from ?? 'host',\n });\n versions[version] = sharedProvider;\n return sharedProvider;\n}\n\nexport function installSharedProviderEntry(\n entry: SharedProviderEntry,\n): SharedProvider {\n return installSharedProvider({\n scope: entry.scope,\n specifier: entry.specifier,\n provider: entry.provider,\n });\n}\n\nexport function getSharedProvider({\n scope,\n specifier,\n version = DEFAULT_VERSION,\n}: {\n scope: string;\n specifier: string;\n version?: string;\n}): SharedProvider | undefined {\n const versions = getProviderScopes()[scope]?.[specifier];\n if (!versions) return undefined;\n\n // This provider scope does not implement semver negotiation. Use an exact\n // version match, then the host default provider when a constrained version is\n // unavailable.\n return (\n versions[version] ??\n (version === DEFAULT_VERSION ? undefined : versions[DEFAULT_VERSION])\n );\n}\n\nexport function getSharedProviderModule({\n scope,\n specifier,\n version,\n}: {\n scope: string;\n specifier: string;\n version?: string;\n}): unknown {\n const provider = getSharedProvider({ scope, specifier, version });\n if (!provider) {\n throw new Error(\n `Shared module \"${specifier}\" not found in provider scope \"${scope}\".`,\n );\n }\n provider.loaded = 1;\n return provider.get();\n}\n\nexport function resetSharedProviderScopesForTest(): void {\n const self = globalThis as typeof globalThis & {\n [GLOBAL_PROVIDER_SCOPES_KEY]?: SharedProviderScopes;\n };\n delete self[GLOBAL_PROVIDER_SCOPES_KEY];\n}\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,OAGK;AAGP,MAAM,kBAAkB;AACxB,MAAM,6BACJ;AAwCF,SAAS,oBAA0C;AACjD,QAAM,OAAO;AAGb,OAAK,0BAA0B,MAAM,CAAC;AACtC,SAAO,KAAK,0BAA0B;AACxC;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AACF,GAGmB;AACjB,SAAO;AAAA,IACL,KAAK,MAAM;AAAA,IACX;AAAA,IACA,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAEO,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ;AAAA,EACA,OAAO;AACT,GAA2E;AACzE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,qBAAqB,EAAE,OAAO,KAAK,CAAC;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,wBAAwB;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ,UAAU;AAAA,EAClB,YAAY;AAAA,EACZ,cAAc,CAAC,OAAO;AAAA,EACtB,oBAAoB,CAAC;AAAA,EACrB;AACF,GASgC;
|
|
1
|
+
{"version":3,"sources":["../../../../src/host/shared/provider.ts"],"sourcesContent":["import {\n createSharedModulePlan,\n type RemoteSharedModules,\n resolveSharedModulePlan,\n SHARED_MODULE_MANIFEST_PROTOCOL,\n type SharedModuleFactory,\n type SharedModuleResolution,\n} from '#internal/host/shared/shared-broker';\nimport type { LogLocation } from '#internal/utils/logger';\n\nconst DEFAULT_VERSION = '0';\nconst GLOBAL_PROVIDER_SCOPES_KEY =\n '__remote_components_shared_provider_scopes__';\n\nexport interface SharedProvider {\n get: () => unknown;\n from: string;\n eager?: boolean;\n loaded?: boolean | number;\n}\n\nexport type SharedProviderScope = Record<\n string,\n Record<string, SharedProvider>\n>;\n\nexport type SharedProviderScopes = Record<string, SharedProviderScope>;\n\nexport interface SharedProviderEntry {\n id: string;\n specifier: string;\n provider: SharedProvider;\n required: boolean;\n singleton: boolean;\n scope: string;\n}\n\nexport interface SharedProviderPlan {\n protocol: 'legacy' | typeof SHARED_MODULE_MANIFEST_PROTOCOL;\n entries: SharedProviderEntry[];\n}\n\nexport interface AdditionalSharedProviderEntry {\n id: string;\n specifier: string;\n value: unknown;\n required?: boolean;\n singleton?: boolean;\n scope?: string;\n from?: string;\n}\n\nfunction getProviderScopes(): SharedProviderScopes {\n const self = globalThis as typeof globalThis & {\n [GLOBAL_PROVIDER_SCOPES_KEY]?: SharedProviderScopes;\n };\n self[GLOBAL_PROVIDER_SCOPES_KEY] ??= {};\n return self[GLOBAL_PROVIDER_SCOPES_KEY];\n}\n\nexport function createSharedProvider({\n value,\n from,\n}: {\n value: unknown;\n from: string;\n}): SharedProvider {\n return {\n get: () => value,\n from,\n eager: true,\n loaded: 1,\n };\n}\n\nexport function createSharedProviderEntry({\n id,\n specifier,\n value,\n required = true,\n singleton = true,\n scope,\n from = 'host',\n}: AdditionalSharedProviderEntry & { scope: string }): SharedProviderEntry {\n return {\n id,\n specifier,\n provider: createSharedProvider({ value, from }),\n required,\n singleton,\n scope,\n };\n}\n\nexport async function buildSharedProviderPlan({\n bundle,\n hostShared,\n remoteShared,\n scope = `remote:${bundle}`,\n callerTag = 'SharedBroker',\n normalizeId = (id) => id,\n additionalEntries = [],\n onMissing,\n}: {\n bundle: string;\n hostShared: Record<string, SharedModuleFactory | unknown>;\n remoteShared: RemoteSharedModules;\n scope?: string;\n callerTag?: LogLocation;\n normalizeId?: (id: string) => string;\n additionalEntries?: AdditionalSharedProviderEntry[];\n onMissing?: (entry: SharedModuleResolution) => void;\n}): Promise<SharedProviderPlan> {\n // `additionalEntries` are host-provided fallbacks (e.g. the host's own React\n // in the Webpack runtime, where core React is supplied here rather than\n // through `hostShared`). They satisfy remote requirements just like\n // `hostShared`, so fold them into the lookup the broker uses to build the\n // plan. Without this, a requirement met only by an additional entry is\n // marked \"missing\" and `resolveSharedModulePlan` emits a spurious\n // \"requires shared module ... but the host does not provide it\" diagnostic,\n // even though the module is provided a few lines below. Explicit `hostShared`\n // entries take precedence over these fallbacks.\n let hostSharedForPlan = hostShared;\n if (additionalEntries.length > 0) {\n hostSharedForPlan = { ...hostShared };\n for (const entry of additionalEntries) {\n if (\n typeof entry.value !== 'undefined' &&\n !(entry.specifier in hostSharedForPlan)\n ) {\n hostSharedForPlan[entry.specifier] = entry.value;\n }\n }\n }\n\n const sharedModulePlan = createSharedModulePlan({\n bundle,\n hostShared: hostSharedForPlan,\n remoteShared,\n scope,\n callerTag,\n });\n const resolved = await resolveSharedModulePlan(sharedModulePlan);\n const entriesByIdAndSpecifier = new Map<string, SharedProviderEntry>();\n const addEntry = (entry: SharedProviderEntry) => {\n entriesByIdAndSpecifier.set(`${entry.id}\\0${entry.specifier}`, entry);\n };\n\n for (const entry of additionalEntries) {\n addEntry(\n createSharedProviderEntry({\n ...entry,\n scope: entry.scope ?? scope,\n }),\n );\n }\n\n for (const entry of sharedModulePlan.entries) {\n if (entry.status !== 'resolved') {\n if (\n onMissing &&\n !(\n sharedModulePlan.protocol === SHARED_MODULE_MANIFEST_PROTOCOL &&\n entry.required\n )\n ) {\n onMissing(entry);\n }\n continue;\n }\n\n const value = resolved[entry.id];\n if (typeof value === 'undefined') continue;\n addEntry(\n createSharedProviderEntry({\n id: normalizeId(entry.id),\n specifier: entry.specifier,\n value,\n required: entry.required,\n singleton: entry.singleton,\n scope: entry.scope,\n }),\n );\n }\n\n return {\n protocol: sharedModulePlan.protocol,\n entries: Array.from(entriesByIdAndSpecifier.values()),\n };\n}\n\nexport function installSharedProvider({\n scope,\n specifier,\n value,\n from,\n provider,\n version = DEFAULT_VERSION,\n}: {\n scope: string;\n specifier: string;\n value?: unknown;\n from?: string;\n provider?: SharedProvider;\n version?: string;\n}): SharedProvider {\n const scopes = getProviderScopes();\n const providerScope = (scopes[scope] ??= {});\n const versions = (providerScope[specifier] ??= {});\n const sharedProvider =\n provider ??\n createSharedProvider({\n value,\n from: from ?? 'host',\n });\n versions[version] = sharedProvider;\n return sharedProvider;\n}\n\nexport function installSharedProviderEntry(\n entry: SharedProviderEntry,\n): SharedProvider {\n return installSharedProvider({\n scope: entry.scope,\n specifier: entry.specifier,\n provider: entry.provider,\n });\n}\n\nexport function getSharedProvider({\n scope,\n specifier,\n version = DEFAULT_VERSION,\n}: {\n scope: string;\n specifier: string;\n version?: string;\n}): SharedProvider | undefined {\n const versions = getProviderScopes()[scope]?.[specifier];\n if (!versions) return undefined;\n\n // This provider scope does not implement semver negotiation. Use an exact\n // version match, then the host default provider when a constrained version is\n // unavailable.\n return (\n versions[version] ??\n (version === DEFAULT_VERSION ? undefined : versions[DEFAULT_VERSION])\n );\n}\n\nexport function getSharedProviderModule({\n scope,\n specifier,\n version,\n}: {\n scope: string;\n specifier: string;\n version?: string;\n}): unknown {\n const provider = getSharedProvider({ scope, specifier, version });\n if (!provider) {\n throw new Error(\n `Shared module \"${specifier}\" not found in provider scope \"${scope}\".`,\n );\n }\n provider.loaded = 1;\n return provider.get();\n}\n\nexport function resetSharedProviderScopesForTest(): void {\n const self = globalThis as typeof globalThis & {\n [GLOBAL_PROVIDER_SCOPES_KEY]?: SharedProviderScopes;\n };\n delete self[GLOBAL_PROVIDER_SCOPES_KEY];\n}\n"],"mappings":"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","names":[]}
|
|
@@ -265,10 +265,10 @@ function getSharedModule(scope, id) {
|
|
|
265
265
|
return null;
|
|
266
266
|
}
|
|
267
267
|
function matchesSharedModuleKey(id, key) {
|
|
268
|
-
if (id.endsWith(key))
|
|
269
|
-
return true;
|
|
270
268
|
if (!key.includes("/") && !key.endsWith(".js"))
|
|
271
269
|
return false;
|
|
270
|
+
if (id.endsWith(key))
|
|
271
|
+
return true;
|
|
272
272
|
const index = id.lastIndexOf(key);
|
|
273
273
|
if (index < 0)
|
|
274
274
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/runtime/turbopack/shared-modules.ts"],"sourcesContent":["import {\n buildSharedProviderPlan,\n getSharedProviderModule,\n installSharedProviderEntry,\n} from '#internal/host/shared/provider';\nimport {\n isSharedModuleManifest,\n type RemoteSharedModules,\n SHARED_MODULE_MANIFEST_PROTOCOL,\n type SharedModuleFactory,\n type SharedModuleManifest,\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, requireModule } from './module';\nimport {\n ASYNC_MODULE_CALLBACK_RE,\n ASYNC_MODULE_LOADER_RE,\n extractGroup,\n normalizeModuleId,\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// `asyncSharedModuleId` accepts: quoted string, integer, or integer in\n// scientific notation (e.g. `35e3`). Production minifiers occasionally\n// emit the scientific form; see normalizeModuleId() / MODULE_ID_PATTERN\n// in ./patterns.ts for the matching marker-extraction path.\nconst INLINE_REMOTE_SHARED_RE =\n /[\"']?__remote_shared_module_(?<specifier>[^\"':]+)[\"']?\\s*:\\s*\\(\\)\\s*=>\\s*(?:__turbopack_context__|[a-z])\\.A\\((?<asyncSharedModuleId>\"[^\"]+\"|[0-9]+e[0-9]+|[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: RemoteSharedModules = {},\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 module. Turbopack emits its\n // factory body as\n // ctx.v((parentImport) => Promise.all([...]).then(() => parentImport(id)))\n // so `module.exports` IS the loader function (upstream `exportValue`\n // semantics). Earlier versions of remote-components' `ctx.v` eagerly\n // invoked the function and stored the resulting Promise on\n // `exports.default` — that shape is preserved here as a fallback for\n // bundles built against the old runtime, but the primary path now\n // invokes the loader explicitly with `requireModule` as the parent\n // import (the actual scope-bound require).\n if (sharedModuleId) {\n const moduleExports = handleTurbopackModule(\n scope,\n sharedModuleId,\n formatRemoteId(scope, String(sharedModuleInitializerId)),\n );\n type Loader = (\n parentImport: (id: string | number) => unknown,\n ) => Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }>;\n const loaderCandidate =\n typeof moduleExports === 'function'\n ? moduleExports\n : (moduleExports as { default?: unknown })?.default;\n if (typeof loaderCandidate === 'function') {\n sharedModuleInitializer = (loaderCandidate as Loader)((parentId) =>\n requireModule(scope, parentId),\n );\n } else if (\n loaderCandidate &&\n typeof (loaderCandidate as { then?: unknown }).then === 'function'\n ) {\n sharedModuleInitializer = loaderCandidate as Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }>;\n }\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 preferSharedManifest(sharedModuleIds, remoteShared),\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 preferSharedManifest(inlineSharedModuleIds, remoteShared),\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 const normalizedRemoteShared =\n normalizeRemoteSharedForTurbopackFallback(remoteShared);\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 rawAsyncSharedModuleId = stripQuotes(\n match.groups?.asyncSharedModuleId,\n );\n const asyncSharedModuleId = rawAsyncSharedModuleId\n ? normalizeModuleId(rawAsyncSharedModuleId)\n : undefined;\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: RemoteSharedModules,\n missingMessage: (id: string, module: string) => string,\n): Promise<undefined[]> {\n return buildSharedProviderPlan({\n bundle: scope.name,\n hostShared,\n remoteShared: sharedModuleIds,\n scope: `remote:${scope.scopedName}`,\n callerTag: 'SharedModules',\n onMissing: (entry) => {\n logError('SharedModules', missingMessage(entry.id, entry.specifier));\n },\n }).then((results) =>\n results.entries.map((entry) => {\n installSharedProviderEntry(entry);\n scope.sharedModules[entry.id] = getSharedProviderModule({\n scope: entry.scope,\n specifier: entry.specifier,\n });\n // Compatibility with the old shared-modules architecture: a remote\n // factory may have already cached its own implementation for this ID.\n // The provider-owned scope.sharedModules entry must replace it. Remove\n // this cache cleanup once Turbopack remotes cannot execute shared\n // factories before the scoped provider plan is installed.\n delete scope.moduleCache[entry.id];\n return undefined;\n }),\n );\n}\n\nfunction preferSharedManifest(\n sharedModuleIds: Record<string, string>,\n remoteShared: RemoteSharedModules,\n): RemoteSharedModules {\n if (!isSharedModuleManifest(remoteShared)) return sharedModuleIds;\n\n const extractedIdBySpecifier = new Map(\n Object.entries(sharedModuleIds).map(([id, specifier]) => [specifier, id]),\n );\n\n return {\n protocol: SHARED_MODULE_MANIFEST_PROTOCOL,\n requirements: remoteShared.requirements.map((requirement) => {\n return {\n ...requirement,\n id: extractedIdBySpecifier.get(requirement.specifier) ?? requirement.id,\n };\n }),\n };\n}\n\nfunction normalizeRemoteSharedForTurbopackFallback(\n remoteShared: RemoteSharedModules,\n): RemoteSharedModules {\n if (isSharedModuleManifest(remoteShared)) {\n return {\n ...remoteShared,\n requirements: remoteShared.requirements.map((requirement) => ({\n ...requirement,\n id:\n typeof requirement.id === 'string'\n ? requirement.id.replace('[app-ssr]', '[app-client]')\n : requirement.id,\n })),\n } satisfies SharedModuleManifest;\n }\n\n // @legacy(remote-components<=0.4.x): normalize server-side generated\n // Turbopack IDs from the historical shared map until 0.4.x remotes are\n // outside the compatibility window.\n return Object.fromEntries(\n Object.entries(remoteShared).map(([id, module]) => [\n id.replace('[app-ssr]', '[app-client]'),\n module,\n ]),\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
|
+
{"version":3,"sources":["../../../../src/runtime/turbopack/shared-modules.ts"],"sourcesContent":["import {\n buildSharedProviderPlan,\n getSharedProviderModule,\n installSharedProviderEntry,\n} from '#internal/host/shared/provider';\nimport {\n isSharedModuleManifest,\n type RemoteSharedModules,\n SHARED_MODULE_MANIFEST_PROTOCOL,\n type SharedModuleFactory,\n type SharedModuleManifest,\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, requireModule } from './module';\nimport {\n ASYNC_MODULE_CALLBACK_RE,\n ASYNC_MODULE_LOADER_RE,\n extractGroup,\n normalizeModuleId,\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// `asyncSharedModuleId` accepts: quoted string, integer, or integer in\n// scientific notation (e.g. `35e3`). Production minifiers occasionally\n// emit the scientific form; see normalizeModuleId() / MODULE_ID_PATTERN\n// in ./patterns.ts for the matching marker-extraction path.\nconst INLINE_REMOTE_SHARED_RE =\n /[\"']?__remote_shared_module_(?<specifier>[^\"':]+)[\"']?\\s*:\\s*\\(\\)\\s*=>\\s*(?:__turbopack_context__|[a-z])\\.A\\((?<asyncSharedModuleId>\"[^\"]+\"|[0-9]+e[0-9]+|[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: RemoteSharedModules = {},\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 module. Turbopack emits its\n // factory body as\n // ctx.v((parentImport) => Promise.all([...]).then(() => parentImport(id)))\n // so `module.exports` IS the loader function (upstream `exportValue`\n // semantics). Earlier versions of remote-components' `ctx.v` eagerly\n // invoked the function and stored the resulting Promise on\n // `exports.default` — that shape is preserved here as a fallback for\n // bundles built against the old runtime, but the primary path now\n // invokes the loader explicitly with `requireModule` as the parent\n // import (the actual scope-bound require).\n if (sharedModuleId) {\n const moduleExports = handleTurbopackModule(\n scope,\n sharedModuleId,\n formatRemoteId(scope, String(sharedModuleInitializerId)),\n );\n type Loader = (\n parentImport: (id: string | number) => unknown,\n ) => Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }>;\n const loaderCandidate =\n typeof moduleExports === 'function'\n ? moduleExports\n : (moduleExports as { default?: unknown })?.default;\n if (typeof loaderCandidate === 'function') {\n sharedModuleInitializer = (loaderCandidate as Loader)((parentId) =>\n requireModule(scope, parentId),\n );\n } else if (\n loaderCandidate &&\n typeof (loaderCandidate as { then?: unknown }).then === 'function'\n ) {\n sharedModuleInitializer = loaderCandidate as Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }>;\n }\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 preferSharedManifest(sharedModuleIds, remoteShared),\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 preferSharedManifest(inlineSharedModuleIds, remoteShared),\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 const normalizedRemoteShared =\n normalizeRemoteSharedForTurbopackFallback(remoteShared);\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 rawAsyncSharedModuleId = stripQuotes(\n match.groups?.asyncSharedModuleId,\n );\n const asyncSharedModuleId = rawAsyncSharedModuleId\n ? normalizeModuleId(rawAsyncSharedModuleId)\n : undefined;\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: RemoteSharedModules,\n missingMessage: (id: string, module: string) => string,\n): Promise<undefined[]> {\n return buildSharedProviderPlan({\n bundle: scope.name,\n hostShared,\n remoteShared: sharedModuleIds,\n scope: `remote:${scope.scopedName}`,\n callerTag: 'SharedModules',\n onMissing: (entry) => {\n logError('SharedModules', missingMessage(entry.id, entry.specifier));\n },\n }).then((results) =>\n results.entries.map((entry) => {\n installSharedProviderEntry(entry);\n scope.sharedModules[entry.id] = getSharedProviderModule({\n scope: entry.scope,\n specifier: entry.specifier,\n });\n // Compatibility with the old shared-modules architecture: a remote\n // factory may have already cached its own implementation for this ID.\n // The provider-owned scope.sharedModules entry must replace it. Remove\n // this cache cleanup once Turbopack remotes cannot execute shared\n // factories before the scoped provider plan is installed.\n delete scope.moduleCache[entry.id];\n return undefined;\n }),\n );\n}\n\nfunction preferSharedManifest(\n sharedModuleIds: Record<string, string>,\n remoteShared: RemoteSharedModules,\n): RemoteSharedModules {\n if (!isSharedModuleManifest(remoteShared)) return sharedModuleIds;\n\n const extractedIdBySpecifier = new Map(\n Object.entries(sharedModuleIds).map(([id, specifier]) => [specifier, id]),\n );\n\n return {\n protocol: SHARED_MODULE_MANIFEST_PROTOCOL,\n requirements: remoteShared.requirements.map((requirement) => {\n return {\n ...requirement,\n id: extractedIdBySpecifier.get(requirement.specifier) ?? requirement.id,\n };\n }),\n };\n}\n\nfunction normalizeRemoteSharedForTurbopackFallback(\n remoteShared: RemoteSharedModules,\n): RemoteSharedModules {\n if (isSharedModuleManifest(remoteShared)) {\n return {\n ...remoteShared,\n requirements: remoteShared.requirements.map((requirement) => ({\n ...requirement,\n id:\n typeof requirement.id === 'string'\n ? requirement.id.replace('[app-ssr]', '[app-client]')\n : requirement.id,\n })),\n } satisfies SharedModuleManifest;\n }\n\n // @legacy(remote-components<=0.4.x): normalize server-side generated\n // Turbopack IDs from the historical shared map until 0.4.x remotes are\n // outside the compatibility window.\n return Object.fromEntries(\n Object.entries(remoteShared).map(([id, module]) => [\n id.replace('[app-ssr]', '[app-client]'),\n module,\n ]),\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 // Suffix matching only applies to path-like keys (e.g. a bundle-prefixed id\n // \"[bundle] /react/index.js\" or a dev id matching the shared key\n // \"/react/index.js\"). Plain numeric Turbopack IDs must match exactly — which\n // the caller already handles before this fallback. This guard MUST run before\n // the `endsWith` check: otherwise a longer numeric id spuriously matches a\n // shorter shared numeric key (e.g. id \"6487\" ends with shared key \"487\", the\n // `next/dist/build/polyfills/process` module), handing the wrong module to the\n // host. Turbopack reassigns numeric ids per build, so such collisions surface\n // unpredictably across Next.js versions.\n if (!key.includes('/') && !key.endsWith('.js')) return false;\n\n if (id.endsWith(key)) return true;\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"]}
|
|
@@ -254,10 +254,10 @@ function getSharedModule(scope, id) {
|
|
|
254
254
|
return null;
|
|
255
255
|
}
|
|
256
256
|
function matchesSharedModuleKey(id, key) {
|
|
257
|
-
if (id.endsWith(key))
|
|
258
|
-
return true;
|
|
259
257
|
if (!key.includes("/") && !key.endsWith(".js"))
|
|
260
258
|
return false;
|
|
259
|
+
if (id.endsWith(key))
|
|
260
|
+
return true;
|
|
261
261
|
const index = id.lastIndexOf(key);
|
|
262
262
|
if (index < 0)
|
|
263
263
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/runtime/turbopack/shared-modules.ts"],"sourcesContent":["import {\n buildSharedProviderPlan,\n getSharedProviderModule,\n installSharedProviderEntry,\n} from '#internal/host/shared/provider';\nimport {\n isSharedModuleManifest,\n type RemoteSharedModules,\n SHARED_MODULE_MANIFEST_PROTOCOL,\n type SharedModuleFactory,\n type SharedModuleManifest,\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, requireModule } from './module';\nimport {\n ASYNC_MODULE_CALLBACK_RE,\n ASYNC_MODULE_LOADER_RE,\n extractGroup,\n normalizeModuleId,\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// `asyncSharedModuleId` accepts: quoted string, integer, or integer in\n// scientific notation (e.g. `35e3`). Production minifiers occasionally\n// emit the scientific form; see normalizeModuleId() / MODULE_ID_PATTERN\n// in ./patterns.ts for the matching marker-extraction path.\nconst INLINE_REMOTE_SHARED_RE =\n /[\"']?__remote_shared_module_(?<specifier>[^\"':]+)[\"']?\\s*:\\s*\\(\\)\\s*=>\\s*(?:__turbopack_context__|[a-z])\\.A\\((?<asyncSharedModuleId>\"[^\"]+\"|[0-9]+e[0-9]+|[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: RemoteSharedModules = {},\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 module. Turbopack emits its\n // factory body as\n // ctx.v((parentImport) => Promise.all([...]).then(() => parentImport(id)))\n // so `module.exports` IS the loader function (upstream `exportValue`\n // semantics). Earlier versions of remote-components' `ctx.v` eagerly\n // invoked the function and stored the resulting Promise on\n // `exports.default` — that shape is preserved here as a fallback for\n // bundles built against the old runtime, but the primary path now\n // invokes the loader explicitly with `requireModule` as the parent\n // import (the actual scope-bound require).\n if (sharedModuleId) {\n const moduleExports = handleTurbopackModule(\n scope,\n sharedModuleId,\n formatRemoteId(scope, String(sharedModuleInitializerId)),\n );\n type Loader = (\n parentImport: (id: string | number) => unknown,\n ) => Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }>;\n const loaderCandidate =\n typeof moduleExports === 'function'\n ? moduleExports\n : (moduleExports as { default?: unknown })?.default;\n if (typeof loaderCandidate === 'function') {\n sharedModuleInitializer = (loaderCandidate as Loader)((parentId) =>\n requireModule(scope, parentId),\n );\n } else if (\n loaderCandidate &&\n typeof (loaderCandidate as { then?: unknown }).then === 'function'\n ) {\n sharedModuleInitializer = loaderCandidate as Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }>;\n }\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 preferSharedManifest(sharedModuleIds, remoteShared),\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 preferSharedManifest(inlineSharedModuleIds, remoteShared),\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 const normalizedRemoteShared =\n normalizeRemoteSharedForTurbopackFallback(remoteShared);\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 rawAsyncSharedModuleId = stripQuotes(\n match.groups?.asyncSharedModuleId,\n );\n const asyncSharedModuleId = rawAsyncSharedModuleId\n ? normalizeModuleId(rawAsyncSharedModuleId)\n : undefined;\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: RemoteSharedModules,\n missingMessage: (id: string, module: string) => string,\n): Promise<undefined[]> {\n return buildSharedProviderPlan({\n bundle: scope.name,\n hostShared,\n remoteShared: sharedModuleIds,\n scope: `remote:${scope.scopedName}`,\n callerTag: 'SharedModules',\n onMissing: (entry) => {\n logError('SharedModules', missingMessage(entry.id, entry.specifier));\n },\n }).then((results) =>\n results.entries.map((entry) => {\n installSharedProviderEntry(entry);\n scope.sharedModules[entry.id] = getSharedProviderModule({\n scope: entry.scope,\n specifier: entry.specifier,\n });\n // Compatibility with the old shared-modules architecture: a remote\n // factory may have already cached its own implementation for this ID.\n // The provider-owned scope.sharedModules entry must replace it. Remove\n // this cache cleanup once Turbopack remotes cannot execute shared\n // factories before the scoped provider plan is installed.\n delete scope.moduleCache[entry.id];\n return undefined;\n }),\n );\n}\n\nfunction preferSharedManifest(\n sharedModuleIds: Record<string, string>,\n remoteShared: RemoteSharedModules,\n): RemoteSharedModules {\n if (!isSharedModuleManifest(remoteShared)) return sharedModuleIds;\n\n const extractedIdBySpecifier = new Map(\n Object.entries(sharedModuleIds).map(([id, specifier]) => [specifier, id]),\n );\n\n return {\n protocol: SHARED_MODULE_MANIFEST_PROTOCOL,\n requirements: remoteShared.requirements.map((requirement) => {\n return {\n ...requirement,\n id: extractedIdBySpecifier.get(requirement.specifier) ?? requirement.id,\n };\n }),\n };\n}\n\nfunction normalizeRemoteSharedForTurbopackFallback(\n remoteShared: RemoteSharedModules,\n): RemoteSharedModules {\n if (isSharedModuleManifest(remoteShared)) {\n return {\n ...remoteShared,\n requirements: remoteShared.requirements.map((requirement) => ({\n ...requirement,\n id:\n typeof requirement.id === 'string'\n ? requirement.id.replace('[app-ssr]', '[app-client]')\n : requirement.id,\n })),\n } satisfies SharedModuleManifest;\n }\n\n // @legacy(remote-components<=0.4.x): normalize server-side generated\n // Turbopack IDs from the historical shared map until 0.4.x remotes are\n // outside the compatibility window.\n return Object.fromEntries(\n Object.entries(remoteShared).map(([id, module]) => [\n id.replace('[app-ssr]', '[app-client]'),\n module,\n ]),\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":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/runtime/turbopack/shared-modules.ts"],"sourcesContent":["import {\n buildSharedProviderPlan,\n getSharedProviderModule,\n installSharedProviderEntry,\n} from '#internal/host/shared/provider';\nimport {\n isSharedModuleManifest,\n type RemoteSharedModules,\n SHARED_MODULE_MANIFEST_PROTOCOL,\n type SharedModuleFactory,\n type SharedModuleManifest,\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, requireModule } from './module';\nimport {\n ASYNC_MODULE_CALLBACK_RE,\n ASYNC_MODULE_LOADER_RE,\n extractGroup,\n normalizeModuleId,\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// `asyncSharedModuleId` accepts: quoted string, integer, or integer in\n// scientific notation (e.g. `35e3`). Production minifiers occasionally\n// emit the scientific form; see normalizeModuleId() / MODULE_ID_PATTERN\n// in ./patterns.ts for the matching marker-extraction path.\nconst INLINE_REMOTE_SHARED_RE =\n /[\"']?__remote_shared_module_(?<specifier>[^\"':]+)[\"']?\\s*:\\s*\\(\\)\\s*=>\\s*(?:__turbopack_context__|[a-z])\\.A\\((?<asyncSharedModuleId>\"[^\"]+\"|[0-9]+e[0-9]+|[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: RemoteSharedModules = {},\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 module. Turbopack emits its\n // factory body as\n // ctx.v((parentImport) => Promise.all([...]).then(() => parentImport(id)))\n // so `module.exports` IS the loader function (upstream `exportValue`\n // semantics). Earlier versions of remote-components' `ctx.v` eagerly\n // invoked the function and stored the resulting Promise on\n // `exports.default` — that shape is preserved here as a fallback for\n // bundles built against the old runtime, but the primary path now\n // invokes the loader explicitly with `requireModule` as the parent\n // import (the actual scope-bound require).\n if (sharedModuleId) {\n const moduleExports = handleTurbopackModule(\n scope,\n sharedModuleId,\n formatRemoteId(scope, String(sharedModuleInitializerId)),\n );\n type Loader = (\n parentImport: (id: string | number) => unknown,\n ) => Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }>;\n const loaderCandidate =\n typeof moduleExports === 'function'\n ? moduleExports\n : (moduleExports as { default?: unknown })?.default;\n if (typeof loaderCandidate === 'function') {\n sharedModuleInitializer = (loaderCandidate as Loader)((parentId) =>\n requireModule(scope, parentId),\n );\n } else if (\n loaderCandidate &&\n typeof (loaderCandidate as { then?: unknown }).then === 'function'\n ) {\n sharedModuleInitializer = loaderCandidate as Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }>;\n }\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 preferSharedManifest(sharedModuleIds, remoteShared),\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 preferSharedManifest(inlineSharedModuleIds, remoteShared),\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 const normalizedRemoteShared =\n normalizeRemoteSharedForTurbopackFallback(remoteShared);\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 rawAsyncSharedModuleId = stripQuotes(\n match.groups?.asyncSharedModuleId,\n );\n const asyncSharedModuleId = rawAsyncSharedModuleId\n ? normalizeModuleId(rawAsyncSharedModuleId)\n : undefined;\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: RemoteSharedModules,\n missingMessage: (id: string, module: string) => string,\n): Promise<undefined[]> {\n return buildSharedProviderPlan({\n bundle: scope.name,\n hostShared,\n remoteShared: sharedModuleIds,\n scope: `remote:${scope.scopedName}`,\n callerTag: 'SharedModules',\n onMissing: (entry) => {\n logError('SharedModules', missingMessage(entry.id, entry.specifier));\n },\n }).then((results) =>\n results.entries.map((entry) => {\n installSharedProviderEntry(entry);\n scope.sharedModules[entry.id] = getSharedProviderModule({\n scope: entry.scope,\n specifier: entry.specifier,\n });\n // Compatibility with the old shared-modules architecture: a remote\n // factory may have already cached its own implementation for this ID.\n // The provider-owned scope.sharedModules entry must replace it. Remove\n // this cache cleanup once Turbopack remotes cannot execute shared\n // factories before the scoped provider plan is installed.\n delete scope.moduleCache[entry.id];\n return undefined;\n }),\n );\n}\n\nfunction preferSharedManifest(\n sharedModuleIds: Record<string, string>,\n remoteShared: RemoteSharedModules,\n): RemoteSharedModules {\n if (!isSharedModuleManifest(remoteShared)) return sharedModuleIds;\n\n const extractedIdBySpecifier = new Map(\n Object.entries(sharedModuleIds).map(([id, specifier]) => [specifier, id]),\n );\n\n return {\n protocol: SHARED_MODULE_MANIFEST_PROTOCOL,\n requirements: remoteShared.requirements.map((requirement) => {\n return {\n ...requirement,\n id: extractedIdBySpecifier.get(requirement.specifier) ?? requirement.id,\n };\n }),\n };\n}\n\nfunction normalizeRemoteSharedForTurbopackFallback(\n remoteShared: RemoteSharedModules,\n): RemoteSharedModules {\n if (isSharedModuleManifest(remoteShared)) {\n return {\n ...remoteShared,\n requirements: remoteShared.requirements.map((requirement) => ({\n ...requirement,\n id:\n typeof requirement.id === 'string'\n ? requirement.id.replace('[app-ssr]', '[app-client]')\n : requirement.id,\n })),\n } satisfies SharedModuleManifest;\n }\n\n // @legacy(remote-components<=0.4.x): normalize server-side generated\n // Turbopack IDs from the historical shared map until 0.4.x remotes are\n // outside the compatibility window.\n return Object.fromEntries(\n Object.entries(remoteShared).map(([id, module]) => [\n id.replace('[app-ssr]', '[app-client]'),\n module,\n ]),\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 // Suffix matching only applies to path-like keys (e.g. a bundle-prefixed id\n // \"[bundle] /react/index.js\" or a dev id matching the shared key\n // \"/react/index.js\"). Plain numeric Turbopack IDs must match exactly — which\n // the caller already handles before this fallback. This guard MUST run before\n // the `endsWith` check: otherwise a longer numeric id spuriously matches a\n // shorter shared numeric key (e.g. id \"6487\" ends with shared key \"487\", the\n // `next/dist/build/polyfills/process` module), handing the wrong module to the\n // host. Turbopack reassigns numeric ids per build, so such collisions surface\n // unpredictably across Next.js versions.\n if (!key.includes('/') && !key.endsWith('.js')) return false;\n\n if (id.endsWith(key)) return true;\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":[]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
setupRemoteScope
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-24LEEDHP.js";
|
|
4
4
|
import {
|
|
5
5
|
applySharedModules,
|
|
6
6
|
initializeSharedModules,
|
|
7
7
|
nextClientPagesLoader
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-BEGVH64U.js";
|
|
9
9
|
import {
|
|
10
10
|
buildCoreShared,
|
|
11
11
|
buildHostShared
|
|
@@ -53,4 +53,4 @@ async function turbopackRuntime(url, bundle, shared, remoteShared, resolveClient
|
|
|
53
53
|
export {
|
|
54
54
|
turbopackRuntime
|
|
55
55
|
};
|
|
56
|
-
//# sourceMappingURL=turbopack-
|
|
56
|
+
//# sourceMappingURL=turbopack-43N2UJNN.js.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkTGE3K3TRcjs = require('./chunk-TGE3K3TR.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _chunkSULMNRMJcjs = require('./chunk-SULMNRMJ.cjs');
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
@@ -22,12 +22,12 @@ async function turbopackRuntime(url, bundle, shared, remoteShared, resolveClient
|
|
|
22
22
|
const hostShared = _chunk6PZEDIAKcjs.buildHostShared.call(void 0, shared, resolveClientUrl, {
|
|
23
23
|
includePagesClientSharedGlobal: true
|
|
24
24
|
});
|
|
25
|
-
await
|
|
25
|
+
await _chunkTGE3K3TRcjs.setupRemoteScope.call(void 0, "turbopack", [], url, bundle, resolveClientUrl);
|
|
26
26
|
const {
|
|
27
27
|
default: { createFromReadableStream }
|
|
28
28
|
} = await Promise.resolve().then(() => _interopRequireWildcard(require("react-server-dom-webpack/client.browser")));
|
|
29
29
|
async function preloadScripts(scripts, __) {
|
|
30
|
-
const scope = await
|
|
30
|
+
const scope = await _chunkTGE3K3TRcjs.setupRemoteScope.call(void 0,
|
|
31
31
|
"turbopack",
|
|
32
32
|
scripts.map((script) => ({
|
|
33
33
|
src: script.getAttribute("src") || script.getAttribute("data-src") || script.src
|
|
@@ -36,7 +36,7 @@ async function turbopackRuntime(url, bundle, shared, remoteShared, resolveClient
|
|
|
36
36
|
bundle,
|
|
37
37
|
resolveClientUrl
|
|
38
38
|
);
|
|
39
|
-
await
|
|
39
|
+
await _chunkSULMNRMJcjs.initializeSharedModules.call(void 0,
|
|
40
40
|
scope,
|
|
41
41
|
_chunk6PZEDIAKcjs.buildCoreShared.call(void 0, hostShared),
|
|
42
42
|
_nullishCoalesce(remoteShared, () => ( {}))
|
|
@@ -45,12 +45,12 @@ async function turbopackRuntime(url, bundle, shared, remoteShared, resolveClient
|
|
|
45
45
|
return {
|
|
46
46
|
self,
|
|
47
47
|
createFromReadableStream,
|
|
48
|
-
applySharedModules:
|
|
49
|
-
nextClientPagesLoader:
|
|
48
|
+
applySharedModules: _chunkSULMNRMJcjs.applySharedModules,
|
|
49
|
+
nextClientPagesLoader: _chunkSULMNRMJcjs.nextClientPagesLoader,
|
|
50
50
|
preloadScripts
|
|
51
51
|
};
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
exports.turbopackRuntime = turbopackRuntime;
|
|
56
|
-
//# sourceMappingURL=turbopack-
|
|
56
|
+
//# sourceMappingURL=turbopack-5VGMYUL4.cjs.map
|
|
@@ -5,7 +5,7 @@ var _chunkXWRB6CEAcjs = require('./chunk-XWRB6CEA.cjs');
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _chunkSULMNRMJcjs = require('./chunk-SULMNRMJ.cjs');
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
@@ -66,7 +66,7 @@ async function webpackRuntime(bundle, shared, remoteShared, resolveClientUrl) {
|
|
|
66
66
|
const hostShared = _chunk6PZEDIAKcjs.buildHostShared.call(void 0, shared, resolveClientUrl, {
|
|
67
67
|
includePagesClientSharedGlobal: true
|
|
68
68
|
});
|
|
69
|
-
const resolve = await
|
|
69
|
+
const resolve = await _chunkSULMNRMJcjs.buildWebpackResolve.call(void 0,
|
|
70
70
|
hostShared,
|
|
71
71
|
_nullishCoalesce(remoteShared, () => ( {})),
|
|
72
72
|
remoteBundle,
|
|
@@ -79,17 +79,17 @@ async function webpackRuntime(bundle, shared, remoteShared, resolveClientUrl) {
|
|
|
79
79
|
},
|
|
80
80
|
"WebpackRuntime"
|
|
81
81
|
);
|
|
82
|
-
|
|
82
|
+
_chunkSULMNRMJcjs.applySharedModules.call(void 0, remoteBundle, resolve);
|
|
83
83
|
}
|
|
84
84
|
return {
|
|
85
85
|
self,
|
|
86
86
|
createFromReadableStream,
|
|
87
|
-
applySharedModules:
|
|
88
|
-
nextClientPagesLoader:
|
|
87
|
+
applySharedModules: _chunkSULMNRMJcjs.applySharedModules,
|
|
88
|
+
nextClientPagesLoader: _chunkSULMNRMJcjs.nextClientPagesLoader,
|
|
89
89
|
preloadScripts
|
|
90
90
|
};
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
|
|
94
94
|
exports.webpackRuntime = webpackRuntime;
|
|
95
|
-
//# sourceMappingURL=webpack-
|
|
95
|
+
//# sourceMappingURL=webpack-FSN5UBA2.cjs.map
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
applySharedModules,
|
|
6
6
|
buildWebpackResolve,
|
|
7
7
|
nextClientPagesLoader
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-BEGVH64U.js";
|
|
9
9
|
import {
|
|
10
10
|
NEXT_BUNDLE_PATH_RE,
|
|
11
11
|
buildHostShared
|
|
@@ -92,4 +92,4 @@ async function webpackRuntime(bundle, shared, remoteShared, resolveClientUrl) {
|
|
|
92
92
|
export {
|
|
93
93
|
webpackRuntime
|
|
94
94
|
};
|
|
95
|
-
//# sourceMappingURL=webpack-
|
|
95
|
+
//# sourceMappingURL=webpack-LXE2UWTA.js.map
|