@farm.js/core 0.1.19 → 0.1.20

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 (165) hide show
  1. package/dist/agent-runtime.d.mts +2 -3
  2. package/dist/agent-runtime.d.ts +2 -3
  3. package/dist/api/route-manager.cjs +5 -5
  4. package/dist/api/route-manager.d.mts +2 -3
  5. package/dist/api/route-manager.d.ts +2 -3
  6. package/dist/api/route-manager.mjs +4 -4
  7. package/dist/api.cjs +6 -6
  8. package/dist/api.d.mts +3 -4
  9. package/dist/api.d.ts +3 -4
  10. package/dist/api.mjs +5 -5
  11. package/dist/{app-BHY_10Lm.d.ts → app-DAyPE-gr.d.ts} +11 -4
  12. package/dist/{app-BMk0do23.d.mts → app-D_6nTit-.d.mts} +11 -4
  13. package/dist/app-markdown.d.mts +3 -4
  14. package/dist/app-markdown.d.ts +3 -4
  15. package/dist/{chunk-FS7FLPOG.mjs → chunk-2J7W2WND.mjs} +3 -2
  16. package/dist/{chunk-YS3TRKCG.mjs → chunk-2M435BUE.mjs} +6 -1
  17. package/dist/{chunk-WJ3HK3LJ.cjs → chunk-2QLBIPFT.cjs} +4 -4
  18. package/dist/{chunk-FJSWYIR7.cjs → chunk-3IL5UC5I.cjs} +2 -2
  19. package/dist/chunk-43FMW62B.mjs +67 -0
  20. package/dist/{chunk-A7T6345N.mjs → chunk-5UX4C5QI.mjs} +10 -7
  21. package/dist/{chunk-FVZGEVTO.mjs → chunk-5V37LKBG.mjs} +102 -38
  22. package/dist/chunk-75WGQVQA.cjs +46 -0
  23. package/dist/{chunk-RFYO7QUD.cjs → chunk-A7T6JZNI.cjs} +1 -1
  24. package/dist/{chunk-AFOD3LYZ.cjs → chunk-B3WK4DTX.cjs} +10 -9
  25. package/dist/{chunk-AORPIPNB.cjs → chunk-BHJUZ64B.cjs} +18 -14
  26. package/dist/chunk-BMWDEBXO.cjs +67 -0
  27. package/dist/{chunk-ATERBVHQ.mjs → chunk-CQHFU55R.mjs} +5 -4
  28. package/dist/{chunk-XSKZORAS.cjs → chunk-DX4VKYAJ.cjs} +5 -5
  29. package/dist/{chunk-2GNATDDE.mjs → chunk-F7E2AZKQ.mjs} +1 -1
  30. package/dist/{chunk-7WPA7GBZ.mjs → chunk-GHFS7RUB.mjs} +1 -1
  31. package/dist/{chunk-NSFC3LHB.cjs → chunk-GQFSCBKJ.cjs} +234 -170
  32. package/dist/{chunk-NZ2JVBT2.mjs → chunk-GZ3ZPTQV.mjs} +2 -2
  33. package/dist/{chunk-RKQVJN2O.mjs → chunk-JIKGGIOL.mjs} +1 -1
  34. package/dist/{chunk-WZXN4R5Y.mjs → chunk-K6MG3SEG.mjs} +106 -75
  35. package/dist/{chunk-OXSIH4D6.cjs → chunk-KNPRCKXK.cjs} +6 -1
  36. package/dist/{chunk-2ANEVVF7.mjs → chunk-NRS46D4L.mjs} +1 -1
  37. package/dist/{chunk-A72YEUZ3.mjs → chunk-OCE65DDM.mjs} +1 -1
  38. package/dist/{chunk-UDBJCUPA.mjs → chunk-PUCUVI7K.mjs} +11 -7
  39. package/dist/{chunk-XDGMADQM.cjs → chunk-PZX6I4JW.cjs} +384 -353
  40. package/dist/{chunk-GDSHDTJ4.cjs → chunk-Q5B3KJBP.cjs} +2 -2
  41. package/dist/{chunk-TSWW5BVH.mjs → chunk-QMV4QELL.mjs} +1 -1
  42. package/dist/{chunk-V4AICMQA.mjs → chunk-RMIJFZU3.mjs} +26 -2
  43. package/dist/{chunk-MKB2EGIR.cjs → chunk-SOR334EB.cjs} +3 -2
  44. package/dist/{chunk-57J3Y7Y3.mjs → chunk-TIKNUAU7.mjs} +3 -2
  45. package/dist/chunk-VVBO3QH7.mjs +46 -0
  46. package/dist/{chunk-QBPKKQTD.mjs → chunk-W7MZXRXM.mjs} +19 -4
  47. package/dist/{chunk-Y53ZSFN6.cjs → chunk-WM6HL7E7.cjs} +4 -3
  48. package/dist/{chunk-GPVTX3HT.cjs → chunk-XFFQSD2F.cjs} +2 -2
  49. package/dist/{chunk-62YJ2IEB.cjs → chunk-XI3GWPUS.cjs} +23 -20
  50. package/dist/{chunk-KVFPGF2M.cjs → chunk-YJJLXIIS.cjs} +7 -7
  51. package/dist/{chunk-U5BMPGS3.cjs → chunk-YP5JZ4LF.cjs} +32 -8
  52. package/dist/{chunk-S27FMYAM.cjs → chunk-ZE6ONQ5R.cjs} +28 -13
  53. package/dist/{client-plugins-JXXmZliS.d.mts → client-plugins-CWrhb1ir.d.mts} +26 -3
  54. package/dist/{client-plugins-C089bQhN.d.ts → client-plugins-DPf0qZey.d.ts} +26 -3
  55. package/dist/client-plugins.d.mts +2 -3
  56. package/dist/client-plugins.d.ts +2 -3
  57. package/dist/client.cjs +4 -4
  58. package/dist/client.d.mts +9 -38
  59. package/dist/client.d.ts +9 -38
  60. package/dist/client.mjs +3 -3
  61. package/dist/config.d.mts +2 -3
  62. package/dist/config.d.ts +2 -3
  63. package/dist/{devtools-FY5R7TQ4.mjs → devtools-MTB5SA2B.mjs} +3 -3
  64. package/dist/{devtools-5KGPDVKL.cjs → devtools-R6MDDAZK.cjs} +7 -7
  65. package/dist/docs.cjs +6 -5
  66. package/dist/docs.d.mts +2 -2
  67. package/dist/docs.d.ts +2 -2
  68. package/dist/docs.mjs +5 -4
  69. package/dist/index.cjs +21 -20
  70. package/dist/index.d.mts +14 -14
  71. package/dist/index.d.ts +14 -14
  72. package/dist/index.mjs +20 -19
  73. package/dist/integrations.d.mts +2 -3
  74. package/dist/integrations.d.ts +2 -3
  75. package/dist/internal/app-markdown-runtime.d.mts +2 -3
  76. package/dist/internal/app-markdown-runtime.d.ts +2 -3
  77. package/dist/internal/build-runtime.cjs +15 -14
  78. package/dist/internal/build-runtime.d.mts +4 -5
  79. package/dist/internal/build-runtime.d.ts +4 -5
  80. package/dist/internal/build-runtime.mjs +14 -13
  81. package/dist/internal/cli-runtime.cjs +7 -7
  82. package/dist/internal/cli-runtime.mjs +6 -6
  83. package/dist/internal/client-error-overlay.cjs +4 -4
  84. package/dist/internal/client-error-overlay.mjs +1 -1
  85. package/dist/internal/compression-runtime.d.mts +2 -3
  86. package/dist/internal/compression-runtime.d.ts +2 -3
  87. package/dist/internal/config-runtime.cjs +4 -4
  88. package/dist/internal/config-runtime.d.mts +3 -4
  89. package/dist/internal/config-runtime.d.ts +3 -4
  90. package/dist/internal/config-runtime.mjs +3 -3
  91. package/dist/internal/product-telemetry-runtime.cjs +2 -2
  92. package/dist/internal/product-telemetry-runtime.mjs +1 -1
  93. package/dist/internal/production-runtime.cjs +2 -2
  94. package/dist/internal/production-runtime.d.mts +8 -9
  95. package/dist/internal/production-runtime.d.ts +8 -9
  96. package/dist/internal/production-runtime.mjs +1 -1
  97. package/dist/{metadata-C1Z9vLbb.d.mts → metadata-CO9fRyyJ.d.mts} +1 -1
  98. package/dist/{metadata-BcNJP4fq.d.ts → metadata-zY9wltwH.d.ts} +1 -1
  99. package/dist/middleware.cjs +4 -4
  100. package/dist/middleware.d.mts +4 -11
  101. package/dist/middleware.d.ts +4 -11
  102. package/dist/middleware.mjs +3 -3
  103. package/dist/navigation.cjs +5 -5
  104. package/dist/navigation.d.mts +42 -3
  105. package/dist/navigation.d.ts +42 -3
  106. package/dist/navigation.mjs +4 -4
  107. package/dist/{nitro-CVZ36JM5.mjs → nitro-4LFVTT24.mjs} +2 -2
  108. package/dist/{nitro-4I2MYLY2.cjs → nitro-TSGDUJMN.cjs} +3 -3
  109. package/dist/plugin.cjs +17 -11
  110. package/dist/plugin.d.mts +3 -4
  111. package/dist/plugin.d.ts +3 -4
  112. package/dist/plugin.mjs +17 -11
  113. package/dist/{production-runtime-jcrTlRTb.d.mts → production-runtime-CywsHwnG.d.mts} +1 -1
  114. package/dist/{production-runtime-oKmC0WU-.d.ts → production-runtime-lkfwujwK.d.ts} +1 -1
  115. package/dist/query/client.cjs +6 -6
  116. package/dist/query/client.mjs +2 -2
  117. package/dist/{render-plan-DOB9cV-h.d.ts → render-plan-DHF0GeWo.d.ts} +1 -1
  118. package/dist/{render-plan-BLIfc4jt.d.mts → render-plan-LVy6sGQe.d.mts} +1 -1
  119. package/dist/renderer-client.cjs +5 -5
  120. package/dist/renderer-client.d.mts +4 -5
  121. package/dist/renderer-client.d.ts +4 -5
  122. package/dist/renderer-client.mjs +2 -2
  123. package/dist/renderer.d.mts +3 -0
  124. package/dist/renderer.d.ts +3 -0
  125. package/dist/{request-Cr53NRHr.d.mts → request-6AkmhEYE.d.mts} +1 -1
  126. package/dist/{request-Dt2gNuQD.d.ts → request-BYxlRqA9.d.ts} +1 -1
  127. package/dist/request.d.mts +3 -4
  128. package/dist/request.d.ts +3 -4
  129. package/dist/{route-rendering-CWYd8Mv1.d.ts → route-rendering-CWaKiUbS.d.ts} +1 -1
  130. package/dist/{route-rendering-CeFBEAoZ.d.mts → route-rendering-Dd8Jmml7.d.mts} +1 -1
  131. package/dist/router-B2m4fvve.d.ts +50 -0
  132. package/dist/router-xwEE112q.d.mts +50 -0
  133. package/dist/routes.cjs +3 -3
  134. package/dist/routes.d.mts +2 -3
  135. package/dist/routes.d.ts +2 -3
  136. package/dist/routes.mjs +2 -2
  137. package/dist/server-plugins.d.mts +3 -4
  138. package/dist/server-plugins.d.ts +3 -4
  139. package/dist/server.cjs +25 -24
  140. package/dist/server.d.mts +8 -9
  141. package/dist/server.d.ts +8 -9
  142. package/dist/server.mjs +12 -11
  143. package/dist/{spa-router-CQWiYGxS.d.mts → spa-router-DVEHQnWo.d.mts} +3 -3
  144. package/dist/{spa-router-Wjiw-8hB.d.ts → spa-router-Y8rrXTVK.d.ts} +3 -3
  145. package/dist/testing.cjs +6 -6
  146. package/dist/testing.d.mts +2 -3
  147. package/dist/testing.d.ts +2 -3
  148. package/dist/testing.mjs +5 -5
  149. package/dist/{types-D-1WTE72.d.mts → types-DFbjpjXX.d.mts} +8 -0
  150. package/dist/{types-D-1WTE72.d.ts → types-DFbjpjXX.d.ts} +8 -0
  151. package/dist/{utils-uUxF0K0P.d.mts → utils-DSPx34-A.d.mts} +1 -1
  152. package/dist/{utils-B0XJmG_b.d.ts → utils-Dvuny_08.d.ts} +1 -1
  153. package/dist/version.cjs +2 -2
  154. package/dist/version.mjs +1 -1
  155. package/dist/vite.cjs +12 -11
  156. package/dist/vite.d.mts +2 -3
  157. package/dist/vite.d.ts +2 -3
  158. package/dist/vite.mjs +11 -10
  159. package/package.json +3 -3
  160. package/dist/chunk-7GNWGLWB.mjs +0 -14
  161. package/dist/chunk-VQDBNVOO.cjs +0 -14
  162. package/dist/navigation-errors-Dvwpzaer.d.mts +0 -13
  163. package/dist/navigation-errors-Dvwpzaer.d.ts +0 -13
  164. /package/dist/{chunk-IAMRBF3Z.cjs → chunk-N4RLRSWW.cjs} +0 -0
  165. /package/dist/{chunk-BNGS6KJ6.mjs → chunk-YOYF2E4U.mjs} +0 -0
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  useRouter
3
- } from "./chunk-A7T6345N.mjs";
3
+ } from "./chunk-5UX4C5QI.mjs";
4
4
  import {
5
5
  getRouter
6
- } from "./chunk-RKQVJN2O.mjs";
6
+ } from "./chunk-JIKGGIOL.mjs";
7
7
  import {
8
8
  applyFarmBasePath
9
9
  } from "./chunk-4RB44K6Z.mjs";
@@ -16,7 +16,7 @@ import {
16
16
  FARM_METADATA_ATTRIBUTE,
17
17
  renderMetadataHead,
18
18
  resolveMetadataTitle
19
- } from "./chunk-YS3TRKCG.mjs";
19
+ } from "./chunk-2M435BUE.mjs";
20
20
  import {
21
21
  createFarmDeploymentMismatchError,
22
22
  createFarmDeploymentRequestHeaders,
@@ -6,7 +6,7 @@ import {
6
6
  parseRouteSlotFile,
7
7
  resolveRouteRenderingConfig,
8
8
  resolveRouteRenderingConfigFromFile
9
- } from "./chunk-2ANEVVF7.mjs";
9
+ } from "./chunk-NRS46D4L.mjs";
10
10
  import {
11
11
  collectSchemaExtensions,
12
12
  declareSchemaTables,
@@ -48,6 +48,10 @@ import {
48
48
  _setDefaultFarmThemeConfig,
49
49
  getTheme
50
50
  } from "./chunk-WBIH66JK.mjs";
51
+ import {
52
+ generateFarmDocsAdapterClientRuntime,
53
+ getFarmDocsAdapterConfigModule
54
+ } from "./chunk-VVBO3QH7.mjs";
51
55
  import {
52
56
  resolveFarmDocsFontAssets,
53
57
  toFarmDocsPublicFontAssets
@@ -65,7 +69,7 @@ import {
65
69
  } from "./chunk-JBSVKMC5.mjs";
66
70
  import {
67
71
  normalizeRouteRules
68
- } from "./chunk-7WPA7GBZ.mjs";
72
+ } from "./chunk-GHFS7RUB.mjs";
69
73
  import {
70
74
  getFarmAppDirectories,
71
75
  getFarmLayerAliases,
@@ -162,7 +166,7 @@ import {
162
166
  } from "./chunk-JLCQGPXE.mjs";
163
167
  import {
164
168
  MiddlewareManager
165
- } from "./chunk-57J3Y7Y3.mjs";
169
+ } from "./chunk-TIKNUAU7.mjs";
166
170
  import {
167
171
  _clearCurrentMiddlewareContext,
168
172
  _clearCurrentMiddlewareData,
@@ -177,11 +181,11 @@ import {
177
181
  } from "./chunk-IOEH4VWN.mjs";
178
182
  import {
179
183
  APIRouteManager
180
- } from "./chunk-ATERBVHQ.mjs";
184
+ } from "./chunk-CQHFU55R.mjs";
181
185
  import {
182
186
  findProgrammaticRouteFiles,
183
187
  loadProgrammaticRouteManifests
184
- } from "./chunk-BNGS6KJ6.mjs";
188
+ } from "./chunk-YOYF2E4U.mjs";
185
189
  import {
186
190
  _runWithFarmI18nRequest,
187
191
  _setDefaultFarmI18nRuntime,
@@ -208,7 +212,7 @@ import {
208
212
  normalizeFarmRouteRuntimeConfig,
209
213
  resolveFarmRouteRuleRuntimeConfig,
210
214
  resolveFarmRouteRuntimeConfig
211
- } from "./chunk-FS7FLPOG.mjs";
215
+ } from "./chunk-2J7W2WND.mjs";
212
216
  import {
213
217
  clearRequestContext,
214
218
  copyRequestContext,
@@ -227,8 +231,10 @@ import {
227
231
  createCliColors
228
232
  } from "./chunk-I2BHUNBU.mjs";
229
233
  import {
234
+ invalidateFailedFarmDevModules,
235
+ loadFarmDevModule,
230
236
  toFileModuleUrl
231
- } from "./chunk-7GNWGLWB.mjs";
237
+ } from "./chunk-43FMW62B.mjs";
232
238
  import {
233
239
  isFarmI18nCatalogFile,
234
240
  resolveFarmI18nConfig,
@@ -258,7 +264,7 @@ import {
258
264
  } from "./chunk-Z2RZJZIZ.mjs";
259
265
  import {
260
266
  FARM_VERSION
261
- } from "./chunk-2GNATDDE.mjs";
267
+ } from "./chunk-F7E2AZKQ.mjs";
262
268
  import {
263
269
  resolveFarmTrailingSlashRedirect,
264
270
  setFarmTrailingSlashPreference
@@ -277,7 +283,7 @@ import {
277
283
  mergeMetadata,
278
284
  renderMetadataHead,
279
285
  resolveFarmNotFoundMetadata
280
- } from "./chunk-YS3TRKCG.mjs";
286
+ } from "./chunk-2M435BUE.mjs";
281
287
  import {
282
288
  FARM_DEPLOYMENT_ID_HEADER,
283
289
  createFarmDeploymentCookie,
@@ -2388,7 +2394,7 @@ var _RouteManager = class _RouteManager {
2388
2394
  const mdxConfig = resolveMdxConfig(this.config.mdx);
2389
2395
  const components = await loadFarmMdxComponents(mdxConfig, {
2390
2396
  root: this.config.root,
2391
- loadModule: this.viteServer ? (componentModulePath) => this.viteServer.ssrLoadModule(componentModulePath) : void 0
2397
+ loadModule: this.viteServer ? (componentModulePath) => loadFarmDevModule(this.viteServer, componentModulePath) : void 0
2392
2398
  });
2393
2399
  return await createFarmMarkdownRouteModuleFromFile(modulePath, {
2394
2400
  components,
@@ -2396,7 +2402,7 @@ var _RouteManager = class _RouteManager {
2396
2402
  });
2397
2403
  }
2398
2404
  if (this.viteServer) {
2399
- const module = await this.viteServer.ssrLoadModule(modulePath);
2405
+ const module = await loadFarmDevModule(this.viteServer, modulePath);
2400
2406
  return module;
2401
2407
  } else {
2402
2408
  const module = await import(
@@ -2421,7 +2427,7 @@ var _RouteManager = class _RouteManager {
2421
2427
  return createLayoutModuleFromProgrammaticLayout(programmaticLayout);
2422
2428
  }
2423
2429
  if (this.viteServer) {
2424
- const module = await this.viteServer.ssrLoadModule(modulePath);
2430
+ const module = await loadFarmDevModule(this.viteServer, modulePath);
2425
2431
  return module;
2426
2432
  } else {
2427
2433
  const module = await import(
@@ -2695,7 +2701,7 @@ var _RouteManager = class _RouteManager {
2695
2701
  async loadProgrammaticRoutesModule(filePath) {
2696
2702
  if (this.viteServer) {
2697
2703
  const viteRoot = this.viteServer.config?.root || this.config.root || process.cwd();
2698
- return await this.viteServer.ssrLoadModule(toViteModuleId(filePath, viteRoot));
2704
+ return await loadFarmDevModule(this.viteServer, toViteModuleId(filePath, viteRoot));
2699
2705
  }
2700
2706
  return await import(
2701
2707
  /* @vite-ignore */
@@ -3012,18 +3018,29 @@ function collectDevStylesheetUrls(modules, alreadyLinked = ALREADY_LINKED) {
3012
3018
  __name(collectDevStylesheetUrls, "collectDevStylesheetUrls");
3013
3019
 
3014
3020
  // src/server/full-document.ts
3015
- function stripContentsWrappers(markup) {
3016
- let out = markup.replace(/^\s+/, "");
3017
- const opener = /^<div\b[^>]*style="display\s*:\s*contents"[^>]*>/i;
3021
+ var CONTENTS_WRAPPER = /^<div\b[^>]*style="display\s*:\s*contents"[^>]*>/i;
3022
+ var HOISTED_HEAD_ELEMENT = /^(?:<(?:meta|link|base)\b[^>]*>|<title\b[^>]*>[\s\S]*?<\/title>)/i;
3023
+ function peelDocumentPrefix(markup) {
3024
+ let inner = markup.replace(/^\s+/, "");
3025
+ let hoisted = "";
3018
3026
  let match;
3019
- while (match = opener.exec(out)) {
3020
- out = out.slice(match[0].length).replace(/^\s+/, "");
3027
+ while (match = CONTENTS_WRAPPER.exec(inner) ?? HOISTED_HEAD_ELEMENT.exec(inner)) {
3028
+ if (!/^<div/i.test(match[0])) hoisted += match[0];
3029
+ inner = inner.slice(match[0].length).replace(/^\s+/, "");
3021
3030
  }
3022
- return out;
3031
+ return { inner, hoisted };
3023
3032
  }
3024
- __name(stripContentsWrappers, "stripContentsWrappers");
3033
+ __name(peelDocumentPrefix, "peelDocumentPrefix");
3034
+ function restoreHoistedHead(document, hoisted) {
3035
+ if (!hoisted) return document;
3036
+ if (/<head[\s>]/i.test(document)) {
3037
+ return document.replace(/<head\b[^>]*>/i, (open) => open + hoisted);
3038
+ }
3039
+ return document.replace(/<html\b[^>]*>/i, (open) => `${open}<head>${hoisted}</head>`);
3040
+ }
3041
+ __name(restoreHoistedHead, "restoreHoistedHead");
3025
3042
  function extractFarmFullDocument(markup) {
3026
- const inner = stripContentsWrappers(markup);
3043
+ const { inner, hoisted } = peelDocumentPrefix(markup);
3027
3044
  if (!/^<!doctype/i.test(inner) && !/^<html[\s>]/i.test(inner)) return null;
3028
3045
  const start = markup.search(/<!doctype|<html[\s>]/i);
3029
3046
  const lower = markup.toLowerCase();
@@ -3041,14 +3058,15 @@ function extractFarmFullDocument(markup) {
3041
3058
  if (streamedTail) {
3042
3059
  document = document.replace(/<\/body>/i, () => `${streamedTail}</body>`);
3043
3060
  }
3044
- return document;
3061
+ return restoreHoistedHead(document, hoisted);
3045
3062
  }
3046
3063
  __name(extractFarmFullDocument, "extractFarmFullDocument");
3047
- function opensFarmFullDocument(markup) {
3048
- const inner = stripContentsWrappers(markup);
3049
- return /^<!doctype/i.test(inner) || /^<html[\s>]/i.test(inner);
3064
+ function classifyFarmDocumentPrefix(markup) {
3065
+ const { inner } = peelDocumentPrefix(markup);
3066
+ if (/^<!doctype/i.test(inner) || /^<html[\s>]/i.test(inner)) return "document";
3067
+ return inner === "" ? "pending" : "fragment";
3050
3068
  }
3051
- __name(opensFarmFullDocument, "opensFarmFullDocument");
3069
+ __name(classifyFarmDocumentPrefix, "classifyFarmDocumentPrefix");
3052
3070
  function ensureFarmDocumentHead(markup) {
3053
3071
  if (/<head[\s>]/i.test(markup)) return markup;
3054
3072
  return markup.replace(/<html([^>]*)>/i, (_match, attributes) => {
@@ -4601,6 +4619,7 @@ function warnSuppressedAsyncHydrationOnce(modulePath, reason) {
4601
4619
  }
4602
4620
  __name(warnSuppressedAsyncHydrationOnce, "warnSuppressedAsyncHydrationOnce");
4603
4621
  var fullDocumentRoutes = /* @__PURE__ */ new Set();
4622
+ var documentLayouts = /* @__PURE__ */ new WeakMap();
4604
4623
  function hasRequestHeader(req, name) {
4605
4624
  const value = req.headers[name.toLowerCase()];
4606
4625
  return Array.isArray(value) ? value.length > 0 : Boolean(value);
@@ -4791,7 +4810,7 @@ var _ServerRenderer = class _ServerRenderer {
4791
4810
  if (this.config.notFound?.component?.trim()) {
4792
4811
  resolveFarmNotFoundComponentPath(this.config, getFarmAppDirectories(this.config));
4793
4812
  }
4794
- const loaded = isReactRenderer(this.config.renderer) ? await import("./renderer/react/server.mjs") : this.viteServer ? await this.viteServer.ssrLoadModule(this.config.renderer.server) : await import(pathToFileURL2(
4813
+ const loaded = isReactRenderer(this.config.renderer) ? await import("./renderer/react/server.mjs") : this.viteServer ? await loadFarmDevModule(this.viteServer, this.config.renderer.server) : await import(pathToFileURL2(
4795
4814
  resolveFarmRendererModule(
4796
4815
  this.config.root || process.cwd(),
4797
4816
  this.config.renderer.server
@@ -5903,7 +5922,7 @@ var _ServerRenderer = class _ServerRenderer {
5903
5922
  path9.resolve(this.config.root, provider.component.module),
5904
5923
  this.config.root
5905
5924
  ) : provider.component.module;
5906
- const providerModule = this.viteServer ? await this.viteServer.ssrLoadModule(providerModuleId) : await importRuntimeModule(
5925
+ const providerModule = this.viteServer ? await loadFarmDevModule(this.viteServer, providerModuleId) : await importRuntimeModule(
5907
5926
  provider.component.module.startsWith(".") ? pathToFileURL2(path9.resolve(this.config.root, provider.component.module)).href : provider.component.module
5908
5927
  );
5909
5928
  ProviderComponent = providerModule[provider.component.export || "default"];
@@ -6530,10 +6549,43 @@ window.__FARM_I18N__ = ${getFarmI18nClientSnapshot() ? serializeInlineValue(getF
6530
6549
  clearMiddlewareData?.();
6531
6550
  }
6532
6551
  }
6552
+ /**
6553
+ * Whether the root layout returns its own `<html>` document, checked as the client's layout
6554
+ * boundary checks it: call a plain synchronous layout and look at what it returns. Knowing
6555
+ * this up front keeps a route's first request on the buffered path too; a layout this cannot
6556
+ * call (async, a class, or one using hooks) falls back to detection from the stream.
6557
+ */
6558
+ async rootLayoutRendersDocument() {
6559
+ if (typeof this.routeManager.getLayouts !== "function") return false;
6560
+ const rootLayout = this.routeManager.getLayouts().get("/");
6561
+ if (!rootLayout) return false;
6562
+ try {
6563
+ const Layout = (await this.routeManager.loadLayoutModule(rootLayout.modulePath)).default;
6564
+ if (typeof Layout !== "function" || Layout.prototype?.isReactComponent || Layout.constructor?.name === "AsyncFunction") {
6565
+ return false;
6566
+ }
6567
+ const cached = documentLayouts.get(Layout);
6568
+ if (cached !== void 0) return cached;
6569
+ let rendersDocument = false;
6570
+ try {
6571
+ const rendered = Layout({
6572
+ children: null,
6573
+ params: {}
6574
+ });
6575
+ rendersDocument = this.rendererRuntime.isValidElement(rendered) && rendered.type === "html";
6576
+ } catch {
6577
+ rendersDocument = false;
6578
+ }
6579
+ documentLayouts.set(Layout, rendersDocument);
6580
+ return rendersDocument;
6581
+ } catch {
6582
+ return false;
6583
+ }
6584
+ }
6533
6585
  async renderWithSSR(element, req, res, clearMiddlewareData, options = {}) {
6534
6586
  const renderToPipeableStream = this.rendererRuntime.renderToPipeableStream;
6535
6587
  const fullDocumentRouteKey = options.observabilityRoute || req.__FARM_ROUTE__ || req.url || "/";
6536
- if (!renderToPipeableStream || fullDocumentRoutes.has(fullDocumentRouteKey)) {
6588
+ if (!renderToPipeableStream || fullDocumentRoutes.has(fullDocumentRouteKey) || await this.rootLayoutRendersDocument()) {
6537
6589
  return this.renderBufferedSSR(element, req, res, clearMiddlewareData, options);
6538
6590
  }
6539
6591
  return new Promise((resolve5, reject) => {
@@ -6709,14 +6761,18 @@ window.__FARM_I18N__ = ${getFarmI18nClientSnapshot() ? serializeInlineValue(getF
6709
6761
  staticShellParts?.push(securedShell);
6710
6762
  let firstChunk = true;
6711
6763
  let checkedFullDocument = false;
6764
+ let documentPrefix = "";
6712
6765
  const cspNonceRewriter = cspNonce ? createFarmCspNonceRewriter(cspNonce) : void 0;
6713
6766
  const cspStreamDecoder = cspNonceRewriter ? new TextDecoder() : void 0;
6714
6767
  const recordRenderedChunk = /* @__PURE__ */ __name((chunkText) => {
6715
6768
  if (!chunkText) return;
6716
6769
  if (!checkedFullDocument) {
6717
- checkedFullDocument = true;
6718
- if (opensFarmFullDocument(chunkText)) {
6719
- fullDocumentRoutes.add(fullDocumentRouteKey);
6770
+ documentPrefix += chunkText;
6771
+ const prefix = classifyFarmDocumentPrefix(documentPrefix);
6772
+ if (prefix !== "pending") {
6773
+ checkedFullDocument = true;
6774
+ documentPrefix = "";
6775
+ if (prefix === "document") fullDocumentRoutes.add(fullDocumentRouteKey);
6720
6776
  }
6721
6777
  }
6722
6778
  htmlParts.push(chunkText);
@@ -9179,33 +9235,6 @@ function mergeFarmProductionViteConfig(farmConfig, userConfig = {}) {
9179
9235
  }
9180
9236
  __name(mergeFarmProductionViteConfig, "mergeFarmProductionViteConfig");
9181
9237
 
9182
- // src/docs/adapter-client.ts
9183
- function generateFarmDocsAdapterClientRuntime(reactModule) {
9184
- if (!reactModule) {
9185
- return `
9186
- async function hydrateFarmDocsAdapterRuntime() {
9187
- return false;
9188
- }
9189
- `;
9190
- }
9191
- return `
9192
- async function hydrateFarmDocsAdapterRuntime() {
9193
- const runtime = window.__FARM_DOCS_ADAPTER__;
9194
- if (!runtime) return false;
9195
- const FarmDocsAdapterReact = await import(${JSON.stringify(reactModule)});
9196
- if (typeof FarmDocsAdapterReact.hydrateFarmDocs !== "function") {
9197
- throw new Error("The configured Farm docs adapter does not export hydrateFarmDocs().");
9198
- }
9199
- FarmDocsAdapterReact.hydrateFarmDocs({
9200
- config: runtime.config || {},
9201
- data: runtime.data,
9202
- });
9203
- return true;
9204
- }
9205
- `;
9206
- }
9207
- __name(generateFarmDocsAdapterClientRuntime, "generateFarmDocsAdapterClientRuntime");
9208
-
9209
9238
  // src/theme/vite.ts
9210
9239
  var FARM_DARK_VARIANT = '@custom-variant dark (&:where([data-theme="dark"], [data-theme="dark"] *));';
9211
9240
  function createFarmThemeCssPlugin(input, basePath = "/") {
@@ -9324,7 +9353,7 @@ function loadFarmWorkflowsDevRuntime() {
9324
9353
  }
9325
9354
  __name(loadFarmWorkflowsDevRuntime, "loadFarmWorkflowsDevRuntime");
9326
9355
  function loadFarmDevtoolsSnapshotRuntime() {
9327
- return import("./devtools-FY5R7TQ4.mjs");
9356
+ return import("./devtools-MTB5SA2B.mjs");
9328
9357
  }
9329
9358
  __name(loadFarmDevtoolsSnapshotRuntime, "loadFarmDevtoolsSnapshotRuntime");
9330
9359
  function loadFarmDevtoolsUIRuntime() {
@@ -9941,6 +9970,9 @@ function farmPlugin(options = {}, initialPluginManager) {
9941
9970
  // directory the production client build emits.
9942
9971
  ...options.publicDir ? { publicDir: options.publicDir } : {},
9943
9972
  define: getEnvDefines(options, configEnv),
9973
+ // Keep development module ownership explicit; the RSC plugin adds its
9974
+ // environment only when enabled. Production environment setup is unchanged.
9975
+ ...!isBuild ? { environments: { client: {}, ssr: {} } } : {},
9944
9976
  resolve: {
9945
9977
  alias: { ...layerAliases, ...sourceAlias }
9946
9978
  },
@@ -10130,9 +10162,7 @@ function farmPlugin(options = {}, initialPluginManager) {
10130
10162
  ["add", "change", "unlink"].forEach((ev) => {
10131
10163
  server.watcher.on(ev, (file) => {
10132
10164
  if (ev === "add") {
10133
- for (const mod of server.moduleGraph.idToModuleMap.values()) {
10134
- if (mod.ssrError) server.moduleGraph.invalidateModule(mod);
10135
- }
10165
+ invalidateFailedFarmDevModules(server);
10136
10166
  }
10137
10167
  const normalizedFile = file.replace(/\\/g, "/");
10138
10168
  const configChanged = isFarmConfigFile(file, farmConfig.root) || layerConfigFiles.has(normalizedFile);
@@ -10212,14 +10242,14 @@ function farmPlugin(options = {}, initialPluginManager) {
10212
10242
  discoveredWorkflows = await discoverFarmWorkflows(
10213
10243
  { ...farmConfig, workflows: workflowConfig },
10214
10244
  {
10215
- loadModule: /* @__PURE__ */ __name(async (filePath) => server.ssrLoadModule(filePath), "loadModule")
10245
+ loadModule: /* @__PURE__ */ __name(async (filePath) => loadFarmDevModule(server, filePath), "loadModule")
10216
10246
  }
10217
10247
  );
10218
10248
  if (discoveredWorkflows.length > 0) {
10219
10249
  workflowHandler = createFarmWorkflowRequestHandler({
10220
10250
  workflows: discoveredWorkflows,
10221
10251
  config: workflowConfig,
10222
- loadModule: /* @__PURE__ */ __name(async (workflow) => server.ssrLoadModule(workflow.filePath), "loadModule"),
10252
+ loadModule: /* @__PURE__ */ __name(async (workflow) => loadFarmDevModule(server, workflow.filePath), "loadModule"),
10223
10253
  server: farmConfig.server
10224
10254
  });
10225
10255
  logger.success(`\u2705 Discovered ${discoveredWorkflows.length} Farm workflow task(s)`);
@@ -10293,16 +10323,14 @@ function farmPlugin(options = {}, initialPluginManager) {
10293
10323
  farmConfig.srcDir
10294
10324
  ),
10295
10325
  loadModule: /* @__PURE__ */ __name(async (specifier) => {
10296
- const resolved = await server.pluginContainer.resolveId(specifier, void 0, {
10297
- ssr: true
10298
- });
10326
+ const resolved = await server.environments.ssr.pluginContainer.resolveId(specifier);
10299
10327
  if (specifier === farmConfig.docs.adapter?.server && resolved?.id) {
10300
10328
  return import(
10301
10329
  /* @vite-ignore */
10302
10330
  pathToFileURL3(resolved.id).href
10303
10331
  );
10304
10332
  }
10305
- return server.ssrLoadModule(resolved?.id ?? specifier);
10333
+ return loadFarmDevModule(server, resolved?.id ?? specifier);
10306
10334
  }, "loadModule")
10307
10335
  }) : farmDocsDevRuntime.createFarmDocsHandler(farmConfig.docs, {
10308
10336
  root: farmConfig.root,
@@ -10340,7 +10368,7 @@ function farmPlugin(options = {}, initialPluginManager) {
10340
10368
  }
10341
10369
  const docsRenderer = resolveFarmRenderer((farmApp?.getConfig() ?? options).renderer);
10342
10370
  const [rendererRuntime, layoutModules] = await Promise.all([
10343
- isReactRenderer(docsRenderer) ? import("./renderer/react/server.mjs") : server.ssrLoadModule(docsRenderer.server),
10371
+ isReactRenderer(docsRenderer) ? import("./renderer/react/server.mjs") : loadFarmDevModule(server, docsRenderer.server),
10344
10372
  Promise.all(
10345
10373
  layoutEntries.map((layout) => routeManager.loadLayoutModule(layout.modulePath))
10346
10374
  )
@@ -11584,7 +11612,8 @@ ${generatedDevIndicatorsClientRuntime}`,
11584
11612
  resolvedConfig?.basePath ?? "/",
11585
11613
  generateClientCachePersistenceCode(
11586
11614
  resolveFarmClientCacheAdapterEntry(root, resolvedConfig?.cache)
11587
- )
11615
+ ),
11616
+ isReactRenderer(renderer) ? getFarmDocsAdapterConfigModule(docs) : void 0
11588
11617
  );
11589
11618
  }
11590
11619
  if (id === "/@farm/server") {
@@ -11750,7 +11779,7 @@ export const manifest = getManifest();
11750
11779
  );
11751
11780
  return;
11752
11781
  }` : "";
11753
- const hmrCode = !shouldEmitFarmClientRootHmr(currentConfig.renderer) ? "" : `
11782
+ const hmrCode = transformOptions?.ssr || !shouldEmitFarmClientRootHmr(currentConfig.renderer) ? "" : `
11754
11783
  if (import.meta.hot) {
11755
11784
  import.meta.hot.accept((newModule) => {
11756
11785
  ${isolatedHmrUpdate}
@@ -12395,7 +12424,7 @@ function parseRouteModuleSchema2(schema, value, label, routePath) {
12395
12424
  }
12396
12425
  }
12397
12426
  __name(parseRouteModuleSchema2, "parseRouteModuleSchema");
12398
- function generateClientCode(integrationProviders = [], documentNavigationMatchers = [], docsSearchClientRuntime = EMPTY_FARM_DOCS_SEARCH_CLIENT_RUNTIME, devtoolsClientRuntime = "", plugins = [], root = process.cwd(), srcDir = "src", publicRuntimeConfig = void 0, docsAdapterReact, renderer = REACT_RENDERER, isolatedHydrationEnabled = false, trailingSlash = false, basePath = "/", clientCachePersistence = { imports: "", init: "" }) {
12427
+ function generateClientCode(integrationProviders = [], documentNavigationMatchers = [], docsSearchClientRuntime = EMPTY_FARM_DOCS_SEARCH_CLIENT_RUNTIME, devtoolsClientRuntime = "", plugins = [], root = process.cwd(), srcDir = "src", publicRuntimeConfig = void 0, docsAdapterReact, renderer = REACT_RENDERER, isolatedHydrationEnabled = false, trailingSlash = false, basePath = "/", clientCachePersistence = { imports: "", init: "" }, docsConfigModule) {
12399
12428
  const providerClientCode = generateFarmIntegrationProviderClientCode(
12400
12429
  integrationProviders,
12401
12430
  root,
@@ -12410,7 +12439,10 @@ function generateClientCode(integrationProviders = [], documentNavigationMatcher
12410
12439
  const rendererClientImports = isReactRenderer(renderer) ? `import React from 'react'
12411
12440
  import { hydrateRoot, createRoot } from 'react-dom/client'` : `import React, { hydrateRoot, createRoot } from ${JSON.stringify(renderer.client)}`;
12412
12441
  const isolatedHydrationImport = isolatedHydrationEnabled ? `import { createFarmIsolatedHydrationRuntime, createFarmServerPageBoundary, wrapFarmIsolatedClientGraph } from '@farm.js/core/internal/isolated-boundary'` : "";
12413
- const docsAdapterImportBlock = generateFarmDocsAdapterClientRuntime(docsAdapterReact);
12442
+ const docsAdapterImportBlock = generateFarmDocsAdapterClientRuntime(
12443
+ docsAdapterReact,
12444
+ docsConfigModule
12445
+ );
12414
12446
  const isolatedHydrationRuntime = isolatedHydrationEnabled ? `const farmIsolatedHydrationRuntime = createFarmIsolatedHydrationRuntime({
12415
12447
  ReactRuntime: React,
12416
12448
  hydrateRoot,
@@ -14208,7 +14240,6 @@ export {
14208
14240
  createFarmSourceAlias,
14209
14241
  mergeFarmViteConfig,
14210
14242
  mergeFarmProductionViteConfig,
14211
- generateFarmDocsAdapterClientRuntime,
14212
14243
  createFarmThemeCssPlugin,
14213
14244
  farmI18nClientBridgePlugin,
14214
14245
  farmServerOnlyEntriesPlugin,
@@ -55,6 +55,11 @@ function mergeMetadataTitle(base, next) {
55
55
  return parentTemplate ? applyTitleTemplate(parentTemplate, next) : next;
56
56
  }
57
57
  if (!isRecord(next)) return next;
58
+ const absoluteTitle = normalizeContent(next.absolute);
59
+ if (absoluteTitle) {
60
+ const { absolute: _absolute, ...rest } = next;
61
+ return { ...rest, default: absoluteTitle };
62
+ }
58
63
  const defaultTitle = _nullishCoalesce(normalizeContent(next.default), () => ( resolveMetadataTitle(base)));
59
64
  return {
60
65
  ...next,
@@ -372,7 +377,7 @@ _chunkS3JO3N4Hcjs.__name.call(void 0, hasMetadataImages, "hasMetadataImages");
372
377
  function resolveMetadataTitle(title) {
373
378
  if (typeof title === "string") return title;
374
379
  if (isRecord(title)) {
375
- return normalizeContent(title.default);
380
+ return _nullishCoalesce(normalizeContent(title.absolute), () => ( normalizeContent(title.default)));
376
381
  }
377
382
  return void 0;
378
383
  }
@@ -26,7 +26,7 @@ import {
26
26
  } from "./chunk-OLYK7EAK.mjs";
27
27
  import {
28
28
  discoverProgrammaticRoutePaths
29
- } from "./chunk-BNGS6KJ6.mjs";
29
+ } from "./chunk-YOYF2E4U.mjs";
30
30
  import {
31
31
  readFarmI18nCatalogs
32
32
  } from "./chunk-FV45CKBC.mjs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  MiddlewareManager
3
- } from "./chunk-57J3Y7Y3.mjs";
3
+ } from "./chunk-TIKNUAU7.mjs";
4
4
  import {
5
5
  resolveFarmI18nConfig
6
6
  } from "./chunk-YMCXWPWK.mjs";
@@ -6,10 +6,10 @@ import {
6
6
  } from "./chunk-IOEH4VWN.mjs";
7
7
  import {
8
8
  APIRouteConflictError
9
- } from "./chunk-ATERBVHQ.mjs";
9
+ } from "./chunk-CQHFU55R.mjs";
10
10
  import {
11
11
  findProgrammaticRouteFilesInDir
12
- } from "./chunk-BNGS6KJ6.mjs";
12
+ } from "./chunk-YOYF2E4U.mjs";
13
13
  import {
14
14
  isFarmAPIRouteFileName
15
15
  } from "./chunk-CU625VAY.mjs";
@@ -31,6 +31,9 @@ import {
31
31
  import {
32
32
  createCliColors
33
33
  } from "./chunk-I2BHUNBU.mjs";
34
+ import {
35
+ loadFarmDevModule
36
+ } from "./chunk-43FMW62B.mjs";
34
37
  import {
35
38
  toPosixPath,
36
39
  toViteModuleId
@@ -249,7 +252,7 @@ function farmApiPlugin(options = {}) {
249
252
  try {
250
253
  const relativePath = path.relative(apiDir, path.dirname(filePath));
251
254
  const routePath = "/api/" + (relativePath === "." ? "" : relativePath.replace(/\\/g, "/"));
252
- const routeModule = await server.ssrLoadModule(filePath);
255
+ const routeModule = await loadFarmDevModule(server, filePath);
253
256
  const endpoints = {};
254
257
  const availableMethods = [];
255
258
  for (const method of API_ROUTE_METHODS) {
@@ -281,7 +284,7 @@ function farmApiPlugin(options = {}) {
281
284
  for (const routesFile of routesFiles) {
282
285
  if (fs.existsSync(routesFile)) {
283
286
  try {
284
- const routesModule = await server.ssrLoadModule(routesFile);
287
+ const routesModule = await loadFarmDevModule(server, routesFile);
285
288
  for (const [exportName, exportValue] of Object.entries(routesModule)) {
286
289
  const endpoint = exportValue;
287
290
  if (endpoint && endpoint.__path) {
@@ -307,7 +310,8 @@ function farmApiPlugin(options = {}) {
307
310
  const { getProgrammaticRouteManifest } = await import("./routes.mjs");
308
311
  for (const routeFile of routeFiles) {
309
312
  try {
310
- const routesModule = await server.ssrLoadModule(
313
+ const routesModule = await loadFarmDevModule(
314
+ server,
311
315
  toViteModuleId(routeFile, server.config.root)
312
316
  );
313
317
  const manifest = getProgrammaticRouteManifest(routesModule);
@@ -471,7 +475,7 @@ function farmApiPlugin(options = {}) {
471
475
  if (await recoverFailedDiscovery?.()) return [];
472
476
  const previousState = snapshotRouteState();
473
477
  try {
474
- const routesModule = await server.ssrLoadModule(file);
478
+ const routesModule = await loadFarmDevModule(server, file);
475
479
  removeEndpointsFromFile(file);
476
480
  for (const [exportName, exportValue] of Object.entries(routesModule)) {
477
481
  const endpoint = exportValue;
@@ -524,7 +528,7 @@ function farmApiPlugin(options = {}) {
524
528
  log(`API route file removed: ${routePath}`);
525
529
  return [];
526
530
  }
527
- const routeModule = await server.ssrLoadModule(file);
531
+ const routeModule = await loadFarmDevModule(server, file);
528
532
  removeEndpointsFromFile(file);
529
533
  const availableMethods = [];
530
534
  for (const method of API_ROUTE_METHODS) {