@reckona/mreact-router 0.0.132 → 0.0.134

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 (48) hide show
  1. package/dist/adapters/cloudflare.js +1 -1
  2. package/dist/adapters/cloudflare.js.map +1 -1
  3. package/dist/adapters/static.js +5 -1
  4. package/dist/adapters/static.js.map +1 -1
  5. package/dist/build.d.ts +1 -0
  6. package/dist/build.d.ts.map +1 -1
  7. package/dist/build.js +136 -41
  8. package/dist/build.js.map +1 -1
  9. package/dist/client.d.ts.map +1 -1
  10. package/dist/client.js +166 -8
  11. package/dist/client.js.map +1 -1
  12. package/dist/http.d.ts +1 -0
  13. package/dist/http.d.ts.map +1 -1
  14. package/dist/http.js +7 -1
  15. package/dist/http.js.map +1 -1
  16. package/dist/module-runner.d.ts +4 -1
  17. package/dist/module-runner.d.ts.map +1 -1
  18. package/dist/module-runner.js +3 -2
  19. package/dist/module-runner.js.map +1 -1
  20. package/dist/render.d.ts +6 -1
  21. package/dist/render.d.ts.map +1 -1
  22. package/dist/render.js +84 -46
  23. package/dist/render.js.map +1 -1
  24. package/dist/routes.js +1 -1
  25. package/dist/routes.js.map +1 -1
  26. package/dist/serve.d.ts.map +1 -1
  27. package/dist/serve.js +110 -17
  28. package/dist/serve.js.map +1 -1
  29. package/dist/vite-plugin-cache-key.d.ts +2 -1
  30. package/dist/vite-plugin-cache-key.d.ts.map +1 -1
  31. package/dist/vite-plugin-cache-key.js +9 -0
  32. package/dist/vite-plugin-cache-key.js.map +1 -1
  33. package/dist/vite.d.ts +2 -1
  34. package/dist/vite.d.ts.map +1 -1
  35. package/dist/vite.js +2 -0
  36. package/dist/vite.js.map +1 -1
  37. package/package.json +11 -11
  38. package/src/adapters/cloudflare.ts +1 -1
  39. package/src/adapters/static.ts +7 -1
  40. package/src/build.ts +201 -53
  41. package/src/client.ts +284 -17
  42. package/src/http.ts +9 -1
  43. package/src/module-runner.ts +8 -2
  44. package/src/render.ts +117 -21
  45. package/src/routes.ts +1 -1
  46. package/src/serve.ts +167 -18
  47. package/src/vite-plugin-cache-key.ts +12 -1
  48. package/src/vite.ts +4 -0
package/dist/render.js CHANGED
@@ -4,7 +4,7 @@ import { access, readFile, stat } from "node:fs/promises";
4
4
  import { dirname, join, relative, resolve, sep } from "node:path";
5
5
  import { formatDiagnostic, transform } from "@reckona/mreact-compiler";
6
6
  import { createQueryClient, dehydrate, __MREACT_QUERY_STATE_SCRIPT_ID, runWithQueryClient, } from "@reckona/mreact-query";
7
- import { createStringSink, renderAsyncBoundary, renderOutOfOrderReorderScript, renderToReadableStream, } from "@reckona/mreact-server";
7
+ import { createStringSink, renderAsyncBoundary, renderOutOfOrderReorderScript, renderReactNodeToString, renderToReadableStream, } from "@reckona/mreact-server";
8
8
  import { createClientRouteInferenceCache, formatClientRouteInferenceDiagnostic, inferClientRouteModule, } from "./client-route-inference.js";
9
9
  import { hydrationMarkerParts, routeIdForPath, withHydrationMarkers, withRouteMarkers, } from "./navigation-runtime.js";
10
10
  import { assetPath } from "./assets.js";
@@ -24,7 +24,7 @@ import { hasLoaderExport, isStreamRouteSource, routeClosureMayUseAwaitBoundary,
24
24
  import { emitRouterLog, logDurationMs, logNow } from "./logger.js";
25
25
  import { createRouterRuntimeCacheCounters, readRouterRuntimeCacheEntry, routerRuntimeCacheStat, } from "./cache-stats.js";
26
26
  import { bundleRouterModule } from "./bundle-pipeline.js";
27
- import { vitePluginsCacheKey } from "./vite-plugin-cache-key.js";
27
+ import { viteDefineCacheKey, vitePluginsCacheKey } from "./vite-plugin-cache-key.js";
28
28
  import { invokeRouterInstrumentation, traceContextFromRequest, } from "./trace.js";
29
29
  import { mergeRouteMiddlewareControls, middlewareMatches, parseRouteMiddlewareControl, parseStaticMiddlewareConfig, shouldSkipMiddleware, } from "./middleware.js";
30
30
  import { applyFileConventionMetadata, injectHeadMetadata, mergeRouteMetadata, responseHeadersForMetadata, serializeRobots, serializeSitemap, } from "./metadata.js";
@@ -51,6 +51,7 @@ export async function preloadBuiltRequestModules(options) {
51
51
  serverModules: options.serverModules,
52
52
  serverModuleCacheVersion: options.serverModuleCacheVersion,
53
53
  serverSourceFiles: options.serverSourceFiles,
54
+ define: options.define,
54
55
  vitePlugins: options.vitePlugins,
55
56
  });
56
57
  }
@@ -65,6 +66,7 @@ export async function preloadBuiltRequestModules(options) {
65
66
  serverModules: options.serverModules,
66
67
  serverModuleCacheVersion: options.serverModuleCacheVersion,
67
68
  serverSourceFiles: options.serverSourceFiles,
69
+ define: options.define,
68
70
  vitePlugins: options.vitePlugins,
69
71
  });
70
72
  continue;
@@ -96,6 +98,7 @@ export async function preloadBuiltRequestModules(options) {
96
98
  importPolicy: options.importPolicy,
97
99
  serverModules: options.serverModules,
98
100
  serverModuleCacheVersion: options.serverModuleCacheVersion,
101
+ define: options.define,
99
102
  vitePlugins: options.vitePlugins,
100
103
  });
101
104
  }
@@ -117,7 +120,7 @@ async function preloadBuiltPageRouteModules(options) {
117
120
  serverOutput: "string",
118
121
  });
119
122
  assertNoFatalServerDiagnostics(options.file, stringOutput.diagnostics);
120
- await loadServerModule(stringOutput.code, options.file, options.serverModules, options.serverModuleCacheVersion, options.vitePlugins);
123
+ await loadServerModule(stringOutput.code, options.file, options.serverModules, options.serverModuleCacheVersion, options.define, options.vitePlugins);
121
124
  }
122
125
  if (options.analysis.streamRoute) {
123
126
  const streamOutput = transformServerModule({
@@ -130,7 +133,7 @@ async function preloadBuiltPageRouteModules(options) {
130
133
  serverAwaitHydration: options.analysis.clientInference.client,
131
134
  });
132
135
  assertNoFatalServerDiagnostics(options.file, streamOutput.diagnostics);
133
- await loadServerStreamModule(streamOutput.code, options.file, options.serverModules, options.serverModuleCacheVersion, options.vitePlugins);
136
+ await loadServerStreamModule(streamOutput.code, options.file, options.serverModules, options.serverModuleCacheVersion, options.define, options.vitePlugins);
134
137
  }
135
138
  await preloadShellModulesForPage({
136
139
  appDir: options.appDir,
@@ -138,6 +141,7 @@ async function preloadBuiltPageRouteModules(options) {
138
141
  serverModules: options.serverModules,
139
142
  serverModuleCacheVersion: options.serverModuleCacheVersion,
140
143
  serverSourceFiles: options.serverSourceFiles,
144
+ define: options.define,
141
145
  vitePlugins: options.vitePlugins,
142
146
  });
143
147
  if (!hasGenerateMetadataExport(options.code)) {
@@ -155,6 +159,7 @@ async function preloadBuiltPageRouteModules(options) {
155
159
  serverModules: options.serverModules,
156
160
  serverModuleCacheVersion: options.serverModuleCacheVersion,
157
161
  serverSourceFiles: options.serverSourceFiles,
162
+ define: options.define,
158
163
  vitePlugins: options.vitePlugins,
159
164
  });
160
165
  }
@@ -170,7 +175,7 @@ async function preloadShellModulesForPage(options) {
170
175
  serverOutput: "string",
171
176
  });
172
177
  assertNoFatalServerDiagnostics(shell.file, output.diagnostics);
173
- await loadServerModule(output.code, shell.file, options.serverModules, options.serverModuleCacheVersion, options.vitePlugins);
178
+ await loadServerModule(output.code, shell.file, options.serverModules, options.serverModuleCacheVersion, options.define, options.vitePlugins);
174
179
  }
175
180
  }
176
181
  function fatalServerDiagnostics(diagnostics) {
@@ -364,6 +369,7 @@ async function renderAppRequestInternal(options) {
364
369
  serverModuleCacheVersion: options.serverModuleCacheVersion,
365
370
  serverSourceFiles: options.serverSourceFiles,
366
371
  timing,
372
+ define: options.define,
367
373
  vitePlugins: options.vitePlugins,
368
374
  });
369
375
  finishRenderTimingPhase(timing, phaseStartedAt, "middlewareMs");
@@ -487,6 +493,7 @@ async function renderAppRequestInternal(options) {
487
493
  clientRouteInferenceCache,
488
494
  serverModuleCacheVersion: options.serverModuleCacheVersion,
489
495
  serverSourceFiles: options.serverSourceFiles,
496
+ define: options.define,
490
497
  timing,
491
498
  vitePlugins: options.vitePlugins,
492
499
  });
@@ -533,6 +540,7 @@ async function renderAppRequestInternal(options) {
533
540
  clientRouteInferenceCache,
534
541
  serverModuleCacheVersion: undefined,
535
542
  serverSourceFiles: options.serverSourceFiles,
543
+ define: options.define,
536
544
  vitePlugins: options.vitePlugins,
537
545
  });
538
546
  finishRenderTimingPhase(timing, phaseStartedAt, "routeCodeAnalysisMs");
@@ -559,6 +567,7 @@ async function renderAppRequestInternal(options) {
559
567
  routePath: matched.route.path,
560
568
  serverModules: options.serverModules,
561
569
  serverModuleCacheVersion: options.serverModuleCacheVersion,
570
+ define: options.define,
562
571
  vitePlugins: options.vitePlugins,
563
572
  timing,
564
573
  })
@@ -631,7 +640,7 @@ async function renderAppRequestInternal(options) {
631
640
  params: matched.params,
632
641
  queryClient,
633
642
  request: options.request,
634
- }, matched.route.file, options.serverModules, options.serverModuleCacheVersion, options.vitePlugins, undefined, options.importPolicy));
643
+ }, matched.route.file, options.serverModules, options.serverModuleCacheVersion, options.define, options.vitePlugins, undefined, options.importPolicy));
635
644
  const pageHtml = renderedPage.html;
636
645
  const pageHtmlForLayout = clientRoute
637
646
  ? withHydrationMarkers({
@@ -752,6 +761,7 @@ async function renderAppRequestInternal(options) {
752
761
  assetBaseUrl: options.assetBaseUrl,
753
762
  clientRoute,
754
763
  data: dataPromise ?? Promise.resolve(undefined),
764
+ define: options.define,
755
765
  loadingFile,
756
766
  pageFile: matched.route.file,
757
767
  params: matched.params,
@@ -793,6 +803,7 @@ async function renderAppRequestInternal(options) {
793
803
  serverModules: options.serverModules,
794
804
  serverModuleCacheVersion: options.serverModuleCacheVersion,
795
805
  serverSourceFiles: options.serverSourceFiles,
806
+ define: options.define,
796
807
  vitePlugins: options.vitePlugins,
797
808
  clientRouteInferenceCache,
798
809
  importPolicy: options.importPolicy,
@@ -844,7 +855,7 @@ async function renderAppRequestInternal(options) {
844
855
  params: matched.params,
845
856
  queryClient,
846
857
  request: options.request,
847
- }, matched.route.file, options.serverModules, options.serverModuleCacheVersion, options.vitePlugins, timing, options.importPolicy));
858
+ }, matched.route.file, options.serverModules, options.serverModuleCacheVersion, options.define, options.vitePlugins, timing, options.importPolicy));
848
859
  finishRenderTimingPhase(timing, phaseStartedAt, "pageRenderMs");
849
860
  const pageHtml = renderedPage.html;
850
861
  // Wrap the page (not the full document) with the hydration marker so
@@ -906,6 +917,7 @@ async function renderAppRequestInternal(options) {
906
917
  serverModules: options.serverModules,
907
918
  serverModuleCacheVersion: options.serverModuleCacheVersion,
908
919
  serverSourceFiles: options.serverSourceFiles,
920
+ define: options.define,
909
921
  vitePlugins: options.vitePlugins,
910
922
  });
911
923
  finishRenderTimingPhase(timing, phaseStartedAt, "metadataMs");
@@ -1175,7 +1187,7 @@ async function renderSpecialRoute(options) {
1175
1187
  routeId: routeIdForPath(options.routePath ?? new URL(options.request.url).pathname),
1176
1188
  traceId: traceContextFromRequest(options.request)?.traceId,
1177
1189
  };
1178
- const pageHtml = await renderServerFileToHtml(options.routeFile, props, options.serverModules, options.serverModuleCacheVersion, options.serverSourceFiles, options.vitePlugins);
1190
+ const pageHtml = await renderServerFileToHtml(options.routeFile, props, options.serverModules, options.serverModuleCacheVersion, options.serverSourceFiles, options.define, options.vitePlugins);
1179
1191
  const pageHtmlForLayout = options.navigation?.clientRoute === true
1180
1192
  ? withHydrationMarkers({
1181
1193
  assetBaseUrl: options.assetBaseUrl,
@@ -1194,6 +1206,7 @@ async function renderSpecialRoute(options) {
1194
1206
  serverModules: options.serverModules,
1195
1207
  serverModuleCacheVersion: options.serverModuleCacheVersion,
1196
1208
  serverSourceFiles: options.serverSourceFiles,
1209
+ define: options.define,
1197
1210
  vitePlugins: options.vitePlugins,
1198
1211
  });
1199
1212
  return new Response(`<!DOCTYPE html>${clientNavigationHeadTags({
@@ -1206,7 +1219,7 @@ async function renderSpecialRoute(options) {
1206
1219
  status: options.status,
1207
1220
  });
1208
1221
  }
1209
- async function renderServerFileToHtml(file, props, serverModules, serverModuleCacheVersion, serverSourceFiles, vitePlugins) {
1222
+ async function renderServerFileToHtml(file, props, serverModules, serverModuleCacheVersion, serverSourceFiles, define, vitePlugins) {
1210
1223
  const code = await readServerSourceFile(file, serverModuleCacheVersion, serverSourceFiles);
1211
1224
  const output = transformServerModule({
1212
1225
  code,
@@ -1218,7 +1231,7 @@ async function renderServerFileToHtml(file, props, serverModules, serverModuleCa
1218
1231
  if (fatalDiagnostics.length > 0) {
1219
1232
  throw new Error(formatServerDiagnostics(file, fatalDiagnostics));
1220
1233
  }
1221
- return runServerModule(output.code, props, file, serverModules, serverModuleCacheVersion, vitePlugins);
1234
+ return runServerModule(output.code, props, file, serverModules, serverModuleCacheVersion, define, vitePlugins);
1222
1235
  }
1223
1236
  function normalizeErrorForProps(error) {
1224
1237
  if (error instanceof Error) {
@@ -1354,6 +1367,7 @@ async function loadServerRouteModule(options) {
1354
1367
  const code = await readServerSourceFile(options.file, options.serverModuleCacheVersion, options.serverSourceFiles);
1355
1368
  const externalSourceDirs = devExternalSourceDirs(options.file, options.importPolicy);
1356
1369
  if (options.serverModuleCacheVersion === undefined &&
1370
+ options.define === undefined &&
1357
1371
  (options.vitePlugins === undefined || options.vitePlugins.length === 0) &&
1358
1372
  (externalSourceDirs === undefined || !hasRelativeSourceImport(code))) {
1359
1373
  return await importAppRouterFileModule(options.file);
@@ -1370,7 +1384,7 @@ async function loadServerRouteModule(options) {
1370
1384
  });
1371
1385
  }
1372
1386
  const moduleCode = artifactCode !== undefined && artifactCode.sourceHash === codeHash ? artifactCode.code : code;
1373
- const cacheKey = `server-route\0${options.file}\0${options.serverModuleCacheVersion}\0${codeHash}\0${memoizedHashText(moduleCode)}\0${vitePluginsCacheKey(options.vitePlugins)}`;
1387
+ const cacheKey = `server-route\0${options.file}\0${options.serverModuleCacheVersion}\0${codeHash}\0${memoizedHashText(moduleCode)}\0${viteDefineCacheKey(options.define)}\0${vitePluginsCacheKey(options.vitePlugins)}`;
1374
1388
  const cached = readRouterRuntimeCacheEntry(serverRouteModuleCache, cacheKey, serverRouteModuleCacheCounters);
1375
1389
  if (cached !== undefined) {
1376
1390
  return cached;
@@ -1378,6 +1392,7 @@ async function loadServerRouteModule(options) {
1378
1392
  const loaded = importAppRouterSourceModule({
1379
1393
  cacheKey,
1380
1394
  code: moduleCode,
1395
+ define: options.define,
1381
1396
  externalizeAppSourceModuleDirs: externalSourceDirs,
1382
1397
  label: `server-route:${options.file}`,
1383
1398
  plugins: [
@@ -1440,6 +1455,7 @@ async function runMiddleware(options) {
1440
1455
  module = await loadMiddlewareModule({
1441
1456
  appDir: options.appDir,
1442
1457
  code,
1458
+ define: options.define,
1443
1459
  file,
1444
1460
  importPolicy: options.importPolicy,
1445
1461
  serverModules: options.serverModules,
@@ -1506,7 +1522,7 @@ async function loadMiddlewareModule(options) {
1506
1522
  (await readServerSourceFile(options.file, options.serverModuleCacheVersion, options.serverSourceFiles));
1507
1523
  const cacheKey = options.serverModuleCacheVersion === undefined
1508
1524
  ? undefined
1509
- : `middleware\0${options.appDir}\0${options.file}\0${options.serverModuleCacheVersion}\0${memoizedHashText(code)}\0${importPolicyCacheKey(options.importPolicy)}\0${vitePluginsCacheKey(options.vitePlugins)}`;
1525
+ : `middleware\0${options.appDir}\0${options.file}\0${options.serverModuleCacheVersion}\0${memoizedHashText(code)}\0${importPolicyCacheKey(options.importPolicy)}\0${viteDefineCacheKey(options.define)}\0${vitePluginsCacheKey(options.vitePlugins)}`;
1510
1526
  if (cacheKey !== undefined) {
1511
1527
  const cached = readRouterRuntimeCacheEntry(middlewareModuleCache, cacheKey, middlewareModuleCacheCounters);
1512
1528
  if (cached !== undefined) {
@@ -1516,6 +1532,7 @@ async function loadMiddlewareModule(options) {
1516
1532
  const loaded = loadBundledMiddlewareModule({
1517
1533
  appDir: options.appDir,
1518
1534
  code,
1535
+ define: options.define,
1519
1536
  file: options.file,
1520
1537
  importPolicy: options.importPolicy,
1521
1538
  prebuiltArtifact: prebuiltRequestModuleArtifact(options.serverModules, options.file, code),
@@ -1535,6 +1552,7 @@ async function loadMiddlewareModule(options) {
1535
1552
  export async function bundleMiddlewareModuleCode(options) {
1536
1553
  const output = await bundleRouterModule({
1537
1554
  code: options.code,
1555
+ define: options.define,
1538
1556
  filename: options.file,
1539
1557
  platform: "node",
1540
1558
  root: options.importPolicy?.projectRoot,
@@ -1566,6 +1584,7 @@ async function loadBundledMiddlewareModule(options) {
1566
1584
  (await bundleMiddlewareModuleCode({
1567
1585
  appDir: options.appDir,
1568
1586
  code: options.code,
1587
+ define: options.define,
1569
1588
  file: options.file,
1570
1589
  importPolicy: options.importPolicy,
1571
1590
  vitePlugins: options.vitePlugins,
@@ -1574,9 +1593,10 @@ async function loadBundledMiddlewareModule(options) {
1574
1593
  ...(options.serverModuleCacheVersion === undefined
1575
1594
  ? {}
1576
1595
  : {
1577
- cacheKey: `middleware:${options.file}:${options.serverModuleCacheVersion}:${memoizedHashText(compiled)}:${vitePluginsCacheKey(options.vitePlugins)}`,
1596
+ cacheKey: `middleware:${options.file}:${options.serverModuleCacheVersion}:${memoizedHashText(compiled)}:${viteDefineCacheKey(options.define)}:${vitePluginsCacheKey(options.vitePlugins)}`,
1578
1597
  }),
1579
1598
  code: compiled,
1599
+ define: options.define,
1580
1600
  label: `middleware:${options.file}`,
1581
1601
  vitePlugins: options.vitePlugins,
1582
1602
  });
@@ -1641,7 +1661,7 @@ async function analyzeRouteSource(options) {
1641
1661
  finishRenderTimingPhase(options.timing, artifactStartedAt, "sourceAnalysisArtifactMs");
1642
1662
  return analysis;
1643
1663
  }
1644
- const cacheKey = `${options.serverModuleCacheVersion ?? "dev"}\0${options.filename}\0${sourceHash}\0${vitePluginsCacheKey(options.vitePlugins)}`;
1664
+ const cacheKey = `${options.serverModuleCacheVersion ?? "dev"}\0${options.filename}\0${sourceHash}\0${viteDefineCacheKey(options.define)}\0${vitePluginsCacheKey(options.vitePlugins)}`;
1645
1665
  const cached = readRouterRuntimeCacheEntry(routeSourceAnalysisCache, cacheKey, routeSourceAnalysisCacheCounters);
1646
1666
  if (cached !== undefined) {
1647
1667
  return cached;
@@ -1700,17 +1720,20 @@ function routeSourceFilesForAnalysis(options) {
1700
1720
  ? { [options.filename]: options.code }
1701
1721
  : { ...Object.fromEntries(options.serverSourceFiles), [options.filename]: options.code };
1702
1722
  }
1703
- async function runServerModule(code, props, sourcefile, serverModules, serverModuleCacheVersion, vitePlugins) {
1704
- const component = await loadServerComponent(code, sourcefile, serverModules, serverModuleCacheVersion, vitePlugins);
1705
- return component(props);
1723
+ async function runServerModule(code, props, sourcefile, serverModules, serverModuleCacheVersion, define, vitePlugins) {
1724
+ const component = await loadServerComponent(code, sourcefile, serverModules, serverModuleCacheVersion, define, vitePlugins);
1725
+ return renderServerComponentResult(await component(props));
1706
1726
  }
1707
- async function runServerModuleWithSlots(code, props, sourcefile, serverModules, serverModuleCacheVersion, vitePlugins, timing, importPolicy) {
1727
+ async function renderServerComponentResult(value) {
1728
+ return typeof value === "string" ? value : renderReactNodeToString(value);
1729
+ }
1730
+ async function runServerModuleWithSlots(code, props, sourcefile, serverModules, serverModuleCacheVersion, define, vitePlugins, timing, importPolicy) {
1708
1731
  const moduleLoadStartedAt = renderTimingPhaseStartedAt(timing);
1709
- const module = await loadServerModule(code, sourcefile, serverModules, serverModuleCacheVersion, vitePlugins, importPolicy);
1732
+ const module = await loadServerModule(code, sourcefile, serverModules, serverModuleCacheVersion, define, vitePlugins, importPolicy);
1710
1733
  finishRenderTimingPhase(timing, moduleLoadStartedAt, "pageModuleLoadMs");
1711
1734
  const component = selectServerComponent(module);
1712
1735
  const componentStartedAt = renderTimingPhaseStartedAt(timing);
1713
- const html = await component(props);
1736
+ const html = await renderServerComponentResult(await component(props));
1714
1737
  finishRenderTimingPhase(timing, componentStartedAt, "pageComponentRenderMs");
1715
1738
  const slotsStartedAt = renderTimingPhaseStartedAt(timing);
1716
1739
  const slots = await renderRouteSlots(module.slots, props);
@@ -1720,7 +1743,7 @@ async function runServerModuleWithSlots(code, props, sourcefile, serverModules,
1720
1743
  slots,
1721
1744
  };
1722
1745
  }
1723
- async function loadServerModule(code, sourcefile, serverModules, serverModuleCacheVersion, vitePlugins, importPolicy) {
1746
+ async function loadServerModule(code, sourcefile, serverModules, serverModuleCacheVersion, define, vitePlugins, importPolicy) {
1724
1747
  const artifact = serverModules?.get(sourcefile)?.string;
1725
1748
  const codeHash = memoizedHashText(code);
1726
1749
  const prebuiltCode = prebuiltServerComponentModuleCode(artifact, code, codeHash);
@@ -1736,10 +1759,11 @@ async function loadServerModule(code, sourcefile, serverModules, serverModuleCac
1736
1759
  const moduleCode = prebuiltCode ?? code;
1737
1760
  const cacheKey = serverModuleCacheVersion === undefined
1738
1761
  ? undefined
1739
- : `server-component:${serverModuleCacheVersion}:${sourcefile}:${moduleCode === code ? codeHash : memoizedHashText(moduleCode)}:${importPolicyCacheKey(importPolicy)}:${vitePluginsCacheKey(vitePlugins)}`;
1762
+ : `server-component:${serverModuleCacheVersion}:${sourcefile}:${moduleCode === code ? codeHash : memoizedHashText(moduleCode)}:${importPolicyCacheKey(importPolicy)}:${viteDefineCacheKey(define)}:${vitePluginsCacheKey(vitePlugins)}`;
1740
1763
  return await importAppRouterSourceModule({
1741
1764
  cacheKey,
1742
1765
  code: moduleCode,
1766
+ define,
1743
1767
  label: `server-component:${sourcefile}`,
1744
1768
  plugins: importPolicy === undefined
1745
1769
  ? undefined
@@ -1757,6 +1781,7 @@ async function loadServerModule(code, sourcefile, serverModules, serverModuleCac
1757
1781
  dev: serverModuleCacheVersion === undefined,
1758
1782
  serverModules,
1759
1783
  serverOutput: "string",
1784
+ define,
1760
1785
  vitePlugins,
1761
1786
  },
1762
1787
  }
@@ -1775,8 +1800,8 @@ async function importBuiltServerModuleFile(options) {
1775
1800
  file: options.file,
1776
1801
  });
1777
1802
  }
1778
- async function loadServerComponent(code, sourcefile, serverModules, serverModuleCacheVersion, vitePlugins, importPolicy) {
1779
- const module = await loadServerModule(code, sourcefile, serverModules, serverModuleCacheVersion, vitePlugins, importPolicy);
1803
+ async function loadServerComponent(code, sourcefile, serverModules, serverModuleCacheVersion, define, vitePlugins, importPolicy) {
1804
+ const module = await loadServerModule(code, sourcefile, serverModules, serverModuleCacheVersion, define, vitePlugins, importPolicy);
1780
1805
  return selectServerComponent(module);
1781
1806
  }
1782
1807
  function selectServerComponent(module) {
@@ -1792,7 +1817,10 @@ async function renderRouteSlots(slots, props) {
1792
1817
  }
1793
1818
  const rendered = {};
1794
1819
  for (const [name, value] of Object.entries(slots)) {
1795
- rendered[name] = typeof value === "function" ? await value(props) : value;
1820
+ rendered[name] =
1821
+ typeof value === "function"
1822
+ ? await renderServerComponentResult(await value(props))
1823
+ : await renderServerComponentResult(value);
1796
1824
  }
1797
1825
  return rendered;
1798
1826
  }
@@ -1803,10 +1831,11 @@ function runServerStreamModule(code, options) {
1803
1831
  props: options.props,
1804
1832
  serverModules: options.serverModules,
1805
1833
  serverModuleCacheVersion: options.serverModuleCacheVersion,
1834
+ define: options.define,
1806
1835
  vitePlugins: options.vitePlugins,
1807
1836
  importPolicy: options.importPolicy,
1808
1837
  });
1809
- const layoutShells = await layoutShellsForPage(options.appDir, options.pageFile, options.props, slots, options.serverModules, options.serverModuleCacheVersion, options.serverSourceFiles, options.clientRouteInferenceCache, options.vitePlugins, options.importPolicy);
1838
+ const layoutShells = await layoutShellsForPage(options.appDir, options.pageFile, options.props, slots, options.serverModules, options.serverModuleCacheVersion, options.serverSourceFiles, options.clientRouteInferenceCache, options.define, options.vitePlugins, options.importPolicy);
1810
1839
  const marker = options.clientRoute
1811
1840
  ? hydrationMarkerParts({
1812
1841
  assetBaseUrl: options.assetBaseUrl,
@@ -1830,7 +1859,7 @@ function runServerStreamModule(code, options) {
1830
1859
  sink.append(shell.prefix);
1831
1860
  }
1832
1861
  sink.append(marker?.prefix ?? "");
1833
- await appendServerStreamModule(code, sink, options.props, options.pageFile, options.serverModules, options.serverModuleCacheVersion, options.vitePlugins, options.importPolicy);
1862
+ await appendServerStreamModule(code, sink, options.props, options.pageFile, options.serverModules, options.serverModuleCacheVersion, options.define, options.vitePlugins, options.importPolicy);
1834
1863
  sink.append(marker?.suffix ?? "");
1835
1864
  for (const shell of [...layoutShells].reverse()) {
1836
1865
  sink.append(shell.suffix);
@@ -1939,8 +1968,8 @@ async function runServerStreamModuleWithLoading(code, options) {
1939
1968
  queryClient: options.queryClient,
1940
1969
  request: options.request,
1941
1970
  };
1942
- const layoutShells = await layoutShellsForPage(options.appDir, options.pageFile, loadingProps, {}, options.serverModules, options.serverModuleCacheVersion, options.serverSourceFiles, options.clientRouteInferenceCache, options.vitePlugins, options.importPolicy);
1943
- const loadingHtml = await renderServerFileToHtml(options.loadingFile, loadingProps, options.serverModules, options.serverModuleCacheVersion, options.serverSourceFiles, options.vitePlugins);
1971
+ const layoutShells = await layoutShellsForPage(options.appDir, options.pageFile, loadingProps, {}, options.serverModules, options.serverModuleCacheVersion, options.serverSourceFiles, options.clientRouteInferenceCache, options.define, options.vitePlugins, options.importPolicy);
1972
+ const loadingHtml = await renderServerFileToHtml(options.loadingFile, loadingProps, options.serverModules, options.serverModuleCacheVersion, options.serverSourceFiles, options.define, options.vitePlugins);
1944
1973
  const marker = options.clientRoute
1945
1974
  ? hydrationMarkerParts({
1946
1975
  assetBaseUrl: options.assetBaseUrl,
@@ -1970,7 +1999,7 @@ async function runServerStreamModuleWithLoading(code, options) {
1970
1999
  params: options.params,
1971
2000
  queryClient: options.queryClient,
1972
2001
  request: options.request,
1973
- }, options.pageFile, options.serverModules, options.serverModuleCacheVersion, options.vitePlugins, options.importPolicy);
2002
+ }, options.pageFile, options.serverModules, options.serverModuleCacheVersion, options.define, options.vitePlugins, options.importPolicy);
1974
2003
  }, {
1975
2004
  placeholder(boundarySink) {
1976
2005
  boundarySink.append(loadingHtml);
@@ -2009,8 +2038,8 @@ async function renderVisibleOutOfOrderFragment(sink, id, value, render, options)
2009
2038
  await fragmentSink.drain();
2010
2039
  sink.append(`<template data-mreact-oob-fragment="${escapeHtmlAttribute(id)}">${fragmentSink.toString()}</template>`);
2011
2040
  }
2012
- async function appendServerStreamModule(code, sink, props, sourcefile, serverModules, serverModuleCacheVersion, vitePlugins, importPolicy) {
2013
- const module = await loadServerStreamModule(code, sourcefile, serverModules, serverModuleCacheVersion, vitePlugins, importPolicy);
2041
+ async function appendServerStreamModule(code, sink, props, sourcefile, serverModules, serverModuleCacheVersion, define, vitePlugins, importPolicy) {
2042
+ const module = await loadServerStreamModule(code, sourcefile, serverModules, serverModuleCacheVersion, define, vitePlugins, importPolicy);
2014
2043
  const component = selectStreamComponent(module);
2015
2044
  await component(sink, props);
2016
2045
  }
@@ -2018,7 +2047,7 @@ async function renderServerStreamSlots(code, options) {
2018
2047
  if (!hasRouteSlotsExport(code)) {
2019
2048
  return {};
2020
2049
  }
2021
- const module = await loadServerStreamModule(code, options.pageFile, options.serverModules, options.serverModuleCacheVersion, options.vitePlugins, options.importPolicy);
2050
+ const module = await loadServerStreamModule(code, options.pageFile, options.serverModules, options.serverModuleCacheVersion, options.define, options.vitePlugins, options.importPolicy);
2022
2051
  if (module.slots === undefined) {
2023
2052
  return {};
2024
2053
  }
@@ -2038,7 +2067,7 @@ async function renderServerStreamSlots(code, options) {
2038
2067
  function hasRouteSlotsExport(code) {
2039
2068
  return /^\s*export\s+const\s+slots\s*=/m.test(code);
2040
2069
  }
2041
- async function loadServerStreamModule(code, sourcefile, serverModules, serverModuleCacheVersion, vitePlugins, importPolicy) {
2070
+ async function loadServerStreamModule(code, sourcefile, serverModules, serverModuleCacheVersion, define, vitePlugins, importPolicy) {
2042
2071
  const artifactCode = serverModules?.get(sourcefile)?.stream;
2043
2072
  const codeHash = memoizedHashText(code);
2044
2073
  const prebuiltCode = prebuiltServerComponentModuleCode(artifactCode, code, codeHash);
@@ -2054,10 +2083,11 @@ async function loadServerStreamModule(code, sourcefile, serverModules, serverMod
2054
2083
  const moduleCode = prebuiltCode ?? code;
2055
2084
  const cacheKey = serverModuleCacheVersion === undefined
2056
2085
  ? undefined
2057
- : `server-stream-component:${serverModuleCacheVersion}:${sourcefile}:${moduleCode === code ? codeHash : memoizedHashText(moduleCode)}:${importPolicyCacheKey(importPolicy)}:${vitePluginsCacheKey(vitePlugins)}`;
2086
+ : `server-stream-component:${serverModuleCacheVersion}:${sourcefile}:${moduleCode === code ? codeHash : memoizedHashText(moduleCode)}:${importPolicyCacheKey(importPolicy)}:${viteDefineCacheKey(define)}:${vitePluginsCacheKey(vitePlugins)}`;
2058
2087
  return await importAppRouterSourceModule({
2059
2088
  cacheKey,
2060
2089
  code: moduleCode,
2090
+ define,
2061
2091
  label: `server-stream-component:${sourcefile}`,
2062
2092
  plugins: importPolicy === undefined
2063
2093
  ? undefined
@@ -2075,6 +2105,7 @@ async function loadServerStreamModule(code, sourcefile, serverModules, serverMod
2075
2105
  dev: serverModuleCacheVersion === undefined,
2076
2106
  serverModules,
2077
2107
  serverOutput: "stream",
2108
+ define,
2078
2109
  vitePlugins,
2079
2110
  },
2080
2111
  }
@@ -2096,7 +2127,7 @@ async function applyLayouts(options) {
2096
2127
  let shellHasOutOfOrderBoundary = false;
2097
2128
  const slotContext = createSlotRenderContext(options.slots);
2098
2129
  for (const shell of layoutFiles.reverse()) {
2099
- const rendered = await renderShellPrefixSuffix(options.appDir, shell, options.props, slotContext, options.serverModules, options.serverModuleCacheVersion, options.serverSourceFiles, options.clientRouteInferenceCache, options.timing, options.vitePlugins, options.importPolicy);
2130
+ const rendered = await renderShellPrefixSuffix(options.appDir, shell, options.props, slotContext, options.serverModules, options.serverModuleCacheVersion, options.serverSourceFiles, options.clientRouteInferenceCache, options.timing, options.define, options.vitePlugins, options.importPolicy);
2100
2131
  shellHasOutOfOrderBoundary ||= rendered.hasOutOfOrderBoundary;
2101
2132
  html = `${rendered.prefix}${html}${rendered.suffix}`;
2102
2133
  }
@@ -2115,12 +2146,12 @@ async function applyLayouts(options) {
2115
2146
  await sink.drain();
2116
2147
  return sink.toString();
2117
2148
  }
2118
- async function layoutShellsForPage(appDir, pageFile, props, slots, serverModules, serverModuleCacheVersion, serverSourceFiles, clientRouteInferenceCache, vitePlugins, importPolicy) {
2149
+ async function layoutShellsForPage(appDir, pageFile, props, slots, serverModules, serverModuleCacheVersion, serverSourceFiles, clientRouteInferenceCache, define, vitePlugins, importPolicy) {
2119
2150
  const layoutFiles = await shellFilesForPage(appDir, pageFile, serverModuleCacheVersion);
2120
2151
  const shells = [];
2121
2152
  const slotContext = createSlotRenderContext(slots);
2122
2153
  for (const shell of layoutFiles) {
2123
- shells.push(await renderShellPrefixSuffix(appDir, shell, props, slotContext, serverModules, serverModuleCacheVersion, serverSourceFiles, clientRouteInferenceCache, undefined, vitePlugins, importPolicy));
2154
+ shells.push(await renderShellPrefixSuffix(appDir, shell, props, slotContext, serverModules, serverModuleCacheVersion, serverSourceFiles, clientRouteInferenceCache, undefined, define, vitePlugins, importPolicy));
2124
2155
  }
2125
2156
  warnUnconsumedRouteSlots({
2126
2157
  appDir,
@@ -2130,11 +2161,11 @@ async function layoutShellsForPage(appDir, pageFile, props, slots, serverModules
2130
2161
  });
2131
2162
  return shells;
2132
2163
  }
2133
- async function renderShellPrefixSuffix(appDir, shell, props, slotContext, serverModules, serverModuleCacheVersion, serverSourceFiles, clientRouteInferenceCache, timing, vitePlugins, importPolicy) {
2164
+ async function renderShellPrefixSuffix(appDir, shell, props, slotContext, serverModules, serverModuleCacheVersion, serverSourceFiles, clientRouteInferenceCache, timing, define, vitePlugins, importPolicy) {
2134
2165
  const hasNamedSlots = Object.keys(slotContext.namedSlots).length > 0;
2135
2166
  const cacheKey = serverModuleCacheVersion === undefined || hasNamedSlots || shell.kind === "template"
2136
2167
  ? undefined
2137
- : `${appDir}\0${shell.file}\0${serverModuleCacheVersion}\0${importPolicyCacheKey(importPolicy)}\0${vitePluginsCacheKey(vitePlugins)}`;
2168
+ : `${appDir}\0${shell.file}\0${serverModuleCacheVersion}\0${importPolicyCacheKey(importPolicy)}\0${viteDefineCacheKey(define)}\0${vitePluginsCacheKey(vitePlugins)}`;
2138
2169
  if (cacheKey !== undefined) {
2139
2170
  const cached = readRouterRuntimeCacheEntry(renderedShellCache, cacheKey, renderedShellCacheCounters);
2140
2171
  if (cached !== undefined && cached !== "impure") {
@@ -2184,8 +2215,8 @@ async function renderShellPrefixSuffix(appDir, shell, props, slotContext, server
2184
2215
  }
2185
2216
  phaseStartedAt = renderTimingPhaseStartedAt(timing);
2186
2217
  const component = shellUsesAwait
2187
- ? selectStreamComponent(await loadServerStreamModule(output.code, shell.file, serverModules, serverModuleCacheVersion, vitePlugins, importPolicy))
2188
- : await loadServerComponent(output.code, shell.file, serverModules, serverModuleCacheVersion, vitePlugins, importPolicy);
2218
+ ? selectStreamComponent(await loadServerStreamModule(output.code, shell.file, serverModules, serverModuleCacheVersion, define, vitePlugins, importPolicy))
2219
+ : await loadServerComponent(output.code, shell.file, serverModules, serverModuleCacheVersion, define, vitePlugins, importPolicy);
2189
2220
  addRenderTimingPhaseDuration(timing, phaseStartedAt, "layoutModuleLoadMs");
2190
2221
  phaseStartedAt = renderTimingPhaseStartedAt(timing);
2191
2222
  const layoutHtml = shellUsesAwait
@@ -2456,7 +2487,7 @@ async function loadRouteDataWithInstrumentation(options) {
2456
2487
  async function loadRouteLoaderModule(options) {
2457
2488
  const cacheKey = options.serverModuleCacheVersion === undefined
2458
2489
  ? undefined
2459
- : `${options.appDir}\0${options.filename}\0${options.serverModuleCacheVersion}\0${memoizedHashText(options.code)}\0${importPolicyCacheKey(options.importPolicy)}\0${vitePluginsCacheKey(options.vitePlugins)}`;
2490
+ : `${options.appDir}\0${options.filename}\0${options.serverModuleCacheVersion}\0${memoizedHashText(options.code)}\0${importPolicyCacheKey(options.importPolicy)}\0${viteDefineCacheKey(options.define)}\0${vitePluginsCacheKey(options.vitePlugins)}`;
2460
2491
  if (cacheKey !== undefined) {
2461
2492
  const cached = readRouterRuntimeCacheEntry(routeLoaderModuleCache, cacheKey, routeLoaderModuleCacheCounters);
2462
2493
  if (cached !== undefined) {
@@ -2480,6 +2511,7 @@ async function loadRouteLoaderModule(options) {
2480
2511
  export async function bundleRouteLoaderModuleCode(options) {
2481
2512
  const output = await bundleRouterModule({
2482
2513
  code: stripRouteLoaderOnlyExports(options.code, options.filename),
2514
+ define: options.define,
2483
2515
  externalizeAppSourceModuleDirs: options.externalizeAppSourceModuleDirs,
2484
2516
  filename: options.filename,
2485
2517
  platform: "node",
@@ -2516,15 +2548,17 @@ async function loadBundledRouteLoaderModule(options) {
2516
2548
  : undefined,
2517
2549
  filename: options.filename,
2518
2550
  importPolicy: options.importPolicy,
2551
+ define: options.define,
2519
2552
  vitePlugins: options.vitePlugins,
2520
2553
  }));
2521
2554
  return await importAppRouterSourceModule({
2522
2555
  ...(options.serverModuleCacheVersion === undefined
2523
2556
  ? {}
2524
2557
  : {
2525
- cacheKey: `loader:${options.filename}:${options.serverModuleCacheVersion}:${memoizedHashText(code)}`,
2558
+ cacheKey: `loader:${options.filename}:${options.serverModuleCacheVersion}:${memoizedHashText(code)}:${viteDefineCacheKey(options.define)}`,
2526
2559
  }),
2527
2560
  code,
2561
+ define: options.define,
2528
2562
  label: `loader:${options.filename}`,
2529
2563
  });
2530
2564
  }
@@ -2546,9 +2580,10 @@ async function loadRouteMetadata(options) {
2546
2580
  ...(options.serverModuleCacheVersion === undefined
2547
2581
  ? {}
2548
2582
  : {
2549
- cacheKey: `metadata:${options.filename}:${options.serverModuleCacheVersion}:${memoizedHashText(code)}`,
2583
+ cacheKey: `metadata:${options.filename}:${options.serverModuleCacheVersion}:${memoizedHashText(code)}:${viteDefineCacheKey(options.define)}`,
2550
2584
  }),
2551
2585
  code,
2586
+ define: options.define,
2552
2587
  label: `metadata:${options.filename}`,
2553
2588
  });
2554
2589
  return await resolveRouteMetadataModule(module, options.context);
@@ -2576,6 +2611,7 @@ function isRouteMetadata(value) {
2576
2611
  async function bundleRouteMetadataModuleCode(options) {
2577
2612
  const output = await bundleRouterModule({
2578
2613
  code: stripRouteMetadataOnlyExports(options.code, options.filename),
2614
+ define: options.define,
2579
2615
  filename: options.filename,
2580
2616
  platform: "node",
2581
2617
  vitePlugins: options.vitePlugins,
@@ -2597,7 +2633,7 @@ async function bundleRouteMetadataModuleCode(options) {
2597
2633
  async function loadComposedRouteMetadata(options) {
2598
2634
  const cacheKey = options.serverModuleCacheVersion === undefined
2599
2635
  ? undefined
2600
- : `${options.appDir}\0${options.filename}\0${options.serverModuleCacheVersion}\0${memoizedHashText(options.code)}\0${vitePluginsCacheKey(options.vitePlugins)}`;
2636
+ : `${options.appDir}\0${options.filename}\0${options.serverModuleCacheVersion}\0${memoizedHashText(options.code)}\0${viteDefineCacheKey(options.define)}\0${vitePluginsCacheKey(options.vitePlugins)}`;
2601
2637
  if (cacheKey !== undefined) {
2602
2638
  const cached = readRouterRuntimeCacheEntry(composedRouteMetadataCache, cacheKey, composedRouteMetadataCacheCounters);
2603
2639
  if (cached !== undefined) {
@@ -2636,6 +2672,7 @@ async function loadComposedRouteMetadataUncached(options) {
2636
2672
  importPolicy: options.importPolicy,
2637
2673
  serverModules: options.serverModules,
2638
2674
  serverModuleCacheVersion: options.serverModuleCacheVersion,
2675
+ define: options.define,
2639
2676
  vitePlugins: options.vitePlugins,
2640
2677
  });
2641
2678
  if (shellMetadata !== undefined) {
@@ -2650,6 +2687,7 @@ async function loadComposedRouteMetadataUncached(options) {
2650
2687
  importPolicy: options.importPolicy,
2651
2688
  serverModules: options.serverModules,
2652
2689
  serverModuleCacheVersion: options.serverModuleCacheVersion,
2690
+ define: options.define,
2653
2691
  vitePlugins: options.vitePlugins,
2654
2692
  });
2655
2693
  if (pageMetadata !== undefined) {