remote-components 0.3.2 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dist/config/nextjs.cjs +36 -25
  2. package/dist/config/nextjs.cjs.map +1 -1
  3. package/dist/config/nextjs.js +30 -19
  4. package/dist/config/nextjs.js.map +1 -1
  5. package/dist/host/defaults/app.cjs +2 -5
  6. package/dist/host/defaults/app.cjs.map +1 -1
  7. package/dist/host/defaults/app.d.ts +1 -3
  8. package/dist/host/defaults/app.js +1 -4
  9. package/dist/host/defaults/app.js.map +1 -1
  10. package/dist/host/defaults/pages.cjs +2 -5
  11. package/dist/host/defaults/pages.cjs.map +1 -1
  12. package/dist/host/defaults/pages.d.ts +1 -3
  13. package/dist/host/defaults/pages.js +1 -4
  14. package/dist/host/defaults/pages.js.map +1 -1
  15. package/dist/host/defaults/shared.cjs +32 -0
  16. package/dist/host/defaults/shared.cjs.map +1 -0
  17. package/dist/host/defaults/shared.d.ts +3 -0
  18. package/dist/host/defaults/shared.js +8 -0
  19. package/dist/host/defaults/shared.js.map +1 -0
  20. package/dist/host/html.cjs +9 -13
  21. package/dist/host/html.cjs.map +1 -1
  22. package/dist/host/html.js +9 -13
  23. package/dist/host/html.js.map +1 -1
  24. package/dist/host/nextjs/app/client-only.cjs +32 -26
  25. package/dist/host/nextjs/app/client-only.cjs.map +1 -1
  26. package/dist/host/nextjs/app/client-only.js +32 -26
  27. package/dist/host/nextjs/app/client-only.js.map +1 -1
  28. package/dist/host/react.cjs +9 -13
  29. package/dist/host/react.cjs.map +1 -1
  30. package/dist/host/react.js +9 -13
  31. package/dist/host/react.js.map +1 -1
  32. package/dist/internal/host/nextjs/app-client.cjs +2 -19
  33. package/dist/internal/host/nextjs/app-client.cjs.map +1 -1
  34. package/dist/internal/host/nextjs/app-client.js +1 -8
  35. package/dist/internal/host/nextjs/app-client.js.map +1 -1
  36. package/dist/internal/host/nextjs/shared-import.cjs +46 -0
  37. package/dist/internal/host/nextjs/shared-import.cjs.map +1 -0
  38. package/dist/internal/host/nextjs/shared-import.d.ts +3 -0
  39. package/dist/internal/host/nextjs/shared-import.js +12 -0
  40. package/dist/internal/host/nextjs/shared-import.js.map +1 -0
  41. package/dist/internal/runtime/loaders/script-loader.cjs +7 -0
  42. package/dist/internal/runtime/loaders/script-loader.cjs.map +1 -1
  43. package/dist/internal/runtime/loaders/script-loader.js +7 -0
  44. package/dist/internal/runtime/loaders/script-loader.js.map +1 -1
  45. package/dist/internal/runtime/turbopack/module.cjs +2 -13
  46. package/dist/internal/runtime/turbopack/module.cjs.map +1 -1
  47. package/dist/internal/runtime/turbopack/module.js +3 -14
  48. package/dist/internal/runtime/turbopack/module.js.map +1 -1
  49. package/dist/internal/runtime/turbopack/shared-modules.cjs +2 -0
  50. package/dist/internal/runtime/turbopack/shared-modules.cjs.map +1 -1
  51. package/dist/internal/runtime/turbopack/shared-modules.d.ts +6 -1
  52. package/dist/internal/runtime/turbopack/shared-modules.js +1 -0
  53. package/dist/internal/runtime/turbopack/shared-modules.js.map +1 -1
  54. package/dist/internal/utils/project-id-env.cjs +31 -0
  55. package/dist/internal/utils/project-id-env.cjs.map +1 -0
  56. package/dist/internal/utils/project-id-env.d.ts +7 -0
  57. package/dist/internal/utils/project-id-env.js +7 -0
  58. package/dist/internal/utils/project-id-env.js.map +1 -0
  59. package/dist/internal/utils/project-id.cjs +46 -0
  60. package/dist/internal/utils/project-id.cjs.map +1 -0
  61. package/dist/internal/utils/project-id.d.ts +8 -0
  62. package/dist/internal/utils/project-id.js +22 -0
  63. package/dist/internal/utils/project-id.js.map +1 -0
  64. package/dist/remote/defaults/app.cjs +2 -5
  65. package/dist/remote/defaults/app.cjs.map +1 -1
  66. package/dist/remote/defaults/app.d.ts +1 -3
  67. package/dist/remote/defaults/app.js +1 -4
  68. package/dist/remote/defaults/app.js.map +1 -1
  69. package/dist/remote/defaults/pages.cjs +2 -5
  70. package/dist/remote/defaults/pages.cjs.map +1 -1
  71. package/dist/remote/defaults/pages.d.ts +1 -3
  72. package/dist/remote/defaults/pages.js +1 -4
  73. package/dist/remote/defaults/pages.js.map +1 -1
  74. package/dist/{internal/host/shared/resolved-data.cjs → remote/defaults/shared.cjs} +18 -3
  75. package/dist/remote/defaults/shared.cjs.map +1 -0
  76. package/dist/remote/defaults/shared.d.ts +3 -0
  77. package/dist/remote/defaults/shared.js +8 -0
  78. package/dist/remote/defaults/shared.js.map +1 -0
  79. package/dist/remote/nextjs/app.cjs +2 -1
  80. package/dist/remote/nextjs/app.cjs.map +1 -1
  81. package/dist/remote/nextjs/app.js +2 -1
  82. package/dist/remote/nextjs/app.js.map +1 -1
  83. package/dist/remote/nextjs/pages.cjs +2 -1
  84. package/dist/remote/nextjs/pages.cjs.map +1 -1
  85. package/dist/remote/nextjs/pages.js +2 -1
  86. package/dist/remote/nextjs/pages.js.map +1 -1
  87. package/package.json +1 -1
  88. package/dist/internal/host/shared/resolved-data.cjs.map +0 -1
  89. package/dist/internal/host/shared/resolved-data.d.ts +0 -48
  90. package/dist/internal/host/shared/resolved-data.js +0 -1
  91. package/dist/internal/host/shared/resolved-data.js.map +0 -1
@@ -1,16 +1,14 @@
1
1
  import { logError } from "#internal/utils/logger";
2
2
  import { loadChunkWithScope } from "./chunk-loader";
3
3
  import { formatRemoteId } from "./remote-scope";
4
- import { getSharedModule } from "./shared-modules";
4
+ import { getSharedModule, getTurbopackModules } from "./shared-modules";
5
5
  function requireModule(scope, moduleId, fullId) {
6
6
  const idStr = String(moduleId);
7
7
  if (scope.moduleCache[idStr])
8
8
  return scope.moduleCache[idStr];
9
9
  const sharedModule = getSharedModule(scope, moduleId);
10
- if (sharedModule) {
11
- scope.moduleCache[idStr] = sharedModule;
10
+ if (sharedModule)
12
11
  return sharedModule;
13
- }
14
12
  return handleTurbopackModule(
15
13
  scope,
16
14
  idStr,
@@ -18,19 +16,10 @@ function requireModule(scope, moduleId, fullId) {
18
16
  );
19
17
  }
20
18
  function handleTurbopackModule(scope, moduleId, id) {
21
- const self = globalThis;
22
19
  if (scope.moduleCache[moduleId]) {
23
20
  return scope.moduleCache[moduleId];
24
21
  }
25
- const raw = self[`TURBOPACK_${scope.globalKey}`];
26
- let modules;
27
- if (raw && typeof raw === "object" && "__chunks__" in raw) {
28
- modules = raw.__chunks__.flat();
29
- } else if (Array.isArray(raw)) {
30
- modules = raw.flat();
31
- } else {
32
- modules = raw;
33
- }
22
+ const modules = getTurbopackModules(scope);
34
23
  if (!modules) {
35
24
  logError(
36
25
  "TurbopackModule",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/runtime/turbopack/module.ts"],"sourcesContent":["import type { GlobalScope } from '#internal/runtime/types';\nimport { logError } from '#internal/utils/logger';\nimport { loadChunkWithScope } from './chunk-loader';\nimport { formatRemoteId, type RemoteScope } from './remote-scope';\nimport { getSharedModule } from './shared-modules';\n\n/**\n * Function signature for Turbopack module initializers.\n * These functions are generated by Turbopack and initialize module exports.\n */\nexport type TurbopackModuleInit = (\n turbopackContext: TurbopackContext,\n module: { exports: Record<string, unknown> },\n exports: Record<string, unknown>,\n) => void;\n\n/**\n * The context object passed to Turbopack module initializers.\n * This provides the runtime API that modules use for imports, exports, and HMR.\n */\ninterface TurbopackContext {\n /** HMR (Hot Module Replacement) - not implemented for remote components */\n k: {\n register(): void;\n registerExports(): void;\n signature(): (fn: unknown) => unknown;\n };\n /** ESM exports setup */\n s: (\n bindings:\n | Record<string, () => unknown>\n | [...([string, () => unknown] | [string, number, () => unknown])],\n esmId?: string | number,\n ) => void;\n /** Import module */\n i: (importId: string | number) => Record<string, unknown> | undefined;\n /** Require module */\n r: (requireId: string) => unknown;\n /** Value exports */\n v: (value: unknown) => void;\n /** Async module initializer */\n a: (\n mod: (\n handleDeps: unknown,\n setResult: (value: unknown) => void,\n ) => Promise<void>,\n ) => Promise<void>;\n /** Async module loader */\n A: (Aid: string) => Promise<unknown>;\n /**\n * Dynamic import tracking. Called in production chunks after ctx.s() to\n * register async/dynamic module relationships. e.g. t.j(importedMod, 58790)\n */\n j: (module: unknown, esmId?: string | number) => void;\n /** Chunk loader */\n l: (url: string) => Promise<unknown> | undefined;\n /** Global object for this bundle */\n g: unknown;\n /** Module object */\n m: { exports: Record<string, unknown> };\n /** Exports object */\n e: Record<string, unknown>;\n}\n\n/**\n * Turbopack pushes chunks as flat arrays in one of two shapes:\n *\n * Module chunk (common case):\n * [scriptElement, id1, factory1, id2, factory2, ...]\n * - index 0: the script Element (document.currentScript) or undefined\n * - alternating pairs: numeric ID (prod) or path string (dev), then factory function\n *\n * Runtime manifest (bootstrapper only, no module factories):\n * [scriptElement, { otherChunks: [...], runtimeModuleIds: [...] }]\n *\n * Newer Next.js canary versions may also store modules as a plain object\n * { [moduleId]: factory } rather than as an array.\n */\ntype BundleModules =\n | (\n | Element\n | string\n | number\n | TurbopackModuleInit\n | Record<string, TurbopackModuleInit>\n | null\n | undefined\n )[]\n | Record<string, TurbopackModuleInit>\n | undefined;\n\n/**\n * Resolves a module within a scope: checks shared modules first, then\n * falls back to Turbopack module resolution. This is the scope-local\n * equivalent of the global __webpack_require__ dispatcher.\n */\nexport function requireModule(\n scope: RemoteScope,\n moduleId: string | number,\n fullId?: string,\n): unknown {\n const idStr = String(moduleId);\n\n // moduleCache is checked first inside handleTurbopackModule too, but\n // checking here avoids the shared-module lookup on every re-entry.\n if (scope.moduleCache[idStr]) return scope.moduleCache[idStr];\n\n const sharedModule = getSharedModule(scope, moduleId);\n if (sharedModule) {\n // Cache the shared module so subsequent lookups for the same id\n // resolve from moduleCache without re-scanning sharedModules.\n scope.moduleCache[idStr] = sharedModule;\n return sharedModule;\n }\n\n return handleTurbopackModule(\n scope,\n idStr,\n fullId ?? formatRemoteId(scope, idStr),\n );\n}\n\n/**\n * Handles Turbopack module resolution and execution.\n * Finds a module in the Turbopack bundle, executes its initializer with a\n * custom runtime context, and returns the module exports.\n */\nexport function handleTurbopackModule(\n scope: RemoteScope,\n moduleId: string,\n id: string,\n): unknown {\n const self = globalThis as GlobalScope;\n\n // Cache check must come before module init lookup. Module initializers\n // re-enter handleTurbopackModule for their own imports, so without this\n // guard circular dependencies would infinite-loop.\n if (scope.moduleCache[moduleId]) {\n return scope.moduleCache[moduleId];\n }\n\n const raw = self[`TURBOPACK_${scope.globalKey}`];\n\n // Normalize the bundle global to a flat entry list. The chunk-loader push\n // interceptor stores modules as { __chunks__: [[Element, id, fn, ...], ...] }.\n let modules: BundleModules;\n if (raw && typeof raw === 'object' && '__chunks__' in raw) {\n modules = (\n raw as { __chunks__: unknown[][] }\n ).__chunks__.flat() as unknown as BundleModules;\n } else if (Array.isArray(raw)) {\n modules = (raw as unknown[]).flat() as unknown as BundleModules;\n } else {\n modules = raw as BundleModules;\n }\n\n // Log only if bundle is completely missing (critical error)\n if (!modules) {\n logError(\n 'TurbopackModule',\n `TURBOPACK_${scope.globalKey} is undefined (scope: \"${scope.scopedName}\")`,\n );\n }\n\n const moduleInit = findModuleInit(modules, moduleId);\n const exports = {} as Record<string, unknown>;\n const moduleExports = { exports };\n\n if (typeof moduleInit !== 'function') {\n throw new Error(\n `Module ${id} not found in bundle ${scope.name} with id ${moduleId}`,\n );\n }\n\n // store a reference to the module exports in the cache before execution\n // to handle circular dependencies\n scope.moduleCache[moduleId] = moduleExports.exports;\n\n // execute the module initializer with our custom Turbopack context\n moduleInit(\n createTurbopackContext(\n scope,\n exports,\n moduleExports,\n modules,\n moduleInit,\n id,\n ),\n moduleExports,\n exports,\n );\n\n // update the cache with the final exports (may have changed during execution)\n if (scope.moduleCache[moduleId] !== moduleExports.exports) {\n scope.moduleCache[moduleId] = moduleExports.exports;\n }\n\n return moduleExports.exports;\n}\n\n/**\n * Finds the module initializer function in the Turbopack bundle.\n */\nfunction findModuleInit(\n modules: BundleModules,\n moduleId: string,\n): TurbopackModuleInit | undefined {\n if (!modules || typeof modules !== 'object') return;\n\n // Object format: { [id]: factory } (newer Next.js canary builds)\n if (!Array.isArray(modules)) {\n const key =\n moduleId in modules\n ? moduleId\n : Object.keys(modules).find((k) => k.startsWith(moduleId));\n return key !== undefined ? modules[key] : undefined;\n }\n\n const flat = modules.flat();\n\n // Two-pass ID search: exact match first to avoid prefix false positives.\n // The startsWith fallback handles dev-mode IDs with appended qualifiers\n // such as \"[project]/path.tsx [app-client] (ecmascript, async loader)\".\n let idx = flat.findIndex((e) => String(e) === String(moduleId));\n if (idx < 0) {\n idx = flat.findIndex(\n (e) => typeof e === 'string' && e.startsWith(moduleId),\n );\n }\n if (idx >= 0) {\n // Factory is the first function entry that follows the module ID\n return flat\n .slice(idx + 1)\n .find((e): e is TurbopackModuleInit => typeof e === 'function');\n }\n\n // Embedded object map: entries of the form { [moduleId]: factory }\n return flat.find((e): e is Record<string, TurbopackModuleInit> =>\n Boolean(e && typeof e === 'object' && moduleId in (e as object)),\n )?.[moduleId];\n}\n\n/**\n * Creates the Turbopack context object that provides the runtime API for modules.\n * All context methods close over the scope directly — no global dispatch needed\n * for internal module-to-module calls.\n */\nfunction createTurbopackContext(\n scope: RemoteScope,\n exports: Record<string, unknown>,\n moduleExports: { exports: Record<string, unknown> },\n modules: BundleModules,\n moduleInit: TurbopackModuleInit,\n id: string,\n): TurbopackContext {\n /** Scope-local require: shared modules → turbopack module resolution. */\n const scopedRequire = (moduleId: string | number): unknown =>\n requireModule(scope, moduleId, formatRemoteId(scope, String(moduleId)));\n\n return {\n // HMR not implemented for Remote Components\n k: {\n register() {\n // omit\n },\n registerExports() {\n // omit\n },\n signature() {\n return (fn: unknown) => fn;\n },\n },\n\n // ESM exports setup\n s(\n bindings:\n | Record<string, () => unknown>\n | [...([string, () => unknown] | [string, number, () => unknown])],\n esmId?: string | number,\n ) {\n let mod = exports;\n if (typeof esmId === 'string' || typeof esmId === 'number') {\n if (!scope.moduleCache[esmId]) {\n scope.moduleCache[esmId] = {} as Record<string, unknown>;\n }\n mod = scope.moduleCache[esmId] as Record<string, unknown>;\n }\n\n Object.defineProperty(mod, '__esModule', { value: true });\n if (Array.isArray(bindings)) {\n let i = 0;\n while (i < bindings.length) {\n const propName = bindings[i++] as string;\n const tagOrFunc = bindings[i++];\n if (typeof tagOrFunc === 'number') {\n Object.defineProperty(mod, propName, {\n value: bindings[i++],\n enumerable: true,\n writable: false,\n });\n } else {\n const getterFn = tagOrFunc as () => unknown;\n if (typeof bindings[i] === 'function') {\n const setterFn = bindings[i++] as (v: unknown) => unknown;\n Object.defineProperty(mod, propName, {\n get: getterFn,\n set: setterFn,\n enumerable: true,\n });\n } else {\n Object.defineProperty(mod, propName, {\n get: getterFn,\n enumerable: true,\n });\n }\n }\n }\n }\n },\n\n // import — resolves directly via scope, no global dispatch\n i(importId: string | number) {\n let mod: Record<string, unknown> | undefined;\n if (typeof importId === 'string') {\n // parse export syntax if present (e.g., \"module <export foo as bar>\")\n const { exportSource, exportName } =\n /\\s+<export (?<exportSource>.*?) as (?<exportName>.*?)>$/.exec(\n importId,\n )?.groups ?? {};\n const normalizedId = importId.replace(\n /\\s+<export(?<specifier>.*)>$/,\n '',\n );\n mod = scopedRequire(normalizedId) as\n | Record<string, unknown>\n | undefined;\n // map the requested export to the module exports\n if (\n mod &&\n exportSource &&\n exportName &&\n (exportSource === '*' || typeof mod[exportSource] !== 'undefined') &&\n typeof mod[exportName] === 'undefined'\n ) {\n if (exportSource === '*') {\n mod[exportName] = mod;\n } else {\n mod[exportName] = mod[exportSource];\n }\n }\n } else {\n mod = scopedRequire(importId) as Record<string, unknown> | undefined;\n }\n\n if (typeof mod !== 'object' || mod === null) {\n mod = { default: mod };\n } else if (!('default' in mod) && mod.toString() !== '[object Module]') {\n try {\n mod.default = mod;\n } catch {\n // ignore if mod is not extensible\n }\n }\n return mod;\n },\n\n // require — resolves directly via scope\n r(requireId: string) {\n return scopedRequire(requireId);\n },\n\n // value exports\n v(value: unknown) {\n if (typeof value === 'function') {\n exports.default = value((vid: string | number) => scopedRequire(vid));\n } else {\n moduleExports.exports = value as Record<string, unknown>;\n }\n },\n\n // async module initializer\n async a(\n mod: (\n handleDeps: unknown,\n setResult: (value: unknown) => void,\n ) => Promise<void>,\n ) {\n let result;\n await mod(\n () => {\n // not implemented\n },\n (value) => (result = value),\n );\n exports.default = result;\n },\n\n // async module loader — resolves directly via scope\n async A(Aid: string) {\n const mod = scopedRequire(Aid) as {\n default: (\n parentImport: (parentId: string) => unknown,\n ) => Promise<unknown>;\n };\n return mod.default((parentId: string) => scopedRequire(parentId));\n },\n\n // dynamic import tracking — no-op for remote components\n j() {\n // omit\n },\n\n // chunk loader — loads directly via scope, no global dispatch\n l(url: string) {\n // find the script tag that loaded the current module to determine base URL\n const flatModules = Array.isArray(modules) ? modules : [];\n const moduleInitIndex = flatModules.indexOf(moduleInit);\n if (moduleInitIndex !== -1) {\n const scriptIndex = flatModules\n .slice(0, moduleInitIndex)\n .findLastIndex((bundleEntry) => bundleEntry instanceof Element);\n if (scriptIndex !== -1) {\n const script = flatModules[scriptIndex] as HTMLScriptElement;\n const scriptSrc = script.getAttribute('data-turbopack-src') || '';\n const nextIndex = scriptSrc.indexOf('/_next');\n const baseUrl = nextIndex !== -1 ? scriptSrc.slice(0, nextIndex) : '';\n const chunkUrl = `${baseUrl}/_next/${url}`;\n return loadChunkWithScope(scope, formatRemoteId(scope, chunkUrl));\n }\n }\n throw new Error(\n `Failed to load Turbopack chunk \"${url}\" for module \"${id}\". Check the URL is correct.`,\n );\n },\n\n // globalThis substitute shared across all modules in this scope\n g: scope.moduleGlobal,\n m: moduleExports,\n e: exports,\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/runtime/turbopack/module.ts"],"sourcesContent":["import { logError } from '#internal/utils/logger';\nimport { loadChunkWithScope } from './chunk-loader';\nimport { formatRemoteId, type RemoteScope } from './remote-scope';\nimport { getSharedModule, getTurbopackModules } from './shared-modules';\n\n/**\n * Function signature for Turbopack module initializers.\n * These functions are generated by Turbopack and initialize module exports.\n */\nexport type TurbopackModuleInit = (\n turbopackContext: TurbopackContext,\n module: { exports: Record<string, unknown> },\n exports: Record<string, unknown>,\n) => void;\n\n/**\n * The context object passed to Turbopack module initializers.\n * This provides the runtime API that modules use for imports, exports, and HMR.\n */\ninterface TurbopackContext {\n /** HMR (Hot Module Replacement) - not implemented for remote components */\n k: {\n register(): void;\n registerExports(): void;\n signature(): (fn: unknown) => unknown;\n };\n /** ESM exports setup */\n s: (\n bindings:\n | Record<string, () => unknown>\n | [...([string, () => unknown] | [string, number, () => unknown])],\n esmId?: string | number,\n ) => void;\n /** Import module */\n i: (importId: string | number) => Record<string, unknown> | undefined;\n /** Require module */\n r: (requireId: string) => unknown;\n /** Value exports */\n v: (value: unknown) => void;\n /** Async module initializer */\n a: (\n mod: (\n handleDeps: unknown,\n setResult: (value: unknown) => void,\n ) => Promise<void>,\n ) => Promise<void>;\n /** Async module loader */\n A: (Aid: string) => Promise<unknown>;\n /**\n * Dynamic import tracking. Called in production chunks after ctx.s() to\n * register async/dynamic module relationships. e.g. t.j(importedMod, 58790)\n */\n j: (module: unknown, esmId?: string | number) => void;\n /** Chunk loader */\n l: (url: string) => Promise<unknown> | undefined;\n /** Global object for this bundle */\n g: unknown;\n /** Module object */\n m: { exports: Record<string, unknown> };\n /** Exports object */\n e: Record<string, unknown>;\n}\n\n/**\n * Turbopack pushes chunks as flat arrays in one of two shapes:\n *\n * Module chunk (common case):\n * [scriptElement, id1, factory1, id2, factory2, ...]\n * - index 0: the script Element (document.currentScript) or undefined\n * - alternating pairs: numeric ID (prod) or path string (dev), then factory function\n *\n * Runtime manifest (bootstrapper only, no module factories):\n * [scriptElement, { otherChunks: [...], runtimeModuleIds: [...] }]\n *\n * Newer Next.js canary versions may also store modules as a plain object\n * { [moduleId]: factory } rather than as an array.\n */\ntype BundleModules =\n | (\n | Element\n | string\n | number\n | TurbopackModuleInit\n | Record<string, TurbopackModuleInit>\n | null\n | undefined\n )[]\n | Record<string, TurbopackModuleInit>\n | undefined;\n\n/**\n * Resolves a module within a scope: checks shared modules first, then\n * falls back to Turbopack module resolution. This is the scope-local\n * equivalent of the global __webpack_require__ dispatcher.\n */\nexport function requireModule(\n scope: RemoteScope,\n moduleId: string | number,\n fullId?: string,\n): unknown {\n const idStr = String(moduleId);\n\n // moduleCache is checked first inside handleTurbopackModule too, but\n // checking here avoids the shared-module lookup on every re-entry.\n if (scope.moduleCache[idStr]) return scope.moduleCache[idStr];\n\n // Shared modules are NOT cached in moduleCache because ctx.s() also\n // uses moduleCache for esmId lookups. Caching the host's frozen module\n // object here would cause ctx.s() to attempt Object.defineProperty on\n // it, failing with \"Cannot redefine property\" for non-configurable\n // exports. Keeping shared modules in their own map avoids the collision.\n const sharedModule = getSharedModule(scope, moduleId);\n if (sharedModule) return sharedModule;\n\n return handleTurbopackModule(\n scope,\n idStr,\n fullId ?? formatRemoteId(scope, idStr),\n );\n}\n\n/**\n * Handles Turbopack module resolution and execution.\n * Finds a module in the Turbopack bundle, executes its initializer with a\n * custom runtime context, and returns the module exports.\n */\nexport function handleTurbopackModule(\n scope: RemoteScope,\n moduleId: string,\n id: string,\n): unknown {\n // Cache check must come before module init lookup. Module initializers\n // re-enter handleTurbopackModule for their own imports, so without this\n // guard circular dependencies would infinite-loop.\n if (scope.moduleCache[moduleId]) {\n return scope.moduleCache[moduleId];\n }\n\n const modules = getTurbopackModules(scope) as BundleModules;\n\n // Log only if bundle is completely missing (critical error)\n if (!modules) {\n logError(\n 'TurbopackModule',\n `TURBOPACK_${scope.globalKey} is undefined (scope: \"${scope.scopedName}\")`,\n );\n }\n\n const moduleInit = findModuleInit(modules, moduleId);\n const exports = {} as Record<string, unknown>;\n const moduleExports = { exports };\n\n if (typeof moduleInit !== 'function') {\n throw new Error(\n `Module ${id} not found in bundle ${scope.name} with id ${moduleId}`,\n );\n }\n\n // store a reference to the module exports in the cache before execution\n // to handle circular dependencies\n scope.moduleCache[moduleId] = moduleExports.exports;\n\n // execute the module initializer with our custom Turbopack context\n moduleInit(\n createTurbopackContext(\n scope,\n exports,\n moduleExports,\n modules,\n moduleInit,\n id,\n ),\n moduleExports,\n exports,\n );\n\n // update the cache with the final exports (may have changed during execution)\n if (scope.moduleCache[moduleId] !== moduleExports.exports) {\n scope.moduleCache[moduleId] = moduleExports.exports;\n }\n\n return moduleExports.exports;\n}\n\n/**\n * Finds the module initializer function in the Turbopack bundle.\n */\nfunction findModuleInit(\n modules: BundleModules,\n moduleId: string,\n): TurbopackModuleInit | undefined {\n if (!modules || typeof modules !== 'object') return;\n\n // Object format: { [id]: factory } (newer Next.js canary builds)\n if (!Array.isArray(modules)) {\n const key =\n moduleId in modules\n ? moduleId\n : Object.keys(modules).find((k) => k.startsWith(moduleId));\n return key !== undefined ? modules[key] : undefined;\n }\n\n const flat = modules.flat();\n\n // Two-pass ID search: exact match first to avoid prefix false positives.\n // The startsWith fallback handles dev-mode IDs with appended qualifiers\n // such as \"[project]/path.tsx [app-client] (ecmascript, async loader)\".\n let idx = flat.findIndex((e) => String(e) === String(moduleId));\n if (idx < 0) {\n idx = flat.findIndex(\n (e) => typeof e === 'string' && e.startsWith(moduleId),\n );\n }\n if (idx >= 0) {\n // Factory is the first function entry that follows the module ID\n return flat\n .slice(idx + 1)\n .find((e): e is TurbopackModuleInit => typeof e === 'function');\n }\n\n // Embedded object map: entries of the form { [moduleId]: factory }\n return flat.find((e): e is Record<string, TurbopackModuleInit> =>\n Boolean(e && typeof e === 'object' && moduleId in (e as object)),\n )?.[moduleId];\n}\n\n/**\n * Creates the Turbopack context object that provides the runtime API for modules.\n * All context methods close over the scope directly — no global dispatch needed\n * for internal module-to-module calls.\n */\nfunction createTurbopackContext(\n scope: RemoteScope,\n exports: Record<string, unknown>,\n moduleExports: { exports: Record<string, unknown> },\n modules: BundleModules,\n moduleInit: TurbopackModuleInit,\n id: string,\n): TurbopackContext {\n /** Scope-local require: shared modules → turbopack module resolution. */\n const scopedRequire = (moduleId: string | number): unknown =>\n requireModule(scope, moduleId, formatRemoteId(scope, String(moduleId)));\n\n return {\n // HMR not implemented for Remote Components\n k: {\n register() {\n // omit\n },\n registerExports() {\n // omit\n },\n signature() {\n return (fn: unknown) => fn;\n },\n },\n\n // ESM exports setup\n s(\n bindings:\n | Record<string, () => unknown>\n | [...([string, () => unknown] | [string, number, () => unknown])],\n esmId?: string | number,\n ) {\n let mod = exports;\n if (typeof esmId === 'string' || typeof esmId === 'number') {\n if (!scope.moduleCache[esmId]) {\n scope.moduleCache[esmId] = {} as Record<string, unknown>;\n }\n mod = scope.moduleCache[esmId] as Record<string, unknown>;\n }\n\n Object.defineProperty(mod, '__esModule', { value: true });\n if (Array.isArray(bindings)) {\n let i = 0;\n while (i < bindings.length) {\n const propName = bindings[i++] as string;\n const tagOrFunc = bindings[i++];\n if (typeof tagOrFunc === 'number') {\n Object.defineProperty(mod, propName, {\n value: bindings[i++],\n enumerable: true,\n writable: false,\n });\n } else {\n const getterFn = tagOrFunc as () => unknown;\n if (typeof bindings[i] === 'function') {\n const setterFn = bindings[i++] as (v: unknown) => unknown;\n Object.defineProperty(mod, propName, {\n get: getterFn,\n set: setterFn,\n enumerable: true,\n });\n } else {\n Object.defineProperty(mod, propName, {\n get: getterFn,\n enumerable: true,\n });\n }\n }\n }\n }\n },\n\n // import — resolves directly via scope, no global dispatch\n i(importId: string | number) {\n let mod: Record<string, unknown> | undefined;\n if (typeof importId === 'string') {\n // parse export syntax if present (e.g., \"module <export foo as bar>\")\n const { exportSource, exportName } =\n /\\s+<export (?<exportSource>.*?) as (?<exportName>.*?)>$/.exec(\n importId,\n )?.groups ?? {};\n const normalizedId = importId.replace(\n /\\s+<export(?<specifier>.*)>$/,\n '',\n );\n mod = scopedRequire(normalizedId) as\n | Record<string, unknown>\n | undefined;\n // map the requested export to the module exports\n if (\n mod &&\n exportSource &&\n exportName &&\n (exportSource === '*' || typeof mod[exportSource] !== 'undefined') &&\n typeof mod[exportName] === 'undefined'\n ) {\n if (exportSource === '*') {\n mod[exportName] = mod;\n } else {\n mod[exportName] = mod[exportSource];\n }\n }\n } else {\n mod = scopedRequire(importId) as Record<string, unknown> | undefined;\n }\n\n if (typeof mod !== 'object' || mod === null) {\n mod = { default: mod };\n } else if (!('default' in mod) && mod.toString() !== '[object Module]') {\n try {\n mod.default = mod;\n } catch {\n // ignore if mod is not extensible\n }\n }\n return mod;\n },\n\n // require — resolves directly via scope\n r(requireId: string) {\n return scopedRequire(requireId);\n },\n\n // value exports\n v(value: unknown) {\n if (typeof value === 'function') {\n exports.default = value((vid: string | number) => scopedRequire(vid));\n } else {\n moduleExports.exports = value as Record<string, unknown>;\n }\n },\n\n // async module initializer\n async a(\n mod: (\n handleDeps: unknown,\n setResult: (value: unknown) => void,\n ) => Promise<void>,\n ) {\n let result;\n await mod(\n () => {\n // not implemented\n },\n (value) => (result = value),\n );\n exports.default = result;\n },\n\n // async module loader — resolves directly via scope\n async A(Aid: string) {\n const mod = scopedRequire(Aid) as {\n default: (\n parentImport: (parentId: string) => unknown,\n ) => Promise<unknown>;\n };\n return mod.default((parentId: string) => scopedRequire(parentId));\n },\n\n // dynamic import tracking — no-op for remote components\n j() {\n // omit\n },\n\n // chunk loader — loads directly via scope, no global dispatch\n l(url: string) {\n // find the script tag that loaded the current module to determine base URL\n const flatModules = Array.isArray(modules) ? modules : [];\n const moduleInitIndex = flatModules.indexOf(moduleInit);\n if (moduleInitIndex !== -1) {\n const scriptIndex = flatModules\n .slice(0, moduleInitIndex)\n .findLastIndex((bundleEntry) => bundleEntry instanceof Element);\n if (scriptIndex !== -1) {\n const script = flatModules[scriptIndex] as HTMLScriptElement;\n const scriptSrc = script.getAttribute('data-turbopack-src') || '';\n const nextIndex = scriptSrc.indexOf('/_next');\n const baseUrl = nextIndex !== -1 ? scriptSrc.slice(0, nextIndex) : '';\n const chunkUrl = `${baseUrl}/_next/${url}`;\n return loadChunkWithScope(scope, formatRemoteId(scope, chunkUrl));\n }\n }\n throw new Error(\n `Failed to load Turbopack chunk \"${url}\" for module \"${id}\". Check the URL is correct.`,\n );\n },\n\n // globalThis substitute shared across all modules in this scope\n g: scope.moduleGlobal,\n m: moduleExports,\n e: exports,\n };\n}\n"],"mappings":"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","names":[]}
@@ -19,6 +19,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  var shared_modules_exports = {};
20
20
  __export(shared_modules_exports, {
21
21
  getSharedModule: () => getSharedModule,
22
+ getTurbopackModules: () => getTurbopackModules,
22
23
  initializeSharedModules: () => initializeSharedModules
23
24
  });
24
25
  module.exports = __toCommonJS(shared_modules_exports);
@@ -154,6 +155,7 @@ function getSharedModule(scope, id) {
154
155
  // Annotate the CommonJS export names for ESM import in node:
155
156
  0 && (module.exports = {
156
157
  getSharedModule,
158
+ getTurbopackModules,
157
159
  initializeSharedModules
158
160
  });
159
161
  //# sourceMappingURL=shared-modules.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/runtime/turbopack/shared-modules.ts"],"sourcesContent":["import type { GlobalScope } from '#internal/runtime/types';\nimport { logDebug, logError, logWarn } from '#internal/utils/logger';\nimport { handleTurbopackModule } from './module';\nimport {\n ASYNC_MODULE_ALL_RE,\n ASYNC_MODULE_LOADER_RE,\n ASYNC_MODULE_RESOLVE_RE,\n REMOTE_SHARED_ASSIGNMENT_RE,\n REMOTE_SHARED_MARKER_RE,\n} from './patterns';\nimport { formatRemoteId, type RemoteScope } from './remote-scope';\n\nconst DEDUPLICATION_WARNING =\n 'This module will not be deduplicated — the remote may load its own copy, ' +\n 'which can cause duplicate instance errors (e.g. invalid hook calls if React is loaded twice).';\n\n/**\n * Reads the TURBOPACK global for a scope, normalizing the push-based\n * `__chunks__` format into a flat module list when needed.\n */\nfunction getTurbopackModules(scope: RemoteScope): unknown[] | undefined {\n const self = globalThis as GlobalScope;\n const raw = self[`TURBOPACK_${scope.globalKey}`];\n if (!raw) return undefined;\n\n if (typeof raw === 'object' && '__chunks__' in (raw as object)) {\n return (raw as { __chunks__: unknown[][] }).__chunks__.flat();\n }\n if (Array.isArray(raw)) {\n return (raw as unknown[]).flat();\n }\n return Object.entries(raw as Record<string, unknown>).flat();\n}\n\n/**\n * Initializes shared modules between the host application and remote components.\n * This enables sharing of common dependencies like React to avoid duplicate instances.\n *\n * The function works by:\n * 1. Looking for a shared module initializer in the Turbopack bundle\n * 2. Extracting module IDs from the initializer\n * 3. Loading the corresponding host modules and mapping them to the remote's expected IDs\n */\nexport async function initializeSharedModules(\n scope: RemoteScope,\n hostShared: Record<string, (bundle?: string) => Promise<unknown>> = {},\n remoteShared: Record<string, string> = {},\n // biome-ignore lint/suspicious/noConfusingVoidType: Runtime is undefined but in TS land service it is void\n): Promise<void[]> {\n const allModules = getTurbopackModules(scope);\n\n logDebug(\n 'SharedModules',\n `initializeSharedModules: scope=\"${scope.scopedName}\", ` +\n `allModules=${allModules ? allModules.length : 'null'}, ` +\n `hostShared=[${Object.keys(hostShared).join(', ')}], ` +\n `remoteShared=${JSON.stringify(remoteShared)}`,\n );\n\n let sharedModuleInitializer: Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }> | null = null;\n\n // find the shared module initializer in the Turbopack bundle\n if (allModules) {\n // find the shared module initializer module id by looking for\n // a function that contains the TURBOPACK_REMOTE_SHARED pattern\n const sharedModuleInitializerIndex = allModules.findIndex((idOrFunc) => {\n if (typeof idOrFunc !== 'function') {\n return false;\n }\n const funcCode = idOrFunc.toString();\n return REMOTE_SHARED_MARKER_RE.test(funcCode);\n });\n\n // if found, extract the shared module initializer\n // first element in the array is always the source script element\n if (sharedModuleInitializerIndex > 0) {\n const sharedModuleInitializerCode = (\n allModules[sharedModuleInitializerIndex] as () => unknown\n ).toString();\n const sharedModuleInitializerId = allModules[\n sharedModuleInitializerIndex - 1\n ] as string | number;\n // extract the shared module id from the function code\n const { sharedModuleId } =\n REMOTE_SHARED_ASSIGNMENT_RE.exec(sharedModuleInitializerCode)?.groups ??\n {};\n // load the shared module initializer using the extracted module id\n if (sharedModuleId) {\n const { default: sharedModuleInitializerInstance } =\n handleTurbopackModule(\n scope,\n sharedModuleId,\n formatRemoteId(scope, String(sharedModuleInitializerId)),\n ) as {\n default: Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }>;\n };\n sharedModuleInitializer = sharedModuleInitializerInstance;\n }\n }\n\n // if we have a shared module initializer, load the shared modules from the host application\n if (sharedModuleInitializer) {\n const { shared } = await sharedModuleInitializer;\n // map shared module ids to their initializer functions\n const sharedModuleIds = extractSharedModuleIds(shared, scope);\n logDebug(\n 'SharedModules',\n `Resolved shared modules for scope=\"${scope.scopedName}\": ${JSON.stringify(sharedModuleIds)}`,\n );\n\n // load shared modules from the host application\n return Promise.all(\n Object.entries(sharedModuleIds).map(async ([id, module]) => {\n if (hostShared[module]) {\n scope.sharedModules[id] = await hostShared[module](scope.name);\n } else {\n logError(\n 'SharedModules',\n `Host shared module \"${module}\" not found for ID ${id}. ${DEDUPLICATION_WARNING}`,\n );\n }\n }),\n );\n }\n\n logWarn(\n 'SharedModules',\n `No shared module initializer found in bundle for scope=\"${scope.scopedName}\" — falling back to remoteShared mapping`,\n );\n } else {\n logWarn(\n 'SharedModules',\n `No TURBOPACK modules found for scope=\"${scope.scopedName}\" (TURBOPACK_${scope.globalKey} is empty)`,\n );\n }\n\n // fallback: ensure that the shared modules are initialized using remoteShared mapping\n return Promise.all(\n Object.entries(remoteShared).map(async ([id, module]) => {\n if (hostShared[module]) {\n const normalizedId = id.replace('[app-ssr]', '[app-client]');\n scope.sharedModules[normalizedId] = await hostShared[module](\n scope.name,\n );\n } else {\n logError(\n 'SharedModules',\n `Shared module \"${module}\" not found for \"${scope.name}\". ${DEDUPLICATION_WARNING}`,\n );\n }\n }),\n );\n}\n\n/**\n * Extracts shared module IDs from the shared module initializer functions.\n * This parses the minified Turbopack code to find the module ID mappings.\n */\nfunction extractSharedModuleIds(\n shared: Record<string, string | (() => Promise<unknown>)>,\n scope: RemoteScope,\n): Record<string, string> {\n return Object.entries(shared)\n .filter(([, value]) => typeof value === 'function')\n .reduce<Record<string, string>>((acc, [key, value]) => {\n const { asyncSharedModuleId } =\n ASYNC_MODULE_LOADER_RE.exec(value.toString())?.groups ?? {};\n\n if (asyncSharedModuleId) {\n const asyncSharedModuleIdNumber = Number(asyncSharedModuleId);\n\n let asyncSharedModule: (() => unknown) | undefined;\n const turbopackModules = getTurbopackModules(scope) ?? [];\n const asyncSharedModuleIdIndex = turbopackModules.indexOf(\n asyncSharedModuleIdNumber,\n );\n if (\n asyncSharedModuleIdIndex !== -1 &&\n typeof turbopackModules[asyncSharedModuleIdIndex + 1] === 'function'\n ) {\n asyncSharedModule = turbopackModules[\n asyncSharedModuleIdIndex + 1\n ] as () => unknown;\n }\n if (asyncSharedModule) {\n const asyncSharedModuleCode = asyncSharedModule.toString();\n // Try both Promise.resolve and Promise.all patterns\n const { sharedModuleId } =\n ASYNC_MODULE_RESOLVE_RE.exec(asyncSharedModuleCode)?.groups ??\n ASYNC_MODULE_ALL_RE.exec(asyncSharedModuleCode)?.groups ??\n {};\n // map the shared module id to the actual module name\n acc[sharedModuleId ?? asyncSharedModuleId] = key.replace(\n '__remote_shared_module_',\n '',\n );\n }\n }\n return acc;\n }, {});\n}\n\n/**\n * Returns a shared module for the given scope and module ID.\n * Shared modules are common dependencies like React that are provided by the host.\n */\nexport function getSharedModule(\n scope: RemoteScope,\n id: string | number,\n): unknown {\n const idStr = String(id);\n\n // Exact match first (covers both string and numeric IDs)\n if (scope.sharedModules[idStr] !== undefined) {\n return scope.sharedModules[idStr];\n }\n\n // Fallback: the id may be a bundle-prefixed string like \"[bundle] /react/index.js\"\n // that contains the shared module key as a suffix. Only match when the key\n // appears as a complete suffix segment to avoid \"react\" matching \"react-dom\".\n for (const [key, value] of Object.entries(scope.sharedModules)) {\n if (typeof value !== 'undefined' && idStr !== key && idStr.endsWith(key)) {\n return value;\n }\n }\n\n return null;\n}\n"],"mappings":"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","names":["module"]}
1
+ {"version":3,"sources":["../../../../src/runtime/turbopack/shared-modules.ts"],"sourcesContent":["import type { GlobalScope } from '#internal/runtime/types';\nimport { logDebug, logError, logWarn } from '#internal/utils/logger';\nimport { handleTurbopackModule } from './module';\nimport {\n ASYNC_MODULE_ALL_RE,\n ASYNC_MODULE_LOADER_RE,\n ASYNC_MODULE_RESOLVE_RE,\n REMOTE_SHARED_ASSIGNMENT_RE,\n REMOTE_SHARED_MARKER_RE,\n} from './patterns';\nimport { formatRemoteId, type RemoteScope } from './remote-scope';\n\nconst DEDUPLICATION_WARNING =\n 'This module will not be deduplicated — the remote may load its own copy, ' +\n 'which can cause duplicate instance errors (e.g. invalid hook calls if React is loaded twice).';\n\n/**\n * Reads the TURBOPACK global for a scope, normalizing the push-based\n * `__chunks__` format into a flat module list when needed.\n */\nexport function getTurbopackModules(scope: RemoteScope): unknown[] | undefined {\n const self = globalThis as GlobalScope;\n const raw = self[`TURBOPACK_${scope.globalKey}`];\n if (!raw) return undefined;\n\n if (typeof raw === 'object' && '__chunks__' in (raw as object)) {\n return (raw as { __chunks__: unknown[][] }).__chunks__.flat();\n }\n if (Array.isArray(raw)) {\n return (raw as unknown[]).flat();\n }\n return Object.entries(raw as Record<string, unknown>).flat();\n}\n\n/**\n * Initializes shared modules between the host application and remote components.\n * This enables sharing of common dependencies like React to avoid duplicate instances.\n *\n * The function works by:\n * 1. Looking for a shared module initializer in the Turbopack bundle\n * 2. Extracting module IDs from the initializer\n * 3. Loading the corresponding host modules and mapping them to the remote's expected IDs\n */\nexport async function initializeSharedModules(\n scope: RemoteScope,\n hostShared: Record<string, (bundle?: string) => Promise<unknown>> = {},\n remoteShared: Record<string, string> = {},\n // biome-ignore lint/suspicious/noConfusingVoidType: Runtime is undefined but in TS land service it is void\n): Promise<void[]> {\n const allModules = getTurbopackModules(scope);\n\n logDebug(\n 'SharedModules',\n `initializeSharedModules: scope=\"${scope.scopedName}\", ` +\n `allModules=${allModules ? allModules.length : 'null'}, ` +\n `hostShared=[${Object.keys(hostShared).join(', ')}], ` +\n `remoteShared=${JSON.stringify(remoteShared)}`,\n );\n\n let sharedModuleInitializer: Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }> | null = null;\n\n // find the shared module initializer in the Turbopack bundle\n if (allModules) {\n // find the shared module initializer module id by looking for\n // a function that contains the TURBOPACK_REMOTE_SHARED pattern\n const sharedModuleInitializerIndex = allModules.findIndex((idOrFunc) => {\n if (typeof idOrFunc !== 'function') {\n return false;\n }\n const funcCode = idOrFunc.toString();\n return REMOTE_SHARED_MARKER_RE.test(funcCode);\n });\n\n // if found, extract the shared module initializer\n // first element in the array is always the source script element\n if (sharedModuleInitializerIndex > 0) {\n const sharedModuleInitializerCode = (\n allModules[sharedModuleInitializerIndex] as () => unknown\n ).toString();\n const sharedModuleInitializerId = allModules[\n sharedModuleInitializerIndex - 1\n ] as string | number;\n // extract the shared module id from the function code\n const { sharedModuleId } =\n REMOTE_SHARED_ASSIGNMENT_RE.exec(sharedModuleInitializerCode)?.groups ??\n {};\n // load the shared module initializer using the extracted module id\n if (sharedModuleId) {\n const { default: sharedModuleInitializerInstance } =\n handleTurbopackModule(\n scope,\n sharedModuleId,\n formatRemoteId(scope, String(sharedModuleInitializerId)),\n ) as {\n default: Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }>;\n };\n sharedModuleInitializer = sharedModuleInitializerInstance;\n }\n }\n\n // if we have a shared module initializer, load the shared modules from the host application\n if (sharedModuleInitializer) {\n const { shared } = await sharedModuleInitializer;\n // map shared module ids to their initializer functions\n const sharedModuleIds = extractSharedModuleIds(shared, scope);\n logDebug(\n 'SharedModules',\n `Resolved shared modules for scope=\"${scope.scopedName}\": ${JSON.stringify(sharedModuleIds)}`,\n );\n\n // load shared modules from the host application\n return Promise.all(\n Object.entries(sharedModuleIds).map(async ([id, module]) => {\n if (hostShared[module]) {\n scope.sharedModules[id] = await hostShared[module](scope.name);\n } else {\n logError(\n 'SharedModules',\n `Host shared module \"${module}\" not found for ID ${id}. ${DEDUPLICATION_WARNING}`,\n );\n }\n }),\n );\n }\n\n logWarn(\n 'SharedModules',\n `No shared module initializer found in bundle for scope=\"${scope.scopedName}\" — falling back to remoteShared mapping`,\n );\n } else {\n logWarn(\n 'SharedModules',\n `No TURBOPACK modules found for scope=\"${scope.scopedName}\" (TURBOPACK_${scope.globalKey} is empty)`,\n );\n }\n\n // fallback: ensure that the shared modules are initialized using remoteShared mapping\n return Promise.all(\n Object.entries(remoteShared).map(async ([id, module]) => {\n if (hostShared[module]) {\n const normalizedId = id.replace('[app-ssr]', '[app-client]');\n scope.sharedModules[normalizedId] = await hostShared[module](\n scope.name,\n );\n } else {\n logError(\n 'SharedModules',\n `Shared module \"${module}\" not found for \"${scope.name}\". ${DEDUPLICATION_WARNING}`,\n );\n }\n }),\n );\n}\n\n/**\n * Extracts shared module IDs from the shared module initializer functions.\n * This parses the minified Turbopack code to find the module ID mappings.\n */\nfunction extractSharedModuleIds(\n shared: Record<string, string | (() => Promise<unknown>)>,\n scope: RemoteScope,\n): Record<string, string> {\n return Object.entries(shared)\n .filter(([, value]) => typeof value === 'function')\n .reduce<Record<string, string>>((acc, [key, value]) => {\n const { asyncSharedModuleId } =\n ASYNC_MODULE_LOADER_RE.exec(value.toString())?.groups ?? {};\n\n if (asyncSharedModuleId) {\n const asyncSharedModuleIdNumber = Number(asyncSharedModuleId);\n\n let asyncSharedModule: (() => unknown) | undefined;\n const turbopackModules = getTurbopackModules(scope) ?? [];\n const asyncSharedModuleIdIndex = turbopackModules.indexOf(\n asyncSharedModuleIdNumber,\n );\n if (\n asyncSharedModuleIdIndex !== -1 &&\n typeof turbopackModules[asyncSharedModuleIdIndex + 1] === 'function'\n ) {\n asyncSharedModule = turbopackModules[\n asyncSharedModuleIdIndex + 1\n ] as () => unknown;\n }\n if (asyncSharedModule) {\n const asyncSharedModuleCode = asyncSharedModule.toString();\n // Try both Promise.resolve and Promise.all patterns\n const { sharedModuleId } =\n ASYNC_MODULE_RESOLVE_RE.exec(asyncSharedModuleCode)?.groups ??\n ASYNC_MODULE_ALL_RE.exec(asyncSharedModuleCode)?.groups ??\n {};\n // map the shared module id to the actual module name\n acc[sharedModuleId ?? asyncSharedModuleId] = key.replace(\n '__remote_shared_module_',\n '',\n );\n }\n }\n return acc;\n }, {});\n}\n\n/**\n * Returns a shared module for the given scope and module ID.\n * Shared modules are common dependencies like React that are provided by the host.\n */\nexport function getSharedModule(\n scope: RemoteScope,\n id: string | number,\n): unknown {\n const idStr = String(id);\n\n // Exact match first (covers both string and numeric IDs)\n if (scope.sharedModules[idStr] !== undefined) {\n return scope.sharedModules[idStr];\n }\n\n // Fallback: the id may be a bundle-prefixed string like \"[bundle] /react/index.js\"\n // that contains the shared module key as a suffix. Only match when the key\n // appears as a complete suffix segment to avoid \"react\" matching \"react-dom\".\n for (const [key, value] of Object.entries(scope.sharedModules)) {\n if (typeof value !== 'undefined' && idStr !== key && idStr.endsWith(key)) {\n return value;\n }\n }\n\n return null;\n}\n"],"mappings":"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","names":["module"]}
@@ -2,6 +2,11 @@ import { RemoteScope } from './remote-scope.js';
2
2
  import '../url/resolve-client-url.js';
3
3
  import '../constants.js';
4
4
 
5
+ /**
6
+ * Reads the TURBOPACK global for a scope, normalizing the push-based
7
+ * `__chunks__` format into a flat module list when needed.
8
+ */
9
+ declare function getTurbopackModules(scope: RemoteScope): unknown[] | undefined;
5
10
  /**
6
11
  * Initializes shared modules between the host application and remote components.
7
12
  * This enables sharing of common dependencies like React to avoid duplicate instances.
@@ -18,4 +23,4 @@ declare function initializeSharedModules(scope: RemoteScope, hostShared?: Record
18
23
  */
19
24
  declare function getSharedModule(scope: RemoteScope, id: string | number): unknown;
20
25
 
21
- export { getSharedModule, initializeSharedModules };
26
+ export { getSharedModule, getTurbopackModules, initializeSharedModules };
@@ -135,6 +135,7 @@ function getSharedModule(scope, id) {
135
135
  }
136
136
  export {
137
137
  getSharedModule,
138
+ getTurbopackModules,
138
139
  initializeSharedModules
139
140
  };
140
141
  //# sourceMappingURL=shared-modules.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/runtime/turbopack/shared-modules.ts"],"sourcesContent":["import type { GlobalScope } from '#internal/runtime/types';\nimport { logDebug, logError, logWarn } from '#internal/utils/logger';\nimport { handleTurbopackModule } from './module';\nimport {\n ASYNC_MODULE_ALL_RE,\n ASYNC_MODULE_LOADER_RE,\n ASYNC_MODULE_RESOLVE_RE,\n REMOTE_SHARED_ASSIGNMENT_RE,\n REMOTE_SHARED_MARKER_RE,\n} from './patterns';\nimport { formatRemoteId, type RemoteScope } from './remote-scope';\n\nconst DEDUPLICATION_WARNING =\n 'This module will not be deduplicated — the remote may load its own copy, ' +\n 'which can cause duplicate instance errors (e.g. invalid hook calls if React is loaded twice).';\n\n/**\n * Reads the TURBOPACK global for a scope, normalizing the push-based\n * `__chunks__` format into a flat module list when needed.\n */\nfunction getTurbopackModules(scope: RemoteScope): unknown[] | undefined {\n const self = globalThis as GlobalScope;\n const raw = self[`TURBOPACK_${scope.globalKey}`];\n if (!raw) return undefined;\n\n if (typeof raw === 'object' && '__chunks__' in (raw as object)) {\n return (raw as { __chunks__: unknown[][] }).__chunks__.flat();\n }\n if (Array.isArray(raw)) {\n return (raw as unknown[]).flat();\n }\n return Object.entries(raw as Record<string, unknown>).flat();\n}\n\n/**\n * Initializes shared modules between the host application and remote components.\n * This enables sharing of common dependencies like React to avoid duplicate instances.\n *\n * The function works by:\n * 1. Looking for a shared module initializer in the Turbopack bundle\n * 2. Extracting module IDs from the initializer\n * 3. Loading the corresponding host modules and mapping them to the remote's expected IDs\n */\nexport async function initializeSharedModules(\n scope: RemoteScope,\n hostShared: Record<string, (bundle?: string) => Promise<unknown>> = {},\n remoteShared: Record<string, string> = {},\n // biome-ignore lint/suspicious/noConfusingVoidType: Runtime is undefined but in TS land service it is void\n): Promise<void[]> {\n const allModules = getTurbopackModules(scope);\n\n logDebug(\n 'SharedModules',\n `initializeSharedModules: scope=\"${scope.scopedName}\", ` +\n `allModules=${allModules ? allModules.length : 'null'}, ` +\n `hostShared=[${Object.keys(hostShared).join(', ')}], ` +\n `remoteShared=${JSON.stringify(remoteShared)}`,\n );\n\n let sharedModuleInitializer: Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }> | null = null;\n\n // find the shared module initializer in the Turbopack bundle\n if (allModules) {\n // find the shared module initializer module id by looking for\n // a function that contains the TURBOPACK_REMOTE_SHARED pattern\n const sharedModuleInitializerIndex = allModules.findIndex((idOrFunc) => {\n if (typeof idOrFunc !== 'function') {\n return false;\n }\n const funcCode = idOrFunc.toString();\n return REMOTE_SHARED_MARKER_RE.test(funcCode);\n });\n\n // if found, extract the shared module initializer\n // first element in the array is always the source script element\n if (sharedModuleInitializerIndex > 0) {\n const sharedModuleInitializerCode = (\n allModules[sharedModuleInitializerIndex] as () => unknown\n ).toString();\n const sharedModuleInitializerId = allModules[\n sharedModuleInitializerIndex - 1\n ] as string | number;\n // extract the shared module id from the function code\n const { sharedModuleId } =\n REMOTE_SHARED_ASSIGNMENT_RE.exec(sharedModuleInitializerCode)?.groups ??\n {};\n // load the shared module initializer using the extracted module id\n if (sharedModuleId) {\n const { default: sharedModuleInitializerInstance } =\n handleTurbopackModule(\n scope,\n sharedModuleId,\n formatRemoteId(scope, String(sharedModuleInitializerId)),\n ) as {\n default: Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }>;\n };\n sharedModuleInitializer = sharedModuleInitializerInstance;\n }\n }\n\n // if we have a shared module initializer, load the shared modules from the host application\n if (sharedModuleInitializer) {\n const { shared } = await sharedModuleInitializer;\n // map shared module ids to their initializer functions\n const sharedModuleIds = extractSharedModuleIds(shared, scope);\n logDebug(\n 'SharedModules',\n `Resolved shared modules for scope=\"${scope.scopedName}\": ${JSON.stringify(sharedModuleIds)}`,\n );\n\n // load shared modules from the host application\n return Promise.all(\n Object.entries(sharedModuleIds).map(async ([id, module]) => {\n if (hostShared[module]) {\n scope.sharedModules[id] = await hostShared[module](scope.name);\n } else {\n logError(\n 'SharedModules',\n `Host shared module \"${module}\" not found for ID ${id}. ${DEDUPLICATION_WARNING}`,\n );\n }\n }),\n );\n }\n\n logWarn(\n 'SharedModules',\n `No shared module initializer found in bundle for scope=\"${scope.scopedName}\" — falling back to remoteShared mapping`,\n );\n } else {\n logWarn(\n 'SharedModules',\n `No TURBOPACK modules found for scope=\"${scope.scopedName}\" (TURBOPACK_${scope.globalKey} is empty)`,\n );\n }\n\n // fallback: ensure that the shared modules are initialized using remoteShared mapping\n return Promise.all(\n Object.entries(remoteShared).map(async ([id, module]) => {\n if (hostShared[module]) {\n const normalizedId = id.replace('[app-ssr]', '[app-client]');\n scope.sharedModules[normalizedId] = await hostShared[module](\n scope.name,\n );\n } else {\n logError(\n 'SharedModules',\n `Shared module \"${module}\" not found for \"${scope.name}\". ${DEDUPLICATION_WARNING}`,\n );\n }\n }),\n );\n}\n\n/**\n * Extracts shared module IDs from the shared module initializer functions.\n * This parses the minified Turbopack code to find the module ID mappings.\n */\nfunction extractSharedModuleIds(\n shared: Record<string, string | (() => Promise<unknown>)>,\n scope: RemoteScope,\n): Record<string, string> {\n return Object.entries(shared)\n .filter(([, value]) => typeof value === 'function')\n .reduce<Record<string, string>>((acc, [key, value]) => {\n const { asyncSharedModuleId } =\n ASYNC_MODULE_LOADER_RE.exec(value.toString())?.groups ?? {};\n\n if (asyncSharedModuleId) {\n const asyncSharedModuleIdNumber = Number(asyncSharedModuleId);\n\n let asyncSharedModule: (() => unknown) | undefined;\n const turbopackModules = getTurbopackModules(scope) ?? [];\n const asyncSharedModuleIdIndex = turbopackModules.indexOf(\n asyncSharedModuleIdNumber,\n );\n if (\n asyncSharedModuleIdIndex !== -1 &&\n typeof turbopackModules[asyncSharedModuleIdIndex + 1] === 'function'\n ) {\n asyncSharedModule = turbopackModules[\n asyncSharedModuleIdIndex + 1\n ] as () => unknown;\n }\n if (asyncSharedModule) {\n const asyncSharedModuleCode = asyncSharedModule.toString();\n // Try both Promise.resolve and Promise.all patterns\n const { sharedModuleId } =\n ASYNC_MODULE_RESOLVE_RE.exec(asyncSharedModuleCode)?.groups ??\n ASYNC_MODULE_ALL_RE.exec(asyncSharedModuleCode)?.groups ??\n {};\n // map the shared module id to the actual module name\n acc[sharedModuleId ?? asyncSharedModuleId] = key.replace(\n '__remote_shared_module_',\n '',\n );\n }\n }\n return acc;\n }, {});\n}\n\n/**\n * Returns a shared module for the given scope and module ID.\n * Shared modules are common dependencies like React that are provided by the host.\n */\nexport function getSharedModule(\n scope: RemoteScope,\n id: string | number,\n): unknown {\n const idStr = String(id);\n\n // Exact match first (covers both string and numeric IDs)\n if (scope.sharedModules[idStr] !== undefined) {\n return scope.sharedModules[idStr];\n }\n\n // Fallback: the id may be a bundle-prefixed string like \"[bundle] /react/index.js\"\n // that contains the shared module key as a suffix. Only match when the key\n // appears as a complete suffix segment to avoid \"react\" matching \"react-dom\".\n for (const [key, value] of Object.entries(scope.sharedModules)) {\n if (typeof value !== 'undefined' && idStr !== key && idStr.endsWith(key)) {\n return value;\n }\n }\n\n return null;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/runtime/turbopack/shared-modules.ts"],"sourcesContent":["import type { GlobalScope } from '#internal/runtime/types';\nimport { logDebug, logError, logWarn } from '#internal/utils/logger';\nimport { handleTurbopackModule } from './module';\nimport {\n ASYNC_MODULE_ALL_RE,\n ASYNC_MODULE_LOADER_RE,\n ASYNC_MODULE_RESOLVE_RE,\n REMOTE_SHARED_ASSIGNMENT_RE,\n REMOTE_SHARED_MARKER_RE,\n} from './patterns';\nimport { formatRemoteId, type RemoteScope } from './remote-scope';\n\nconst DEDUPLICATION_WARNING =\n 'This module will not be deduplicated — the remote may load its own copy, ' +\n 'which can cause duplicate instance errors (e.g. invalid hook calls if React is loaded twice).';\n\n/**\n * Reads the TURBOPACK global for a scope, normalizing the push-based\n * `__chunks__` format into a flat module list when needed.\n */\nexport function getTurbopackModules(scope: RemoteScope): unknown[] | undefined {\n const self = globalThis as GlobalScope;\n const raw = self[`TURBOPACK_${scope.globalKey}`];\n if (!raw) return undefined;\n\n if (typeof raw === 'object' && '__chunks__' in (raw as object)) {\n return (raw as { __chunks__: unknown[][] }).__chunks__.flat();\n }\n if (Array.isArray(raw)) {\n return (raw as unknown[]).flat();\n }\n return Object.entries(raw as Record<string, unknown>).flat();\n}\n\n/**\n * Initializes shared modules between the host application and remote components.\n * This enables sharing of common dependencies like React to avoid duplicate instances.\n *\n * The function works by:\n * 1. Looking for a shared module initializer in the Turbopack bundle\n * 2. Extracting module IDs from the initializer\n * 3. Loading the corresponding host modules and mapping them to the remote's expected IDs\n */\nexport async function initializeSharedModules(\n scope: RemoteScope,\n hostShared: Record<string, (bundle?: string) => Promise<unknown>> = {},\n remoteShared: Record<string, string> = {},\n // biome-ignore lint/suspicious/noConfusingVoidType: Runtime is undefined but in TS land service it is void\n): Promise<void[]> {\n const allModules = getTurbopackModules(scope);\n\n logDebug(\n 'SharedModules',\n `initializeSharedModules: scope=\"${scope.scopedName}\", ` +\n `allModules=${allModules ? allModules.length : 'null'}, ` +\n `hostShared=[${Object.keys(hostShared).join(', ')}], ` +\n `remoteShared=${JSON.stringify(remoteShared)}`,\n );\n\n let sharedModuleInitializer: Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }> | null = null;\n\n // find the shared module initializer in the Turbopack bundle\n if (allModules) {\n // find the shared module initializer module id by looking for\n // a function that contains the TURBOPACK_REMOTE_SHARED pattern\n const sharedModuleInitializerIndex = allModules.findIndex((idOrFunc) => {\n if (typeof idOrFunc !== 'function') {\n return false;\n }\n const funcCode = idOrFunc.toString();\n return REMOTE_SHARED_MARKER_RE.test(funcCode);\n });\n\n // if found, extract the shared module initializer\n // first element in the array is always the source script element\n if (sharedModuleInitializerIndex > 0) {\n const sharedModuleInitializerCode = (\n allModules[sharedModuleInitializerIndex] as () => unknown\n ).toString();\n const sharedModuleInitializerId = allModules[\n sharedModuleInitializerIndex - 1\n ] as string | number;\n // extract the shared module id from the function code\n const { sharedModuleId } =\n REMOTE_SHARED_ASSIGNMENT_RE.exec(sharedModuleInitializerCode)?.groups ??\n {};\n // load the shared module initializer using the extracted module id\n if (sharedModuleId) {\n const { default: sharedModuleInitializerInstance } =\n handleTurbopackModule(\n scope,\n sharedModuleId,\n formatRemoteId(scope, String(sharedModuleInitializerId)),\n ) as {\n default: Promise<{\n shared: Record<string, string | (() => Promise<unknown>)>;\n }>;\n };\n sharedModuleInitializer = sharedModuleInitializerInstance;\n }\n }\n\n // if we have a shared module initializer, load the shared modules from the host application\n if (sharedModuleInitializer) {\n const { shared } = await sharedModuleInitializer;\n // map shared module ids to their initializer functions\n const sharedModuleIds = extractSharedModuleIds(shared, scope);\n logDebug(\n 'SharedModules',\n `Resolved shared modules for scope=\"${scope.scopedName}\": ${JSON.stringify(sharedModuleIds)}`,\n );\n\n // load shared modules from the host application\n return Promise.all(\n Object.entries(sharedModuleIds).map(async ([id, module]) => {\n if (hostShared[module]) {\n scope.sharedModules[id] = await hostShared[module](scope.name);\n } else {\n logError(\n 'SharedModules',\n `Host shared module \"${module}\" not found for ID ${id}. ${DEDUPLICATION_WARNING}`,\n );\n }\n }),\n );\n }\n\n logWarn(\n 'SharedModules',\n `No shared module initializer found in bundle for scope=\"${scope.scopedName}\" — falling back to remoteShared mapping`,\n );\n } else {\n logWarn(\n 'SharedModules',\n `No TURBOPACK modules found for scope=\"${scope.scopedName}\" (TURBOPACK_${scope.globalKey} is empty)`,\n );\n }\n\n // fallback: ensure that the shared modules are initialized using remoteShared mapping\n return Promise.all(\n Object.entries(remoteShared).map(async ([id, module]) => {\n if (hostShared[module]) {\n const normalizedId = id.replace('[app-ssr]', '[app-client]');\n scope.sharedModules[normalizedId] = await hostShared[module](\n scope.name,\n );\n } else {\n logError(\n 'SharedModules',\n `Shared module \"${module}\" not found for \"${scope.name}\". ${DEDUPLICATION_WARNING}`,\n );\n }\n }),\n );\n}\n\n/**\n * Extracts shared module IDs from the shared module initializer functions.\n * This parses the minified Turbopack code to find the module ID mappings.\n */\nfunction extractSharedModuleIds(\n shared: Record<string, string | (() => Promise<unknown>)>,\n scope: RemoteScope,\n): Record<string, string> {\n return Object.entries(shared)\n .filter(([, value]) => typeof value === 'function')\n .reduce<Record<string, string>>((acc, [key, value]) => {\n const { asyncSharedModuleId } =\n ASYNC_MODULE_LOADER_RE.exec(value.toString())?.groups ?? {};\n\n if (asyncSharedModuleId) {\n const asyncSharedModuleIdNumber = Number(asyncSharedModuleId);\n\n let asyncSharedModule: (() => unknown) | undefined;\n const turbopackModules = getTurbopackModules(scope) ?? [];\n const asyncSharedModuleIdIndex = turbopackModules.indexOf(\n asyncSharedModuleIdNumber,\n );\n if (\n asyncSharedModuleIdIndex !== -1 &&\n typeof turbopackModules[asyncSharedModuleIdIndex + 1] === 'function'\n ) {\n asyncSharedModule = turbopackModules[\n asyncSharedModuleIdIndex + 1\n ] as () => unknown;\n }\n if (asyncSharedModule) {\n const asyncSharedModuleCode = asyncSharedModule.toString();\n // Try both Promise.resolve and Promise.all patterns\n const { sharedModuleId } =\n ASYNC_MODULE_RESOLVE_RE.exec(asyncSharedModuleCode)?.groups ??\n ASYNC_MODULE_ALL_RE.exec(asyncSharedModuleCode)?.groups ??\n {};\n // map the shared module id to the actual module name\n acc[sharedModuleId ?? asyncSharedModuleId] = key.replace(\n '__remote_shared_module_',\n '',\n );\n }\n }\n return acc;\n }, {});\n}\n\n/**\n * Returns a shared module for the given scope and module ID.\n * Shared modules are common dependencies like React that are provided by the host.\n */\nexport function getSharedModule(\n scope: RemoteScope,\n id: string | number,\n): unknown {\n const idStr = String(id);\n\n // Exact match first (covers both string and numeric IDs)\n if (scope.sharedModules[idStr] !== undefined) {\n return scope.sharedModules[idStr];\n }\n\n // Fallback: the id may be a bundle-prefixed string like \"[bundle] /react/index.js\"\n // that contains the shared module key as a suffix. Only match when the key\n // appears as a complete suffix segment to avoid \"react\" matching \"react-dom\".\n for (const [key, value] of Object.entries(scope.sharedModules)) {\n if (typeof value !== 'undefined' && idStr !== key && idStr.endsWith(key)) {\n return value;\n }\n }\n\n return null;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var project_id_env_exports = {};
20
+ __export(project_id_env_exports, {
21
+ resolveProjectIdFromEnv: () => resolveProjectIdFromEnv
22
+ });
23
+ module.exports = __toCommonJS(project_id_env_exports);
24
+ function resolveProjectIdFromEnv() {
25
+ return process.env.REMOTE_COMPONENTS_PROJECT_ID || process.env.NEXT_PUBLIC_MFE_CURRENT_APPLICATION || process.env.VERCEL_PROJECT_ID || void 0;
26
+ }
27
+ // Annotate the CommonJS export names for ESM import in node:
28
+ 0 && (module.exports = {
29
+ resolveProjectIdFromEnv
30
+ });
31
+ //# sourceMappingURL=project-id-env.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/project-id-env.ts"],"sourcesContent":["/**\n * Resolves the project ID from environment variables only.\n * Safe for edge/browser contexts where file system access is unavailable.\n */\nexport function resolveProjectIdFromEnv(): string | undefined {\n return (\n process.env.REMOTE_COMPONENTS_PROJECT_ID ||\n process.env.NEXT_PUBLIC_MFE_CURRENT_APPLICATION ||\n process.env.VERCEL_PROJECT_ID ||\n undefined\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIO,SAAS,0BAA8C;AAC5D,SACE,QAAQ,IAAI,gCACZ,QAAQ,IAAI,uCACZ,QAAQ,IAAI,qBACZ;AAEJ;","names":[]}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Resolves the project ID from environment variables only.
3
+ * Safe for edge/browser contexts where file system access is unavailable.
4
+ */
5
+ declare function resolveProjectIdFromEnv(): string | undefined;
6
+
7
+ export { resolveProjectIdFromEnv };
@@ -0,0 +1,7 @@
1
+ function resolveProjectIdFromEnv() {
2
+ return process.env.REMOTE_COMPONENTS_PROJECT_ID || process.env.NEXT_PUBLIC_MFE_CURRENT_APPLICATION || process.env.VERCEL_PROJECT_ID || void 0;
3
+ }
4
+ export {
5
+ resolveProjectIdFromEnv
6
+ };
7
+ //# sourceMappingURL=project-id-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/project-id-env.ts"],"sourcesContent":["/**\n * Resolves the project ID from environment variables only.\n * Safe for edge/browser contexts where file system access is unavailable.\n */\nexport function resolveProjectIdFromEnv(): string | undefined {\n return (\n process.env.REMOTE_COMPONENTS_PROJECT_ID ||\n process.env.NEXT_PUBLIC_MFE_CURRENT_APPLICATION ||\n process.env.VERCEL_PROJECT_ID ||\n undefined\n );\n}\n"],"mappings":"AAIO,SAAS,0BAA8C;AAC5D,SACE,QAAQ,IAAI,gCACZ,QAAQ,IAAI,uCACZ,QAAQ,IAAI,qBACZ;AAEJ;","names":[]}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var project_id_exports = {};
20
+ __export(project_id_exports, {
21
+ resolveProjectId: () => resolveProjectId
22
+ });
23
+ module.exports = __toCommonJS(project_id_exports);
24
+ var import_node_fs = require("node:fs");
25
+ var import_find_up = require("find-up");
26
+ var import_project_id_env = require("./project-id-env");
27
+ function resolveProjectId(packageName) {
28
+ const fromEnv = (0, import_project_id_env.resolveProjectIdFromEnv)();
29
+ if (fromEnv)
30
+ return fromEnv;
31
+ try {
32
+ const projectPath = (0, import_find_up.findUpSync)(".vercel/project.json", {
33
+ cwd: process.cwd()
34
+ });
35
+ if (projectPath) {
36
+ return JSON.parse((0, import_node_fs.readFileSync)(projectPath, "utf8")).projectId;
37
+ }
38
+ } catch {
39
+ }
40
+ return packageName;
41
+ }
42
+ // Annotate the CommonJS export names for ESM import in node:
43
+ 0 && (module.exports = {
44
+ resolveProjectId
45
+ });
46
+ //# sourceMappingURL=project-id.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/project-id.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { findUpSync } from 'find-up';\nimport { resolveProjectIdFromEnv } from './project-id-env';\n\n/**\n * Resolves the project ID using environment variables first, then\n * falling back to `.vercel/project.json` and finally the package name.\n * Node-only — requires file system access.\n */\nexport function resolveProjectId(packageName: string): string {\n const fromEnv = resolveProjectIdFromEnv();\n if (fromEnv) return fromEnv;\n\n try {\n const projectPath = findUpSync('.vercel/project.json', {\n cwd: process.cwd(),\n });\n if (projectPath) {\n return (\n JSON.parse(readFileSync(projectPath, 'utf8')) as { projectId: string }\n ).projectId;\n }\n } catch {\n // fallback below\n }\n\n return packageName;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAA6B;AAC7B,qBAA2B;AAC3B,4BAAwC;AAOjC,SAAS,iBAAiB,aAA6B;AAC5D,QAAM,cAAU,+CAAwB;AACxC,MAAI;AAAS,WAAO;AAEpB,MAAI;AACF,UAAM,kBAAc,2BAAW,wBAAwB;AAAA,MACrD,KAAK,QAAQ,IAAI;AAAA,IACnB,CAAC;AACD,QAAI,aAAa;AACf,aACE,KAAK,UAAM,6BAAa,aAAa,MAAM,CAAC,EAC5C;AAAA,IACJ;AAAA,EACF,QAAE;AAAA,EAEF;AAEA,SAAO;AACT;","names":[]}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Resolves the project ID using environment variables first, then
3
+ * falling back to `.vercel/project.json` and finally the package name.
4
+ * Node-only — requires file system access.
5
+ */
6
+ declare function resolveProjectId(packageName: string): string;
7
+
8
+ export { resolveProjectId };
@@ -0,0 +1,22 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { findUpSync } from "find-up";
3
+ import { resolveProjectIdFromEnv } from "./project-id-env";
4
+ function resolveProjectId(packageName) {
5
+ const fromEnv = resolveProjectIdFromEnv();
6
+ if (fromEnv)
7
+ return fromEnv;
8
+ try {
9
+ const projectPath = findUpSync(".vercel/project.json", {
10
+ cwd: process.cwd()
11
+ });
12
+ if (projectPath) {
13
+ return JSON.parse(readFileSync(projectPath, "utf8")).projectId;
14
+ }
15
+ } catch {
16
+ }
17
+ return packageName;
18
+ }
19
+ export {
20
+ resolveProjectId
21
+ };
22
+ //# sourceMappingURL=project-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/project-id.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { findUpSync } from 'find-up';\nimport { resolveProjectIdFromEnv } from './project-id-env';\n\n/**\n * Resolves the project ID using environment variables first, then\n * falling back to `.vercel/project.json` and finally the package name.\n * Node-only — requires file system access.\n */\nexport function resolveProjectId(packageName: string): string {\n const fromEnv = resolveProjectIdFromEnv();\n if (fromEnv) return fromEnv;\n\n try {\n const projectPath = findUpSync('.vercel/project.json', {\n cwd: process.cwd(),\n });\n if (projectPath) {\n return (\n JSON.parse(readFileSync(projectPath, 'utf8')) as { projectId: string }\n ).projectId;\n }\n } catch {\n // fallback below\n }\n\n return packageName;\n}\n"],"mappings":"AAAA,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,+BAA+B;AAOjC,SAAS,iBAAiB,aAA6B;AAC5D,QAAM,UAAU,wBAAwB;AACxC,MAAI;AAAS,WAAO;AAEpB,MAAI;AACF,UAAM,cAAc,WAAW,wBAAwB;AAAA,MACrD,KAAK,QAAQ,IAAI;AAAA,IACnB,CAAC;AACD,QAAI,aAAa;AACf,aACE,KAAK,MAAM,aAAa,aAAa,MAAM,CAAC,EAC5C;AAAA,IACJ;AAAA,EACF,QAAE;AAAA,EAEF;AAEA,SAAO;AACT;","names":[]}
@@ -18,13 +18,10 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var app_exports = {};
20
20
  __export(app_exports, {
21
- shared: () => shared
21
+ shared: () => import_shared.shared
22
22
  });
23
23
  module.exports = __toCommonJS(app_exports);
24
- var import_constants = require("#internal/utils/constants");
25
- const shared = {
26
- __remote_components_missing_shared__: import_constants.MISSING_SHARED_MODULES_MESSAGE
27
- };
24
+ var import_shared = require("./shared");
28
25
  // Annotate the CommonJS export names for ESM import in node:
29
26
  0 && (module.exports = {
30
27
  shared
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/remote/defaults/app.ts"],"sourcesContent":["import { MISSING_SHARED_MODULES_MESSAGE } from '#internal/utils/constants';\n\nexport const shared: Record<string, string> = {\n __remote_components_missing_shared__: MISSING_SHARED_MODULES_MESSAGE,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAA+C;AAExC,MAAM,SAAiC;AAAA,EAC5C,sCAAsC;AACxC;","names":[]}
1
+ {"version":3,"sources":["../../../src/remote/defaults/app.ts"],"sourcesContent":["export { shared } from './shared';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuB;","names":[]}
@@ -1,3 +1 @@
1
- declare const shared: Record<string, string>;
2
-
3
- export { shared };
1
+ export { shared } from './shared.js';
@@ -1,7 +1,4 @@
1
- import { MISSING_SHARED_MODULES_MESSAGE } from "#internal/utils/constants";
2
- const shared = {
3
- __remote_components_missing_shared__: MISSING_SHARED_MODULES_MESSAGE
4
- };
1
+ import { shared } from "./shared";
5
2
  export {
6
3
  shared
7
4
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/remote/defaults/app.ts"],"sourcesContent":["import { MISSING_SHARED_MODULES_MESSAGE } from '#internal/utils/constants';\n\nexport const shared: Record<string, string> = {\n __remote_components_missing_shared__: MISSING_SHARED_MODULES_MESSAGE,\n};\n"],"mappings":"AAAA,SAAS,sCAAsC;AAExC,MAAM,SAAiC;AAAA,EAC5C,sCAAsC;AACxC;","names":[]}
1
+ {"version":3,"sources":["../../../src/remote/defaults/app.ts"],"sourcesContent":["export { shared } from './shared';\n"],"mappings":"AAAA,SAAS,cAAc;","names":[]}
@@ -18,13 +18,10 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var pages_exports = {};
20
20
  __export(pages_exports, {
21
- shared: () => shared
21
+ shared: () => import_shared.shared
22
22
  });
23
23
  module.exports = __toCommonJS(pages_exports);
24
- var import_constants = require("#internal/utils/constants");
25
- const shared = {
26
- __remote_components_missing_shared__: import_constants.MISSING_SHARED_MODULES_MESSAGE
27
- };
24
+ var import_shared = require("./shared");
28
25
  // Annotate the CommonJS export names for ESM import in node:
29
26
  0 && (module.exports = {
30
27
  shared
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/remote/defaults/pages.ts"],"sourcesContent":["import { MISSING_SHARED_MODULES_MESSAGE } from '#internal/utils/constants';\n\nexport const shared: Record<string, string> = {\n __remote_components_missing_shared__: MISSING_SHARED_MODULES_MESSAGE,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAA+C;AAExC,MAAM,SAAiC;AAAA,EAC5C,sCAAsC;AACxC;","names":[]}
1
+ {"version":3,"sources":["../../../src/remote/defaults/pages.ts"],"sourcesContent":["export { shared } from './shared';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuB;","names":[]}
@@ -1,3 +1 @@
1
- declare const shared: Record<string, string>;
2
-
3
- export { shared };
1
+ export { shared } from './shared.js';
@@ -1,7 +1,4 @@
1
- import { MISSING_SHARED_MODULES_MESSAGE } from "#internal/utils/constants";
2
- const shared = {
3
- __remote_components_missing_shared__: MISSING_SHARED_MODULES_MESSAGE
4
- };
1
+ import { shared } from "./shared";
5
2
  export {
6
3
  shared
7
4
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/remote/defaults/pages.ts"],"sourcesContent":["import { MISSING_SHARED_MODULES_MESSAGE } from '#internal/utils/constants';\n\nexport const shared: Record<string, string> = {\n __remote_components_missing_shared__: MISSING_SHARED_MODULES_MESSAGE,\n};\n"],"mappings":"AAAA,SAAS,sCAAsC;AAExC,MAAM,SAAiC;AAAA,EAC5C,sCAAsC;AACxC;","names":[]}
1
+ {"version":3,"sources":["../../../src/remote/defaults/pages.ts"],"sourcesContent":["export { shared } from './shared';\n"],"mappings":"AAAA,SAAS,cAAc;","names":[]}
@@ -3,6 +3,10 @@ var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
6
10
  var __copyProps = (to, from, except, desc) => {
7
11
  if (from && typeof from === "object" || typeof from === "function") {
8
12
  for (let key of __getOwnPropNames(from))
@@ -12,6 +16,17 @@ var __copyProps = (to, from, except, desc) => {
12
16
  return to;
13
17
  };
14
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
- var resolved_data_exports = {};
16
- module.exports = __toCommonJS(resolved_data_exports);
17
- //# sourceMappingURL=resolved-data.cjs.map
19
+ var shared_exports = {};
20
+ __export(shared_exports, {
21
+ shared: () => shared
22
+ });
23
+ module.exports = __toCommonJS(shared_exports);
24
+ var import_constants = require("#internal/utils/constants");
25
+ const shared = {
26
+ __remote_components_missing_shared__: import_constants.MISSING_SHARED_MODULES_MESSAGE
27
+ };
28
+ // Annotate the CommonJS export names for ESM import in node:
29
+ 0 && (module.exports = {
30
+ shared
31
+ });
32
+ //# sourceMappingURL=shared.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/remote/defaults/shared.ts"],"sourcesContent":["import { MISSING_SHARED_MODULES_MESSAGE } from '#internal/utils/constants';\n\nexport const shared: Record<string, string> = {\n __remote_components_missing_shared__: MISSING_SHARED_MODULES_MESSAGE,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAA+C;AAExC,MAAM,SAAiC;AAAA,EAC5C,sCAAsC;AACxC;","names":[]}
@@ -0,0 +1,3 @@
1
+ declare const shared: Record<string, string>;
2
+
3
+ export { shared };
@@ -0,0 +1,8 @@
1
+ import { MISSING_SHARED_MODULES_MESSAGE } from "#internal/utils/constants";
2
+ const shared = {
3
+ __remote_components_missing_shared__: MISSING_SHARED_MODULES_MESSAGE
4
+ };
5
+ export {
6
+ shared
7
+ };
8
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/remote/defaults/shared.ts"],"sourcesContent":["import { MISSING_SHARED_MODULES_MESSAGE } from '#internal/utils/constants';\n\nexport const shared: Record<string, string> = {\n __remote_components_missing_shared__: MISSING_SHARED_MODULES_MESSAGE,\n};\n"],"mappings":"AAAA,SAAS,sCAAsC;AAExC,MAAM,SAAiC;AAAA,EAC5C,sCAAsC;AACxC;","names":[]}
@@ -38,11 +38,12 @@ var import_react = require("react");
38
38
  var import_app_client = require("#internal/remote/nextjs/app-client");
39
39
  var import_constants = require("#internal/runtime/constants");
40
40
  var import_error = require("#internal/utils/error");
41
+ var import_project_id_env = require("#internal/utils/project-id-env");
41
42
  const SERVER_ACTION_MANIFESTS_SINGLETON = Symbol.for(
42
43
  "next.server.action-manifests"
43
44
  );
44
45
  const MANIFESTS_SINGLETON = Symbol.for("next.server.manifests");
45
- const PROJECT_ID = process.env.REMOTE_COMPONENTS_PROJECT_ID || process.env.NEXT_PUBLIC_MFE_CURRENT_APPLICATION || process.env.VERCEL_PROJECT_ID;
46
+ const PROJECT_ID = (0, import_project_id_env.resolveProjectIdFromEnv)();
46
47
  async function tryImport(importer) {
47
48
  try {
48
49
  return await importer();