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.
Files changed (139) hide show
  1. package/dist/{chunk-C5EYU7EQ.cjs → chunk-4MLJE6UP.cjs} +3 -3
  2. package/dist/{chunk-SECN7UAL.cjs → chunk-7OD5S534.cjs} +18 -18
  3. package/dist/{chunk-7XXO2DLF.cjs → chunk-I7VKDF3E.cjs} +115 -77
  4. package/dist/chunk-I7VKDF3E.cjs.map +1 -0
  5. package/dist/{chunk-55TEMSB5.js → chunk-JZRA6DPE.js} +116 -78
  6. package/dist/chunk-JZRA6DPE.js.map +1 -0
  7. package/dist/{chunk-HYVNEUIK.js → chunk-MJ2KYXGR.js} +3 -3
  8. package/dist/{chunk-KV5J7PNM.js → chunk-NZM2SI6U.js} +3 -3
  9. package/dist/{chunk-DGZVFKSQ.js → chunk-O4A6CJGI.js} +19 -11
  10. package/dist/chunk-O4A6CJGI.js.map +1 -0
  11. package/dist/{chunk-2W7JBTID.cjs → chunk-PNASFKWA.cjs} +39 -31
  12. package/dist/chunk-PNASFKWA.cjs.map +1 -0
  13. package/dist/{chunk-4NW46ZVD.js → chunk-PT3R275L.js} +93 -38
  14. package/dist/chunk-PT3R275L.js.map +1 -0
  15. package/dist/{chunk-4AH3KXDW.cjs → chunk-TWO3XB6H.cjs} +19 -19
  16. package/dist/{chunk-HMB3SIVJ.cjs → chunk-W5FSHVWU.cjs} +107 -52
  17. package/dist/chunk-W5FSHVWU.cjs.map +1 -0
  18. package/dist/{chunk-HL6BL5HY.js → chunk-WGSS7TJP.js} +2 -2
  19. package/dist/config/nextjs.cjs +98 -30
  20. package/dist/config/nextjs.cjs.map +1 -1
  21. package/dist/config/nextjs.d.ts +14 -1
  22. package/dist/config/nextjs.js +89 -21
  23. package/dist/config/nextjs.js.map +1 -1
  24. package/dist/host/html.cjs +19 -19
  25. package/dist/host/html.cjs.map +1 -1
  26. package/dist/host/html.js +7 -7
  27. package/dist/host/html.js.map +1 -1
  28. package/dist/host/nextjs/app/client-only.cjs +11 -11
  29. package/dist/host/nextjs/app/client-only.js +6 -6
  30. package/dist/host/nextjs/pages.cjs +32 -9
  31. package/dist/host/nextjs/pages.cjs.map +1 -1
  32. package/dist/host/nextjs/pages.js +39 -9
  33. package/dist/host/nextjs/pages.js.map +1 -1
  34. package/dist/host/react.cjs +7 -7
  35. package/dist/host/react.js +6 -6
  36. package/dist/internal/host/nextjs/app-client.d.ts +3 -1
  37. package/dist/internal/host/nextjs/dom-flight.cjs +17 -2
  38. package/dist/internal/host/nextjs/dom-flight.cjs.map +1 -1
  39. package/dist/internal/host/nextjs/dom-flight.d.ts +5 -1
  40. package/dist/internal/host/nextjs/dom-flight.js +18 -2
  41. package/dist/internal/host/nextjs/dom-flight.js.map +1 -1
  42. package/dist/internal/host/server/fetch-remote-component.cjs +4 -2
  43. package/dist/internal/host/server/fetch-remote-component.cjs.map +1 -1
  44. package/dist/internal/host/server/fetch-remote-component.d.ts +2 -0
  45. package/dist/internal/host/server/fetch-remote-component.js +4 -2
  46. package/dist/internal/host/server/fetch-remote-component.js.map +1 -1
  47. package/dist/internal/host/server/types.cjs.map +1 -1
  48. package/dist/internal/host/server/types.d.ts +4 -1
  49. package/dist/internal/host/shared/pipeline.cjs +7 -8
  50. package/dist/internal/host/shared/pipeline.cjs.map +1 -1
  51. package/dist/internal/host/shared/pipeline.d.ts +5 -3
  52. package/dist/internal/host/shared/pipeline.js +9 -8
  53. package/dist/internal/host/shared/pipeline.js.map +1 -1
  54. package/dist/internal/host/shared/shared-broker.cjs +51 -10
  55. package/dist/internal/host/shared/shared-broker.cjs.map +1 -1
  56. package/dist/internal/host/shared/shared-broker.d.ts +19 -3
  57. package/dist/internal/host/shared/shared-broker.js +48 -10
  58. package/dist/internal/host/shared/shared-broker.js.map +1 -1
  59. package/dist/internal/host/shared/shared-module-resolver.cjs.map +1 -1
  60. package/dist/internal/host/shared/shared-module-resolver.d.ts +2 -2
  61. package/dist/internal/host/shared/shared-module-resolver.js.map +1 -1
  62. package/dist/internal/remote/nextjs/app-client.cjs +28 -19
  63. package/dist/internal/remote/nextjs/app-client.cjs.map +1 -1
  64. package/dist/internal/remote/nextjs/app-client.d.ts +6 -1
  65. package/dist/internal/remote/nextjs/app-client.js +20 -11
  66. package/dist/internal/remote/nextjs/app-client.js.map +1 -1
  67. package/dist/internal/runtime/html/html-spec.cjs +6 -0
  68. package/dist/internal/runtime/html/html-spec.cjs.map +1 -1
  69. package/dist/internal/runtime/html/html-spec.d.ts +3 -1
  70. package/dist/internal/runtime/html/html-spec.js +4 -0
  71. package/dist/internal/runtime/html/html-spec.js.map +1 -1
  72. package/dist/internal/runtime/html/parse-remote-html.cjs +7 -1
  73. package/dist/internal/runtime/html/parse-remote-html.cjs.map +1 -1
  74. package/dist/internal/runtime/html/parse-remote-html.d.ts +5 -3
  75. package/dist/internal/runtime/html/parse-remote-html.js +9 -1
  76. package/dist/internal/runtime/html/parse-remote-html.js.map +1 -1
  77. package/dist/internal/runtime/loaders/component-loader.cjs.map +1 -1
  78. package/dist/internal/runtime/loaders/component-loader.d.ts +4 -2
  79. package/dist/internal/runtime/loaders/component-loader.js.map +1 -1
  80. package/dist/internal/runtime/turbopack/chunk-loader.cjs +39 -23
  81. package/dist/internal/runtime/turbopack/chunk-loader.cjs.map +1 -1
  82. package/dist/internal/runtime/turbopack/chunk-loader.js +39 -23
  83. package/dist/internal/runtime/turbopack/chunk-loader.js.map +1 -1
  84. package/dist/internal/runtime/turbopack/patterns.cjs +15 -5
  85. package/dist/internal/runtime/turbopack/patterns.cjs.map +1 -1
  86. package/dist/internal/runtime/turbopack/patterns.d.ts +10 -2
  87. package/dist/internal/runtime/turbopack/patterns.js +13 -4
  88. package/dist/internal/runtime/turbopack/patterns.js.map +1 -1
  89. package/dist/internal/runtime/turbopack/shared-modules.cjs +39 -10
  90. package/dist/internal/runtime/turbopack/shared-modules.cjs.map +1 -1
  91. package/dist/internal/runtime/turbopack/shared-modules.d.ts +2 -2
  92. package/dist/internal/runtime/turbopack/shared-modules.js +43 -11
  93. package/dist/internal/runtime/turbopack/shared-modules.js.map +1 -1
  94. package/dist/remote/defaults/app.cjs +4 -2
  95. package/dist/remote/defaults/app.cjs.map +1 -1
  96. package/dist/remote/defaults/app.d.ts +3 -1
  97. package/dist/remote/defaults/app.js +3 -2
  98. package/dist/remote/defaults/app.js.map +1 -1
  99. package/dist/remote/defaults/pages.cjs +4 -2
  100. package/dist/remote/defaults/pages.cjs.map +1 -1
  101. package/dist/remote/defaults/pages.d.ts +3 -1
  102. package/dist/remote/defaults/pages.js +3 -2
  103. package/dist/remote/defaults/pages.js.map +1 -1
  104. package/dist/remote/defaults/shared.cjs +5 -2
  105. package/dist/remote/defaults/shared.cjs.map +1 -1
  106. package/dist/remote/defaults/shared.d.ts +5 -1
  107. package/dist/remote/defaults/shared.js +3 -1
  108. package/dist/remote/defaults/shared.js.map +1 -1
  109. package/dist/remote/nextjs/pages.cjs +4 -1
  110. package/dist/remote/nextjs/pages.cjs.map +1 -1
  111. package/dist/remote/nextjs/pages.d.ts +5 -0
  112. package/dist/remote/nextjs/pages.js +8 -2
  113. package/dist/remote/nextjs/pages.js.map +1 -1
  114. package/dist/{server-handoff-8c89b856.d.ts → server-handoff-9e905049.d.ts} +2 -1
  115. package/dist/{turbopack-7F757Z7V.js → turbopack-55EJDSUT.js} +4 -4
  116. package/dist/turbopack-55EJDSUT.js.map +1 -0
  117. package/dist/{turbopack-DULMVTWV.cjs → turbopack-Q6KJAEOX.cjs} +11 -11
  118. package/dist/turbopack-Q6KJAEOX.cjs.map +1 -0
  119. package/dist/{webpack-WGVTKJ3W.js → webpack-AQ34DAJZ.js} +4 -4
  120. package/dist/webpack-AQ34DAJZ.js.map +1 -0
  121. package/dist/{webpack-6LXCB7WA.cjs → webpack-FWUNUWLF.cjs} +11 -11
  122. package/dist/webpack-FWUNUWLF.cjs.map +1 -0
  123. package/package.json +1 -1
  124. package/dist/chunk-2W7JBTID.cjs.map +0 -1
  125. package/dist/chunk-4NW46ZVD.js.map +0 -1
  126. package/dist/chunk-55TEMSB5.js.map +0 -1
  127. package/dist/chunk-7XXO2DLF.cjs.map +0 -1
  128. package/dist/chunk-DGZVFKSQ.js.map +0 -1
  129. package/dist/chunk-HMB3SIVJ.cjs.map +0 -1
  130. package/dist/turbopack-7F757Z7V.js.map +0 -1
  131. package/dist/turbopack-DULMVTWV.cjs.map +0 -1
  132. package/dist/webpack-6LXCB7WA.cjs.map +0 -1
  133. package/dist/webpack-WGVTKJ3W.js.map +0 -1
  134. /package/dist/{chunk-C5EYU7EQ.cjs.map → chunk-4MLJE6UP.cjs.map} +0 -0
  135. /package/dist/{chunk-SECN7UAL.cjs.map → chunk-7OD5S534.cjs.map} +0 -0
  136. /package/dist/{chunk-HYVNEUIK.js.map → chunk-MJ2KYXGR.js.map} +0 -0
  137. /package/dist/{chunk-KV5J7PNM.js.map → chunk-NZM2SI6U.js.map} +0 -0
  138. /package/dist/{chunk-4AH3KXDW.cjs.map → chunk-TWO3XB6H.cjs.map} +0 -0
  139. /package/dist/{chunk-HL6BL5HY.js.map → chunk-WGSS7TJP.js.map} +0 -0
@@ -1,7 +1,8 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
3
 
4
- var _chunk7XXO2DLFcjs = require('../chunk-7XXO2DLF.cjs');
4
+
5
+ var _chunkI7VKDF3Ecjs = require('../chunk-I7VKDF3E.cjs');
5
6
  require('../chunk-Z2SLBFQL.cjs');
6
7
  require('../chunk-5KTAEO52.cjs');
7
8
 
@@ -20,10 +21,10 @@ require('../chunk-SHFJ5OQA.cjs');
20
21
 
21
22
  // src/config/nextjs/index.ts
22
23
  var _fs = require('fs');
24
+ var _module = require('module');
23
25
  var _path = require('path');
24
26
  var _enhancedresolve = require('enhanced-resolve'); var _enhancedresolve2 = _interopRequireDefault(_enhancedresolve);
25
27
  var _findup = require('find-up');
26
- var _configschemajs = require('next/dist/server/config-schema.js');
27
28
  var _tsconfigpathswebpackplugin = require('tsconfig-paths-webpack-plugin'); var _tsconfigpathswebpackplugin2 = _interopRequireDefault(_tsconfigpathswebpackplugin);
28
29
 
29
30
  // src/utils/project-id.ts
@@ -108,6 +109,18 @@ function getNextMajorVersion() {
108
109
  function hasPagesDirectory() {
109
110
  return _fs.existsSync.call(void 0, _path.join.call(void 0, process.cwd(), "pages")) || _fs.existsSync.call(void 0, _path.join.call(void 0, process.cwd(), "src/pages"));
110
111
  }
112
+ function isChunkLoadingGlobalSupported(schema) {
113
+ return schema.safeParse({ turbopack: { chunkLoadingGlobal: "__test__" } }).success;
114
+ }
115
+ function loadAppConfigSchema() {
116
+ try {
117
+ const appRequire = _module.createRequire.call(void 0, _path.join.call(void 0, process.cwd(), "package.json"));
118
+ const mod = appRequire("next/dist/server/config-schema.js");
119
+ return mod.configSchema;
120
+ } catch (e3) {
121
+ return void 0;
122
+ }
123
+ }
111
124
  function readProjectPackageJson() {
112
125
  const defaults = { name: _path.basename.call(void 0, process.cwd()), type: "module" };
113
126
  try {
@@ -120,7 +133,7 @@ function readProjectPackageJson() {
120
133
  ...JSON.parse(_fs.readFileSync.call(void 0, packageJsonPath, "utf8"))
121
134
  };
122
135
  }
123
- } catch (e3) {
136
+ } catch (e4) {
124
137
  }
125
138
  return defaults;
126
139
  }
@@ -142,7 +155,7 @@ function withRemoteComponentsConfig(nextConfig, options) {
142
155
  ".remote-components/shared/pages-host.tsx"
143
156
  );
144
157
  const appShared = /* @__PURE__ */ new Set([
145
- ..._chunk7XXO2DLFcjs.CORE_REACT_SHARED_KEYS,
158
+ ..._chunkI7VKDF3Ecjs.CORE_REACT_SHARED_KEYS,
146
159
  "next/navigation",
147
160
  "next/dist/client/components/navigation",
148
161
  "next/link",
@@ -156,7 +169,7 @@ function withRemoteComponentsConfig(nextConfig, options) {
156
169
  ..._nullishCoalesce(_optionalChain([options, 'optionalAccess', _ => _.shared]), () => ( []))
157
170
  ]);
158
171
  const pagesShared = /* @__PURE__ */ new Set([
159
- ..._chunk7XXO2DLFcjs.CORE_REACT_SHARED_KEYS,
172
+ ..._chunkI7VKDF3Ecjs.CORE_REACT_SHARED_KEYS,
160
173
  "next/router",
161
174
  "next/link",
162
175
  "next/dist/shared/lib/image-loader",
@@ -164,7 +177,7 @@ function withRemoteComponentsConfig(nextConfig, options) {
164
177
  "next/form",
165
178
  ..._nullishCoalesce(_optionalChain([options, 'optionalAccess', _2 => _2.shared]), () => ( []))
166
179
  ]);
167
- const vendorShared = { ..._chunk7XXO2DLFcjs.VENDOR_SHARED };
180
+ const vendorShared = { ..._chunkI7VKDF3Ecjs.VENDOR_SHARED };
168
181
  const resolve = _enhancedresolve2.default.create.sync({
169
182
  conditionNames: ["browser", "import", "module", "require"],
170
183
  ..._fs.existsSync.call(void 0, _path.join.call(void 0, process.cwd(), "tsconfig.json")) ? {
@@ -177,8 +190,31 @@ function withRemoteComponentsConfig(nextConfig, options) {
177
190
  } : {}
178
191
  });
179
192
  const packageJson = readProjectPackageJson();
180
- const exportPre = packageJson.type !== "module" ? "module.exports = { shared: { " : "export const shared = { ";
181
- const exportPost = packageJson.type !== "module" ? "} };\n" : "};\n";
193
+ const generateSharedModule = ({
194
+ sharedEntries,
195
+ sharedManifest
196
+ }) => {
197
+ const shared = sharedEntries.join("\n");
198
+ if (packageJson.type !== "module") {
199
+ const exports = [`shared: {
200
+ ${shared}
201
+ }`];
202
+ if (sharedManifest) {
203
+ exports.push(`sharedManifest: ${sharedManifest}`);
204
+ }
205
+ return `'use client';
206
+ module.exports = {
207
+ ${exports.join(",\n")}
208
+ };
209
+ `;
210
+ }
211
+ return `'use client';
212
+ export const shared = {
213
+ ${shared}
214
+ };
215
+ ${sharedManifest ? `export const sharedManifest = ${sharedManifest};
216
+ ` : ""}`;
217
+ };
182
218
  const resolveSharedPath = (moduleName) => {
183
219
  try {
184
220
  const resolved = resolve(process.cwd(), moduleName);
@@ -188,25 +224,41 @@ function withRemoteComponentsConfig(nextConfig, options) {
188
224
  ""
189
225
  );
190
226
  }
191
- } catch (e4) {
227
+ } catch (e5) {
192
228
  }
193
229
  };
194
- const generateSharedRemote = (sharedRemote) => `'use client';
195
- ${exportPre}${Array.from(sharedRemote).reduce((acc, curr) => {
196
- const path = resolveSharedPath(curr);
197
- acc.push(
198
- `[${_nullishCoalesce(vendorShared[curr], () => ( (path ? `'${path}'` : `require.resolve('${curr}')`)))}]: '${curr}',`
199
- );
200
- acc.push(
201
- `['__remote_shared_module_${curr}']: () => import('${curr}'),`
230
+ const sharedKeyExpression = (moduleName) => {
231
+ const path = resolveSharedPath(moduleName);
232
+ return _nullishCoalesce(vendorShared[moduleName], () => ( (path ? `'${path}'` : `require.resolve('${moduleName}')`)));
233
+ };
234
+ const generateSharedRemote = (sharedRemote) => {
235
+ const sharedEntries = Array.from(sharedRemote).reduce(
236
+ (acc, curr) => {
237
+ const id = sharedKeyExpression(curr);
238
+ acc.push(`[${id}]: '${curr}',`);
239
+ acc.push(
240
+ `['__remote_shared_module_${curr}']: () => import('${curr}'),`
241
+ );
242
+ return acc;
243
+ },
244
+ []
202
245
  );
203
- return acc;
204
- }, []).join("\n")}${exportPost}`;
205
- const generateSharedHost = (sharedHost) => `'use client';
206
- ${exportPre}${Array.from(sharedHost).reduce((acc, curr) => {
207
- acc.push(`['${curr}']: () => import('${curr}'),`);
208
- return acc;
209
- }, []).join("\n")}${exportPost}`;
246
+ const requirements = Array.from(sharedRemote).map(
247
+ (curr) => `{ id: ${sharedKeyExpression(curr)}, specifier: '${curr}', required: true, singleton: true }`
248
+ ).join(",\n");
249
+ return generateSharedModule({
250
+ sharedEntries,
251
+ sharedManifest: `{ protocol: '${_chunkI7VKDF3Ecjs.SHARED_MODULE_MANIFEST_PROTOCOL}', requirements: [
252
+ ${requirements}
253
+ ] }`
254
+ });
255
+ };
256
+ const generateSharedHost = (sharedHost) => generateSharedModule({
257
+ sharedEntries: Array.from(sharedHost).reduce((acc, curr) => {
258
+ acc.push(`['${curr}']: () => import('${curr}'),`);
259
+ return acc;
260
+ }, [])
261
+ });
210
262
  const appSharedRemote = generateSharedRemote(appShared);
211
263
  const pagesSharedRemote = generateSharedRemote(pagesShared);
212
264
  const appSharedHost = generateSharedHost(appShared);
@@ -271,7 +323,8 @@ ${exportPre}${Array.from(sharedHost).reduce((acc, curr) => {
271
323
  }
272
324
  }
273
325
  if (process.env.TURBOPACK) {
274
- if (!_configschemajs.configSchema.safeParse({
326
+ const appConfigSchema = loadAppConfigSchema();
327
+ if (!_optionalChain([appConfigSchema, 'optionalAccess', _3 => _3.safeParse, 'call', _4 => _4({
275
328
  turbopack: {
276
329
  resolveAlias: {
277
330
  ...alias
@@ -282,24 +335,38 @@ ${exportPre}${Array.from(sharedHost).reduce((acc, curr) => {
282
335
  REMOTE_COMPONENTS_PROJECT_ID: projectId
283
336
  }
284
337
  }
285
- }).success) {
338
+ }), 'access', _5 => _5.success])) {
286
339
  _chunkBBXVML3Dcjs.logError.call(void 0,
287
340
  "Config",
288
341
  "Turbopack support requires a Next.js version that includes `compiler.defineServer`. Upgrade Next.js to continue using Remote Components with Turbopack."
289
342
  );
290
343
  process.exit(1);
291
344
  }
345
+ const chunkLoadingGlobalSupported = appConfigSchema !== void 0 && isChunkLoadingGlobalSupported(appConfigSchema);
346
+ const chunkLoadingGlobalValue = `TURBOPACK_remote_chunk_loading_global_${projectId}`;
347
+ if (chunkLoadingGlobalSupported) {
348
+ _chunkBBXVML3Dcjs.logDebug.call(void 0,
349
+ "Config",
350
+ `Turbopack chunkLoadingGlobal set to "${chunkLoadingGlobalValue}" \u2014 chunks will use a build-time scoped global (no runtime TURBOPACK rename needed).`
351
+ );
352
+ } else {
353
+ _chunkBBXVML3Dcjs.logDebug.call(void 0,
354
+ "Config",
355
+ "Turbopack chunkLoadingGlobal not supported by this Next.js version \u2014 falling back to runtime TURBOPACK global rename."
356
+ );
357
+ }
292
358
  nextConfig.turbopack = {
293
359
  ...nextConfig.turbopack,
294
360
  resolveAlias: {
295
- ..._optionalChain([nextConfig, 'access', _3 => _3.turbopack, 'optionalAccess', _4 => _4.resolveAlias]),
361
+ ..._optionalChain([nextConfig, 'access', _6 => _6.turbopack, 'optionalAccess', _7 => _7.resolveAlias]),
296
362
  ...alias
297
- }
363
+ },
364
+ ...chunkLoadingGlobalSupported ? { chunkLoadingGlobal: chunkLoadingGlobalValue } : {}
298
365
  };
299
366
  nextConfig.compiler = {
300
367
  ...nextConfig.compiler,
301
368
  defineServer: {
302
- ..._optionalChain([nextConfig, 'access', _5 => _5.compiler, 'optionalAccess', _6 => _6.defineServer]),
369
+ ..._optionalChain([nextConfig, 'access', _8 => _8.compiler, 'optionalAccess', _9 => _9.defineServer]),
303
370
  "process.env.REMOTE_COMPONENTS_PROJECT_ID": projectId
304
371
  }
305
372
  };
@@ -314,5 +381,6 @@ ${exportPre}${Array.from(sharedHost).reduce((acc, curr) => {
314
381
  }
315
382
 
316
383
 
317
- exports.withRemoteComponentsConfig = withRemoteComponentsConfig;
384
+
385
+ exports.isChunkLoadingGlobalSupported = isChunkLoadingGlobalSupported; exports.withRemoteComponentsConfig = withRemoteComponentsConfig;
318
386
  //# sourceMappingURL=nextjs.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config/nextjs/index.ts","../../src/utils/project-id.ts","../../src/utils/project-id-env.ts","../../src/config/webpack/nextjs.ts"],"names":["readFileSync","join","findUpSync"],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { basename, dirname, join, relative } from 'node:path';\nimport enhancedResolve from 'enhanced-resolve';\nimport { findUpSync } from 'find-up';\nimport type { NextConfig } from 'next';\nimport { configSchema } from 'next/dist/server/config-schema.js';\nimport TsConfigPathsWebpackPlugin from 'tsconfig-paths-webpack-plugin';\nimport {\n CORE_REACT_SHARED_KEYS,\n VENDOR_SHARED,\n} from '#internal/host/shared/shared-module-resolver';\nimport { logDebug, logError, logWarn } from '#internal/utils/logger';\nimport { resolveProjectId } from '#internal/utils/project-id';\nimport { transform as webpackTransform } from '../webpack/nextjs';\n\nfunction getNextMajorVersion(): number | undefined {\n try {\n const nextPkgPath = findUpSync('node_modules/next/package.json', {\n cwd: process.cwd(),\n });\n if (!nextPkgPath) return undefined;\n const { version } = JSON.parse(readFileSync(nextPkgPath, 'utf8')) as {\n version: string;\n };\n const major = version.split('.')[0];\n return major ? Number.parseInt(major, 10) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction hasPagesDirectory(): boolean {\n return (\n existsSync(join(process.cwd(), 'pages')) ||\n existsSync(join(process.cwd(), 'src/pages'))\n );\n}\n\ninterface ZodSchema {\n safeParse: (data: unknown) => { success: boolean };\n}\n\nfunction readProjectPackageJson(): { name: string; type: string } {\n const defaults = { name: basename(process.cwd()), type: 'module' };\n try {\n const packageJsonPath = findUpSync('package.json', {\n cwd: process.cwd(),\n });\n if (packageJsonPath) {\n return {\n ...defaults,\n ...(JSON.parse(readFileSync(packageJsonPath, 'utf8')) as {\n name: string;\n type: string;\n }),\n };\n }\n } catch {\n // noop\n }\n return defaults;\n}\n\ninterface WithRemoteComponentsOptions {\n /**\n * An array of package names that should be shared between the host and remote components.\n * This is useful for ensuring that both the host and remote components use the same version\n * of shared libraries.\n *\n * Essential packages are included by default: `react`, `react-dom`, `next/navigation`, `next/link`, `next/form`, `next/image` (loader only), and `next/script`.\n */\n shared?: string[];\n}\n\n/**\n * This function configures Next.js to support Remote Components.\n * You need to also use the `withMicrofrontends` function to extend your Next.js configuration.\n *\n * @param nextConfig - The Next.js configuration object.\n * @param options - Optional configuration for remote components.\n * @returns The modified Next.js configuration object with remote components support.\n *\n * @example\n *\n * ```js\n * import { withMicrofrontends } from '@vercel/microfrontends/next/config';\n * import { withRemoteComponentsConfig } from 'remote-components/config/nextjs';\n *\n * const nextConfig = {\n * // your Next.js configuration\n * };\n *\n * export default withRemoteComponentsConfig(\n * withMicrofrontends(nextConfig),\n * {\n * shared: ['some-package', 'another-package'],\n * },\n * );\n * ```\n */\nexport function withRemoteComponentsConfig(\n nextConfig: NextConfig,\n options?: WithRemoteComponentsOptions,\n) {\n const virtualRemoteComponentAppSharedRemote = join(\n process.cwd(),\n '.remote-components/shared/app-remote.tsx',\n );\n const virtualRemoteComponentPagesSharedRemote = join(\n process.cwd(),\n '.remote-components/shared/pages-remote.tsx',\n );\n const virtualRemoteComponentAppSharedHost = join(\n process.cwd(),\n '.remote-components/shared/app-host.tsx',\n );\n const virtualRemoteComponentPagesSharedHost = join(\n process.cwd(),\n '.remote-components/shared/pages-host.tsx',\n );\n\n const appShared = new Set([\n ...CORE_REACT_SHARED_KEYS,\n 'next/navigation',\n 'next/dist/client/components/navigation',\n 'next/link',\n 'next/dist/client/app-dir/link',\n 'next/form',\n 'next/dist/client/app-dir/form',\n 'next/dist/shared/lib/image-loader',\n 'next/script',\n 'next/dist/client/script',\n 'next/dist/build/polyfills/process',\n ...(options?.shared ?? []),\n ]);\n const pagesShared = new Set([\n ...CORE_REACT_SHARED_KEYS,\n 'next/router',\n 'next/link',\n 'next/dist/shared/lib/image-loader',\n 'next/script',\n 'next/form',\n ...(options?.shared ?? []),\n ]);\n\n const vendorShared = { ...VENDOR_SHARED };\n\n // resolve using enhanced-resolve\n // named import does not work with enhanced-resolve when using cjs\n // eslint-disable-next-line import/no-named-as-default-member\n const resolve = enhancedResolve.create.sync({\n conditionNames: ['browser', 'import', 'module', 'require'],\n ...(existsSync(join(process.cwd(), 'tsconfig.json'))\n ? {\n extensions: ['.js', '.jsx', '.ts', '.tsx'],\n plugins: [\n new TsConfigPathsWebpackPlugin({\n configFile: join(process.cwd(), 'tsconfig.json'),\n }) as unknown as enhancedResolve.Plugin,\n ],\n }\n : {}),\n });\n\n const packageJson = readProjectPackageJson();\n\n const exportPre =\n packageJson.type !== 'module'\n ? 'module.exports = { shared: { '\n : 'export const shared = { ';\n const exportPost = packageJson.type !== 'module' ? '} };\\n' : '};\\n';\n\n const resolveSharedPath = (moduleName: string): string | undefined => {\n try {\n const resolved = resolve(process.cwd(), moduleName);\n if (resolved) {\n return relative(process.cwd(), resolved).replace(\n /^(?<relative>\\.\\.\\/)+/,\n '',\n );\n }\n } catch {\n // if module resolution using enhanced-resolve fails, fallback to require.resolve called in the shared/remote file\n }\n };\n\n const generateSharedRemote = (sharedRemote: Set<string>) =>\n `'use client';\\n${exportPre}${Array.from(sharedRemote)\n .reduce<string[]>((acc, curr) => {\n const path = resolveSharedPath(curr);\n acc.push(\n `[${\n vendorShared[curr] ??\n (path ? `'${path}'` : `require.resolve('${curr}')`)\n }]: '${curr}',`,\n );\n acc.push(\n `['__remote_shared_module_${curr}']: () => import('${curr}'),`,\n );\n return acc;\n }, [])\n .join('\\n')}${exportPost}`;\n const generateSharedHost = (sharedHost: Set<string>) =>\n `'use client';\\n${exportPre}${Array.from(sharedHost)\n .reduce<string[]>((acc, curr) => {\n acc.push(`['${curr}']: () => import('${curr}'),`);\n return acc;\n }, [])\n .join('\\n')}${exportPost}`;\n\n const appSharedRemote = generateSharedRemote(appShared);\n const pagesSharedRemote = generateSharedRemote(pagesShared);\n\n const appSharedHost = generateSharedHost(appShared);\n const pagesSharedHost = generateSharedHost(pagesShared);\n\n const emitSharedFiles = () => {\n mkdirSync(dirname(virtualRemoteComponentAppSharedRemote), {\n recursive: true,\n });\n\n writeFileSync(\n virtualRemoteComponentAppSharedRemote,\n appSharedRemote,\n 'utf-8',\n );\n writeFileSync(\n virtualRemoteComponentPagesSharedRemote,\n pagesSharedRemote,\n 'utf-8',\n );\n writeFileSync(virtualRemoteComponentAppSharedHost, appSharedHost, 'utf-8');\n writeFileSync(\n virtualRemoteComponentPagesSharedHost,\n pagesSharedHost,\n 'utf-8',\n );\n };\n\n nextConfig.transpilePackages = [\n ...(nextConfig.transpilePackages ?? []),\n 'remote-components',\n ];\n\n nextConfig.env = {\n ...nextConfig.env,\n REMOTE_COMPONENTS_CONFIGURED: '1',\n };\n\n const alias = {\n '#remote-components/remote/defaults/app': `./${relative(\n process.cwd(),\n virtualRemoteComponentAppSharedRemote,\n )}`,\n '#remote-components/remote/defaults/pages': `./${relative(\n process.cwd(),\n virtualRemoteComponentPagesSharedRemote,\n )}`,\n '#remote-components/host/defaults/app': `./${relative(\n process.cwd(),\n virtualRemoteComponentAppSharedHost,\n )}`,\n '#remote-components/host/defaults/pages': `./${relative(\n process.cwd(),\n virtualRemoteComponentPagesSharedHost,\n )}`,\n };\n\n const projectId = resolveProjectId(packageJson.name);\n process.env.REMOTE_COMPONENTS_PROJECT_ID = projectId;\n\n if (hasPagesDirectory()) {\n // Log instead of throwing for the version check because\n // withRemoteComponentsConfig is shared by both hosts and remotes.\n // Only Pages Router hosts are broken on Next.js < 16 — remotes\n // work fine and must not have their builds blocked.\n const nextMajor = getNextMajorVersion();\n if (nextMajor !== undefined && nextMajor < 16) {\n const log =\n process.env.NODE_ENV !== 'production' ||\n process.env.VERCEL_ENV === 'preview'\n ? logWarn\n : logDebug;\n log(\n 'Config',\n `Remote Components does not support Pages Router hosts on Next.js ${nextMajor}. ` +\n 'Pages Router remotes are unaffected. Upgrade to Next.js 16+ for host support.',\n );\n }\n }\n\n if (process.env.TURBOPACK) {\n if (\n !(configSchema as ZodSchema).safeParse({\n turbopack: {\n resolveAlias: {\n ...alias,\n },\n },\n compiler: {\n defineServer: {\n REMOTE_COMPONENTS_PROJECT_ID: projectId,\n },\n },\n }).success\n ) {\n logError(\n 'Config',\n 'Turbopack support requires a Next.js version that includes `compiler.defineServer`. ' +\n 'Upgrade Next.js to continue using Remote Components with Turbopack.',\n );\n process.exit(1);\n }\n nextConfig.turbopack = {\n ...nextConfig.turbopack,\n resolveAlias: {\n ...nextConfig.turbopack?.resolveAlias,\n ...alias,\n },\n };\n nextConfig.compiler = {\n ...nextConfig.compiler,\n defineServer: {\n ...nextConfig.compiler?.defineServer,\n 'process.env.REMOTE_COMPONENTS_PROJECT_ID': projectId,\n },\n };\n emitSharedFiles();\n return nextConfig;\n }\n\n // apply the webpack transform\n return webpackTransform(nextConfig, {\n app: { name: projectId },\n alias,\n emitSharedFiles,\n });\n}\n","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","/**\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","import { join } from 'node:path';\nimport type { NextConfig } from 'next';\nimport type { WebpackOptionsNormalized } from 'webpack';\nimport { ConditionalExecPlugin } from './plugins/conditional-exec';\nimport { ModuleIdEmbedPlugin } from './plugins/module-id-embed';\nimport { PatchRequirePlugin } from './plugins/patch-require';\nimport { RemoteWebpackRequirePlugin } from './plugins/remote-webpack-require';\n\nexport function transform(\n nextConfig: NextConfig,\n {\n app,\n alias = {},\n emitSharedFiles = () => {\n // no-op by default\n },\n }: {\n app: { name: string };\n alias?: Record<string, string>;\n emitSharedFiles?: () => void;\n },\n) {\n const webpackConfig = nextConfig.webpack;\n\n nextConfig.webpack = (\n baseConfig: WebpackOptionsNormalized,\n webpackContext,\n ) => {\n // execute the client config first, otherwise their config may accidentally\n // overwrite our required config - leading to unexpected errors.\n const config = (\n typeof webpackConfig === 'function'\n ? (webpackConfig(baseConfig, webpackContext) ?? baseConfig)\n : baseConfig\n ) as WebpackOptionsNormalized;\n\n // remote component specific plugins\n config.plugins.push(\n new RemoteWebpackRequirePlugin(app.name),\n new ModuleIdEmbedPlugin(app.name, { isServer: webpackContext.isServer }),\n new ConditionalExecPlugin(app.name),\n new PatchRequirePlugin(app.name),\n );\n if (!webpackContext.isServer) {\n // change the chunk loading global to avoid conflicts with other remote components\n config.output.chunkLoadingGlobal = `__remote_chunk_loading_global_${app.name}__`;\n }\n\n config.resolve = {\n ...config.resolve,\n alias: {\n ...config.resolve.alias,\n ...Object.fromEntries(\n Object.entries(alias).map(([key, value]) => [\n key,\n join(process.cwd(), value),\n ]),\n ),\n },\n };\n\n emitSharedFiles();\n return config;\n };\n\n return nextConfig;\n}\n"]}
1
+ {"version":3,"sources":["../../src/config/nextjs/index.ts","../../src/utils/project-id.ts","../../src/utils/project-id-env.ts","../../src/config/webpack/nextjs.ts"],"names":["readFileSync","join","findUpSync"],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { basename, dirname, join, relative } from 'node:path';\nimport enhancedResolve from 'enhanced-resolve';\nimport { findUpSync } from 'find-up';\nimport type { NextConfig } from 'next';\nimport TsConfigPathsWebpackPlugin from 'tsconfig-paths-webpack-plugin';\nimport { SHARED_MODULE_MANIFEST_PROTOCOL } from '#internal/host/shared/shared-broker';\nimport {\n CORE_REACT_SHARED_KEYS,\n VENDOR_SHARED,\n} from '#internal/host/shared/shared-module-resolver';\nimport { logDebug, logError, logWarn } from '#internal/utils/logger';\nimport { resolveProjectId } from '#internal/utils/project-id';\nimport { transform as webpackTransform } from '../webpack/nextjs';\n\nfunction getNextMajorVersion(): number | undefined {\n try {\n const nextPkgPath = findUpSync('node_modules/next/package.json', {\n cwd: process.cwd(),\n });\n if (!nextPkgPath) return undefined;\n const { version } = JSON.parse(readFileSync(nextPkgPath, 'utf8')) as {\n version: string;\n };\n const major = version.split('.')[0];\n return major ? Number.parseInt(major, 10) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction hasPagesDirectory(): boolean {\n return (\n existsSync(join(process.cwd(), 'pages')) ||\n existsSync(join(process.cwd(), 'src/pages'))\n );\n}\n\ninterface ZodSchema {\n safeParse: (data: unknown) => { success: boolean };\n}\n\n/**\n * Returns true when the installed Next.js version's config schema accepts\n * `turbopack.chunkLoadingGlobal`. The turbopack schema uses `z.strictObject`\n * so unrecognised keys fail — a successful parse means the field is present.\n *\n * Exported for unit testing.\n */\nexport function isChunkLoadingGlobalSupported(schema: ZodSchema): boolean {\n return schema.safeParse({ turbopack: { chunkLoadingGlobal: '__test__' } })\n .success;\n}\n\n/**\n * Loads `next/dist/server/config-schema.js` from the consuming app's own\n * `node_modules` (resolved from `process.cwd()`), not from the location of\n * this package. This ensures the schema reflects the exact Next.js version\n * installed in the app rather than whatever is hoisted to the workspace root.\n */\nfunction loadAppConfigSchema(): ZodSchema | undefined {\n try {\n const appRequire = createRequire(join(process.cwd(), 'package.json'));\n const mod = appRequire('next/dist/server/config-schema.js') as {\n configSchema: ZodSchema;\n };\n return mod.configSchema;\n } catch {\n return undefined;\n }\n}\n\nfunction readProjectPackageJson(): { name: string; type: string } {\n const defaults = { name: basename(process.cwd()), type: 'module' };\n try {\n const packageJsonPath = findUpSync('package.json', {\n cwd: process.cwd(),\n });\n if (packageJsonPath) {\n return {\n ...defaults,\n ...(JSON.parse(readFileSync(packageJsonPath, 'utf8')) as {\n name: string;\n type: string;\n }),\n };\n }\n } catch {\n // noop\n }\n return defaults;\n}\n\ninterface WithRemoteComponentsOptions {\n /**\n * An array of package names that should be shared between the host and remote components.\n * This is useful for ensuring that both the host and remote components use the same version\n * of shared libraries.\n *\n * Essential packages are included by default: `react`, `react-dom`, `next/navigation`, `next/link`, `next/form`, `next/image` (loader only), and `next/script`.\n */\n shared?: string[];\n}\n\n/**\n * This function configures Next.js to support Remote Components.\n * You need to also use the `withMicrofrontends` function to extend your Next.js configuration.\n *\n * @param nextConfig - The Next.js configuration object.\n * @param options - Optional configuration for remote components.\n * @returns The modified Next.js configuration object with remote components support.\n *\n * @example\n *\n * ```js\n * import { withMicrofrontends } from '@vercel/microfrontends/next/config';\n * import { withRemoteComponentsConfig } from 'remote-components/config/nextjs';\n *\n * const nextConfig = {\n * // your Next.js configuration\n * };\n *\n * export default withRemoteComponentsConfig(\n * withMicrofrontends(nextConfig),\n * {\n * shared: ['some-package', 'another-package'],\n * },\n * );\n * ```\n */\nexport function withRemoteComponentsConfig(\n nextConfig: NextConfig,\n options?: WithRemoteComponentsOptions,\n) {\n const virtualRemoteComponentAppSharedRemote = join(\n process.cwd(),\n '.remote-components/shared/app-remote.tsx',\n );\n const virtualRemoteComponentPagesSharedRemote = join(\n process.cwd(),\n '.remote-components/shared/pages-remote.tsx',\n );\n const virtualRemoteComponentAppSharedHost = join(\n process.cwd(),\n '.remote-components/shared/app-host.tsx',\n );\n const virtualRemoteComponentPagesSharedHost = join(\n process.cwd(),\n '.remote-components/shared/pages-host.tsx',\n );\n\n const appShared = new Set([\n ...CORE_REACT_SHARED_KEYS,\n 'next/navigation',\n 'next/dist/client/components/navigation',\n 'next/link',\n 'next/dist/client/app-dir/link',\n 'next/form',\n 'next/dist/client/app-dir/form',\n 'next/dist/shared/lib/image-loader',\n 'next/script',\n 'next/dist/client/script',\n 'next/dist/build/polyfills/process',\n ...(options?.shared ?? []),\n ]);\n const pagesShared = new Set([\n ...CORE_REACT_SHARED_KEYS,\n 'next/router',\n 'next/link',\n 'next/dist/shared/lib/image-loader',\n 'next/script',\n 'next/form',\n ...(options?.shared ?? []),\n ]);\n\n const vendorShared = { ...VENDOR_SHARED };\n\n // resolve using enhanced-resolve\n // named import does not work with enhanced-resolve when using cjs\n // eslint-disable-next-line import/no-named-as-default-member\n const resolve = enhancedResolve.create.sync({\n conditionNames: ['browser', 'import', 'module', 'require'],\n ...(existsSync(join(process.cwd(), 'tsconfig.json'))\n ? {\n extensions: ['.js', '.jsx', '.ts', '.tsx'],\n plugins: [\n new TsConfigPathsWebpackPlugin({\n configFile: join(process.cwd(), 'tsconfig.json'),\n }) as unknown as enhancedResolve.Plugin,\n ],\n }\n : {}),\n });\n\n const packageJson = readProjectPackageJson();\n\n const generateSharedModule = ({\n sharedEntries,\n sharedManifest,\n }: {\n sharedEntries: string[];\n sharedManifest?: string;\n }) => {\n const shared = sharedEntries.join('\\n');\n\n if (packageJson.type !== 'module') {\n const exports = [`shared: {\\n${shared}\\n}`];\n if (sharedManifest) {\n exports.push(`sharedManifest: ${sharedManifest}`);\n }\n return `'use client';\\nmodule.exports = {\\n${exports.join(',\\n')}\\n};\\n`;\n }\n\n return `'use client';\\nexport const shared = {\\n${shared}\\n};\\n${\n sharedManifest ? `export const sharedManifest = ${sharedManifest};\\n` : ''\n }`;\n };\n\n const resolveSharedPath = (moduleName: string): string | undefined => {\n try {\n const resolved = resolve(process.cwd(), moduleName);\n if (resolved) {\n return relative(process.cwd(), resolved).replace(\n /^(?<relative>\\.\\.\\/)+/,\n '',\n );\n }\n } catch {\n // if module resolution using enhanced-resolve fails, fallback to require.resolve called in the shared/remote file\n }\n };\n\n const sharedKeyExpression = (moduleName: string): string => {\n const path = resolveSharedPath(moduleName);\n return (\n vendorShared[moduleName] ??\n (path ? `'${path}'` : `require.resolve('${moduleName}')`)\n );\n };\n\n const generateSharedRemote = (sharedRemote: Set<string>) => {\n const sharedEntries = Array.from(sharedRemote).reduce<string[]>(\n (acc, curr) => {\n const id = sharedKeyExpression(curr);\n // @legacy(remote-components<=0.4.x): keep emitting the historical\n // shared map until hosts on 0.4.x are outside the compatibility window.\n acc.push(`[${id}]: '${curr}',`);\n acc.push(\n `['__remote_shared_module_${curr}']: () => import('${curr}'),`,\n );\n return acc;\n },\n [],\n );\n const requirements = Array.from(sharedRemote)\n .map(\n (curr) =>\n `{ id: ${sharedKeyExpression(curr)}, specifier: '${curr}', required: true, singleton: true }`,\n )\n .join(',\\n');\n return generateSharedModule({\n sharedEntries,\n sharedManifest: `{ protocol: '${SHARED_MODULE_MANIFEST_PROTOCOL}', requirements: [\\n${requirements}\\n] }`,\n });\n };\n const generateSharedHost = (sharedHost: Set<string>) =>\n generateSharedModule({\n sharedEntries: Array.from(sharedHost).reduce<string[]>((acc, curr) => {\n acc.push(`['${curr}']: () => import('${curr}'),`);\n return acc;\n }, []),\n });\n\n const appSharedRemote = generateSharedRemote(appShared);\n const pagesSharedRemote = generateSharedRemote(pagesShared);\n\n const appSharedHost = generateSharedHost(appShared);\n const pagesSharedHost = generateSharedHost(pagesShared);\n\n const emitSharedFiles = () => {\n mkdirSync(dirname(virtualRemoteComponentAppSharedRemote), {\n recursive: true,\n });\n\n writeFileSync(\n virtualRemoteComponentAppSharedRemote,\n appSharedRemote,\n 'utf-8',\n );\n writeFileSync(\n virtualRemoteComponentPagesSharedRemote,\n pagesSharedRemote,\n 'utf-8',\n );\n writeFileSync(virtualRemoteComponentAppSharedHost, appSharedHost, 'utf-8');\n writeFileSync(\n virtualRemoteComponentPagesSharedHost,\n pagesSharedHost,\n 'utf-8',\n );\n };\n\n nextConfig.transpilePackages = [\n ...(nextConfig.transpilePackages ?? []),\n 'remote-components',\n ];\n\n nextConfig.env = {\n ...nextConfig.env,\n REMOTE_COMPONENTS_CONFIGURED: '1',\n };\n\n const alias = {\n '#remote-components/remote/defaults/app': `./${relative(\n process.cwd(),\n virtualRemoteComponentAppSharedRemote,\n )}`,\n '#remote-components/remote/defaults/pages': `./${relative(\n process.cwd(),\n virtualRemoteComponentPagesSharedRemote,\n )}`,\n '#remote-components/host/defaults/app': `./${relative(\n process.cwd(),\n virtualRemoteComponentAppSharedHost,\n )}`,\n '#remote-components/host/defaults/pages': `./${relative(\n process.cwd(),\n virtualRemoteComponentPagesSharedHost,\n )}`,\n };\n\n const projectId = resolveProjectId(packageJson.name);\n process.env.REMOTE_COMPONENTS_PROJECT_ID = projectId;\n\n if (hasPagesDirectory()) {\n // Log instead of throwing for the version check because\n // withRemoteComponentsConfig is shared by both hosts and remotes.\n // Only Pages Router hosts are broken on Next.js < 16 — remotes\n // work fine and must not have their builds blocked.\n const nextMajor = getNextMajorVersion();\n if (nextMajor !== undefined && nextMajor < 16) {\n const log =\n process.env.NODE_ENV !== 'production' ||\n process.env.VERCEL_ENV === 'preview'\n ? logWarn\n : logDebug;\n log(\n 'Config',\n `Remote Components does not support Pages Router hosts on Next.js ${nextMajor}. ` +\n 'Pages Router remotes are unaffected. Upgrade to Next.js 16+ for host support.',\n );\n }\n }\n\n if (process.env.TURBOPACK) {\n const appConfigSchema = loadAppConfigSchema();\n if (\n !appConfigSchema?.safeParse({\n turbopack: {\n resolveAlias: {\n ...alias,\n },\n },\n compiler: {\n defineServer: {\n REMOTE_COMPONENTS_PROJECT_ID: projectId,\n },\n },\n }).success\n ) {\n logError(\n 'Config',\n 'Turbopack support requires a Next.js version that includes `compiler.defineServer`. ' +\n 'Upgrade Next.js to continue using Remote Components with Turbopack.',\n );\n process.exit(1);\n }\n const chunkLoadingGlobalSupported =\n appConfigSchema !== undefined &&\n isChunkLoadingGlobalSupported(appConfigSchema);\n // Next.js auto-prefixes chunkLoadingGlobal with \"TURBOPACK_\" when the value\n // doesn't already start with it. We set the prefix ourselves so the final\n // global name is predictable: TURBOPACK_remote_chunk_loading_global_<id>.\n const chunkLoadingGlobalValue = `TURBOPACK_remote_chunk_loading_global_${projectId}`;\n if (chunkLoadingGlobalSupported) {\n logDebug(\n 'Config',\n `Turbopack chunkLoadingGlobal set to \"${chunkLoadingGlobalValue}\" — ` +\n 'chunks will use a build-time scoped global (no runtime TURBOPACK rename needed).',\n );\n } else {\n logDebug(\n 'Config',\n 'Turbopack chunkLoadingGlobal not supported by this Next.js version — ' +\n 'falling back to runtime TURBOPACK global rename.',\n );\n }\n nextConfig.turbopack = {\n ...nextConfig.turbopack,\n resolveAlias: {\n ...nextConfig.turbopack?.resolveAlias,\n ...alias,\n },\n ...(chunkLoadingGlobalSupported\n ? { chunkLoadingGlobal: chunkLoadingGlobalValue }\n : {}),\n };\n nextConfig.compiler = {\n ...nextConfig.compiler,\n defineServer: {\n ...nextConfig.compiler?.defineServer,\n 'process.env.REMOTE_COMPONENTS_PROJECT_ID': projectId,\n },\n };\n emitSharedFiles();\n return nextConfig;\n }\n\n // apply the webpack transform\n return webpackTransform(nextConfig, {\n app: { name: projectId },\n alias,\n emitSharedFiles,\n });\n}\n","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","/**\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","import { join } from 'node:path';\nimport type { NextConfig } from 'next';\nimport type { WebpackOptionsNormalized } from 'webpack';\nimport { ConditionalExecPlugin } from './plugins/conditional-exec';\nimport { ModuleIdEmbedPlugin } from './plugins/module-id-embed';\nimport { PatchRequirePlugin } from './plugins/patch-require';\nimport { RemoteWebpackRequirePlugin } from './plugins/remote-webpack-require';\n\nexport function transform(\n nextConfig: NextConfig,\n {\n app,\n alias = {},\n emitSharedFiles = () => {\n // no-op by default\n },\n }: {\n app: { name: string };\n alias?: Record<string, string>;\n emitSharedFiles?: () => void;\n },\n) {\n const webpackConfig = nextConfig.webpack;\n\n nextConfig.webpack = (\n baseConfig: WebpackOptionsNormalized,\n webpackContext,\n ) => {\n // execute the client config first, otherwise their config may accidentally\n // overwrite our required config - leading to unexpected errors.\n const config = (\n typeof webpackConfig === 'function'\n ? (webpackConfig(baseConfig, webpackContext) ?? baseConfig)\n : baseConfig\n ) as WebpackOptionsNormalized;\n\n // remote component specific plugins\n config.plugins.push(\n new RemoteWebpackRequirePlugin(app.name),\n new ModuleIdEmbedPlugin(app.name, { isServer: webpackContext.isServer }),\n new ConditionalExecPlugin(app.name),\n new PatchRequirePlugin(app.name),\n );\n if (!webpackContext.isServer) {\n // change the chunk loading global to avoid conflicts with other remote components\n config.output.chunkLoadingGlobal = `__remote_chunk_loading_global_${app.name}__`;\n }\n\n config.resolve = {\n ...config.resolve,\n alias: {\n ...config.resolve.alias,\n ...Object.fromEntries(\n Object.entries(alias).map(([key, value]) => [\n key,\n join(process.cwd(), value),\n ]),\n ),\n },\n };\n\n emitSharedFiles();\n return config;\n };\n\n return nextConfig;\n}\n"]}
@@ -1,5 +1,18 @@
1
1
  import { NextConfig } from 'next';
2
2
 
3
+ interface ZodSchema {
4
+ safeParse: (data: unknown) => {
5
+ success: boolean;
6
+ };
7
+ }
8
+ /**
9
+ * Returns true when the installed Next.js version's config schema accepts
10
+ * `turbopack.chunkLoadingGlobal`. The turbopack schema uses `z.strictObject`
11
+ * so unrecognised keys fail — a successful parse means the field is present.
12
+ *
13
+ * Exported for unit testing.
14
+ */
15
+ declare function isChunkLoadingGlobalSupported(schema: ZodSchema): boolean;
3
16
  interface WithRemoteComponentsOptions {
4
17
  /**
5
18
  * An array of package names that should be shared between the host and remote components.
@@ -38,4 +51,4 @@ interface WithRemoteComponentsOptions {
38
51
  */
39
52
  declare function withRemoteComponentsConfig(nextConfig: NextConfig, options?: WithRemoteComponentsOptions): NextConfig;
40
53
 
41
- export { withRemoteComponentsConfig };
54
+ export { isChunkLoadingGlobalSupported, withRemoteComponentsConfig };
@@ -1,7 +1,8 @@
1
1
  import {
2
2
  CORE_REACT_SHARED_KEYS,
3
+ SHARED_MODULE_MANIFEST_PROTOCOL,
3
4
  VENDOR_SHARED
4
- } from "../chunk-55TEMSB5.js";
5
+ } from "../chunk-JZRA6DPE.js";
5
6
  import "../chunk-D5GNZB6O.js";
6
7
  import "../chunk-STIJO4AG.js";
7
8
  import {
@@ -20,10 +21,10 @@ import "../chunk-ENYGL5CO.js";
20
21
 
21
22
  // src/config/nextjs/index.ts
22
23
  import { existsSync, mkdirSync, readFileSync as readFileSync2, writeFileSync } from "node:fs";
24
+ import { createRequire } from "node:module";
23
25
  import { basename, dirname, join as join2, relative } from "node:path";
24
26
  import enhancedResolve from "enhanced-resolve";
25
27
  import { findUpSync as findUpSync2 } from "find-up";
26
- import { configSchema } from "next/dist/server/config-schema.js";
27
28
  import TsConfigPathsWebpackPlugin from "tsconfig-paths-webpack-plugin";
28
29
 
29
30
  // src/utils/project-id.ts
@@ -108,6 +109,18 @@ function getNextMajorVersion() {
108
109
  function hasPagesDirectory() {
109
110
  return existsSync(join2(process.cwd(), "pages")) || existsSync(join2(process.cwd(), "src/pages"));
110
111
  }
112
+ function isChunkLoadingGlobalSupported(schema) {
113
+ return schema.safeParse({ turbopack: { chunkLoadingGlobal: "__test__" } }).success;
114
+ }
115
+ function loadAppConfigSchema() {
116
+ try {
117
+ const appRequire = createRequire(join2(process.cwd(), "package.json"));
118
+ const mod = appRequire("next/dist/server/config-schema.js");
119
+ return mod.configSchema;
120
+ } catch {
121
+ return void 0;
122
+ }
123
+ }
111
124
  function readProjectPackageJson() {
112
125
  const defaults = { name: basename(process.cwd()), type: "module" };
113
126
  try {
@@ -177,8 +190,31 @@ function withRemoteComponentsConfig(nextConfig, options) {
177
190
  } : {}
178
191
  });
179
192
  const packageJson = readProjectPackageJson();
180
- const exportPre = packageJson.type !== "module" ? "module.exports = { shared: { " : "export const shared = { ";
181
- const exportPost = packageJson.type !== "module" ? "} };\n" : "};\n";
193
+ const generateSharedModule = ({
194
+ sharedEntries,
195
+ sharedManifest
196
+ }) => {
197
+ const shared = sharedEntries.join("\n");
198
+ if (packageJson.type !== "module") {
199
+ const exports = [`shared: {
200
+ ${shared}
201
+ }`];
202
+ if (sharedManifest) {
203
+ exports.push(`sharedManifest: ${sharedManifest}`);
204
+ }
205
+ return `'use client';
206
+ module.exports = {
207
+ ${exports.join(",\n")}
208
+ };
209
+ `;
210
+ }
211
+ return `'use client';
212
+ export const shared = {
213
+ ${shared}
214
+ };
215
+ ${sharedManifest ? `export const sharedManifest = ${sharedManifest};
216
+ ` : ""}`;
217
+ };
182
218
  const resolveSharedPath = (moduleName) => {
183
219
  try {
184
220
  const resolved = resolve(process.cwd(), moduleName);
@@ -191,22 +227,38 @@ function withRemoteComponentsConfig(nextConfig, options) {
191
227
  } catch {
192
228
  }
193
229
  };
194
- const generateSharedRemote = (sharedRemote) => `'use client';
195
- ${exportPre}${Array.from(sharedRemote).reduce((acc, curr) => {
196
- const path = resolveSharedPath(curr);
197
- acc.push(
198
- `[${vendorShared[curr] ?? (path ? `'${path}'` : `require.resolve('${curr}')`)}]: '${curr}',`
199
- );
200
- acc.push(
201
- `['__remote_shared_module_${curr}']: () => import('${curr}'),`
230
+ const sharedKeyExpression = (moduleName) => {
231
+ const path = resolveSharedPath(moduleName);
232
+ return vendorShared[moduleName] ?? (path ? `'${path}'` : `require.resolve('${moduleName}')`);
233
+ };
234
+ const generateSharedRemote = (sharedRemote) => {
235
+ const sharedEntries = Array.from(sharedRemote).reduce(
236
+ (acc, curr) => {
237
+ const id = sharedKeyExpression(curr);
238
+ acc.push(`[${id}]: '${curr}',`);
239
+ acc.push(
240
+ `['__remote_shared_module_${curr}']: () => import('${curr}'),`
241
+ );
242
+ return acc;
243
+ },
244
+ []
202
245
  );
203
- return acc;
204
- }, []).join("\n")}${exportPost}`;
205
- const generateSharedHost = (sharedHost) => `'use client';
206
- ${exportPre}${Array.from(sharedHost).reduce((acc, curr) => {
207
- acc.push(`['${curr}']: () => import('${curr}'),`);
208
- return acc;
209
- }, []).join("\n")}${exportPost}`;
246
+ const requirements = Array.from(sharedRemote).map(
247
+ (curr) => `{ id: ${sharedKeyExpression(curr)}, specifier: '${curr}', required: true, singleton: true }`
248
+ ).join(",\n");
249
+ return generateSharedModule({
250
+ sharedEntries,
251
+ sharedManifest: `{ protocol: '${SHARED_MODULE_MANIFEST_PROTOCOL}', requirements: [
252
+ ${requirements}
253
+ ] }`
254
+ });
255
+ };
256
+ const generateSharedHost = (sharedHost) => generateSharedModule({
257
+ sharedEntries: Array.from(sharedHost).reduce((acc, curr) => {
258
+ acc.push(`['${curr}']: () => import('${curr}'),`);
259
+ return acc;
260
+ }, [])
261
+ });
210
262
  const appSharedRemote = generateSharedRemote(appShared);
211
263
  const pagesSharedRemote = generateSharedRemote(pagesShared);
212
264
  const appSharedHost = generateSharedHost(appShared);
@@ -271,7 +323,8 @@ ${exportPre}${Array.from(sharedHost).reduce((acc, curr) => {
271
323
  }
272
324
  }
273
325
  if (process.env.TURBOPACK) {
274
- if (!configSchema.safeParse({
326
+ const appConfigSchema = loadAppConfigSchema();
327
+ if (!appConfigSchema?.safeParse({
275
328
  turbopack: {
276
329
  resolveAlias: {
277
330
  ...alias
@@ -289,12 +342,26 @@ ${exportPre}${Array.from(sharedHost).reduce((acc, curr) => {
289
342
  );
290
343
  process.exit(1);
291
344
  }
345
+ const chunkLoadingGlobalSupported = appConfigSchema !== void 0 && isChunkLoadingGlobalSupported(appConfigSchema);
346
+ const chunkLoadingGlobalValue = `TURBOPACK_remote_chunk_loading_global_${projectId}`;
347
+ if (chunkLoadingGlobalSupported) {
348
+ logDebug(
349
+ "Config",
350
+ `Turbopack chunkLoadingGlobal set to "${chunkLoadingGlobalValue}" \u2014 chunks will use a build-time scoped global (no runtime TURBOPACK rename needed).`
351
+ );
352
+ } else {
353
+ logDebug(
354
+ "Config",
355
+ "Turbopack chunkLoadingGlobal not supported by this Next.js version \u2014 falling back to runtime TURBOPACK global rename."
356
+ );
357
+ }
292
358
  nextConfig.turbopack = {
293
359
  ...nextConfig.turbopack,
294
360
  resolveAlias: {
295
361
  ...nextConfig.turbopack?.resolveAlias,
296
362
  ...alias
297
- }
363
+ },
364
+ ...chunkLoadingGlobalSupported ? { chunkLoadingGlobal: chunkLoadingGlobalValue } : {}
298
365
  };
299
366
  nextConfig.compiler = {
300
367
  ...nextConfig.compiler,
@@ -313,6 +380,7 @@ ${exportPre}${Array.from(sharedHost).reduce((acc, curr) => {
313
380
  });
314
381
  }
315
382
  export {
383
+ isChunkLoadingGlobalSupported,
316
384
  withRemoteComponentsConfig
317
385
  };
318
386
  //# sourceMappingURL=nextjs.js.map