remote-components 0.4.3 → 0.4.5
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-C5EYU7EQ.cjs → chunk-4MLJE6UP.cjs} +3 -3
- package/dist/{chunk-SECN7UAL.cjs → chunk-7OD5S534.cjs} +18 -18
- package/dist/{chunk-7XXO2DLF.cjs → chunk-I7VKDF3E.cjs} +115 -77
- package/dist/chunk-I7VKDF3E.cjs.map +1 -0
- package/dist/{chunk-55TEMSB5.js → chunk-JZRA6DPE.js} +116 -78
- package/dist/chunk-JZRA6DPE.js.map +1 -0
- package/dist/{chunk-HYVNEUIK.js → chunk-MJ2KYXGR.js} +3 -3
- package/dist/{chunk-KV5J7PNM.js → chunk-NZM2SI6U.js} +3 -3
- package/dist/{chunk-DGZVFKSQ.js → chunk-O4A6CJGI.js} +19 -11
- package/dist/chunk-O4A6CJGI.js.map +1 -0
- package/dist/{chunk-2W7JBTID.cjs → chunk-PNASFKWA.cjs} +39 -31
- package/dist/chunk-PNASFKWA.cjs.map +1 -0
- package/dist/{chunk-4NW46ZVD.js → chunk-PT3R275L.js} +93 -38
- package/dist/chunk-PT3R275L.js.map +1 -0
- package/dist/{chunk-4AH3KXDW.cjs → chunk-TWO3XB6H.cjs} +19 -19
- package/dist/{chunk-HMB3SIVJ.cjs → chunk-W5FSHVWU.cjs} +107 -52
- package/dist/chunk-W5FSHVWU.cjs.map +1 -0
- package/dist/{chunk-HL6BL5HY.js → chunk-WGSS7TJP.js} +2 -2
- package/dist/config/nextjs.cjs +98 -30
- package/dist/config/nextjs.cjs.map +1 -1
- package/dist/config/nextjs.d.ts +14 -1
- package/dist/config/nextjs.js +89 -21
- package/dist/config/nextjs.js.map +1 -1
- package/dist/host/html.cjs +19 -19
- package/dist/host/html.cjs.map +1 -1
- package/dist/host/html.js +7 -7
- package/dist/host/html.js.map +1 -1
- package/dist/host/nextjs/app/client-only.cjs +11 -11
- package/dist/host/nextjs/app/client-only.js +6 -6
- package/dist/host/nextjs/pages.cjs +32 -9
- package/dist/host/nextjs/pages.cjs.map +1 -1
- package/dist/host/nextjs/pages.js +39 -9
- package/dist/host/nextjs/pages.js.map +1 -1
- package/dist/host/react.cjs +7 -7
- package/dist/host/react.js +6 -6
- package/dist/internal/host/nextjs/app-client.d.ts +3 -1
- package/dist/internal/host/nextjs/dom-flight.cjs +17 -2
- package/dist/internal/host/nextjs/dom-flight.cjs.map +1 -1
- package/dist/internal/host/nextjs/dom-flight.d.ts +5 -1
- package/dist/internal/host/nextjs/dom-flight.js +18 -2
- package/dist/internal/host/nextjs/dom-flight.js.map +1 -1
- package/dist/internal/host/server/fetch-remote-component.cjs +4 -2
- package/dist/internal/host/server/fetch-remote-component.cjs.map +1 -1
- package/dist/internal/host/server/fetch-remote-component.d.ts +2 -0
- package/dist/internal/host/server/fetch-remote-component.js +4 -2
- package/dist/internal/host/server/fetch-remote-component.js.map +1 -1
- package/dist/internal/host/server/types.cjs.map +1 -1
- package/dist/internal/host/server/types.d.ts +4 -1
- package/dist/internal/host/shared/pipeline.cjs +7 -8
- package/dist/internal/host/shared/pipeline.cjs.map +1 -1
- package/dist/internal/host/shared/pipeline.d.ts +5 -3
- package/dist/internal/host/shared/pipeline.js +9 -8
- package/dist/internal/host/shared/pipeline.js.map +1 -1
- package/dist/internal/host/shared/shared-broker.cjs +51 -10
- package/dist/internal/host/shared/shared-broker.cjs.map +1 -1
- package/dist/internal/host/shared/shared-broker.d.ts +19 -3
- package/dist/internal/host/shared/shared-broker.js +48 -10
- package/dist/internal/host/shared/shared-broker.js.map +1 -1
- package/dist/internal/host/shared/shared-module-resolver.cjs.map +1 -1
- package/dist/internal/host/shared/shared-module-resolver.d.ts +2 -2
- package/dist/internal/host/shared/shared-module-resolver.js.map +1 -1
- package/dist/internal/remote/nextjs/app-client.cjs +28 -19
- package/dist/internal/remote/nextjs/app-client.cjs.map +1 -1
- package/dist/internal/remote/nextjs/app-client.d.ts +6 -1
- package/dist/internal/remote/nextjs/app-client.js +20 -11
- package/dist/internal/remote/nextjs/app-client.js.map +1 -1
- package/dist/internal/runtime/html/html-spec.cjs +6 -0
- package/dist/internal/runtime/html/html-spec.cjs.map +1 -1
- package/dist/internal/runtime/html/html-spec.d.ts +3 -1
- package/dist/internal/runtime/html/html-spec.js +4 -0
- package/dist/internal/runtime/html/html-spec.js.map +1 -1
- package/dist/internal/runtime/html/parse-remote-html.cjs +7 -1
- package/dist/internal/runtime/html/parse-remote-html.cjs.map +1 -1
- package/dist/internal/runtime/html/parse-remote-html.d.ts +5 -3
- package/dist/internal/runtime/html/parse-remote-html.js +9 -1
- package/dist/internal/runtime/html/parse-remote-html.js.map +1 -1
- package/dist/internal/runtime/loaders/component-loader.cjs.map +1 -1
- package/dist/internal/runtime/loaders/component-loader.d.ts +4 -2
- package/dist/internal/runtime/loaders/component-loader.js.map +1 -1
- package/dist/internal/runtime/turbopack/chunk-loader.cjs +39 -23
- package/dist/internal/runtime/turbopack/chunk-loader.cjs.map +1 -1
- package/dist/internal/runtime/turbopack/chunk-loader.js +39 -23
- package/dist/internal/runtime/turbopack/chunk-loader.js.map +1 -1
- package/dist/internal/runtime/turbopack/patterns.cjs +15 -5
- package/dist/internal/runtime/turbopack/patterns.cjs.map +1 -1
- package/dist/internal/runtime/turbopack/patterns.d.ts +10 -2
- package/dist/internal/runtime/turbopack/patterns.js +13 -4
- package/dist/internal/runtime/turbopack/patterns.js.map +1 -1
- package/dist/internal/runtime/turbopack/shared-modules.cjs +39 -10
- package/dist/internal/runtime/turbopack/shared-modules.cjs.map +1 -1
- package/dist/internal/runtime/turbopack/shared-modules.d.ts +2 -2
- package/dist/internal/runtime/turbopack/shared-modules.js +43 -11
- package/dist/internal/runtime/turbopack/shared-modules.js.map +1 -1
- package/dist/remote/defaults/app.cjs +4 -2
- package/dist/remote/defaults/app.cjs.map +1 -1
- package/dist/remote/defaults/app.d.ts +3 -1
- package/dist/remote/defaults/app.js +3 -2
- package/dist/remote/defaults/app.js.map +1 -1
- package/dist/remote/defaults/pages.cjs +4 -2
- package/dist/remote/defaults/pages.cjs.map +1 -1
- package/dist/remote/defaults/pages.d.ts +3 -1
- package/dist/remote/defaults/pages.js +3 -2
- package/dist/remote/defaults/pages.js.map +1 -1
- package/dist/remote/defaults/shared.cjs +5 -2
- package/dist/remote/defaults/shared.cjs.map +1 -1
- package/dist/remote/defaults/shared.d.ts +5 -1
- package/dist/remote/defaults/shared.js +3 -1
- package/dist/remote/defaults/shared.js.map +1 -1
- package/dist/remote/nextjs/pages.cjs +4 -1
- package/dist/remote/nextjs/pages.cjs.map +1 -1
- package/dist/remote/nextjs/pages.d.ts +5 -0
- package/dist/remote/nextjs/pages.js +8 -2
- package/dist/remote/nextjs/pages.js.map +1 -1
- package/dist/{server-handoff-8c89b856.d.ts → server-handoff-9e905049.d.ts} +2 -1
- package/dist/{turbopack-7F757Z7V.js → turbopack-55EJDSUT.js} +4 -4
- package/dist/turbopack-55EJDSUT.js.map +1 -0
- package/dist/{turbopack-DULMVTWV.cjs → turbopack-Q6KJAEOX.cjs} +11 -11
- package/dist/turbopack-Q6KJAEOX.cjs.map +1 -0
- package/dist/{webpack-WGVTKJ3W.js → webpack-AQ34DAJZ.js} +4 -4
- package/dist/webpack-AQ34DAJZ.js.map +1 -0
- package/dist/{webpack-6LXCB7WA.cjs → webpack-FWUNUWLF.cjs} +11 -11
- package/dist/webpack-FWUNUWLF.cjs.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-2W7JBTID.cjs.map +0 -1
- package/dist/chunk-4NW46ZVD.js.map +0 -1
- package/dist/chunk-55TEMSB5.js.map +0 -1
- package/dist/chunk-7XXO2DLF.cjs.map +0 -1
- package/dist/chunk-DGZVFKSQ.js.map +0 -1
- package/dist/chunk-HMB3SIVJ.cjs.map +0 -1
- package/dist/turbopack-7F757Z7V.js.map +0 -1
- package/dist/turbopack-DULMVTWV.cjs.map +0 -1
- package/dist/webpack-6LXCB7WA.cjs.map +0 -1
- package/dist/webpack-WGVTKJ3W.js.map +0 -1
- /package/dist/{chunk-C5EYU7EQ.cjs.map → chunk-4MLJE6UP.cjs.map} +0 -0
- /package/dist/{chunk-SECN7UAL.cjs.map → chunk-7OD5S534.cjs.map} +0 -0
- /package/dist/{chunk-HYVNEUIK.js.map → chunk-MJ2KYXGR.js.map} +0 -0
- /package/dist/{chunk-KV5J7PNM.js.map → chunk-NZM2SI6U.js.map} +0 -0
- /package/dist/{chunk-4AH3KXDW.cjs.map → chunk-TWO3XB6H.cjs.map} +0 -0
- /package/dist/{chunk-HL6BL5HY.js.map → chunk-WGSS7TJP.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/host/shared/shared-broker.ts"],"sourcesContent":["import type { LogLocation } from '#internal/utils/logger';\nimport { logDebug, logError } from '#internal/utils/logger';\n\nexport type SharedModuleFactory = (bundle?: string) => Promise<unknown>;\n\nexport interface SharedModuleRequirement {\n id: string;\n specifier: string;\n required: boolean;\n singleton: boolean;\n scope: string;\n}\n\nexport interface SharedModuleResolution extends SharedModuleRequirement {\n provider?: SharedModuleFactory | unknown;\n status: 'resolved' | 'missing';\n}\n\nexport interface SharedModulePlan {\n protocol: '
|
|
1
|
+
{"version":3,"sources":["../../../../src/host/shared/shared-broker.ts"],"sourcesContent":["import type { LogLocation } from '#internal/utils/logger';\nimport { logDebug, logError } from '#internal/utils/logger';\n\nexport type SharedModuleFactory = (bundle?: string) => Promise<unknown>;\n\nexport const SHARED_MODULE_MANIFEST_PROTOCOL =\n 'remote-components.shared.v1' as const;\n\nexport type LegacySharedModuleMap = Record<string, string | number>;\n\nexport interface SharedModuleManifestRequirement {\n id: string | number;\n specifier: string;\n required?: boolean;\n singleton?: boolean;\n scope?: string;\n}\n\nexport interface SharedModuleManifest {\n protocol: typeof SHARED_MODULE_MANIFEST_PROTOCOL;\n requirements: SharedModuleManifestRequirement[];\n}\n\nexport type RemoteSharedModules = LegacySharedModuleMap | SharedModuleManifest;\n\nexport interface SharedModuleRequirement {\n id: string;\n specifier: string;\n required: boolean;\n singleton: boolean;\n scope: string;\n}\n\nexport interface SharedModuleResolution extends SharedModuleRequirement {\n provider?: SharedModuleFactory | unknown;\n status: 'resolved' | 'missing';\n}\n\nexport interface SharedModulePlan {\n protocol: 'legacy' | typeof SHARED_MODULE_MANIFEST_PROTOCOL;\n bundle: string;\n entries: SharedModuleResolution[];\n}\n\nexport function isSharedModuleManifest(\n value: unknown,\n): value is SharedModuleManifest {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'protocol' in value &&\n value.protocol === SHARED_MODULE_MANIFEST_PROTOCOL &&\n 'requirements' in value &&\n Array.isArray(value.requirements)\n );\n}\n\nexport function getMissingSharedModulesMessage(\n remoteShared: RemoteSharedModules,\n): string | undefined {\n if (isSharedModuleManifest(remoteShared)) return undefined;\n const message = remoteShared.__remote_components_missing_shared__;\n return typeof message === 'string' ? message : undefined;\n}\n\nexport function createSharedModulePlan({\n bundle,\n hostShared,\n remoteShared,\n scope = `remote:${bundle}`,\n callerTag = 'SharedBroker',\n}: {\n bundle: string;\n hostShared: Record<string, SharedModuleFactory | unknown>;\n remoteShared: RemoteSharedModules;\n scope?: string;\n callerTag?: LogLocation;\n}): SharedModulePlan {\n const protocol = isSharedModuleManifest(remoteShared)\n ? remoteShared.protocol\n : 'legacy';\n const requirements: SharedModuleManifestRequirement[] =\n isSharedModuleManifest(remoteShared)\n ? remoteShared.requirements\n : // @legacy(remote-components<=0.4.x): normalize the historical shared\n // map until hosts and remotes on 0.4.x are no longer supported.\n Object.entries(remoteShared).map(([id, specifier]) => ({\n id,\n specifier: String(specifier),\n required: true,\n singleton: true,\n }));\n\n const entries = requirements.map((requirement) => {\n const specifier = String(requirement.specifier);\n const provider = hostShared[specifier];\n const entry: SharedModuleResolution = {\n id: String(requirement.id),\n specifier,\n required: requirement.required ?? true,\n singleton: requirement.singleton ?? true,\n scope: requirement.scope ?? scope,\n provider,\n status: typeof provider === 'undefined' ? 'missing' : 'resolved',\n };\n\n if (entry.status === 'missing') {\n logDebug(\n callerTag,\n `Remote \"${bundle}\" requests \"${specifier}\" for \"${entry.id}\" but the host does not provide it`,\n );\n }\n\n return entry;\n });\n\n logDebug(\n callerTag,\n `Share plan (${protocol}) for \"${bundle}\": ${entries\n .map((entry) => `${entry.id}=>${entry.specifier}:${entry.status}`)\n .join(', ')}`,\n );\n\n return {\n protocol,\n bundle,\n entries,\n };\n}\n\nfunction missingRequiredSharedModuleMessage(\n plan: SharedModulePlan,\n entry: SharedModuleResolution,\n): string {\n return (\n `Remote Component \"${plan.bundle}\" requires shared module \"${entry.specifier}\", but the host does not provide it. ` +\n 'Add it to the host shared modules through `withRemoteComponentsConfig({ shared: [...] })` or the `shared` prop. ' +\n 'This diagnostic runs when both host and remote support the shared-module manifest in remote-components >=0.5.0. ' +\n 'The remote may load its bundled copy during the compatibility window; this will become a load error after remote-components <=0.4.x support is removed.'\n );\n}\n\nfunction logMissingRequiredSharedModule(\n callerTag: LogLocation,\n plan: SharedModulePlan,\n entry: SharedModuleResolution,\n): void {\n logError(callerTag, missingRequiredSharedModuleMessage(plan, entry));\n}\n\nexport async function resolveSharedModulePlan(\n plan: SharedModulePlan,\n): Promise<Record<string, unknown>> {\n const resolved: Record<string, unknown> = {};\n\n await Promise.all(\n plan.entries.map(async (entry) => {\n if (entry.status !== 'resolved') {\n if (\n plan.protocol === SHARED_MODULE_MANIFEST_PROTOCOL &&\n entry.required\n ) {\n logMissingRequiredSharedModule('SharedBroker', plan, entry);\n }\n return;\n }\n const value =\n typeof entry.provider === 'function'\n ? await (entry.provider as SharedModuleFactory)(plan.bundle)\n : entry.provider;\n resolved[entry.id] = value;\n }),\n );\n\n return resolved;\n}\n\nexport async function installSharedModulePlan({\n plan,\n target,\n callerTag = 'SharedBroker',\n onMissing,\n}: {\n plan: SharedModulePlan;\n target: Record<string, unknown>;\n callerTag?: LogLocation;\n onMissing?: (entry: SharedModuleResolution) => void;\n}): Promise<undefined[]> {\n return Promise.all(\n plan.entries.map(async (entry) => {\n if (entry.status !== 'resolved') {\n if (\n plan.protocol === SHARED_MODULE_MANIFEST_PROTOCOL &&\n entry.required\n ) {\n logMissingRequiredSharedModule(callerTag, plan, entry);\n return undefined;\n }\n if (onMissing) {\n onMissing(entry);\n } else {\n logError(\n callerTag,\n `Shared module \"${entry.specifier}\" not found for \"${plan.bundle}\".`,\n );\n }\n return undefined;\n }\n\n target[entry.id] =\n typeof entry.provider === 'function'\n ? await (entry.provider as SharedModuleFactory)(plan.bundle)\n : entry.provider;\n return undefined;\n }),\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/host/shared/shared-module-resolver.ts"],"sourcesContent":["import type { InternalResolveClientUrl } from '#internal/host/server/types';\nimport { sharedPolyfills } from '#internal/host/shared/polyfill';\nimport {\n createSharedModulePlan,\n resolveSharedModulePlan,\n type SharedModuleFactory,\n} from '#internal/host/shared/shared-broker';\nimport type { LogLocation } from '#internal/utils/logger';\n\n/**\n * The core React packages that are always shared between host and remote.\n * These correspond to the `/react/*.js` and `/react-dom/*.js` path keys\n * used in the webpack module resolution map.\n */\nexport const CORE_REACT_SHARED_KEYS = [\n 'react',\n 'react/jsx-dev-runtime',\n 'react/jsx-runtime',\n 'react-dom',\n 'react-dom/client',\n] as const;\n\n/**\n * Maps each core React package to its webpack-style path key.\n * For example, `react` maps to `/react/index.js`.\n */\nexport const CORE_REACT_PATH_MAP: Record<string, string> = {\n react: '/react/index.js',\n 'react/jsx-dev-runtime': '/react/jsx-dev-runtime.js',\n 'react/jsx-runtime': '/react/jsx-runtime.js',\n 'react-dom': '/react-dom/index.js',\n 'react-dom/client': '/react-dom/client.js',\n};\n\n/**\n * The vendorShared record used by the Next.js config to map React packages\n * to their webpack path-key string literals. Derived from CORE_REACT_PATH_MAP\n * but excludes `react-dom/client` to match the existing config behavior.\n */\nexport const VENDOR_SHARED: Record<string, string> = Object.fromEntries(\n Object.entries(CORE_REACT_PATH_MAP)\n .filter(([key]) => key !== 'react-dom/client')\n .map(([key, path]) => [key, `'${path}'`]),\n);\n\n/**\n * Builds the `coreShared` map for the Turbopack runtime's\n * `initializeSharedModules`. Each entry is an async factory that dynamically\n * imports the corresponding React package. User-provided shared modules\n * override core entries (e.g. to supply a pinned React version).\n */\nexport function buildCoreShared(\n userShared?: Record<string, SharedModuleFactory>,\n): Record<string, SharedModuleFactory> {\n return {\n react: async () => (await import('react')).default,\n 'react-dom': async () => (await import('react-dom')).default,\n 'react/jsx-dev-runtime': async () =>\n (await import('react/jsx-dev-runtime')).default,\n 'react/jsx-runtime': async () =>\n (await import('react/jsx-runtime')).default,\n 'react-dom/client': async () => (await import('react-dom/client')).default,\n ...userShared,\n };\n}\n\ninterface HostSharedGlobals {\n __remote_component_host_shared_modules__?: Record<\n string,\n SharedModuleFactory\n >;\n __remote_component_shared__?: Record<string, SharedModuleFactory>;\n}\n\n/**\n * Builds the merged host shared modules map with a consistent merge priority:\n * 1. Polyfills (lowest priority — fallback implementations)\n * 2. Global host shared modules (`__remote_component_host_shared_modules__`)\n * 3. User-provided shared modules (highest priority — explicit overrides)\n *\n * Some callers also include `__remote_component_shared__` (the pages router\n * global). Pass `includeRemoteComponentShared: true` to include it at the end.\n */\nexport function buildHostShared(\n userShared?: Record<string, SharedModuleFactory>,\n resolveClientUrl?: InternalResolveClientUrl,\n options?: { includeRemoteComponentShared?: boolean },\n): Record<string, SharedModuleFactory> {\n const self = globalThis as typeof globalThis & HostSharedGlobals;\n const result: Record<string, SharedModuleFactory> = {\n ...sharedPolyfills(userShared, resolveClientUrl),\n ...self.__remote_component_host_shared_modules__,\n ...userShared,\n };\n if (options?.includeRemoteComponentShared) {\n Object.assign(result, self.__remote_component_shared__);\n }\n return result;\n}\n\n/**\n * React module instances keyed by their webpack path, e.g.\n * `{ '/react/index.js': React }`. Passed into `buildWebpackResolve` so it\n * can populate the resolve map without importing React itself.\n */\nexport interface ReactModules {\n '/react/index.js': unknown;\n '/react/jsx-dev-runtime.js': unknown;\n '/react/jsx-runtime.js': unknown;\n '/react-dom/index.js': unknown;\n '/react-dom/client.js': unknown;\n}\n\n/**\n * Builds the `resolve` map passed to `applySharedModules` for the webpack\n * runtime. Combines:\n * - Static React module path keys (`/react/index.js`, etc.)\n * - Remote shared modules matched against host shared, with `(ssr)/` prefix stripped\n *\n * After building the map, resolves any factory functions by awaiting them\n * with the given bundle name.\n */\nexport async function buildWebpackResolve(\n hostShared: Record<string, SharedModuleFactory | unknown>,\n remoteShared:
|
|
1
|
+
{"version":3,"sources":["../../../../src/host/shared/shared-module-resolver.ts"],"sourcesContent":["import type { InternalResolveClientUrl } from '#internal/host/server/types';\nimport { sharedPolyfills } from '#internal/host/shared/polyfill';\nimport {\n createSharedModulePlan,\n type RemoteSharedModules,\n resolveSharedModulePlan,\n type SharedModuleFactory,\n} from '#internal/host/shared/shared-broker';\nimport type { LogLocation } from '#internal/utils/logger';\n\n/**\n * The core React packages that are always shared between host and remote.\n * These correspond to the `/react/*.js` and `/react-dom/*.js` path keys\n * used in the webpack module resolution map.\n */\nexport const CORE_REACT_SHARED_KEYS = [\n 'react',\n 'react/jsx-dev-runtime',\n 'react/jsx-runtime',\n 'react-dom',\n 'react-dom/client',\n] as const;\n\n/**\n * Maps each core React package to its webpack-style path key.\n * For example, `react` maps to `/react/index.js`.\n */\nexport const CORE_REACT_PATH_MAP: Record<string, string> = {\n react: '/react/index.js',\n 'react/jsx-dev-runtime': '/react/jsx-dev-runtime.js',\n 'react/jsx-runtime': '/react/jsx-runtime.js',\n 'react-dom': '/react-dom/index.js',\n 'react-dom/client': '/react-dom/client.js',\n};\n\n/**\n * The vendorShared record used by the Next.js config to map React packages\n * to their webpack path-key string literals. Derived from CORE_REACT_PATH_MAP\n * but excludes `react-dom/client` to match the existing config behavior.\n */\nexport const VENDOR_SHARED: Record<string, string> = Object.fromEntries(\n Object.entries(CORE_REACT_PATH_MAP)\n .filter(([key]) => key !== 'react-dom/client')\n .map(([key, path]) => [key, `'${path}'`]),\n);\n\n/**\n * Builds the `coreShared` map for the Turbopack runtime's\n * `initializeSharedModules`. Each entry is an async factory that dynamically\n * imports the corresponding React package. User-provided shared modules\n * override core entries (e.g. to supply a pinned React version).\n */\nexport function buildCoreShared(\n userShared?: Record<string, SharedModuleFactory>,\n): Record<string, SharedModuleFactory> {\n return {\n react: async () => (await import('react')).default,\n 'react-dom': async () => (await import('react-dom')).default,\n 'react/jsx-dev-runtime': async () =>\n (await import('react/jsx-dev-runtime')).default,\n 'react/jsx-runtime': async () =>\n (await import('react/jsx-runtime')).default,\n 'react-dom/client': async () => (await import('react-dom/client')).default,\n ...userShared,\n };\n}\n\ninterface HostSharedGlobals {\n __remote_component_host_shared_modules__?: Record<\n string,\n SharedModuleFactory\n >;\n __remote_component_shared__?: Record<string, SharedModuleFactory>;\n}\n\n/**\n * Builds the merged host shared modules map with a consistent merge priority:\n * 1. Polyfills (lowest priority — fallback implementations)\n * 2. Global host shared modules (`__remote_component_host_shared_modules__`)\n * 3. User-provided shared modules (highest priority — explicit overrides)\n *\n * Some callers also include `__remote_component_shared__` (the pages router\n * global). Pass `includeRemoteComponentShared: true` to include it at the end.\n */\nexport function buildHostShared(\n userShared?: Record<string, SharedModuleFactory>,\n resolveClientUrl?: InternalResolveClientUrl,\n options?: { includeRemoteComponentShared?: boolean },\n): Record<string, SharedModuleFactory> {\n const self = globalThis as typeof globalThis & HostSharedGlobals;\n const result: Record<string, SharedModuleFactory> = {\n ...sharedPolyfills(userShared, resolveClientUrl),\n ...self.__remote_component_host_shared_modules__,\n ...userShared,\n };\n if (options?.includeRemoteComponentShared) {\n Object.assign(result, self.__remote_component_shared__);\n }\n return result;\n}\n\n/**\n * React module instances keyed by their webpack path, e.g.\n * `{ '/react/index.js': React }`. Passed into `buildWebpackResolve` so it\n * can populate the resolve map without importing React itself.\n */\nexport interface ReactModules {\n '/react/index.js': unknown;\n '/react/jsx-dev-runtime.js': unknown;\n '/react/jsx-runtime.js': unknown;\n '/react-dom/index.js': unknown;\n '/react-dom/client.js': unknown;\n}\n\n/**\n * Builds the `resolve` map passed to `applySharedModules` for the webpack\n * runtime. Combines:\n * - Static React module path keys (`/react/index.js`, etc.)\n * - Remote shared modules matched against host shared, with `(ssr)/` prefix stripped\n *\n * After building the map, resolves any factory functions by awaiting them\n * with the given bundle name.\n */\nexport async function buildWebpackResolve(\n hostShared: Record<string, SharedModuleFactory | unknown>,\n remoteShared: RemoteSharedModules,\n bundle: string,\n reactModules: ReactModules,\n callerTag: LogLocation = 'SharedModuleResolver',\n): Promise<Record<string, unknown>> {\n const sharePlan = createSharedModulePlan({\n bundle,\n hostShared,\n remoteShared,\n callerTag,\n });\n const plannedResolve = await resolveSharedModulePlan(sharePlan);\n const resolve: Record<string, unknown> = {\n ...reactModules,\n ...Object.fromEntries(\n Object.entries(plannedResolve).map(([key, value]) => [\n key.replace(/^\\(ssr\\)\\/(?<relative>\\.\\/)?/, ''),\n value,\n ]),\n ),\n };\n return resolve;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,sBAAgC;AAChC,2BAKO;AAQA,MAAM,yBAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,MAAM,sBAA8C;AAAA,EACzD,OAAO;AAAA,EACP,yBAAyB;AAAA,EACzB,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,oBAAoB;AACtB;AAOO,MAAM,gBAAwC,OAAO;AAAA,EAC1D,OAAO,QAAQ,mBAAmB,EAC/B,OAAO,CAAC,CAAC,GAAG,MAAM,QAAQ,kBAAkB,EAC5C,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC;AAC5C;AAQO,SAAS,gBACd,YACqC;AACrC,SAAO;AAAA,IACL,OAAO,aAAa,MAAM,OAAO,OAAO,GAAG;AAAA,IAC3C,aAAa,aAAa,MAAM,OAAO,WAAW,GAAG;AAAA,IACrD,yBAAyB,aACtB,MAAM,OAAO,uBAAuB,GAAG;AAAA,IAC1C,qBAAqB,aAClB,MAAM,OAAO,mBAAmB,GAAG;AAAA,IACtC,oBAAoB,aAAa,MAAM,OAAO,kBAAkB,GAAG;AAAA,IACnE,GAAG;AAAA,EACL;AACF;AAmBO,SAAS,gBACd,YACA,kBACA,SACqC;AACrC,QAAM,OAAO;AACb,QAAM,SAA8C;AAAA,IAClD,OAAG,iCAAgB,YAAY,gBAAgB;AAAA,IAC/C,GAAG,KAAK;AAAA,IACR,GAAG;AAAA,EACL;AACA,MAAI,SAAS,8BAA8B;AACzC,WAAO,OAAO,QAAQ,KAAK,2BAA2B;AAAA,EACxD;AACA,SAAO;AACT;AAwBA,eAAsB,oBACpB,YACA,cACA,QACA,cACA,YAAyB,wBACS;AAClC,QAAM,gBAAY,6CAAuB;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,iBAAiB,UAAM,8CAAwB,SAAS;AAC9D,QAAM,UAAmC;AAAA,IACvC,GAAG;AAAA,IACH,GAAG,OAAO;AAAA,MACR,OAAO,QAAQ,cAAc,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAAA,QACnD,IAAI,QAAQ,gCAAgC,EAAE;AAAA,QAC9C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { SharedModuleFactory, RemoteSharedModules } from './shared-broker.js';
|
|
1
2
|
import { InternalResolveClientUrl } from '../../runtime/url/resolve-client-url.js';
|
|
2
|
-
import { SharedModuleFactory } from './shared-broker.js';
|
|
3
3
|
import { LogLocation } from '../../utils/logger.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -59,6 +59,6 @@ interface ReactModules {
|
|
|
59
59
|
* After building the map, resolves any factory functions by awaiting them
|
|
60
60
|
* with the given bundle name.
|
|
61
61
|
*/
|
|
62
|
-
declare function buildWebpackResolve(hostShared: Record<string, SharedModuleFactory | unknown>, remoteShared:
|
|
62
|
+
declare function buildWebpackResolve(hostShared: Record<string, SharedModuleFactory | unknown>, remoteShared: RemoteSharedModules, bundle: string, reactModules: ReactModules, callerTag?: LogLocation): Promise<Record<string, unknown>>;
|
|
63
63
|
|
|
64
64
|
export { CORE_REACT_PATH_MAP, CORE_REACT_SHARED_KEYS, ReactModules, VENDOR_SHARED, buildCoreShared, buildHostShared, buildWebpackResolve };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/host/shared/shared-module-resolver.ts"],"sourcesContent":["import type { InternalResolveClientUrl } from '#internal/host/server/types';\nimport { sharedPolyfills } from '#internal/host/shared/polyfill';\nimport {\n createSharedModulePlan,\n resolveSharedModulePlan,\n type SharedModuleFactory,\n} from '#internal/host/shared/shared-broker';\nimport type { LogLocation } from '#internal/utils/logger';\n\n/**\n * The core React packages that are always shared between host and remote.\n * These correspond to the `/react/*.js` and `/react-dom/*.js` path keys\n * used in the webpack module resolution map.\n */\nexport const CORE_REACT_SHARED_KEYS = [\n 'react',\n 'react/jsx-dev-runtime',\n 'react/jsx-runtime',\n 'react-dom',\n 'react-dom/client',\n] as const;\n\n/**\n * Maps each core React package to its webpack-style path key.\n * For example, `react` maps to `/react/index.js`.\n */\nexport const CORE_REACT_PATH_MAP: Record<string, string> = {\n react: '/react/index.js',\n 'react/jsx-dev-runtime': '/react/jsx-dev-runtime.js',\n 'react/jsx-runtime': '/react/jsx-runtime.js',\n 'react-dom': '/react-dom/index.js',\n 'react-dom/client': '/react-dom/client.js',\n};\n\n/**\n * The vendorShared record used by the Next.js config to map React packages\n * to their webpack path-key string literals. Derived from CORE_REACT_PATH_MAP\n * but excludes `react-dom/client` to match the existing config behavior.\n */\nexport const VENDOR_SHARED: Record<string, string> = Object.fromEntries(\n Object.entries(CORE_REACT_PATH_MAP)\n .filter(([key]) => key !== 'react-dom/client')\n .map(([key, path]) => [key, `'${path}'`]),\n);\n\n/**\n * Builds the `coreShared` map for the Turbopack runtime's\n * `initializeSharedModules`. Each entry is an async factory that dynamically\n * imports the corresponding React package. User-provided shared modules\n * override core entries (e.g. to supply a pinned React version).\n */\nexport function buildCoreShared(\n userShared?: Record<string, SharedModuleFactory>,\n): Record<string, SharedModuleFactory> {\n return {\n react: async () => (await import('react')).default,\n 'react-dom': async () => (await import('react-dom')).default,\n 'react/jsx-dev-runtime': async () =>\n (await import('react/jsx-dev-runtime')).default,\n 'react/jsx-runtime': async () =>\n (await import('react/jsx-runtime')).default,\n 'react-dom/client': async () => (await import('react-dom/client')).default,\n ...userShared,\n };\n}\n\ninterface HostSharedGlobals {\n __remote_component_host_shared_modules__?: Record<\n string,\n SharedModuleFactory\n >;\n __remote_component_shared__?: Record<string, SharedModuleFactory>;\n}\n\n/**\n * Builds the merged host shared modules map with a consistent merge priority:\n * 1. Polyfills (lowest priority — fallback implementations)\n * 2. Global host shared modules (`__remote_component_host_shared_modules__`)\n * 3. User-provided shared modules (highest priority — explicit overrides)\n *\n * Some callers also include `__remote_component_shared__` (the pages router\n * global). Pass `includeRemoteComponentShared: true` to include it at the end.\n */\nexport function buildHostShared(\n userShared?: Record<string, SharedModuleFactory>,\n resolveClientUrl?: InternalResolveClientUrl,\n options?: { includeRemoteComponentShared?: boolean },\n): Record<string, SharedModuleFactory> {\n const self = globalThis as typeof globalThis & HostSharedGlobals;\n const result: Record<string, SharedModuleFactory> = {\n ...sharedPolyfills(userShared, resolveClientUrl),\n ...self.__remote_component_host_shared_modules__,\n ...userShared,\n };\n if (options?.includeRemoteComponentShared) {\n Object.assign(result, self.__remote_component_shared__);\n }\n return result;\n}\n\n/**\n * React module instances keyed by their webpack path, e.g.\n * `{ '/react/index.js': React }`. Passed into `buildWebpackResolve` so it\n * can populate the resolve map without importing React itself.\n */\nexport interface ReactModules {\n '/react/index.js': unknown;\n '/react/jsx-dev-runtime.js': unknown;\n '/react/jsx-runtime.js': unknown;\n '/react-dom/index.js': unknown;\n '/react-dom/client.js': unknown;\n}\n\n/**\n * Builds the `resolve` map passed to `applySharedModules` for the webpack\n * runtime. Combines:\n * - Static React module path keys (`/react/index.js`, etc.)\n * - Remote shared modules matched against host shared, with `(ssr)/` prefix stripped\n *\n * After building the map, resolves any factory functions by awaiting them\n * with the given bundle name.\n */\nexport async function buildWebpackResolve(\n hostShared: Record<string, SharedModuleFactory | unknown>,\n remoteShared:
|
|
1
|
+
{"version":3,"sources":["../../../../src/host/shared/shared-module-resolver.ts"],"sourcesContent":["import type { InternalResolveClientUrl } from '#internal/host/server/types';\nimport { sharedPolyfills } from '#internal/host/shared/polyfill';\nimport {\n createSharedModulePlan,\n type RemoteSharedModules,\n resolveSharedModulePlan,\n type SharedModuleFactory,\n} from '#internal/host/shared/shared-broker';\nimport type { LogLocation } from '#internal/utils/logger';\n\n/**\n * The core React packages that are always shared between host and remote.\n * These correspond to the `/react/*.js` and `/react-dom/*.js` path keys\n * used in the webpack module resolution map.\n */\nexport const CORE_REACT_SHARED_KEYS = [\n 'react',\n 'react/jsx-dev-runtime',\n 'react/jsx-runtime',\n 'react-dom',\n 'react-dom/client',\n] as const;\n\n/**\n * Maps each core React package to its webpack-style path key.\n * For example, `react` maps to `/react/index.js`.\n */\nexport const CORE_REACT_PATH_MAP: Record<string, string> = {\n react: '/react/index.js',\n 'react/jsx-dev-runtime': '/react/jsx-dev-runtime.js',\n 'react/jsx-runtime': '/react/jsx-runtime.js',\n 'react-dom': '/react-dom/index.js',\n 'react-dom/client': '/react-dom/client.js',\n};\n\n/**\n * The vendorShared record used by the Next.js config to map React packages\n * to their webpack path-key string literals. Derived from CORE_REACT_PATH_MAP\n * but excludes `react-dom/client` to match the existing config behavior.\n */\nexport const VENDOR_SHARED: Record<string, string> = Object.fromEntries(\n Object.entries(CORE_REACT_PATH_MAP)\n .filter(([key]) => key !== 'react-dom/client')\n .map(([key, path]) => [key, `'${path}'`]),\n);\n\n/**\n * Builds the `coreShared` map for the Turbopack runtime's\n * `initializeSharedModules`. Each entry is an async factory that dynamically\n * imports the corresponding React package. User-provided shared modules\n * override core entries (e.g. to supply a pinned React version).\n */\nexport function buildCoreShared(\n userShared?: Record<string, SharedModuleFactory>,\n): Record<string, SharedModuleFactory> {\n return {\n react: async () => (await import('react')).default,\n 'react-dom': async () => (await import('react-dom')).default,\n 'react/jsx-dev-runtime': async () =>\n (await import('react/jsx-dev-runtime')).default,\n 'react/jsx-runtime': async () =>\n (await import('react/jsx-runtime')).default,\n 'react-dom/client': async () => (await import('react-dom/client')).default,\n ...userShared,\n };\n}\n\ninterface HostSharedGlobals {\n __remote_component_host_shared_modules__?: Record<\n string,\n SharedModuleFactory\n >;\n __remote_component_shared__?: Record<string, SharedModuleFactory>;\n}\n\n/**\n * Builds the merged host shared modules map with a consistent merge priority:\n * 1. Polyfills (lowest priority — fallback implementations)\n * 2. Global host shared modules (`__remote_component_host_shared_modules__`)\n * 3. User-provided shared modules (highest priority — explicit overrides)\n *\n * Some callers also include `__remote_component_shared__` (the pages router\n * global). Pass `includeRemoteComponentShared: true` to include it at the end.\n */\nexport function buildHostShared(\n userShared?: Record<string, SharedModuleFactory>,\n resolveClientUrl?: InternalResolveClientUrl,\n options?: { includeRemoteComponentShared?: boolean },\n): Record<string, SharedModuleFactory> {\n const self = globalThis as typeof globalThis & HostSharedGlobals;\n const result: Record<string, SharedModuleFactory> = {\n ...sharedPolyfills(userShared, resolveClientUrl),\n ...self.__remote_component_host_shared_modules__,\n ...userShared,\n };\n if (options?.includeRemoteComponentShared) {\n Object.assign(result, self.__remote_component_shared__);\n }\n return result;\n}\n\n/**\n * React module instances keyed by their webpack path, e.g.\n * `{ '/react/index.js': React }`. Passed into `buildWebpackResolve` so it\n * can populate the resolve map without importing React itself.\n */\nexport interface ReactModules {\n '/react/index.js': unknown;\n '/react/jsx-dev-runtime.js': unknown;\n '/react/jsx-runtime.js': unknown;\n '/react-dom/index.js': unknown;\n '/react-dom/client.js': unknown;\n}\n\n/**\n * Builds the `resolve` map passed to `applySharedModules` for the webpack\n * runtime. Combines:\n * - Static React module path keys (`/react/index.js`, etc.)\n * - Remote shared modules matched against host shared, with `(ssr)/` prefix stripped\n *\n * After building the map, resolves any factory functions by awaiting them\n * with the given bundle name.\n */\nexport async function buildWebpackResolve(\n hostShared: Record<string, SharedModuleFactory | unknown>,\n remoteShared: RemoteSharedModules,\n bundle: string,\n reactModules: ReactModules,\n callerTag: LogLocation = 'SharedModuleResolver',\n): Promise<Record<string, unknown>> {\n const sharePlan = createSharedModulePlan({\n bundle,\n hostShared,\n remoteShared,\n callerTag,\n });\n const plannedResolve = await resolveSharedModulePlan(sharePlan);\n const resolve: Record<string, unknown> = {\n ...reactModules,\n ...Object.fromEntries(\n Object.entries(plannedResolve).map(([key, value]) => [\n key.replace(/^\\(ssr\\)\\/(?<relative>\\.\\/)?/, ''),\n value,\n ]),\n ),\n };\n return resolve;\n}\n"],"mappings":"AACA,SAAS,uBAAuB;AAChC;AAAA,EACE;AAAA,EAEA;AAAA,OAEK;AAQA,MAAM,yBAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMO,MAAM,sBAA8C;AAAA,EACzD,OAAO;AAAA,EACP,yBAAyB;AAAA,EACzB,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,oBAAoB;AACtB;AAOO,MAAM,gBAAwC,OAAO;AAAA,EAC1D,OAAO,QAAQ,mBAAmB,EAC/B,OAAO,CAAC,CAAC,GAAG,MAAM,QAAQ,kBAAkB,EAC5C,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC;AAC5C;AAQO,SAAS,gBACd,YACqC;AACrC,SAAO;AAAA,IACL,OAAO,aAAa,MAAM,OAAO,OAAO,GAAG;AAAA,IAC3C,aAAa,aAAa,MAAM,OAAO,WAAW,GAAG;AAAA,IACrD,yBAAyB,aACtB,MAAM,OAAO,uBAAuB,GAAG;AAAA,IAC1C,qBAAqB,aAClB,MAAM,OAAO,mBAAmB,GAAG;AAAA,IACtC,oBAAoB,aAAa,MAAM,OAAO,kBAAkB,GAAG;AAAA,IACnE,GAAG;AAAA,EACL;AACF;AAmBO,SAAS,gBACd,YACA,kBACA,SACqC;AACrC,QAAM,OAAO;AACb,QAAM,SAA8C;AAAA,IAClD,GAAG,gBAAgB,YAAY,gBAAgB;AAAA,IAC/C,GAAG,KAAK;AAAA,IACR,GAAG;AAAA,EACL;AACA,MAAI,SAAS,8BAA8B;AACzC,WAAO,OAAO,QAAQ,KAAK,2BAA2B;AAAA,EACxD;AACA,SAAO;AACT;AAwBA,eAAsB,oBACpB,YACA,cACA,QACA,cACA,YAAyB,wBACS;AAClC,QAAM,YAAY,uBAAuB;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,iBAAiB,MAAM,wBAAwB,SAAS;AAC9D,QAAM,UAAmC;AAAA,IACvC,GAAG;AAAA,IACH,GAAG,OAAO;AAAA,MACR,OAAO,QAAQ,cAAc,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAAA,QACnD,IAAI,QAAQ,gCAAgC,EAAE;AAAA,QAC9C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
|
|
@@ -33,42 +33,51 @@ __export(app_client_exports, {
|
|
|
33
33
|
tryImportSharedPromise: () => tryImportSharedPromise
|
|
34
34
|
});
|
|
35
35
|
module.exports = __toCommonJS(app_client_exports);
|
|
36
|
-
var import_jsx_runtime = (
|
|
37
|
-
// render the shared module as a script tag
|
|
38
|
-
require("react/jsx-runtime")
|
|
39
|
-
);
|
|
36
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
40
37
|
var import_react = require("react");
|
|
41
38
|
var import_error = require("#internal/utils/error");
|
|
42
39
|
async function tryImportShared() {
|
|
43
40
|
try {
|
|
44
41
|
const self = globalThis;
|
|
45
42
|
self.TURBOPACK_REMOTE_SHARED = await import("#remote-components/remote/defaults/app");
|
|
46
|
-
|
|
47
|
-
return shared;
|
|
43
|
+
return self.TURBOPACK_REMOTE_SHARED;
|
|
48
44
|
} catch {
|
|
49
45
|
return {
|
|
50
|
-
|
|
51
|
-
|
|
46
|
+
shared: {
|
|
47
|
+
// eslint-disable-next-line camelcase
|
|
48
|
+
__remote_components_missing_shared__: "Remote Components shared modules not found. Did you forget to wrap your config with `withRemoteComponentsConfig` on both host and remote?"
|
|
49
|
+
}
|
|
52
50
|
};
|
|
53
51
|
}
|
|
54
52
|
}
|
|
55
53
|
const tryImportSharedPromise = tryImportShared();
|
|
56
54
|
function RemoteComponentSharedRemote({ name }) {
|
|
57
|
-
const shared = (0, import_react.use)(tryImportSharedPromise);
|
|
55
|
+
const { shared, sharedManifest } = (0, import_react.use)(tryImportSharedPromise);
|
|
58
56
|
if ("__remote_components_missing_shared__" in shared) {
|
|
59
57
|
throw new import_error.RemoteComponentsError(
|
|
60
|
-
shared.__remote_components_missing_shared__
|
|
58
|
+
String(shared.__remote_components_missing_shared__)
|
|
61
59
|
);
|
|
62
60
|
}
|
|
63
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
61
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
62
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
63
|
+
"script",
|
|
64
|
+
{
|
|
65
|
+
"data-remote-components-shared": "",
|
|
66
|
+
id: `${name}_shared`,
|
|
67
|
+
type: "application/json",
|
|
68
|
+
children: JSON.stringify(shared)
|
|
69
|
+
}
|
|
70
|
+
),
|
|
71
|
+
sharedManifest ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
72
|
+
"script",
|
|
73
|
+
{
|
|
74
|
+
"data-remote-components-shared-manifest": "",
|
|
75
|
+
id: `${name}_shared_manifest`,
|
|
76
|
+
type: "application/json",
|
|
77
|
+
children: JSON.stringify(sharedManifest)
|
|
78
|
+
}
|
|
79
|
+
) : null
|
|
80
|
+
] });
|
|
72
81
|
}
|
|
73
82
|
// Annotate the CommonJS export names for ESM import in node:
|
|
74
83
|
0 && (module.exports = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/remote/nextjs/app-client.tsx"],"sourcesContent":["'use client';\n\nimport { use } from 'react';\nimport { RemoteComponentsError } from '#internal/utils/error';\n\n// try to import the shared module from the remote application\n// use an empty object as a fallback if the import fails to avoid breaking the application\nasync function tryImportShared() {\n try {\n const self = globalThis as unknown as {\n TURBOPACK_REMOTE_SHARED: {
|
|
1
|
+
{"version":3,"sources":["../../../../src/remote/nextjs/app-client.tsx"],"sourcesContent":["'use client';\n\nimport { use } from 'react';\nimport type {\n LegacySharedModuleMap,\n SharedModuleManifest,\n} from '#internal/host/shared/shared-broker';\nimport { RemoteComponentsError } from '#internal/utils/error';\n\n// try to import the shared module from the remote application\n// use an empty object as a fallback if the import fails to avoid breaking the application\nasync function tryImportShared() {\n try {\n const self = globalThis as unknown as {\n TURBOPACK_REMOTE_SHARED: {\n shared: LegacySharedModuleMap;\n sharedManifest?: SharedModuleManifest;\n };\n };\n // this is a marker to find the shared module initializer in the Turbopack bundle\n // DO NOT REMOVE\n self.TURBOPACK_REMOTE_SHARED = await import(\n '#remote-components/remote/defaults/app'\n );\n return self.TURBOPACK_REMOTE_SHARED;\n } catch {\n return {\n shared: {\n // eslint-disable-next-line camelcase\n __remote_components_missing_shared__:\n 'Remote Components shared modules not found. Did you forget to wrap your config with `withRemoteComponentsConfig` on both host and remote?',\n },\n };\n }\n}\n\n// create a promise singleton to import the shared module\nexport const tryImportSharedPromise = tryImportShared();\n\nexport function RemoteComponentSharedRemote({ name }: { name: string }) {\n const { shared, sharedManifest } = use(tryImportSharedPromise);\n\n if ('__remote_components_missing_shared__' in shared) {\n throw new RemoteComponentsError(\n String(shared.__remote_components_missing_shared__),\n );\n }\n\n return (\n <>\n {/* @legacy(remote-components<=0.4.x): keep this shared map for older hosts\n until package versions at or below 0.4.x are no longer supported. */}\n <script\n data-remote-components-shared=\"\"\n id={`${name}_shared`}\n type=\"application/json\"\n >\n {JSON.stringify(shared)}\n </script>\n {sharedManifest ? (\n <script\n data-remote-components-shared-manifest=\"\"\n id={`${name}_shared_manifest`}\n type=\"application/json\"\n >\n {JSON.stringify(sharedManifest)}\n </script>\n ) : null}\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiDI;AA/CJ,mBAAoB;AAKpB,mBAAsC;AAItC,eAAe,kBAAkB;AAC/B,MAAI;AACF,UAAM,OAAO;AAQb,SAAK,0BAA0B,MAAM,OACnC,wCACF;AACA,WAAO,KAAK;AAAA,EACd,QAAE;AACA,WAAO;AAAA,MACL,QAAQ;AAAA;AAAA,QAEN,sCACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACF;AAGO,MAAM,yBAAyB,gBAAgB;AAE/C,SAAS,4BAA4B,EAAE,KAAK,GAAqB;AACtE,QAAM,EAAE,QAAQ,eAAe,QAAI,kBAAI,sBAAsB;AAE7D,MAAI,0CAA0C,QAAQ;AACpD,UAAM,IAAI;AAAA,MACR,OAAO,OAAO,oCAAoC;AAAA,IACpD;AAAA,EACF;AAEA,SACE,4EAGE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,iCAA8B;AAAA,QAC9B,IAAI,GAAG;AAAA,QACP,MAAK;AAAA,QAEJ,eAAK,UAAU,MAAM;AAAA;AAAA,IACxB;AAAA,IACC,iBACC;AAAA,MAAC;AAAA;AAAA,QACC,0CAAuC;AAAA,QACvC,IAAI,GAAG;AAAA,QACP,MAAK;AAAA,QAEJ,eAAK,UAAU,cAAc;AAAA;AAAA,IAChC,IACE;AAAA,KACN;AAEJ;","names":[]}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { LegacySharedModuleMap, SharedModuleManifest } from '../../host/shared/shared-broker.js';
|
|
3
|
+
import '../../utils/logger.js';
|
|
2
4
|
|
|
3
|
-
declare const tryImportSharedPromise: Promise<
|
|
5
|
+
declare const tryImportSharedPromise: Promise<{
|
|
6
|
+
shared: LegacySharedModuleMap;
|
|
7
|
+
sharedManifest?: SharedModuleManifest;
|
|
8
|
+
}>;
|
|
4
9
|
declare function RemoteComponentSharedRemote({ name }: {
|
|
5
10
|
name: string;
|
|
6
11
|
}): react_jsx_runtime.JSX.Element;
|
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { use } from "react";
|
|
4
4
|
import { RemoteComponentsError } from "#internal/utils/error";
|
|
5
5
|
async function tryImportShared() {
|
|
6
6
|
try {
|
|
7
7
|
const self = globalThis;
|
|
8
8
|
self.TURBOPACK_REMOTE_SHARED = await import("#remote-components/remote/defaults/app");
|
|
9
|
-
|
|
10
|
-
return shared;
|
|
9
|
+
return self.TURBOPACK_REMOTE_SHARED;
|
|
11
10
|
} catch {
|
|
12
11
|
return {
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
shared: {
|
|
13
|
+
// eslint-disable-next-line camelcase
|
|
14
|
+
__remote_components_missing_shared__: "Remote Components shared modules not found. Did you forget to wrap your config with `withRemoteComponentsConfig` on both host and remote?"
|
|
15
|
+
}
|
|
15
16
|
};
|
|
16
17
|
}
|
|
17
18
|
}
|
|
18
19
|
const tryImportSharedPromise = tryImportShared();
|
|
19
20
|
function RemoteComponentSharedRemote({ name }) {
|
|
20
|
-
const shared = use(tryImportSharedPromise);
|
|
21
|
+
const { shared, sharedManifest } = use(tryImportSharedPromise);
|
|
21
22
|
if ("__remote_components_missing_shared__" in shared) {
|
|
22
23
|
throw new RemoteComponentsError(
|
|
23
|
-
shared.__remote_components_missing_shared__
|
|
24
|
+
String(shared.__remote_components_missing_shared__)
|
|
24
25
|
);
|
|
25
26
|
}
|
|
26
|
-
return (
|
|
27
|
-
// render the shared module as a script tag
|
|
27
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
28
28
|
/* @__PURE__ */ jsx(
|
|
29
29
|
"script",
|
|
30
30
|
{
|
|
@@ -33,8 +33,17 @@ function RemoteComponentSharedRemote({ name }) {
|
|
|
33
33
|
type: "application/json",
|
|
34
34
|
children: JSON.stringify(shared)
|
|
35
35
|
}
|
|
36
|
-
)
|
|
37
|
-
|
|
36
|
+
),
|
|
37
|
+
sharedManifest ? /* @__PURE__ */ jsx(
|
|
38
|
+
"script",
|
|
39
|
+
{
|
|
40
|
+
"data-remote-components-shared-manifest": "",
|
|
41
|
+
id: `${name}_shared_manifest`,
|
|
42
|
+
type: "application/json",
|
|
43
|
+
children: JSON.stringify(sharedManifest)
|
|
44
|
+
}
|
|
45
|
+
) : null
|
|
46
|
+
] });
|
|
38
47
|
}
|
|
39
48
|
export {
|
|
40
49
|
RemoteComponentSharedRemote,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/remote/nextjs/app-client.tsx"],"sourcesContent":["'use client';\n\nimport { use } from 'react';\nimport { RemoteComponentsError } from '#internal/utils/error';\n\n// try to import the shared module from the remote application\n// use an empty object as a fallback if the import fails to avoid breaking the application\nasync function tryImportShared() {\n try {\n const self = globalThis as unknown as {\n TURBOPACK_REMOTE_SHARED: {
|
|
1
|
+
{"version":3,"sources":["../../../../src/remote/nextjs/app-client.tsx"],"sourcesContent":["'use client';\n\nimport { use } from 'react';\nimport type {\n LegacySharedModuleMap,\n SharedModuleManifest,\n} from '#internal/host/shared/shared-broker';\nimport { RemoteComponentsError } from '#internal/utils/error';\n\n// try to import the shared module from the remote application\n// use an empty object as a fallback if the import fails to avoid breaking the application\nasync function tryImportShared() {\n try {\n const self = globalThis as unknown as {\n TURBOPACK_REMOTE_SHARED: {\n shared: LegacySharedModuleMap;\n sharedManifest?: SharedModuleManifest;\n };\n };\n // this is a marker to find the shared module initializer in the Turbopack bundle\n // DO NOT REMOVE\n self.TURBOPACK_REMOTE_SHARED = await import(\n '#remote-components/remote/defaults/app'\n );\n return self.TURBOPACK_REMOTE_SHARED;\n } catch {\n return {\n shared: {\n // eslint-disable-next-line camelcase\n __remote_components_missing_shared__:\n 'Remote Components shared modules not found. Did you forget to wrap your config with `withRemoteComponentsConfig` on both host and remote?',\n },\n };\n }\n}\n\n// create a promise singleton to import the shared module\nexport const tryImportSharedPromise = tryImportShared();\n\nexport function RemoteComponentSharedRemote({ name }: { name: string }) {\n const { shared, sharedManifest } = use(tryImportSharedPromise);\n\n if ('__remote_components_missing_shared__' in shared) {\n throw new RemoteComponentsError(\n String(shared.__remote_components_missing_shared__),\n );\n }\n\n return (\n <>\n {/* @legacy(remote-components<=0.4.x): keep this shared map for older hosts\n until package versions at or below 0.4.x are no longer supported. */}\n <script\n data-remote-components-shared=\"\"\n id={`${name}_shared`}\n type=\"application/json\"\n >\n {JSON.stringify(shared)}\n </script>\n {sharedManifest ? (\n <script\n data-remote-components-shared-manifest=\"\"\n id={`${name}_shared_manifest`}\n type=\"application/json\"\n >\n {JSON.stringify(sharedManifest)}\n </script>\n ) : null}\n </>\n );\n}\n"],"mappings":";AAiDI,mBAGE,KAHF;AA/CJ,SAAS,WAAW;AAKpB,SAAS,6BAA6B;AAItC,eAAe,kBAAkB;AAC/B,MAAI;AACF,UAAM,OAAO;AAQb,SAAK,0BAA0B,MAAM,OACnC,wCACF;AACA,WAAO,KAAK;AAAA,EACd,QAAE;AACA,WAAO;AAAA,MACL,QAAQ;AAAA;AAAA,QAEN,sCACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACF;AAGO,MAAM,yBAAyB,gBAAgB;AAE/C,SAAS,4BAA4B,EAAE,KAAK,GAAqB;AACtE,QAAM,EAAE,QAAQ,eAAe,IAAI,IAAI,sBAAsB;AAE7D,MAAI,0CAA0C,QAAQ;AACpD,UAAM,IAAI;AAAA,MACR,OAAO,OAAO,oCAAoC;AAAA,IACpD;AAAA,EACF;AAEA,SACE,iCAGE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,iCAA8B;AAAA,QAC9B,IAAI,GAAG;AAAA,QACP,MAAK;AAAA,QAEJ,eAAK,UAAU,MAAM;AAAA;AAAA,IACxB;AAAA,IACC,iBACC;AAAA,MAAC;AAAA;AAAA,QACC,0CAAuC;AAAA,QACvC,IAAI,GAAG;AAAA,QACP,MAAK;AAAA,QAEJ,eAAK,UAAU,cAAc;AAAA;AAAA,IAChC,IACE;AAAA,KACN;AAEJ;","names":[]}
|
|
@@ -20,12 +20,14 @@ var html_spec_exports = {};
|
|
|
20
20
|
__export(html_spec_exports, {
|
|
21
21
|
DATA_BUNDLE: () => DATA_BUNDLE,
|
|
22
22
|
DATA_REMOTE_COMPONENTS_SHARED: () => DATA_REMOTE_COMPONENTS_SHARED,
|
|
23
|
+
DATA_REMOTE_COMPONENTS_SHARED_MANIFEST: () => DATA_REMOTE_COMPONENTS_SHARED_MANIFEST,
|
|
23
24
|
DATA_ROUTE: () => DATA_ROUTE,
|
|
24
25
|
DATA_RUNTIME: () => DATA_RUNTIME,
|
|
25
26
|
DATA_SRC: () => DATA_SRC,
|
|
26
27
|
DATA_TYPE: () => DATA_TYPE,
|
|
27
28
|
ID_SUFFIX_RSC: () => ID_SUFFIX_RSC,
|
|
28
29
|
ID_SUFFIX_SHARED: () => ID_SUFFIX_SHARED,
|
|
30
|
+
ID_SUFFIX_SHARED_MANIFEST: () => ID_SUFFIX_SHARED_MANIFEST,
|
|
29
31
|
ID_SUFFIX_SSR: () => ID_SUFFIX_SSR,
|
|
30
32
|
NEXT_CONTAINER_ID: () => NEXT_CONTAINER_ID,
|
|
31
33
|
NEXT_DATA_ID: () => NEXT_DATA_ID,
|
|
@@ -48,12 +50,14 @@ const ORIGIN_REWRITE_TAGS = [
|
|
|
48
50
|
const ID_SUFFIX_RSC = "_rsc";
|
|
49
51
|
const ID_SUFFIX_SSR = "_ssr";
|
|
50
52
|
const ID_SUFFIX_SHARED = "_shared";
|
|
53
|
+
const ID_SUFFIX_SHARED_MANIFEST = "_shared_manifest";
|
|
51
54
|
const DATA_BUNDLE = "data-bundle";
|
|
52
55
|
const DATA_ROUTE = "data-route";
|
|
53
56
|
const DATA_RUNTIME = "data-runtime";
|
|
54
57
|
const DATA_TYPE = "data-type";
|
|
55
58
|
const DATA_SRC = "data-src";
|
|
56
59
|
const DATA_REMOTE_COMPONENTS_SHARED = "data-remote-components-shared";
|
|
60
|
+
const DATA_REMOTE_COMPONENTS_SHARED_MANIFEST = "data-remote-components-shared-manifest";
|
|
57
61
|
const TAG_REMOTE_COMPONENT = "remote-component";
|
|
58
62
|
const NEXT_DATA_ID = "__NEXT_DATA__";
|
|
59
63
|
const REMOTE_NEXT_DATA_ID = "__REMOTE_NEXT_DATA__";
|
|
@@ -62,12 +66,14 @@ const NEXT_CONTAINER_ID = "__next";
|
|
|
62
66
|
0 && (module.exports = {
|
|
63
67
|
DATA_BUNDLE,
|
|
64
68
|
DATA_REMOTE_COMPONENTS_SHARED,
|
|
69
|
+
DATA_REMOTE_COMPONENTS_SHARED_MANIFEST,
|
|
65
70
|
DATA_ROUTE,
|
|
66
71
|
DATA_RUNTIME,
|
|
67
72
|
DATA_SRC,
|
|
68
73
|
DATA_TYPE,
|
|
69
74
|
ID_SUFFIX_RSC,
|
|
70
75
|
ID_SUFFIX_SHARED,
|
|
76
|
+
ID_SUFFIX_SHARED_MANIFEST,
|
|
71
77
|
ID_SUFFIX_SSR,
|
|
72
78
|
NEXT_CONTAINER_ID,
|
|
73
79
|
NEXT_DATA_ID,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/runtime/html/html-spec.ts"],"sourcesContent":["/**\n * Pure constants for HTML element names, data attributes, and ID suffixes\n * used across both server-side (parse5) and browser (DOM) HTML processing.\n *\n * No imports, no runtime code — safe to use in any context.\n */\n\n/** Elements whose `src`, `href`, `srcset`, and `imagesrcset` need origin rewriting. */\nexport const ORIGIN_REWRITE_TAGS = [\n 'img',\n 'source',\n 'video',\n 'audio',\n 'track',\n 'iframe',\n 'embed',\n 'script',\n 'link',\n] as const;\n\n// ID suffixes appended to the component name to form element IDs.\nexport const ID_SUFFIX_RSC = '_rsc';\nexport const ID_SUFFIX_SSR = '_ssr';\nexport const ID_SUFFIX_SHARED = '_shared';\n\n// Data attributes written on the remote component wrapper element.\nexport const DATA_BUNDLE = 'data-bundle';\nexport const DATA_ROUTE = 'data-route';\nexport const DATA_RUNTIME = 'data-runtime';\nexport const DATA_TYPE = 'data-type';\nexport const DATA_SRC = 'data-src';\nexport const DATA_REMOTE_COMPONENTS_SHARED = 'data-remote-components-shared';\n\n// Well-known element identifiers.\nexport const TAG_REMOTE_COMPONENT = 'remote-component';\nexport const NEXT_DATA_ID = '__NEXT_DATA__';\nexport const REMOTE_NEXT_DATA_ID = '__REMOTE_NEXT_DATA__';\nexport const NEXT_CONTAINER_ID = '__next';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQO,MAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AACtB,MAAM,mBAAmB;
|
|
1
|
+
{"version":3,"sources":["../../../../src/runtime/html/html-spec.ts"],"sourcesContent":["/**\n * Pure constants for HTML element names, data attributes, and ID suffixes\n * used across both server-side (parse5) and browser (DOM) HTML processing.\n *\n * No imports, no runtime code — safe to use in any context.\n */\n\n/** Elements whose `src`, `href`, `srcset`, and `imagesrcset` need origin rewriting. */\nexport const ORIGIN_REWRITE_TAGS = [\n 'img',\n 'source',\n 'video',\n 'audio',\n 'track',\n 'iframe',\n 'embed',\n 'script',\n 'link',\n] as const;\n\n// ID suffixes appended to the component name to form element IDs.\nexport const ID_SUFFIX_RSC = '_rsc';\nexport const ID_SUFFIX_SSR = '_ssr';\nexport const ID_SUFFIX_SHARED = '_shared';\nexport const ID_SUFFIX_SHARED_MANIFEST = '_shared_manifest';\n\n// Data attributes written on the remote component wrapper element.\nexport const DATA_BUNDLE = 'data-bundle';\nexport const DATA_ROUTE = 'data-route';\nexport const DATA_RUNTIME = 'data-runtime';\nexport const DATA_TYPE = 'data-type';\nexport const DATA_SRC = 'data-src';\nexport const DATA_REMOTE_COMPONENTS_SHARED = 'data-remote-components-shared';\nexport const DATA_REMOTE_COMPONENTS_SHARED_MANIFEST =\n 'data-remote-components-shared-manifest';\n\n// Well-known element identifiers.\nexport const TAG_REMOTE_COMPONENT = 'remote-component';\nexport const NEXT_DATA_ID = '__NEXT_DATA__';\nexport const REMOTE_NEXT_DATA_ID = '__REMOTE_NEXT_DATA__';\nexport const NEXT_CONTAINER_ID = '__next';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQO,MAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AACtB,MAAM,mBAAmB;AACzB,MAAM,4BAA4B;AAGlC,MAAM,cAAc;AACpB,MAAM,aAAa;AACnB,MAAM,eAAe;AACrB,MAAM,YAAY;AAClB,MAAM,WAAW;AACjB,MAAM,gCAAgC;AACtC,MAAM,yCACX;AAGK,MAAM,uBAAuB;AAC7B,MAAM,eAAe;AACrB,MAAM,sBAAsB;AAC5B,MAAM,oBAAoB;","names":[]}
|
|
@@ -9,15 +9,17 @@ declare const ORIGIN_REWRITE_TAGS: readonly ["img", "source", "video", "audio",
|
|
|
9
9
|
declare const ID_SUFFIX_RSC = "_rsc";
|
|
10
10
|
declare const ID_SUFFIX_SSR = "_ssr";
|
|
11
11
|
declare const ID_SUFFIX_SHARED = "_shared";
|
|
12
|
+
declare const ID_SUFFIX_SHARED_MANIFEST = "_shared_manifest";
|
|
12
13
|
declare const DATA_BUNDLE = "data-bundle";
|
|
13
14
|
declare const DATA_ROUTE = "data-route";
|
|
14
15
|
declare const DATA_RUNTIME = "data-runtime";
|
|
15
16
|
declare const DATA_TYPE = "data-type";
|
|
16
17
|
declare const DATA_SRC = "data-src";
|
|
17
18
|
declare const DATA_REMOTE_COMPONENTS_SHARED = "data-remote-components-shared";
|
|
19
|
+
declare const DATA_REMOTE_COMPONENTS_SHARED_MANIFEST = "data-remote-components-shared-manifest";
|
|
18
20
|
declare const TAG_REMOTE_COMPONENT = "remote-component";
|
|
19
21
|
declare const NEXT_DATA_ID = "__NEXT_DATA__";
|
|
20
22
|
declare const REMOTE_NEXT_DATA_ID = "__REMOTE_NEXT_DATA__";
|
|
21
23
|
declare const NEXT_CONTAINER_ID = "__next";
|
|
22
24
|
|
|
23
|
-
export { DATA_BUNDLE, DATA_REMOTE_COMPONENTS_SHARED, DATA_ROUTE, DATA_RUNTIME, DATA_SRC, DATA_TYPE, ID_SUFFIX_RSC, ID_SUFFIX_SHARED, ID_SUFFIX_SSR, NEXT_CONTAINER_ID, NEXT_DATA_ID, ORIGIN_REWRITE_TAGS, REMOTE_NEXT_DATA_ID, TAG_REMOTE_COMPONENT };
|
|
25
|
+
export { DATA_BUNDLE, DATA_REMOTE_COMPONENTS_SHARED, DATA_REMOTE_COMPONENTS_SHARED_MANIFEST, DATA_ROUTE, DATA_RUNTIME, DATA_SRC, DATA_TYPE, ID_SUFFIX_RSC, ID_SUFFIX_SHARED, ID_SUFFIX_SHARED_MANIFEST, ID_SUFFIX_SSR, NEXT_CONTAINER_ID, NEXT_DATA_ID, ORIGIN_REWRITE_TAGS, REMOTE_NEXT_DATA_ID, TAG_REMOTE_COMPONENT };
|
|
@@ -12,12 +12,14 @@ const ORIGIN_REWRITE_TAGS = [
|
|
|
12
12
|
const ID_SUFFIX_RSC = "_rsc";
|
|
13
13
|
const ID_SUFFIX_SSR = "_ssr";
|
|
14
14
|
const ID_SUFFIX_SHARED = "_shared";
|
|
15
|
+
const ID_SUFFIX_SHARED_MANIFEST = "_shared_manifest";
|
|
15
16
|
const DATA_BUNDLE = "data-bundle";
|
|
16
17
|
const DATA_ROUTE = "data-route";
|
|
17
18
|
const DATA_RUNTIME = "data-runtime";
|
|
18
19
|
const DATA_TYPE = "data-type";
|
|
19
20
|
const DATA_SRC = "data-src";
|
|
20
21
|
const DATA_REMOTE_COMPONENTS_SHARED = "data-remote-components-shared";
|
|
22
|
+
const DATA_REMOTE_COMPONENTS_SHARED_MANIFEST = "data-remote-components-shared-manifest";
|
|
21
23
|
const TAG_REMOTE_COMPONENT = "remote-component";
|
|
22
24
|
const NEXT_DATA_ID = "__NEXT_DATA__";
|
|
23
25
|
const REMOTE_NEXT_DATA_ID = "__REMOTE_NEXT_DATA__";
|
|
@@ -25,12 +27,14 @@ const NEXT_CONTAINER_ID = "__next";
|
|
|
25
27
|
export {
|
|
26
28
|
DATA_BUNDLE,
|
|
27
29
|
DATA_REMOTE_COMPONENTS_SHARED,
|
|
30
|
+
DATA_REMOTE_COMPONENTS_SHARED_MANIFEST,
|
|
28
31
|
DATA_ROUTE,
|
|
29
32
|
DATA_RUNTIME,
|
|
30
33
|
DATA_SRC,
|
|
31
34
|
DATA_TYPE,
|
|
32
35
|
ID_SUFFIX_RSC,
|
|
33
36
|
ID_SUFFIX_SHARED,
|
|
37
|
+
ID_SUFFIX_SHARED_MANIFEST,
|
|
34
38
|
ID_SUFFIX_SSR,
|
|
35
39
|
NEXT_CONTAINER_ID,
|
|
36
40
|
NEXT_DATA_ID,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/runtime/html/html-spec.ts"],"sourcesContent":["/**\n * Pure constants for HTML element names, data attributes, and ID suffixes\n * used across both server-side (parse5) and browser (DOM) HTML processing.\n *\n * No imports, no runtime code — safe to use in any context.\n */\n\n/** Elements whose `src`, `href`, `srcset`, and `imagesrcset` need origin rewriting. */\nexport const ORIGIN_REWRITE_TAGS = [\n 'img',\n 'source',\n 'video',\n 'audio',\n 'track',\n 'iframe',\n 'embed',\n 'script',\n 'link',\n] as const;\n\n// ID suffixes appended to the component name to form element IDs.\nexport const ID_SUFFIX_RSC = '_rsc';\nexport const ID_SUFFIX_SSR = '_ssr';\nexport const ID_SUFFIX_SHARED = '_shared';\n\n// Data attributes written on the remote component wrapper element.\nexport const DATA_BUNDLE = 'data-bundle';\nexport const DATA_ROUTE = 'data-route';\nexport const DATA_RUNTIME = 'data-runtime';\nexport const DATA_TYPE = 'data-type';\nexport const DATA_SRC = 'data-src';\nexport const DATA_REMOTE_COMPONENTS_SHARED = 'data-remote-components-shared';\n\n// Well-known element identifiers.\nexport const TAG_REMOTE_COMPONENT = 'remote-component';\nexport const NEXT_DATA_ID = '__NEXT_DATA__';\nexport const REMOTE_NEXT_DATA_ID = '__REMOTE_NEXT_DATA__';\nexport const NEXT_CONTAINER_ID = '__next';\n"],"mappings":"AAQO,MAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AACtB,MAAM,mBAAmB;
|
|
1
|
+
{"version":3,"sources":["../../../../src/runtime/html/html-spec.ts"],"sourcesContent":["/**\n * Pure constants for HTML element names, data attributes, and ID suffixes\n * used across both server-side (parse5) and browser (DOM) HTML processing.\n *\n * No imports, no runtime code — safe to use in any context.\n */\n\n/** Elements whose `src`, `href`, `srcset`, and `imagesrcset` need origin rewriting. */\nexport const ORIGIN_REWRITE_TAGS = [\n 'img',\n 'source',\n 'video',\n 'audio',\n 'track',\n 'iframe',\n 'embed',\n 'script',\n 'link',\n] as const;\n\n// ID suffixes appended to the component name to form element IDs.\nexport const ID_SUFFIX_RSC = '_rsc';\nexport const ID_SUFFIX_SSR = '_ssr';\nexport const ID_SUFFIX_SHARED = '_shared';\nexport const ID_SUFFIX_SHARED_MANIFEST = '_shared_manifest';\n\n// Data attributes written on the remote component wrapper element.\nexport const DATA_BUNDLE = 'data-bundle';\nexport const DATA_ROUTE = 'data-route';\nexport const DATA_RUNTIME = 'data-runtime';\nexport const DATA_TYPE = 'data-type';\nexport const DATA_SRC = 'data-src';\nexport const DATA_REMOTE_COMPONENTS_SHARED = 'data-remote-components-shared';\nexport const DATA_REMOTE_COMPONENTS_SHARED_MANIFEST =\n 'data-remote-components-shared-manifest';\n\n// Well-known element identifiers.\nexport const TAG_REMOTE_COMPONENT = 'remote-component';\nexport const NEXT_DATA_ID = '__NEXT_DATA__';\nexport const REMOTE_NEXT_DATA_ID = '__REMOTE_NEXT_DATA__';\nexport const NEXT_CONTAINER_ID = '__next';\n"],"mappings":"AAQO,MAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AACtB,MAAM,mBAAmB;AACzB,MAAM,4BAA4B;AAGlC,MAAM,cAAc;AACpB,MAAM,aAAa;AACnB,MAAM,eAAe;AACrB,MAAM,YAAY;AAClB,MAAM,WAAW;AACjB,MAAM,gCAAgC;AACtC,MAAM,yCACX;AAGK,MAAM,uBAAuB;AAC7B,MAAM,eAAe;AACrB,MAAM,sBAAsB;AAC5B,MAAM,oBAAoB;","names":[]}
|
|
@@ -54,10 +54,16 @@ function resolveComponentName(component, nextData, fallbackName) {
|
|
|
54
54
|
return { name, isRemoteComponent };
|
|
55
55
|
}
|
|
56
56
|
function extractRemoteShared(doc, name, nextData) {
|
|
57
|
+
const remoteSharedManifestEl = doc.querySelector(
|
|
58
|
+
`#${name}${import_html_spec.ID_SUFFIX_SHARED_MANIFEST}[${import_html_spec.DATA_REMOTE_COMPONENTS_SHARED_MANIFEST}]`
|
|
59
|
+
);
|
|
57
60
|
const remoteSharedEl = doc.querySelector(
|
|
58
61
|
`#${name}${import_html_spec.ID_SUFFIX_SHARED}[${import_html_spec.DATA_REMOTE_COMPONENTS_SHARED}]`
|
|
59
62
|
);
|
|
60
|
-
const remoteShared = nextData?.props.__REMOTE_COMPONENT__?.
|
|
63
|
+
const remoteShared = nextData?.props.__REMOTE_COMPONENT__?.sharedManifest ?? (remoteSharedManifestEl?.textContent ? JSON.parse(remoteSharedManifestEl.textContent) : void 0) ?? // @legacy(remote-components<=0.4.x): keep reading the historical shared
|
|
64
|
+
// map until remotes on 0.4.x are outside the compatibility window.
|
|
65
|
+
nextData?.props.__REMOTE_COMPONENT__?.shared ?? (JSON.parse(remoteSharedEl?.textContent ?? "{}") ?? {});
|
|
66
|
+
remoteSharedManifestEl?.remove();
|
|
61
67
|
remoteSharedEl?.remove();
|
|
62
68
|
return remoteShared;
|
|
63
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/runtime/html/parse-remote-html.ts"],"sourcesContent":["import type { NextData } from '#internal/host/server/types';\nimport {\n DEFAULT_COMPONENT_NAME,\n RUNTIME_SCRIPT,\n} from '#internal/runtime/constants';\nimport {\n buildMetadata,\n type RemoteComponentMetadata,\n} from '#internal/runtime/metadata';\nimport {\n multipleRemoteComponentsError,\n RemoteComponentsError,\n} from '#internal/utils/error';\nimport {\n DATA_BUNDLE,\n DATA_REMOTE_COMPONENTS_SHARED,\n DATA_ROUTE,\n DATA_RUNTIME,\n DATA_SRC,\n DATA_TYPE,\n ID_SUFFIX_RSC,\n ID_SUFFIX_SHARED,\n ID_SUFFIX_SSR,\n NEXT_CONTAINER_ID,\n NEXT_DATA_ID,\n REMOTE_NEXT_DATA_ID,\n TAG_REMOTE_COMPONENT,\n} from './html-spec';\n\nexport interface ParsedRemoteComponent {\n /** The DOM element representing the remote component content. */\n component: Element;\n /** Resolved name of the remote component (with _ssr suffix stripped). */\n name: string;\n /** Whether the component is a <remote-component> custom element. */\n isRemoteComponent: boolean;\n /** Component metadata: bundle, route, runtime. */\n metadata: RemoteComponentMetadata;\n /** Parsed __NEXT_DATA__ or __REMOTE_NEXT_DATA__, or null. */\n nextData: NextData | null;\n /** The RSC flight data script element, or null. */\n rsc: Element | null;\n /** Shared module map extracted from the component's shared data script. */\n remoteShared: Record<string, string>;\n /** Link elements extracted from the document (outside the component). */\n links: HTMLLinkElement[];\n /** Script elements extracted from the component or document. */\n scripts: HTMLScriptElement[];\n}\n\n/**\n * Validates that the document does not contain multiple unnamed remote components.\n * When multiple components exist, the consumer must specify a name to select one.\n */\nexport function validateSingleComponent(\n doc: Document,\n name: string,\n url: string,\n): void {\n if (\n (doc.querySelectorAll(`div[${DATA_BUNDLE}][${DATA_ROUTE}]`).length > 1 &&\n !doc.querySelector(\n `div[${DATA_BUNDLE}][${DATA_ROUTE}][id^=\"${name}\"]`,\n )) ||\n (doc.querySelectorAll(`${TAG_REMOTE_COMPONENT}:not([src])`).length > 1 &&\n !doc.querySelector(`${TAG_REMOTE_COMPONENT}[name=\"${name}\"]`))\n ) {\n throw multipleRemoteComponentsError(url);\n }\n}\n\n/**\n * Finds the remote component element in the parsed HTML document using the\n * standard querySelector chain. Returns null if no component is found.\n */\nexport function findComponentElement(\n doc: Document,\n name: string,\n): Element | null {\n return (\n doc.querySelector(`div[${DATA_BUNDLE}][${DATA_ROUTE}][id^=\"${name}\"]`) ??\n doc.querySelector(`div[${DATA_BUNDLE}][${DATA_ROUTE}]`) ??\n doc.querySelector(`div#${NEXT_CONTAINER_ID}`) ??\n doc.querySelector(`${TAG_REMOTE_COMPONENT}[name=\"${name}\"]:not([src])`) ??\n doc.querySelector(`${TAG_REMOTE_COMPONENT}:not([src])`)\n );\n}\n\n/**\n * Parses the __NEXT_DATA__ or __REMOTE_NEXT_DATA__ script element from the document.\n */\nexport function parseNextData(doc: Document): NextData | null {\n return JSON.parse(\n (\n doc.querySelector(`#${NEXT_DATA_ID}`) ??\n doc.querySelector(`#${REMOTE_NEXT_DATA_ID}`)\n )?.textContent ?? 'null',\n ) as NextData | null;\n}\n\n/**\n * Resolves the component name from the element's id attribute, the name attribute\n * (for <remote-component> elements), nextData, or a fallback value.\n * Strips the _ssr suffix from the id if present.\n */\nexport function resolveComponentName(\n component: Element | null,\n nextData: NextData | null,\n fallbackName: string,\n): { name: string; isRemoteComponent: boolean } {\n const isRemoteComponent =\n component?.tagName.toLowerCase() === TAG_REMOTE_COMPONENT;\n\n const name =\n component\n ?.getAttribute('id')\n ?.replace(new RegExp(`${ID_SUFFIX_SSR}$`), '') ||\n (isRemoteComponent && component?.getAttribute('name')) ||\n (nextData ? '__next' : fallbackName);\n\n return { name, isRemoteComponent };\n}\n\n/**\n * Extracts the shared module map from the document and removes the element.\n * Falls back to nextData's shared modules if available.\n */\nexport function extractRemoteShared(\n doc: Document,\n name: string,\n nextData: NextData | null,\n): Record<string, string> {\n const remoteSharedEl = doc.querySelector(\n `#${name}${ID_SUFFIX_SHARED}[${DATA_REMOTE_COMPONENTS_SHARED}]`,\n );\n const remoteShared =\n nextData?.props.__REMOTE_COMPONENT__?.shared ??\n ((JSON.parse(remoteSharedEl?.textContent ?? '{}') ?? {}) as Record<\n string,\n string\n >);\n remoteSharedEl?.remove();\n return remoteShared;\n}\n\n/**\n * Validates that a remote component was found in the document and that it has\n * RSC data, Next.js data, or is a <remote-component> element.\n * Acts as a type assertion - narrows component to non-null on success.\n */\nexport function validateComponentFound(\n component: Element | null,\n rsc: Element | null,\n nextData: NextData | null,\n isRemoteComponent: boolean,\n url: string,\n name: string,\n): asserts component is Element {\n if (!component || !(rsc || nextData || isRemoteComponent)) {\n throw new RemoteComponentsError(\n `Remote Component not found on ${url}.${\n name !== DEFAULT_COMPONENT_NAME\n ? ` The name for the <RemoteComponent> is \"${name}\". Check <RemoteComponent> usage.`\n : ''\n } Did you forget to wrap the content in <RemoteComponent>?`,\n );\n }\n}\n\n/**\n * Extracts link elements from the document that are not inside the component.\n */\nexport function extractLinks(\n doc: Document,\n component: Element,\n): HTMLLinkElement[] {\n return Array.from(doc.querySelectorAll<HTMLLinkElement>('link[href]')).filter(\n (link) => !component.contains(link),\n );\n}\n\n/**\n * Extracts script elements from the component or document, depending on whether\n * the component is a <remote-component> custom element.\n */\nexport function extractScripts(\n doc: Document,\n component: Element,\n isRemoteComponent: boolean,\n): HTMLScriptElement[] {\n return Array.from(\n (isRemoteComponent ? component : doc).querySelectorAll<HTMLScriptElement>(\n `script[src],script[${DATA_SRC}]`,\n ),\n );\n}\n\n/**\n * Parses a remote component HTML document and extracts all data needed for\n * loading and hydrating the component. This is the main orchestrator that\n * calls the individual extraction functions.\n */\nexport function parseRemoteComponentDocument(\n doc: Document,\n name: string,\n url: URL,\n): ParsedRemoteComponent {\n validateSingleComponent(doc, name, url.href);\n\n const component = findComponentElement(doc, name);\n const nextData = parseNextData(doc);\n\n const { name: resolvedName, isRemoteComponent } = resolveComponentName(\n component,\n nextData,\n name,\n );\n\n const rsc = doc.querySelector(`#${resolvedName}${ID_SUFFIX_RSC}`);\n const metadata = buildMetadata(\n {\n name: resolvedName,\n bundle:\n component?.getAttribute(DATA_BUNDLE) ||\n nextData?.props.__REMOTE_COMPONENT__?.bundle,\n route: component?.getAttribute(DATA_ROUTE) ?? nextData?.page,\n runtime:\n component?.getAttribute(DATA_RUNTIME) ??\n nextData?.props.__REMOTE_COMPONENT__?.runtime ??\n RUNTIME_SCRIPT,\n id: component?.getAttribute('id'),\n type: component?.getAttribute(DATA_TYPE),\n },\n url,\n );\n const remoteShared = extractRemoteShared(doc, resolvedName, nextData);\n\n validateComponentFound(\n component,\n rsc,\n nextData,\n isRemoteComponent,\n url.href,\n resolvedName,\n );\n\n const links = extractLinks(doc, component);\n const scripts = extractScripts(doc, component, isRemoteComponent);\n\n return {\n component,\n name: resolvedName,\n isRemoteComponent,\n metadata,\n nextData,\n rsc,\n remoteShared,\n links,\n scripts,\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/runtime/html/parse-remote-html.ts"],"sourcesContent":["import type { NextData } from '#internal/host/server/types';\nimport type { RemoteSharedModules } from '#internal/host/shared/shared-broker';\nimport {\n DEFAULT_COMPONENT_NAME,\n RUNTIME_SCRIPT,\n} from '#internal/runtime/constants';\nimport {\n buildMetadata,\n type RemoteComponentMetadata,\n} from '#internal/runtime/metadata';\nimport {\n multipleRemoteComponentsError,\n RemoteComponentsError,\n} from '#internal/utils/error';\nimport {\n DATA_BUNDLE,\n DATA_REMOTE_COMPONENTS_SHARED,\n DATA_REMOTE_COMPONENTS_SHARED_MANIFEST,\n DATA_ROUTE,\n DATA_RUNTIME,\n DATA_SRC,\n DATA_TYPE,\n ID_SUFFIX_RSC,\n ID_SUFFIX_SHARED,\n ID_SUFFIX_SHARED_MANIFEST,\n ID_SUFFIX_SSR,\n NEXT_CONTAINER_ID,\n NEXT_DATA_ID,\n REMOTE_NEXT_DATA_ID,\n TAG_REMOTE_COMPONENT,\n} from './html-spec';\n\nexport interface ParsedRemoteComponent {\n /** The DOM element representing the remote component content. */\n component: Element;\n /** Resolved name of the remote component (with _ssr suffix stripped). */\n name: string;\n /** Whether the component is a <remote-component> custom element. */\n isRemoteComponent: boolean;\n /** Component metadata: bundle, route, runtime. */\n metadata: RemoteComponentMetadata;\n /** Parsed __NEXT_DATA__ or __REMOTE_NEXT_DATA__, or null. */\n nextData: NextData | null;\n /** The RSC flight data script element, or null. */\n rsc: Element | null;\n /** Shared module manifest or compatibility map extracted from the document. */\n remoteShared: RemoteSharedModules;\n /** Link elements extracted from the document (outside the component). */\n links: HTMLLinkElement[];\n /** Script elements extracted from the component or document. */\n scripts: HTMLScriptElement[];\n}\n\n/**\n * Validates that the document does not contain multiple unnamed remote components.\n * When multiple components exist, the consumer must specify a name to select one.\n */\nexport function validateSingleComponent(\n doc: Document,\n name: string,\n url: string,\n): void {\n if (\n (doc.querySelectorAll(`div[${DATA_BUNDLE}][${DATA_ROUTE}]`).length > 1 &&\n !doc.querySelector(\n `div[${DATA_BUNDLE}][${DATA_ROUTE}][id^=\"${name}\"]`,\n )) ||\n (doc.querySelectorAll(`${TAG_REMOTE_COMPONENT}:not([src])`).length > 1 &&\n !doc.querySelector(`${TAG_REMOTE_COMPONENT}[name=\"${name}\"]`))\n ) {\n throw multipleRemoteComponentsError(url);\n }\n}\n\n/**\n * Finds the remote component element in the parsed HTML document using the\n * standard querySelector chain. Returns null if no component is found.\n */\nexport function findComponentElement(\n doc: Document,\n name: string,\n): Element | null {\n return (\n doc.querySelector(`div[${DATA_BUNDLE}][${DATA_ROUTE}][id^=\"${name}\"]`) ??\n doc.querySelector(`div[${DATA_BUNDLE}][${DATA_ROUTE}]`) ??\n doc.querySelector(`div#${NEXT_CONTAINER_ID}`) ??\n doc.querySelector(`${TAG_REMOTE_COMPONENT}[name=\"${name}\"]:not([src])`) ??\n doc.querySelector(`${TAG_REMOTE_COMPONENT}:not([src])`)\n );\n}\n\n/**\n * Parses the __NEXT_DATA__ or __REMOTE_NEXT_DATA__ script element from the document.\n */\nexport function parseNextData(doc: Document): NextData | null {\n return JSON.parse(\n (\n doc.querySelector(`#${NEXT_DATA_ID}`) ??\n doc.querySelector(`#${REMOTE_NEXT_DATA_ID}`)\n )?.textContent ?? 'null',\n ) as NextData | null;\n}\n\n/**\n * Resolves the component name from the element's id attribute, the name attribute\n * (for <remote-component> elements), nextData, or a fallback value.\n * Strips the _ssr suffix from the id if present.\n */\nexport function resolveComponentName(\n component: Element | null,\n nextData: NextData | null,\n fallbackName: string,\n): { name: string; isRemoteComponent: boolean } {\n const isRemoteComponent =\n component?.tagName.toLowerCase() === TAG_REMOTE_COMPONENT;\n\n const name =\n component\n ?.getAttribute('id')\n ?.replace(new RegExp(`${ID_SUFFIX_SSR}$`), '') ||\n (isRemoteComponent && component?.getAttribute('name')) ||\n (nextData ? '__next' : fallbackName);\n\n return { name, isRemoteComponent };\n}\n\n/**\n * Extracts the shared module map from the document and removes the element.\n * Falls back to nextData's shared modules if available.\n */\nexport function extractRemoteShared(\n doc: Document,\n name: string,\n nextData: NextData | null,\n): RemoteSharedModules {\n const remoteSharedManifestEl = doc.querySelector(\n `#${name}${ID_SUFFIX_SHARED_MANIFEST}[${DATA_REMOTE_COMPONENTS_SHARED_MANIFEST}]`,\n );\n const remoteSharedEl = doc.querySelector(\n `#${name}${ID_SUFFIX_SHARED}[${DATA_REMOTE_COMPONENTS_SHARED}]`,\n );\n const remoteShared =\n nextData?.props.__REMOTE_COMPONENT__?.sharedManifest ??\n ((remoteSharedManifestEl?.textContent\n ? JSON.parse(remoteSharedManifestEl.textContent)\n : undefined) as RemoteSharedModules | undefined) ??\n // @legacy(remote-components<=0.4.x): keep reading the historical shared\n // map until remotes on 0.4.x are outside the compatibility window.\n nextData?.props.__REMOTE_COMPONENT__?.shared ??\n ((JSON.parse(remoteSharedEl?.textContent ?? '{}') ?? {}) as Record<\n string,\n string\n >);\n remoteSharedManifestEl?.remove();\n remoteSharedEl?.remove();\n return remoteShared;\n}\n\n/**\n * Validates that a remote component was found in the document and that it has\n * RSC data, Next.js data, or is a <remote-component> element.\n * Acts as a type assertion - narrows component to non-null on success.\n */\nexport function validateComponentFound(\n component: Element | null,\n rsc: Element | null,\n nextData: NextData | null,\n isRemoteComponent: boolean,\n url: string,\n name: string,\n): asserts component is Element {\n if (!component || !(rsc || nextData || isRemoteComponent)) {\n throw new RemoteComponentsError(\n `Remote Component not found on ${url}.${\n name !== DEFAULT_COMPONENT_NAME\n ? ` The name for the <RemoteComponent> is \"${name}\". Check <RemoteComponent> usage.`\n : ''\n } Did you forget to wrap the content in <RemoteComponent>?`,\n );\n }\n}\n\n/**\n * Extracts link elements from the document that are not inside the component.\n */\nexport function extractLinks(\n doc: Document,\n component: Element,\n): HTMLLinkElement[] {\n return Array.from(doc.querySelectorAll<HTMLLinkElement>('link[href]')).filter(\n (link) => !component.contains(link),\n );\n}\n\n/**\n * Extracts script elements from the component or document, depending on whether\n * the component is a <remote-component> custom element.\n */\nexport function extractScripts(\n doc: Document,\n component: Element,\n isRemoteComponent: boolean,\n): HTMLScriptElement[] {\n return Array.from(\n (isRemoteComponent ? component : doc).querySelectorAll<HTMLScriptElement>(\n `script[src],script[${DATA_SRC}]`,\n ),\n );\n}\n\n/**\n * Parses a remote component HTML document and extracts all data needed for\n * loading and hydrating the component. This is the main orchestrator that\n * calls the individual extraction functions.\n */\nexport function parseRemoteComponentDocument(\n doc: Document,\n name: string,\n url: URL,\n): ParsedRemoteComponent {\n validateSingleComponent(doc, name, url.href);\n\n const component = findComponentElement(doc, name);\n const nextData = parseNextData(doc);\n\n const { name: resolvedName, isRemoteComponent } = resolveComponentName(\n component,\n nextData,\n name,\n );\n\n const rsc = doc.querySelector(`#${resolvedName}${ID_SUFFIX_RSC}`);\n const metadata = buildMetadata(\n {\n name: resolvedName,\n bundle:\n component?.getAttribute(DATA_BUNDLE) ||\n nextData?.props.__REMOTE_COMPONENT__?.bundle,\n route: component?.getAttribute(DATA_ROUTE) ?? nextData?.page,\n runtime:\n component?.getAttribute(DATA_RUNTIME) ??\n nextData?.props.__REMOTE_COMPONENT__?.runtime ??\n RUNTIME_SCRIPT,\n id: component?.getAttribute('id'),\n type: component?.getAttribute(DATA_TYPE),\n },\n url,\n );\n const remoteShared = extractRemoteShared(doc, resolvedName, nextData);\n\n validateComponentFound(\n component,\n rsc,\n nextData,\n isRemoteComponent,\n url.href,\n resolvedName,\n );\n\n const links = extractLinks(doc, component);\n const scripts = extractScripts(doc, component, isRemoteComponent);\n\n return {\n component,\n name: resolvedName,\n isRemoteComponent,\n metadata,\n nextData,\n rsc,\n remoteShared,\n links,\n scripts,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,uBAGO;AACP,sBAGO;AACP,mBAGO;AACP,uBAgBO;AA2BA,SAAS,wBACd,KACA,MACA,KACM;AACN,MACG,IAAI,iBAAiB,OAAO,iCAAgB,8BAAa,EAAE,SAAS,KACnE,CAAC,IAAI;AAAA,IACH,OAAO,iCAAgB,qCAAoB;AAAA,EAC7C,KACD,IAAI,iBAAiB,GAAG,kDAAiC,EAAE,SAAS,KACnE,CAAC,IAAI,cAAc,GAAG,+CAA8B,QAAQ,GAC9D;AACA,cAAM,4CAA8B,GAAG;AAAA,EACzC;AACF;AAMO,SAAS,qBACd,KACA,MACgB;AAChB,SACE,IAAI,cAAc,OAAO,iCAAgB,qCAAoB,QAAQ,KACrE,IAAI,cAAc,OAAO,iCAAgB,8BAAa,KACtD,IAAI,cAAc,OAAO,oCAAmB,KAC5C,IAAI,cAAc,GAAG,+CAA8B,mBAAmB,KACtE,IAAI,cAAc,GAAG,kDAAiC;AAE1D;AAKO,SAAS,cAAc,KAAgC;AAC5D,SAAO,KAAK;AAAA,KAER,IAAI,cAAc,IAAI,+BAAc,KACpC,IAAI,cAAc,IAAI,sCAAqB,IAC1C,eAAe;AAAA,EACpB;AACF;AAOO,SAAS,qBACd,WACA,UACA,cAC8C;AAC9C,QAAM,oBACJ,WAAW,QAAQ,YAAY,MAAM;AAEvC,QAAM,OACJ,WACI,aAAa,IAAI,GACjB,QAAQ,IAAI,OAAO,GAAG,iCAAgB,GAAG,EAAE,KAC9C,qBAAqB,WAAW,aAAa,MAAM,MACnD,WAAW,WAAW;AAEzB,SAAO,EAAE,MAAM,kBAAkB;AACnC;AAMO,SAAS,oBACd,KACA,MACA,UACqB;AACrB,QAAM,yBAAyB,IAAI;AAAA,IACjC,IAAI,OAAO,8CAA6B;AAAA,EAC1C;AACA,QAAM,iBAAiB,IAAI;AAAA,IACzB,IAAI,OAAO,qCAAoB;AAAA,EACjC;AACA,QAAM,eACJ,UAAU,MAAM,sBAAsB,mBACpC,wBAAwB,cACtB,KAAK,MAAM,uBAAuB,WAAW,IAC7C;AAAA;AAAA,EAGJ,UAAU,MAAM,sBAAsB,WACpC,KAAK,MAAM,gBAAgB,eAAe,IAAI,KAAK,CAAC;AAIxD,0BAAwB,OAAO;AAC/B,kBAAgB,OAAO;AACvB,SAAO;AACT;AAOO,SAAS,uBACd,WACA,KACA,UACA,mBACA,KACA,MAC8B;AAC9B,MAAI,CAAC,aAAa,EAAE,OAAO,YAAY,oBAAoB;AACzD,UAAM,IAAI;AAAA,MACR,iCAAiC,OAC/B,SAAS,0CACL,2CAA2C,0CAC3C;AAAA,IAER;AAAA,EACF;AACF;AAKO,SAAS,aACd,KACA,WACmB;AACnB,SAAO,MAAM,KAAK,IAAI,iBAAkC,YAAY,CAAC,EAAE;AAAA,IACrE,CAAC,SAAS,CAAC,UAAU,SAAS,IAAI;AAAA,EACpC;AACF;AAMO,SAAS,eACd,KACA,WACA,mBACqB;AACrB,SAAO,MAAM;AAAA,KACV,oBAAoB,YAAY,KAAK;AAAA,MACpC,sBAAsB;AAAA,IACxB;AAAA,EACF;AACF;AAOO,SAAS,6BACd,KACA,MACA,KACuB;AACvB,0BAAwB,KAAK,MAAM,IAAI,IAAI;AAE3C,QAAM,YAAY,qBAAqB,KAAK,IAAI;AAChD,QAAM,WAAW,cAAc,GAAG;AAElC,QAAM,EAAE,MAAM,cAAc,kBAAkB,IAAI;AAAA,IAChD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,MAAM,IAAI,cAAc,IAAI,eAAe,gCAAe;AAChE,QAAM,eAAW;AAAA,IACf;AAAA,MACE,MAAM;AAAA,MACN,QACE,WAAW,aAAa,4BAAW,KACnC,UAAU,MAAM,sBAAsB;AAAA,MACxC,OAAO,WAAW,aAAa,2BAAU,KAAK,UAAU;AAAA,MACxD,SACE,WAAW,aAAa,6BAAY,KACpC,UAAU,MAAM,sBAAsB,WACtC;AAAA,MACF,IAAI,WAAW,aAAa,IAAI;AAAA,MAChC,MAAM,WAAW,aAAa,0BAAS;AAAA,IACzC;AAAA,IACA;AAAA,EACF;AACA,QAAM,eAAe,oBAAoB,KAAK,cAAc,QAAQ;AAEpE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,IAAI;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,QAAQ,aAAa,KAAK,SAAS;AACzC,QAAM,UAAU,eAAe,KAAK,WAAW,iBAAiB;AAEhE,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { NextData } from '../../host/server/types.js';
|
|
2
|
+
import { RemoteSharedModules } from '../../host/shared/shared-broker.js';
|
|
2
3
|
import { RemoteComponentMetadata } from '../metadata.js';
|
|
3
4
|
import '../../host/nextjs/dom-flight.js';
|
|
4
5
|
import 'parse5/dist/tree-adapters/default';
|
|
5
6
|
import '../../host/shared/asset-descriptors.js';
|
|
6
7
|
import '../url/resolve-client-url.js';
|
|
8
|
+
import '../../utils/logger.js';
|
|
7
9
|
|
|
8
10
|
interface ParsedRemoteComponent {
|
|
9
11
|
/** The DOM element representing the remote component content. */
|
|
@@ -18,8 +20,8 @@ interface ParsedRemoteComponent {
|
|
|
18
20
|
nextData: NextData | null;
|
|
19
21
|
/** The RSC flight data script element, or null. */
|
|
20
22
|
rsc: Element | null;
|
|
21
|
-
/** Shared module map extracted from the
|
|
22
|
-
remoteShared:
|
|
23
|
+
/** Shared module manifest or compatibility map extracted from the document. */
|
|
24
|
+
remoteShared: RemoteSharedModules;
|
|
23
25
|
/** Link elements extracted from the document (outside the component). */
|
|
24
26
|
links: HTMLLinkElement[];
|
|
25
27
|
/** Script elements extracted from the component or document. */
|
|
@@ -52,7 +54,7 @@ declare function resolveComponentName(component: Element | null, nextData: NextD
|
|
|
52
54
|
* Extracts the shared module map from the document and removes the element.
|
|
53
55
|
* Falls back to nextData's shared modules if available.
|
|
54
56
|
*/
|
|
55
|
-
declare function extractRemoteShared(doc: Document, name: string, nextData: NextData | null):
|
|
57
|
+
declare function extractRemoteShared(doc: Document, name: string, nextData: NextData | null): RemoteSharedModules;
|
|
56
58
|
/**
|
|
57
59
|
* Validates that a remote component was found in the document and that it has
|
|
58
60
|
* RSC data, Next.js data, or is a <remote-component> element.
|
|
@@ -12,12 +12,14 @@ import {
|
|
|
12
12
|
import {
|
|
13
13
|
DATA_BUNDLE,
|
|
14
14
|
DATA_REMOTE_COMPONENTS_SHARED,
|
|
15
|
+
DATA_REMOTE_COMPONENTS_SHARED_MANIFEST,
|
|
15
16
|
DATA_ROUTE,
|
|
16
17
|
DATA_RUNTIME,
|
|
17
18
|
DATA_SRC,
|
|
18
19
|
DATA_TYPE,
|
|
19
20
|
ID_SUFFIX_RSC,
|
|
20
21
|
ID_SUFFIX_SHARED,
|
|
22
|
+
ID_SUFFIX_SHARED_MANIFEST,
|
|
21
23
|
ID_SUFFIX_SSR,
|
|
22
24
|
NEXT_CONTAINER_ID,
|
|
23
25
|
NEXT_DATA_ID,
|
|
@@ -45,10 +47,16 @@ function resolveComponentName(component, nextData, fallbackName) {
|
|
|
45
47
|
return { name, isRemoteComponent };
|
|
46
48
|
}
|
|
47
49
|
function extractRemoteShared(doc, name, nextData) {
|
|
50
|
+
const remoteSharedManifestEl = doc.querySelector(
|
|
51
|
+
`#${name}${ID_SUFFIX_SHARED_MANIFEST}[${DATA_REMOTE_COMPONENTS_SHARED_MANIFEST}]`
|
|
52
|
+
);
|
|
48
53
|
const remoteSharedEl = doc.querySelector(
|
|
49
54
|
`#${name}${ID_SUFFIX_SHARED}[${DATA_REMOTE_COMPONENTS_SHARED}]`
|
|
50
55
|
);
|
|
51
|
-
const remoteShared = nextData?.props.__REMOTE_COMPONENT__?.
|
|
56
|
+
const remoteShared = nextData?.props.__REMOTE_COMPONENT__?.sharedManifest ?? (remoteSharedManifestEl?.textContent ? JSON.parse(remoteSharedManifestEl.textContent) : void 0) ?? // @legacy(remote-components<=0.4.x): keep reading the historical shared
|
|
57
|
+
// map until remotes on 0.4.x are outside the compatibility window.
|
|
58
|
+
nextData?.props.__REMOTE_COMPONENT__?.shared ?? (JSON.parse(remoteSharedEl?.textContent ?? "{}") ?? {});
|
|
59
|
+
remoteSharedManifestEl?.remove();
|
|
52
60
|
remoteSharedEl?.remove();
|
|
53
61
|
return remoteShared;
|
|
54
62
|
}
|