@farm.js/core 0.1.48 → 0.1.50

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 (322) hide show
  1. package/dist/{agent-mcp-DAjB8Eyu.d.ts → agent-mcp-9BMbRgg_.d.ts} +1 -1
  2. package/dist/{agent-mcp-CXN3g0eX.d.mts → agent-mcp-CIMH324y.d.mts} +1 -1
  3. package/dist/agent-runtime.cjs +3 -3
  4. package/dist/agent-runtime.d.mts +6 -6
  5. package/dist/agent-runtime.d.ts +6 -6
  6. package/dist/agent-runtime.mjs +2 -2
  7. package/dist/analyzer-CN7C74WX.cjs +1066 -0
  8. package/dist/analyzer-DDW34OMC.mjs +1066 -0
  9. package/dist/api/client.d.mts +0 -1
  10. package/dist/api/client.d.ts +0 -1
  11. package/dist/api/route-manager.cjs +5 -5
  12. package/dist/api/route-manager.d.mts +10 -10
  13. package/dist/api/route-manager.d.ts +10 -10
  14. package/dist/api/route-manager.mjs +4 -4
  15. package/dist/api/runtime.cjs +3 -3
  16. package/dist/api/runtime.d.mts +7 -7
  17. package/dist/api/runtime.d.ts +7 -7
  18. package/dist/api/runtime.mjs +2 -2
  19. package/dist/api.cjs +6 -6
  20. package/dist/api.d.mts +10 -10
  21. package/dist/api.d.ts +10 -10
  22. package/dist/api.mjs +5 -5
  23. package/dist/{app-VK9sHDn5.d.ts → app-BWibTHVT.d.ts} +7 -7
  24. package/dist/{app-DytgRPjJ.d.mts → app-DVJ13FPA.d.mts} +7 -7
  25. package/dist/{app-manifest-DPgW5ke5.d.mts → app-manifest-CQDJOKL2.d.mts} +1 -1
  26. package/dist/{app-manifest-BUu7YGAx.d.ts → app-manifest-D0kaXdwu.d.ts} +1 -1
  27. package/dist/app-markdown.d.mts +7 -7
  28. package/dist/app-markdown.d.ts +7 -7
  29. package/dist/cache.d.mts +4 -3
  30. package/dist/cache.d.ts +4 -3
  31. package/dist/{chunk-VJXLUTBM.mjs → chunk-2DEPNLXK.mjs} +7 -7
  32. package/dist/chunk-2G63BIRL.mjs +227 -0
  33. package/dist/chunk-2GLQSIZD.mjs +55 -0
  34. package/dist/{chunk-HRLYO2XJ.mjs → chunk-2VCC3GVC.mjs} +1 -1
  35. package/dist/chunk-3ATXWZPH.cjs +227 -0
  36. package/dist/{chunk-YSPMY4B7.cjs → chunk-474FO3UE.cjs} +233 -157
  37. package/dist/{chunk-QNQEK3OF.cjs → chunk-4T25YCZ5.cjs} +14 -14
  38. package/dist/{chunk-ATHPRVP2.mjs → chunk-5V4KZOZO.mjs} +1 -1
  39. package/dist/{chunk-FGJQS4EC.cjs → chunk-6QA2SXVH.cjs} +2 -2
  40. package/dist/{chunk-XLYXG73A.mjs → chunk-75WWOZ5C.mjs} +22 -0
  41. package/dist/{chunk-QFQDRJKJ.mjs → chunk-76R5GJER.mjs} +2 -2
  42. package/dist/{chunk-NG44F7AH.mjs → chunk-7ONZDKVY.mjs} +2 -2
  43. package/dist/{chunk-MZZA6ZQV.mjs → chunk-7PZVXMWG.mjs} +4 -4
  44. package/dist/{chunk-4IICUBQX.cjs → chunk-A5BJKSZE.cjs} +2 -2
  45. package/dist/{chunk-TTYXOAB7.mjs → chunk-ANHZ6SUL.mjs} +1 -1
  46. package/dist/{chunk-ZBS3GOQZ.cjs → chunk-AQLHD6HZ.cjs} +35 -61
  47. package/dist/{chunk-Q2ZKQ6GD.cjs → chunk-B5S2JS6M.cjs} +127 -125
  48. package/dist/{chunk-AXRNEVCS.cjs → chunk-B6PREBN6.cjs} +8 -8
  49. package/dist/{chunk-JOHXK4BB.mjs → chunk-BW6SCVYX.mjs} +1 -1
  50. package/dist/{chunk-LZBM35DH.mjs → chunk-C73RIAEF.mjs} +4 -4
  51. package/dist/chunk-CGCJ2TJU.cjs +55 -0
  52. package/dist/{chunk-UYQOIPXE.mjs → chunk-CPXDDWGL.mjs} +1 -1
  53. package/dist/{chunk-JPAVNDZH.cjs → chunk-CY7H5KS4.cjs} +25 -25
  54. package/dist/{chunk-4S7M63WX.cjs → chunk-DGOLAZLV.cjs} +22 -1
  55. package/dist/{chunk-73XBJRZW.cjs → chunk-E2BMCNMJ.cjs} +2 -2
  56. package/dist/{chunk-WUEDTW6E.cjs → chunk-F5LERVY3.cjs} +23 -5
  57. package/dist/{chunk-A7DK663W.cjs → chunk-FACTMUPI.cjs} +27 -27
  58. package/dist/chunk-G2KTRMWA.mjs +40 -0
  59. package/dist/{chunk-C6U66WWF.mjs → chunk-GFT5AHAT.mjs} +13 -0
  60. package/dist/{chunk-ZGS3ZDF7.cjs → chunk-GOOK2J2W.cjs} +7 -7
  61. package/dist/{chunk-NW2BKDVT.mjs → chunk-HHFMECFO.mjs} +1 -1
  62. package/dist/{chunk-6M3HXUBQ.mjs → chunk-HWCHIBJZ.mjs} +21 -3
  63. package/dist/{chunk-HUL4LTC6.cjs → chunk-HYN3LLG7.cjs} +63 -20
  64. package/dist/{chunk-HELQXYVI.cjs → chunk-I2DQGS56.cjs} +11 -9
  65. package/dist/{chunk-SSNN55Q6.cjs → chunk-IQXGHGZF.cjs} +5 -5
  66. package/dist/{chunk-ZSIGEHSE.cjs → chunk-IUBDMDZZ.cjs} +21 -180
  67. package/dist/{chunk-TQWGOQ7O.mjs → chunk-IWJKJDNW.mjs} +116 -40
  68. package/dist/{chunk-NRFUVDTH.mjs → chunk-JJOWY3XD.mjs} +2 -2
  69. package/dist/{chunk-6XFGJBYX.cjs → chunk-JYNNIGQO.cjs} +16 -7
  70. package/dist/{chunk-XO6WL6NL.mjs → chunk-KGP76FSV.mjs} +1 -1
  71. package/dist/{chunk-GXSMF7UR.mjs → chunk-KO2NWUKN.mjs} +1 -1
  72. package/dist/{chunk-VDLF2DJA.cjs → chunk-KZH6YLND.cjs} +375 -162
  73. package/dist/{chunk-5566GNEG.cjs → chunk-LIFUPCXW.cjs} +13 -0
  74. package/dist/{chunk-I2SWKWO7.mjs → chunk-LJDIFIJ2.mjs} +1 -1
  75. package/dist/{chunk-KZT2VHRQ.cjs → chunk-LYWAGXXW.cjs} +11 -11
  76. package/dist/{chunk-N6SIQJEJ.mjs → chunk-M7LKA632.mjs} +54 -11
  77. package/dist/{chunk-6LH33DLL.cjs → chunk-NJVFPJ2Y.cjs} +2 -2
  78. package/dist/{chunk-JWP56HCP.mjs → chunk-OD6WM3I7.mjs} +2 -2
  79. package/dist/{chunk-MJ6IC4K2.mjs → chunk-OTOOJIUB.mjs} +1 -1
  80. package/dist/{chunk-TFA6BUAE.cjs → chunk-OY5XDG24.cjs} +4 -4
  81. package/dist/{chunk-R2SEZEBC.cjs → chunk-OYNNA4DD.cjs} +4 -4
  82. package/dist/{chunk-GBPDSUFE.mjs → chunk-OZK2DS44.mjs} +1 -1
  83. package/dist/chunk-QXJADAQB.cjs +40 -0
  84. package/dist/{chunk-JLS6ZLFM.cjs → chunk-RHOR2J6V.cjs} +1 -1
  85. package/dist/{chunk-YQGZLCT4.cjs → chunk-RWT2BTJT.cjs} +6 -6
  86. package/dist/{chunk-3HBFI373.cjs → chunk-S5AQ7CAC.cjs} +14 -14
  87. package/dist/{chunk-HNAUK3SC.mjs → chunk-SHJJM6OG.mjs} +40 -199
  88. package/dist/{chunk-LL7TDMOM.mjs → chunk-SMUW7UST.mjs} +33 -59
  89. package/dist/{chunk-VCFBQFOV.mjs → chunk-SN5VSO3Q.mjs} +9 -7
  90. package/dist/{chunk-DM3TFCC2.cjs → chunk-SUV6YO4Q.cjs} +5 -5
  91. package/dist/{chunk-JUMPFVMK.mjs → chunk-TUOO6IK3.mjs} +9 -0
  92. package/dist/chunk-UB7RVEMX.mjs +73 -0
  93. package/dist/{chunk-CDTIXBKN.mjs → chunk-UN6N623E.mjs} +2 -2
  94. package/dist/{chunk-BEXYFR2R.cjs → chunk-UY6HS5PF.cjs} +2 -2
  95. package/dist/{chunk-HAH4FBTA.mjs → chunk-VAHBCI6X.mjs} +1 -1
  96. package/dist/{chunk-C2R5RVLA.cjs → chunk-VCKGOXFI.cjs} +73 -1
  97. package/dist/{chunk-N25RPPO5.cjs → chunk-WAPQWAE6.cjs} +10 -10
  98. package/dist/{chunk-NE33FRQ5.mjs → chunk-WVBUXNBX.mjs} +274 -61
  99. package/dist/{chunk-ALD2WMLA.mjs → chunk-WXHDVXJE.mjs} +2 -2
  100. package/dist/{chunk-EVCQX243.cjs → chunk-X2EL3BLH.cjs} +2 -2
  101. package/dist/{chunk-EA5PMJDU.mjs → chunk-X3HOVNHI.mjs} +1 -1
  102. package/dist/{chunk-XXB37YET.cjs → chunk-XLRLSTJ6.cjs} +7 -7
  103. package/dist/{chunk-DRFADSKY.mjs → chunk-XXXRRVY6.mjs} +4 -4
  104. package/dist/{chunk-EXHEPWFJ.cjs → chunk-YAXOEAND.cjs} +10 -10
  105. package/dist/{chunk-PEHL3IZL.cjs → chunk-YB44NKC2.cjs} +2 -2
  106. package/dist/chunk-YKHRCY4T.cjs +73 -0
  107. package/dist/{chunk-NIPKC4DA.mjs → chunk-ZIBIE7AH.mjs} +72 -0
  108. package/dist/{chunk-N7SPZJLY.mjs → chunk-ZLOQQ2UF.mjs} +33 -31
  109. package/dist/client/lifecycle.d.mts +1 -1
  110. package/dist/client/lifecycle.d.ts +1 -1
  111. package/dist/{client-plugins-DqjCsKMN.d.ts → client-plugins-BPfltM5m.d.ts} +19 -10
  112. package/dist/{client-plugins-BlEzV5FO.d.mts → client-plugins-D4RO59f0.d.mts} +19 -10
  113. package/dist/client-plugins.d.mts +6 -6
  114. package/dist/client-plugins.d.ts +6 -6
  115. package/dist/client.cjs +11 -8
  116. package/dist/client.d.mts +11 -10
  117. package/dist/client.d.ts +11 -10
  118. package/dist/client.mjs +12 -9
  119. package/dist/client.react-server.mjs +1 -1
  120. package/dist/config-CnhyvvmT.d.mts +188 -0
  121. package/dist/config-CnhyvvmT.d.ts +188 -0
  122. package/dist/config.d.mts +6 -6
  123. package/dist/config.d.ts +6 -6
  124. package/dist/desktop.d.mts +7 -7
  125. package/dist/desktop.d.ts +7 -7
  126. package/dist/{dev-guard-MPZUJFIV.mjs → dev-guard-4PFQNXQX.mjs} +4 -2
  127. package/dist/{dev-guard-4NQ3LFO5.cjs → dev-guard-YLO5DE3H.cjs} +7 -5
  128. package/dist/{devtools-A37WWJZL.cjs → devtools-N5XTOECL.cjs} +8 -8
  129. package/dist/{devtools-BLKHPY3C.mjs → devtools-STG7HPRV.mjs} +7 -7
  130. package/dist/docs.cjs +10 -10
  131. package/dist/docs.d.mts +7 -7
  132. package/dist/docs.d.ts +7 -7
  133. package/dist/docs.mjs +9 -9
  134. package/dist/environment/vite.d.mts +1 -1
  135. package/dist/environment/vite.d.ts +1 -1
  136. package/dist/generate-route-types-DQP0cUzk.d.ts +33 -0
  137. package/dist/generate-route-types-TF5Wwtvz.d.mts +33 -0
  138. package/dist/i18n/client.d.mts +2 -2
  139. package/dist/i18n/client.d.ts +2 -2
  140. package/dist/i18n/index.d.mts +3 -3
  141. package/dist/i18n/index.d.ts +3 -3
  142. package/dist/i18n/server.d.mts +5 -5
  143. package/dist/i18n/server.d.ts +5 -5
  144. package/dist/image/server.cjs +3 -3
  145. package/dist/image/server.mjs +2 -2
  146. package/dist/image/sharp.cjs +10 -10
  147. package/dist/image/sharp.mjs +2 -2
  148. package/dist/{index-CMigAr9f.d.mts → index-C-N3Pwg-.d.ts} +2 -2
  149. package/dist/{index-MocnSP3a.d.ts → index-D3l4tREW.d.ts} +2 -2
  150. package/dist/{index-Cl3akY5U.d.mts → index-DPUAPho_.d.mts} +2 -2
  151. package/dist/{index-n3hjOvVC.d.ts → index-k8o8eUOd.d.mts} +2 -2
  152. package/dist/index.cjs +73 -66
  153. package/dist/index.d.mts +29 -45
  154. package/dist/index.d.ts +29 -45
  155. package/dist/index.mjs +78 -71
  156. package/dist/integrations.cjs +3 -3
  157. package/dist/integrations.d.mts +6 -6
  158. package/dist/integrations.d.ts +6 -6
  159. package/dist/integrations.mjs +2 -2
  160. package/dist/internal/app-markdown-runtime.d.mts +7 -7
  161. package/dist/internal/app-markdown-runtime.d.ts +7 -7
  162. package/dist/internal/build-runtime.cjs +36 -32
  163. package/dist/internal/build-runtime.d.mts +9 -9
  164. package/dist/internal/build-runtime.d.ts +9 -9
  165. package/dist/internal/build-runtime.mjs +35 -31
  166. package/dist/internal/cli-runtime.cjs +16 -15
  167. package/dist/internal/cli-runtime.mjs +16 -15
  168. package/dist/internal/client-error-overlay.cjs +4 -4
  169. package/dist/internal/client-error-overlay.mjs +1 -1
  170. package/dist/internal/client-runtime.cjs +19 -2
  171. package/dist/internal/client-runtime.d.mts +45 -3
  172. package/dist/internal/client-runtime.d.ts +45 -3
  173. package/dist/internal/client-runtime.mjs +19 -2
  174. package/dist/internal/compression-runtime.d.mts +6 -6
  175. package/dist/internal/compression-runtime.d.ts +6 -6
  176. package/dist/internal/config-runtime.cjs +17 -10
  177. package/dist/internal/config-runtime.d.mts +259 -18
  178. package/dist/internal/config-runtime.d.ts +259 -18
  179. package/dist/internal/config-runtime.mjs +15 -8
  180. package/dist/internal/desktop-guard.cjs +2 -2
  181. package/dist/internal/desktop-guard.d.mts +7 -0
  182. package/dist/internal/desktop-guard.d.ts +7 -0
  183. package/dist/internal/desktop-guard.mjs +1 -1
  184. package/dist/internal/form-actions.cjs +4 -4
  185. package/dist/internal/form-actions.mjs +3 -3
  186. package/dist/internal/infra-analytics-runtime.cjs +6 -6
  187. package/dist/internal/infra-analytics-runtime.mjs +4 -4
  188. package/dist/internal/islands-runtime.cjs +4 -1
  189. package/dist/internal/islands-runtime.d.mts +9 -12
  190. package/dist/internal/islands-runtime.d.ts +9 -12
  191. package/dist/internal/islands-runtime.mjs +5 -2
  192. package/dist/internal/metadata-image-runtime.cjs +3 -3
  193. package/dist/internal/metadata-image-runtime.mjs +2 -2
  194. package/dist/internal/product-telemetry-runtime.cjs +2 -2
  195. package/dist/internal/product-telemetry-runtime.mjs +1 -1
  196. package/dist/internal/production-runtime.cjs +13 -13
  197. package/dist/internal/production-runtime.d.mts +19 -19
  198. package/dist/internal/production-runtime.d.ts +19 -19
  199. package/dist/internal/production-runtime.mjs +15 -15
  200. package/dist/{layers-D9fbe-rz.d.ts → layers-CcS42OGR.d.mts} +1 -1
  201. package/dist/{layers-D9fbe-rz.d.mts → layers-CcS42OGR.d.ts} +1 -1
  202. package/dist/{lifecycle-DK06VuKP.d.ts → lifecycle-C2aLBOwu.d.mts} +1 -1
  203. package/dist/{lifecycle-DK06VuKP.d.mts → lifecycle-C2aLBOwu.d.ts} +1 -1
  204. package/dist/markdown.d.mts +6 -6
  205. package/dist/markdown.d.ts +6 -6
  206. package/dist/middleware.cjs +7 -7
  207. package/dist/middleware.d.mts +8 -8
  208. package/dist/middleware.d.ts +8 -8
  209. package/dist/middleware.mjs +6 -6
  210. package/dist/mobile.cjs +9 -0
  211. package/dist/mobile.d.mts +67 -0
  212. package/dist/mobile.d.ts +67 -0
  213. package/dist/mobile.mjs +9 -0
  214. package/dist/navigation-delegate-8xg3Zvp4.d.ts +29 -0
  215. package/dist/navigation-delegate-ji6elCKy.d.mts +29 -0
  216. package/dist/navigation.cjs +5 -5
  217. package/dist/navigation.d.mts +9 -9
  218. package/dist/navigation.d.ts +9 -9
  219. package/dist/navigation.mjs +4 -4
  220. package/dist/{nitro-UT2J5A5D.mjs → nitro-2Q5NVY7L.mjs} +2 -2
  221. package/dist/{nitro-BIXIKJZS.cjs → nitro-YPSZBYDK.cjs} +3 -3
  222. package/dist/platform.cjs +2 -1
  223. package/dist/platform.d.mts +4 -3
  224. package/dist/platform.d.ts +4 -3
  225. package/dist/platform.mjs +2 -1
  226. package/dist/{plugin-4KYXV7BB.mjs → plugin-53SY5YBS.mjs} +1 -1
  227. package/dist/{plugin-WBANOZQM.cjs → plugin-HZIBL3DW.cjs} +2 -2
  228. package/dist/plugin.cjs +31 -29
  229. package/dist/plugin.d.mts +13 -8
  230. package/dist/plugin.d.ts +13 -8
  231. package/dist/plugin.mjs +30 -28
  232. package/dist/{production-runtime-bWZJMcQb.d.mts → production-runtime-DXnQQkQf.d.mts} +3 -3
  233. package/dist/{production-runtime-YVDGYWBG.d.ts → production-runtime-TdKaYRj0.d.ts} +3 -3
  234. package/dist/production-vite-BQFAlG7n.d.mts +13 -0
  235. package/dist/production-vite-BQFAlG7n.d.ts +13 -0
  236. package/dist/{programmatic-routes-client-DviwGeAv.d.ts → programmatic-routes-client-BwiTndEC.d.ts} +2 -2
  237. package/dist/{programmatic-routes-client-BFKOTEXN.d.mts → programmatic-routes-client-Dh1SDLSM.d.mts} +2 -2
  238. package/dist/query/client.cjs +6 -6
  239. package/dist/query/client.mjs +2 -2
  240. package/dist/{render-plan-DqWXo3-B.d.ts → render-plan-BPbwRbuN.d.ts} +1 -1
  241. package/dist/{render-plan-CS8l0zaK.d.mts → render-plan-BvCGXF6K.d.mts} +1 -1
  242. package/dist/renderer-client.cjs +9 -6
  243. package/dist/renderer-client.d.mts +9 -8
  244. package/dist/renderer-client.d.ts +9 -8
  245. package/dist/renderer-client.mjs +6 -3
  246. package/dist/{request-CBrHpaCC.d.ts → request-B8PGTZNR.d.ts} +1 -1
  247. package/dist/{request-D4XqmnJF.d.mts → request-C_xTkJib.d.mts} +1 -1
  248. package/dist/request.d.mts +7 -7
  249. package/dist/request.d.ts +7 -7
  250. package/dist/{resolver-DC57A4vz.d.ts → resolver-CJ-D9nP-.d.ts} +1 -1
  251. package/dist/{resolver-C2G-3Tm6.d.mts → resolver-TDyZKgKI.d.mts} +1 -1
  252. package/dist/{route-rendering-3pRPtyO2.d.mts → route-rendering-DlddURL1.d.mts} +1 -1
  253. package/dist/{route-rendering-Bltnu8a3.d.ts → route-rendering-RNtcj607.d.ts} +1 -1
  254. package/dist/{router-BFSmKGtI.d.mts → router-B97eB0Mq.d.mts} +1 -1
  255. package/dist/{router-DDT7bkg7.d.ts → router-qUVaoEN8.d.ts} +1 -1
  256. package/dist/routes-8PT9cl60.d.ts +121 -0
  257. package/dist/routes-kEUsXHx3.d.mts +121 -0
  258. package/dist/routes.d.mts +6 -6
  259. package/dist/routes.d.ts +6 -6
  260. package/dist/{rsc-pipeline-4KOITP64.cjs → rsc-pipeline-L4XOZ2TE.cjs} +13 -10
  261. package/dist/{rsc-pipeline-ULFIB3UT.mjs → rsc-pipeline-T3775JUA.mjs} +12 -9
  262. package/dist/runtime-BIBGJO7V.cjs +1005 -0
  263. package/dist/{runtime-B9HmxiZc.d.ts → runtime-C4CmlOOh.d.ts} +2 -2
  264. package/dist/{runtime-C6yG64je.d.ts → runtime-C8GUnNeP.d.ts} +1 -1
  265. package/dist/{runtime-Cpylaypt.d.mts → runtime-CaDswfWi.d.mts} +1 -1
  266. package/dist/{runtime-CCxTmGuf.d.mts → runtime-CihDZ2Rn.d.mts} +2 -2
  267. package/dist/runtime-HRSFC4ZC.mjs +1005 -0
  268. package/dist/{schema-dev-notice-O3I5HLXK.mjs → schema-dev-notice-LZ5NXGLN.mjs} +2 -2
  269. package/dist/{schema-dev-notice-Z73J3NJ6.cjs → schema-dev-notice-XV7GZ3QJ.cjs} +4 -4
  270. package/dist/server-action-security.cjs +3 -3
  271. package/dist/server-action-security.mjs +2 -2
  272. package/dist/server-fn-client.d.mts +0 -1
  273. package/dist/server-fn-client.d.ts +0 -1
  274. package/dist/server-fn.cjs +4 -4
  275. package/dist/server-fn.d.mts +0 -1
  276. package/dist/server-fn.d.ts +0 -1
  277. package/dist/server-fn.mjs +3 -3
  278. package/dist/server-plugins.cjs +1 -1
  279. package/dist/server-plugins.d.mts +7 -7
  280. package/dist/server-plugins.d.ts +7 -7
  281. package/dist/server-plugins.mjs +1 -1
  282. package/dist/server-query-client.d.mts +0 -1
  283. package/dist/server-query-client.d.ts +0 -1
  284. package/dist/server-query.cjs +5 -5
  285. package/dist/server-query.d.mts +0 -1
  286. package/dist/server-query.d.ts +0 -1
  287. package/dist/server-query.mjs +4 -4
  288. package/dist/server.cjs +89 -66
  289. package/dist/server.d.mts +22 -17
  290. package/dist/server.d.ts +22 -17
  291. package/dist/server.mjs +64 -41
  292. package/dist/{spa-router-CkTPnA4L.d.mts → spa-router-Dlv5ofg0.d.mts} +4 -4
  293. package/dist/{spa-router-CKuS81mi.d.ts → spa-router-qapSboKz.d.ts} +4 -4
  294. package/dist/testing.cjs +7 -7
  295. package/dist/testing.d.mts +6 -6
  296. package/dist/testing.d.ts +6 -6
  297. package/dist/testing.mjs +5 -5
  298. package/dist/{types--Wh02r5_.d.mts → types-C41ePjvP.d.mts} +1 -1
  299. package/dist/{types--Wh02r5_.d.ts → types-C41ePjvP.d.ts} +1 -1
  300. package/dist/{utils-C0ORLYXc.d.ts → utils-A-cYF81u.d.ts} +1 -1
  301. package/dist/{utils-IA9wVkef.d.mts → utils-DyvlSxFk.d.mts} +1 -1
  302. package/dist/version.cjs +2 -2
  303. package/dist/version.mjs +1 -1
  304. package/dist/vite.cjs +31 -29
  305. package/dist/vite.d.mts +9 -9
  306. package/dist/vite.d.ts +9 -9
  307. package/dist/vite.mjs +30 -28
  308. package/dist/{workflows-Df1C_7OG.d.mts → workflows-CRMzQZ3k.d.mts} +2 -1
  309. package/dist/{workflows-Df1C_7OG.d.ts → workflows-CRMzQZ3k.d.ts} +2 -1
  310. package/dist/workflows.cjs +3 -3
  311. package/dist/workflows.d.mts +1 -1
  312. package/dist/workflows.d.ts +1 -1
  313. package/dist/workflows.mjs +2 -2
  314. package/package.json +10 -2
  315. package/dist/cache-invalidation-BD0z_lfu.d.mts +0 -4
  316. package/dist/cache-invalidation-BD0z_lfu.d.ts +0 -4
  317. package/dist/chunk-45EUIICW.mjs +0 -15
  318. package/dist/chunk-V7KTQR4C.cjs +0 -15
  319. package/dist/{chunk-BR5FSKZ5.cjs → chunk-EQWWOQTK.cjs} +0 -0
  320. package/dist/{chunk-5OJVKXFV.cjs → chunk-N7JQXQAV.cjs} +2 -2
  321. package/dist/{chunk-VR4SEDEM.mjs → chunk-VOZ5DI7D.mjs} +0 -0
  322. package/dist/{chunk-72KABRWN.mjs → chunk-WSDKXV4E.mjs} +4 -4
@@ -1,6 +1,3 @@
1
- import {
2
- loadFarmProductionVite
3
- } from "./chunk-PSUYE5HR.mjs";
4
1
  import {
5
2
  FARM_DESKTOP_ENV_MODULE_FILE,
6
3
  FARM_DESKTOP_ENV_MODULE_SOURCE,
@@ -10,6 +7,9 @@ import {
10
7
  createFarmNodeServerEntry,
11
8
  withProductionNodeEnv
12
9
  } from "./chunk-VU3MYZPO.mjs";
10
+ import {
11
+ loadFarmProductionVite
12
+ } from "./chunk-PSUYE5HR.mjs";
13
13
  import {
14
14
  generateNativeMCPPluginSource
15
15
  } from "./chunk-KQH2COEJ.mjs";
@@ -18,7 +18,7 @@ import {
18
18
  compileFarmDocsAdapterEdgeManifest,
19
19
  createFarmDocsAPIHandler,
20
20
  hasFarmDocsRuntimeAdapter
21
- } from "./chunk-QFQDRJKJ.mjs";
21
+ } from "./chunk-76R5GJER.mjs";
22
22
  import {
23
23
  FARM_DOCS_LAST_MODIFIED_MANIFEST,
24
24
  createFarmDocsHandler,
@@ -29,7 +29,7 @@ import {
29
29
  loadFarmDocsPage,
30
30
  resolveFarmDocsContentDir,
31
31
  toFarmDocsMarkdownPage
32
- } from "./chunk-GXSMF7UR.mjs";
32
+ } from "./chunk-KO2NWUKN.mjs";
33
33
  import {
34
34
  generateFarmDocsSearchClientRuntime,
35
35
  isFarmDocsSearchEnabled,
@@ -37,7 +37,7 @@ import {
37
37
  } from "./chunk-WB6XES4V.mjs";
38
38
  import {
39
39
  FARM_PRERENDER_ENV
40
- } from "./chunk-N6SIQJEJ.mjs";
40
+ } from "./chunk-M7LKA632.mjs";
41
41
  import {
42
42
  resolveFarmInstrumentationFile
43
43
  } from "./chunk-N35YPV4N.mjs";
@@ -52,7 +52,7 @@ import {
52
52
  getDeployTargetForPreset,
53
53
  hasCustomFarmRouteContext,
54
54
  resolveDeployOutputPath
55
- } from "./chunk-VJXLUTBM.mjs";
55
+ } from "./chunk-2DEPNLXK.mjs";
56
56
  import {
57
57
  DEFAULT_NOT_FOUND_STYLES,
58
58
  FARM_LAYOUT_ELEMENT_CLIENT_SOURCE,
@@ -84,7 +84,7 @@ import {
84
84
  resolveFarmIsolatedClientHydrationMode,
85
85
  resolveFarmNotFoundComponentPath,
86
86
  usesFarmServerTree
87
- } from "./chunk-TQWGOQ7O.mjs";
87
+ } from "./chunk-IWJKJDNW.mjs";
88
88
  import {
89
89
  loadTailwindVitePlugin
90
90
  } from "./chunk-XLLVWLWO.mjs";
@@ -95,7 +95,7 @@ import {
95
95
  generateFarmTypeArtifacts,
96
96
  readRouteRenderingDirectiveFromFile,
97
97
  resolveRouteRenderingConfigFromFile
98
- } from "./chunk-HNAUK3SC.mjs";
98
+ } from "./chunk-SHJJM6OG.mjs";
99
99
  import {
100
100
  HOISTED_HEAD_ELEMENT,
101
101
  appMiddlewareMayHandlePath,
@@ -108,10 +108,13 @@ import {
108
108
  layoutsCanCoverSamePage,
109
109
  routeBoundaryCoversDirectory,
110
110
  stripRouteGroups
111
- } from "./chunk-NIPKC4DA.mjs";
111
+ } from "./chunk-ZIBIE7AH.mjs";
112
112
  import {
113
113
  farmPluginMayAffectRuntimePath
114
114
  } from "./chunk-UUMKLGUU.mjs";
115
+ import {
116
+ isFarmPreviewDeploymentEnvironment
117
+ } from "./chunk-CSLUBKGG.mjs";
115
118
  import {
116
119
  FARM_API_CATALOG_PATH,
117
120
  FARM_APP_MANIFEST_LEGACY_PATH,
@@ -119,18 +122,18 @@ import {
119
122
  listFarmBuiltInRoutePaths,
120
123
  resolveFarmApiCatalogInput,
121
124
  resolveFarmAppManifestInput
122
- } from "./chunk-NRFUVDTH.mjs";
125
+ } from "./chunk-JJOWY3XD.mjs";
123
126
  import {
124
127
  FARM_DEFAULT_MCP_PATH,
125
128
  createFarmDefaultMCPServer,
126
129
  farmConfigMountsMCP
127
130
  } from "./chunk-KRRZJ77U.mjs";
128
- import {
129
- isFarmPreviewDeploymentEnvironment
130
- } from "./chunk-CSLUBKGG.mjs";
131
131
  import {
132
132
  farmEnvironmentFunctionsPlugin
133
133
  } from "./chunk-C5JXCUKR.mjs";
134
+ import {
135
+ isFarmMarkdownPageFile
136
+ } from "./chunk-GW4YUIHW.mjs";
134
137
  import {
135
138
  generateFarmDocsAdapterClientRuntime,
136
139
  getFarmDocsAdapterConfigModule
@@ -164,10 +167,14 @@ import {
164
167
  import {
165
168
  getFarmAppDirectories
166
169
  } from "./chunk-52Y3C3HG.mjs";
170
+ import {
171
+ resolveFarmMdxComponentsModulePath,
172
+ resolveMdxConfig
173
+ } from "./chunk-UIJOLBUL.mjs";
167
174
  import {
168
175
  applyFarmWorkflowVercelCrons,
169
176
  prepareFarmWorkflowsForNitro
170
- } from "./chunk-ATHPRVP2.mjs";
177
+ } from "./chunk-5V4KZOZO.mjs";
171
178
  import {
172
179
  applyFarmCronVercelCrons,
173
180
  createFarmCronCloudflareConfig,
@@ -176,14 +183,7 @@ import {
176
183
  } from "./chunk-UCQ52TJY.mjs";
177
184
  import {
178
185
  resolveServerActionsConfig
179
- } from "./chunk-JOHXK4BB.mjs";
180
- import {
181
- isFarmMarkdownPageFile
182
- } from "./chunk-GW4YUIHW.mjs";
183
- import {
184
- resolveFarmMdxComponentsModulePath,
185
- resolveMdxConfig
186
- } from "./chunk-UIJOLBUL.mjs";
186
+ } from "./chunk-BW6SCVYX.mjs";
187
187
  import {
188
188
  getFarmMarkdownAlternatePath
189
189
  } from "./chunk-N77JBPLC.mjs";
@@ -193,7 +193,7 @@ import {
193
193
  import {
194
194
  getFarmIntegrationPluginServerRuntime,
195
195
  getIntegrationProviders
196
- } from "./chunk-NW2BKDVT.mjs";
196
+ } from "./chunk-HHFMECFO.mjs";
197
197
  import {
198
198
  FARM_INTEGRATION_API_BASE_PATH_KEY
199
199
  } from "./chunk-F6TLUMH7.mjs";
@@ -204,7 +204,7 @@ import {
204
204
  } from "./chunk-4HBKBHVP.mjs";
205
205
  import {
206
206
  APIRouteManager
207
- } from "./chunk-ALD2WMLA.mjs";
207
+ } from "./chunk-WXHDVXJE.mjs";
208
208
  import {
209
209
  readFarmI18nCatalogs
210
210
  } from "./chunk-DU4VHHPJ.mjs";
@@ -231,7 +231,7 @@ import {
231
231
  } from "./chunk-LM2YOGDK.mjs";
232
232
  import {
233
233
  FARM_VERSION
234
- } from "./chunk-HRLYO2XJ.mjs";
234
+ } from "./chunk-2VCC3GVC.mjs";
235
235
  import {
236
236
  getFarmPresetRuntime
237
237
  } from "./chunk-UAQD67HM.mjs";
@@ -954,7 +954,7 @@ export default async function farmNetlifyHandler(request, context) {
954
954
  // src/build/strip-platform-config.ts
955
955
  import { realpathSync } from "fs";
956
956
  import path8 from "path";
957
- var PLATFORM_CONFIG_KEYS = /* @__PURE__ */ new Set(["desktop"]);
957
+ var PLATFORM_CONFIG_KEYS = /* @__PURE__ */ new Set(["desktop", "mobile"]);
958
958
  var CONFIG_FACTORIES = /* @__PURE__ */ new Set(["defineConfig", "defineFarmConfig"]);
959
959
  function isConfigObject(node) {
960
960
  return node?.type === "ObjectExpression";
@@ -989,23 +989,33 @@ function collectConfigObjects(node, found) {
989
989
  }
990
990
  }
991
991
  function stripPlatformConfigSource(code, parse) {
992
- if (!code.includes("desktop")) return null;
992
+ if (!code.includes("desktop") && !code.includes("mobile")) return null;
993
993
  const objects = [];
994
994
  collectConfigObjects(parse(code), objects);
995
995
  const removals = [];
996
996
  for (const object of objects) {
997
997
  const properties = object.properties;
998
- properties.forEach((property, index) => {
998
+ const removed = properties.map((property) => {
999
999
  const name = propertyName(property);
1000
- if (!name || !PLATFORM_CONFIG_KEYS.has(name)) return;
1001
- if (index < properties.length - 1)
1002
- removals.push([property.start, properties[index + 1].start]);
1003
- else if (index > 0) removals.push([properties[index - 1].end, property.end]);
1004
- else {
1005
- const trailingComma = /^\s*,/.exec(code.slice(property.end));
1006
- removals.push([property.start, property.end + (trailingComma?.[0].length ?? 0)]);
1007
- }
1000
+ return !!name && PLATFORM_CONFIG_KEYS.has(name);
1008
1001
  });
1002
+ for (let first = 0; first < properties.length; first++) {
1003
+ if (!removed[first]) continue;
1004
+ let last = first;
1005
+ while (last + 1 < properties.length && removed[last + 1]) last++;
1006
+ if (last < properties.length - 1) {
1007
+ removals.push([properties[first].start, properties[last + 1].start]);
1008
+ } else if (first > 0) {
1009
+ removals.push([properties[first - 1].end, properties[last].end]);
1010
+ } else {
1011
+ const trailingComma = /^\s*,/.exec(code.slice(properties[last].end));
1012
+ removals.push([
1013
+ properties[first].start,
1014
+ properties[last].end + (trailingComma?.[0].length ?? 0)
1015
+ ]);
1016
+ }
1017
+ first = last;
1018
+ }
1009
1019
  }
1010
1020
  if (removals.length === 0) return null;
1011
1021
  removals.sort((left, right) => right[0] - left[0]);
@@ -2044,7 +2054,7 @@ function getCachedClientModuleHydrationPlan(modulePath, root, mode, cache, optio
2044
2054
  async function buildClient(productionVite, config, root, srcDir, outputDir, pageRoutes, layoutRoutes = [], routeSlots = [], isolatedClientBoundaryModules = /* @__PURE__ */ new Set(), hydrationPlanCache = /* @__PURE__ */ new Map(), rendererBuildLifetime, programmaticClientRoutes) {
2045
2055
  const viteBuild = productionVite.build;
2046
2056
  const { farmPlugin, farmServerOnlyEntriesPlugin } = await import("./vite.mjs");
2047
- const { PluginManager: PluginManager2 } = await import("./plugin-4KYXV7BB.mjs");
2057
+ const { PluginManager: PluginManager2 } = await import("./plugin-53SY5YBS.mjs");
2048
2058
  const fs4 = await import("fs/promises");
2049
2059
  const pluginManager = new PluginManager2({
2050
2060
  config,
@@ -2510,7 +2520,7 @@ function toBakedMarkdownSourcePath(root, filePath) {
2510
2520
  }
2511
2521
  return relative.split(path10.sep).join("/");
2512
2522
  }
2513
- function generateUniversalRouterStateRuntime() {
2523
+ function generateUniversalRouterStateRuntime(streamNavigations = false) {
2514
2524
  return `
2515
2525
  const FARM_PAGE_STATE_KEY = "__farmPageState";
2516
2526
  const FARM_HISTORY_INDEX_KEY = "__farmHistoryIndex";
@@ -2578,6 +2588,46 @@ async function fetchFarmNavigationDocument(url, headers, recover = true, signal)
2578
2588
  return response;
2579
2589
  }
2580
2590
 
2591
+ ${streamNavigations ? `const FARM_FLUSH_MARKER = "<!--farm-flush-->";
2592
+
2593
+ // Reads a streamed navigation (F-Stream) up to the end of React's shell. \`next\` then resolves
2594
+ // with each later flush as it ends, and null at the end; a document without a marker is all shell.
2595
+ async function readFarmNavigationStream(body) {
2596
+ const reader = body.getReader();
2597
+ const decoder = new TextDecoder();
2598
+ let text = "";
2599
+ let done = false;
2600
+ const next = async function() {
2601
+ for (;;) {
2602
+ const at = text.indexOf(FARM_FLUSH_MARKER);
2603
+ if (at !== -1) {
2604
+ const flush = text.slice(0, at);
2605
+ text = text.slice(at + FARM_FLUSH_MARKER.length);
2606
+ return flush;
2607
+ }
2608
+ if (done) {
2609
+ const flush = text;
2610
+ text = "";
2611
+ return flush ? flush : null;
2612
+ }
2613
+ const result = await reader.read();
2614
+ if (result.done) {
2615
+ done = true;
2616
+ text += decoder.decode();
2617
+ } else {
2618
+ text += decoder.decode(result.value, { stream: true });
2619
+ }
2620
+ }
2621
+ };
2622
+ const shell = await next();
2623
+ if (done && !text) return { shell: shell || "" };
2624
+ return {
2625
+ shell: shell,
2626
+ next: next,
2627
+ cancel: function() { reader.cancel().catch(function() {}); },
2628
+ };
2629
+ }` : ""}
2630
+
2581
2631
  function clearFarmPrefetchCacheOnDeploymentMismatch(router, error) {
2582
2632
  if (error?.name === "FarmDeploymentMismatchError") {
2583
2633
  router.clearCache();
@@ -2781,9 +2831,35 @@ function interpolateRedirectDestination(destination, params) {
2781
2831
  }
2782
2832
  `.trim();
2783
2833
  }
2784
- function generateUniversalRouterStateProperties() {
2834
+ function generateUniversalRouterStateProperties(streamNavigations = false) {
2785
2835
  return `
2786
- blockers: new Set(),
2836
+ ${streamNavigations ? ` // A streamed navigation swaps in the page's shell; its Suspense content follows flush by flush.
2837
+ navigationStream: null,
2838
+ streamingNavigation: null,
2839
+ takeNavigationStream: function(html) {
2840
+ const stream = this.navigationStream;
2841
+ this.navigationStream = null;
2842
+ if (!stream) return;
2843
+ if (stream.html !== html) {
2844
+ stream.cancel();
2845
+ return;
2846
+ }
2847
+ this.streamingNavigation = stream;
2848
+ void streamFarmNavigation(
2849
+ stream,
2850
+ document.getElementById("root") || document.body,
2851
+ () => this.streamingNavigation === stream,
2852
+ );
2853
+ },
2854
+ stopNavigationStream: function() {
2855
+ this.navigationStream?.cancel();
2856
+ this.streamingNavigation?.cancel();
2857
+ this.navigationStream = null;
2858
+ this.streamingNavigation = null;
2859
+ },
2860
+ ` : ` takeNavigationStream: function() {},
2861
+ stopNavigationStream: function() {},
2862
+ `} blockers: new Set(),
2787
2863
  unloadBlockers: new Map(),
2788
2864
  navigationListeners: new Set(),
2789
2865
  navigationState: IDLE_NAVIGATION_STATE,
@@ -3077,6 +3153,11 @@ function generateUniversalRouterStateProperties() {
3077
3153
  // Only speculative requests have shared ownership. Ordinary navigations
3078
3154
  // keep their own abort signal and cannot cancel another caller's work.
3079
3155
  const record = recover ? null : { valid: true, deploymentId, promise: null };
3156
+ // A navigation (not a prefetch) streams when the router supports it: the page goes in as
3157
+ // soon as its shell arrives, and its Suspense content follows (takeNavigationStream). A page
3158
+ // whose layouts hydrate, or one rendered in this page's React root, arrives whole.
3159
+ const streamShell = ${streamNavigations ? `recover && !interceptFrom && !partialHeaders["F-Render"] &&
3160
+ !hasHydratableLayout(new URL(url, window.location.href).pathname)` : "false"};
3080
3161
  const request = async () => {
3081
3162
  const response = await fetchFarmNavigationDocument(url, {
3082
3163
  "Accept": "text/html",
@@ -3085,13 +3166,28 @@ function generateUniversalRouterStateProperties() {
3085
3166
  // layouts it shows.
3086
3167
  ...getFarmIslandValueHeaders(),
3087
3168
  ...partialHeaders,
3169
+ ...(streamShell ? { "F-Stream": "flush" } : {}),
3088
3170
  }, recover, signal);
3089
3171
  if (!response.ok) throw new Error("Failed to fetch page");
3090
- const html = await response.text();
3091
- if (cacheResult && !signal?.aborted && generation === this.prefetchGeneration &&
3092
- deploymentId === window.__FARM_DEPLOYMENT_ID__ && (!record || record.valid)) {
3093
- this.storePrefetchedHtml(cacheKey, html);
3172
+ const store = (html) => {
3173
+ if (cacheResult && !signal?.aborted && generation === this.prefetchGeneration &&
3174
+ deploymentId === window.__FARM_DEPLOYMENT_ID__ && (!record || record.valid)) {
3175
+ this.storePrefetchedHtml(cacheKey, html);
3176
+ }
3177
+ };
3178
+ ${streamNavigations ? ` if (streamShell && response.body) {
3179
+ const streamed = await readFarmNavigationStream(response.body);
3180
+ if (!streamed.next) {
3181
+ store(streamed.shell);
3182
+ return streamed.shell;
3183
+ }
3184
+ this.stopNavigationStream();
3185
+ this.navigationStream = { html: streamed.shell, next: streamed.next, cancel: streamed.cancel, store };
3186
+ return streamed.shell;
3094
3187
  }
3188
+ ` : ""}
3189
+ const html = await response.text();
3190
+ store(html);
3095
3191
  return html;
3096
3192
  };
3097
3193
  if (!record) return request();
@@ -3372,7 +3468,7 @@ function isFarmDocsPath() {
3372
3468
  // Farm.js Client Runtime (no client components)
3373
3469
  ${cssImport}
3374
3470
  ${layoutImports}
3375
- import { createClientCancellation, createClientPluginManager, getFarmIslandValueHeaders, getHashTargetElement, installChunkErrorRecovery, isFarmBlockedNavigationURL, isFarmExternalNavigationURL, reconcileFarmDocumentHead, setFarmBasePath, setFarmTrailingSlashPreference, stripFarmBasePath } from "@farm.js/core/internal/client-runtime";
3471
+ import { createClientCancellation, createClientPluginManager, getFarmIslandValueHeaders, getHashTargetElement, installChunkErrorRecovery, isFarmBlockedNavigationURL, isFarmExternalNavigationURL, reconcileFarmDocumentHead, runFarmNavigationDelegates, setFarmBasePath, setFarmTrailingSlashPreference, stripFarmBasePath } from "@farm.js/core/internal/client-runtime";
3376
3472
  import { createFarmDeploymentMismatchError, createFarmDeploymentRequestHeaders, isFarmDeploymentMismatchResponse } from "@farm.js/core/deployment";
3377
3473
  ${clientPluginEntry.imports}
3378
3474
  ${clientCachePersistence.imports}
@@ -3437,6 +3533,15 @@ ${generateUniversalRouterStateProperties()}
3437
3533
  if (action === "pop") this.revertBlockedPopState(from);
3438
3534
  return;
3439
3535
  }
3536
+ // A refresh re-renders the page on screen; only a move to another page is offered.
3537
+ if (
3538
+ action !== "pop" &&
3539
+ !(options.refresh && to === from) &&
3540
+ (await runFarmNavigationDelegates({ url: url.href, from, to, action }))
3541
+ ) {
3542
+ this.cancelActiveNavigation();
3543
+ return;
3544
+ }
3440
3545
  if (action === "pop") {
3441
3546
  this.currentHistoryIndex = readHistoryIndex(options.popState);
3442
3547
  this.currentHistoryState = options.popState;
@@ -3737,7 +3842,7 @@ ${layoutImports}
3737
3842
  ${rendererClientImports}
3738
3843
  ${isolatedHydrationImport}
3739
3844
  ${providerClientCode.imports}
3740
- import { createClientCancellation, createClientPluginManager, getFarmIslandValueHeaders, getHashTargetElement, installChunkErrorRecovery, isFarmBlockedNavigationURL, isFarmExternalNavigationURL, reconcileFarmDocumentHead, scheduleFarmIslandHydration, searchParamsToObject, setFarmBasePath, setFarmTrailingSlashPreference, stripFarmBasePath } from "@farm.js/core/internal/client-runtime";
3845
+ import { createClientCancellation, createClientPluginManager, getFarmIslandValueHeaders, getHashTargetElement, installChunkErrorRecovery, isFarmBlockedNavigationURL, isFarmExternalNavigationURL, reconcileFarmDocumentHead, runFarmNavigationDelegates, scheduleFarmIslandHydration, searchParamsToObject, setFarmBasePath, setFarmTrailingSlashPreference, stripFarmBasePath } from "@farm.js/core/internal/client-runtime";
3741
3846
  import { createFarmDeploymentMismatchError, createFarmDeploymentRequestHeaders, isFarmDeploymentMismatchResponse } from "@farm.js/core/deployment";
3742
3847
  import { createFarmRouter, isFarmRouteActive, matchFarmRoute } from "@farm.js/core/router";
3743
3848
  ${clientPluginEntry.imports}
@@ -4169,7 +4274,7 @@ let currentPathname = null;
4169
4274
  let isHydrated = false;
4170
4275
  let pendingPageHydrationController = null;
4171
4276
 
4172
- ${generateUniversalRouterStateRuntime()}
4277
+ ${generateUniversalRouterStateRuntime(islandValues)}
4173
4278
 
4174
4279
  function cancelPendingPageHydration() {
4175
4280
  pendingPageHydrationController?.abort();
@@ -4357,6 +4462,55 @@ function activateNavigationScripts(root) {
4357
4462
  }
4358
4463
  }
4359
4464
 
4465
+ ${islandValues ? `// Adds the flushes after a streamed navigation's shell: React's staged Suspense content and the
4466
+ // scripts that reveal it. In islands mode, the islands React reveals hydrate as they appear, and
4467
+ // the ones it removes (a replaced fallback) are released.
4468
+ async function streamFarmNavigation(stream, root, isCurrent) {
4469
+ let html = stream.html;
4470
+ let streaming = true;
4471
+ ${isolatedHydrationEnabled ? `const removed = new Set();
4472
+ let queued = false;
4473
+ const run = function() {
4474
+ queued = false;
4475
+ if (!isCurrent()) return observer.disconnect();
4476
+ for (const node of removed) if (!node.isConnected) disposeFarmIsolatedClientBoundaries(node);
4477
+ removed.clear();
4478
+ if (!streaming && !root.querySelector('div[hidden][id^="S:"]')) observer.disconnect();
4479
+ hydrateFarmIsolatedClientBoundaries(root).catch(function(error) {
4480
+ console.error("[Farm.js] Hydrating streamed islands failed:", error);
4481
+ });
4482
+ };
4483
+ const observer = new MutationObserver(function(records) {
4484
+ for (const record of records) for (const node of record.removedNodes) removed.add(node);
4485
+ if (queued) return;
4486
+ queued = true;
4487
+ queueMicrotask(run);
4488
+ });
4489
+ observer.observe(root, { childList: true, subtree: true });` : "const observer = { disconnect: function() {} };"}
4490
+ try {
4491
+ for (let flush = await stream.next(); flush !== null; flush = await stream.next()) {
4492
+ if (!isCurrent()) return stream.cancel();
4493
+ html += flush;
4494
+ const parsed = new DOMParser().parseFromString('<div id="root">' + flush, "text/html");
4495
+ const fragment = document.createDocumentFragment();
4496
+ for (const node of Array.from(parsed.getElementById("root").childNodes)) fragment.appendChild(node);
4497
+ activateNavigationScripts(fragment);
4498
+ root.appendChild(fragment);
4499
+ }
4500
+ } catch (error) {
4501
+ streaming = false;
4502
+ if (!isCurrent()) return observer.disconnect();
4503
+ console.error("[Farm.js] A streamed navigation failed:", error);
4504
+ ${isolatedHydrationEnabled ? "farmIsolatedHydrationRuntime.endStream?.(root);\n if (!queued) run();" : ""}
4505
+ return;
4506
+ }
4507
+ // A cancelled stream ends early: keep its partial document out of the cache.
4508
+ if (!isCurrent()) return observer.disconnect();
4509
+ streaming = false;
4510
+ stream.store(html);
4511
+ ${isolatedHydrationEnabled ? "farmIsolatedHydrationRuntime.endStream?.(root);\n if (!queued) run();" : ""}
4512
+ }` : ""}
4513
+
4360
4514
  function replaceSharedLayoutBoundary(currentRoot, nextRoot, refresh = false) {
4361
4515
  const currentPatterns = getLayoutPatterns(currentRoot);
4362
4516
  const nextPatterns = getLayoutPatterns(nextRoot);
@@ -4399,7 +4553,7 @@ function replaceSharedLayoutBoundary(currentRoot, nextRoot, refresh = false) {
4399
4553
 
4400
4554
  // SPA Router
4401
4555
  const spaRouter = {
4402
- ${generateUniversalRouterStateProperties()}
4556
+ ${generateUniversalRouterStateProperties(islandValues)}
4403
4557
  prefetchCache: new Map(),
4404
4558
  ${islandValues ? ` // Islands mode: navigations name the layouts on screen, and say when this page renders the
4405
4559
  // next one in its own React root; the server leaves out what the browser keeps or rebuilds.
@@ -4411,7 +4565,7 @@ ${islandValues ? ` // Islands mode: navigations name the layouts on screen, and
4411
4565
  ...(reactRoot && reactRootContainer === root ? { "F-Render": "tree" } : {}),
4412
4566
  };
4413
4567
  },
4414
- ` : ""}
4568
+ ` : ""}
4415
4569
  navigate: async function(href, options = {}) {
4416
4570
  const url = new URL(href, window.location.href);
4417
4571
  if (isFarmBlockedNavigationURL(url)) return;
@@ -4457,6 +4611,15 @@ ${islandValues ? ` // Islands mode: navigations name the layouts on screen, and
4457
4611
  if (action === "pop") this.revertBlockedPopState(from);
4458
4612
  return;
4459
4613
  }
4614
+ // A refresh re-renders the page on screen; only a move to another page is offered.
4615
+ if (
4616
+ action !== "pop" &&
4617
+ !(options.refresh && to === from) &&
4618
+ (await runFarmNavigationDelegates({ url: url.href, from, to, action }))
4619
+ ) {
4620
+ this.cancelActiveNavigation();
4621
+ return;
4622
+ }
4460
4623
  if (action === "pop") {
4461
4624
  this.currentHistoryIndex = readHistoryIndex(options.popState);
4462
4625
  this.currentHistoryState = options.popState;
@@ -4464,6 +4627,7 @@ ${islandValues ? ` // Islands mode: navigations name the layouts on screen, and
4464
4627
 
4465
4628
  // A route transition invalidates any trigger waiting on the previous DOM boundary.
4466
4629
  cancelPendingPageHydration();
4630
+ this.stopNavigationStream();
4467
4631
  this.saveScrollPosition(window.location.pathname + window.location.search);
4468
4632
  const navigation = this.startNavigation(from, url, action);
4469
4633
  // A refresh keeps the islands still on the page (islands mode).
@@ -4588,6 +4752,7 @@ ${islandValues ? ` // Islands mode: navigations name the layouts on screen, and
4588
4752
  if (!this.isCurrentNavigation(navigation, clientNavigation)) return;
4589
4753
  await this.runViewTransition(options.viewTransition, async () => {
4590
4754
  if (!this.isCurrentNavigation(navigation, clientNavigation)) return;
4755
+ let swappedHtml = html;
4591
4756
  let swapped = await this.swapContent(
4592
4757
  html,
4593
4758
  url.pathname + url.search,
@@ -4607,6 +4772,7 @@ ${islandValues ? ` // Islands mode: navigations name the layouts on screen, and
4607
4772
  false,
4608
4773
  );
4609
4774
  if (!this.isCurrentNavigation(navigation, clientNavigation)) return;
4775
+ swappedHtml = documentHtml;
4610
4776
  swapped = await this.swapContent(
4611
4777
  documentHtml,
4612
4778
  url.pathname + url.search,
@@ -4618,6 +4784,7 @@ ${islandValues ? ` // Islands mode: navigations name the layouts on screen, and
4618
4784
  if (!swapped || swapped === "segment-mismatch") {
4619
4785
  throw new Error("Farm could not swap the target document");
4620
4786
  }
4787
+ this.takeNavigationStream(swappedHtml);
4621
4788
  this.writeHistoryEntry(action, url.pathname + url.search, options.state, url);
4622
4789
  currentPathname = pathname;
4623
4790
  this.currentPath = to;
@@ -4907,7 +5074,7 @@ void hydrate();
4907
5074
  async function buildSSRInMemory(productionVite, config, root, routeManager, apiRouteManager, serverRenderer, preset, collectedPageRoutes, collectedLayoutRoutes, collectedRouteSlots, isolatedClientBoundaryModules, hydrationPlanCache, rendererBuildLifetime) {
4908
5075
  const viteBuild = productionVite.build;
4909
5076
  const { farmPlugin, farmServerOnlyEntriesPlugin } = await import("./vite.mjs");
4910
- const { PluginManager: PluginManager2 } = await import("./plugin-4KYXV7BB.mjs");
5077
+ const { PluginManager: PluginManager2 } = await import("./plugin-53SY5YBS.mjs");
4911
5078
  const fs4 = await import("fs/promises");
4912
5079
  const pluginManager = new PluginManager2({
4913
5080
  config,
@@ -6796,11 +6963,16 @@ function escapeFarmHtmlAttribute(value) {
6796
6963
  .replace(/>/g, "&gt;");
6797
6964
  }
6798
6965
 
6799
- async function renderFarmElement(ReactDOMServer, element, routeKey) {
6966
+ async function renderFarmElement(ReactDOMServer, element, routeKey, flushMarkers = false) {
6967
+ // Written after each React flush in a streamed navigation (flushMarkers): the browser swaps in
6968
+ // the shell, then adds each Suspense boundary as soon as the flush that completed it ends.
6969
+ const FARM_FLUSH_MARKER = "<!--farm-flush-->";
6800
6970
  // Islands mode: each render writes its islands' values itself, so a request that renders twice
6801
6971
  // (notFound(), or a synchronous attempt that suspends and streams) still sends them.
6802
6972
  if (typeof farmIslandsRender === "function") element = farmIslandsRender(element);
6803
6973
  const streamErrors = [];
6974
+ // A browser that leaves the page cancels the stream: React's abort errors are not failures.
6975
+ let cancelled = false;
6804
6976
  const syncHtml = renderFarmElementSync(ReactDOMServer, element, routeKey);
6805
6977
  if (syncHtml !== undefined) return { html: syncHtml, shellHtml: syncHtml, streamErrors };
6806
6978
  let encoder;
@@ -6838,7 +7010,7 @@ async function renderFarmElement(ReactDOMServer, element, routeKey) {
6838
7010
  // request handler must still receive them to map the response status,
6839
7011
  // but they should not produce a misleading SSR failure log.
6840
7012
  streamErrors.push(error);
6841
- if (isFarmRedirectError(error) || isFarmNotFoundError(error)) return;
7013
+ if (cancelled || isFarmRedirectError(error) || isFarmNotFoundError(error)) return;
6842
7014
  console.error("[Farm SSR stream]", error);
6843
7015
  },
6844
7016
  });
@@ -6885,13 +7057,33 @@ async function renderFarmElement(ReactDOMServer, element, routeKey) {
6885
7057
  }
6886
7058
 
6887
7059
  let replayFirstChunk = true;
7060
+ let pendingRead = null;
7061
+ // A flush is the chunks React has queued when a task boundary passes.
7062
+ const drainFlush = async function(controller, waitForFirst) {
7063
+ for (let first = waitForFirst; ; first = false) {
7064
+ const read = pendingRead || (pendingRead = reader.read());
7065
+ const result = first
7066
+ ? await read
7067
+ : await Promise.race([read, new Promise(function(resolve) { setTimeout(resolve, 0); })]);
7068
+ if (!result) break;
7069
+ pendingRead = null;
7070
+ if (result.done) {
7071
+ controller.close();
7072
+ return;
7073
+ }
7074
+ controller.enqueue(normalizeChunk(result.value));
7075
+ }
7076
+ controller.enqueue(normalizeChunk(FARM_FLUSH_MARKER));
7077
+ };
6888
7078
  const replayStream = new ReadableStream({
6889
7079
  pull(controller) {
6890
7080
  if (replayFirstChunk) {
6891
7081
  replayFirstChunk = false;
6892
7082
  controller.enqueue(firstChunk);
7083
+ if (flushMarkers) return drainFlush(controller, false);
6893
7084
  return;
6894
7085
  }
7086
+ if (flushMarkers) return drainFlush(controller, true);
6895
7087
  return reader.read().then(
6896
7088
  function(result) {
6897
7089
  if (result.done) controller.close();
@@ -6903,6 +7095,7 @@ async function renderFarmElement(ReactDOMServer, element, routeKey) {
6903
7095
  );
6904
7096
  },
6905
7097
  cancel(reason) {
7098
+ cancelled = true;
6906
7099
  return reader.cancel(reason);
6907
7100
  },
6908
7101
  });
@@ -6927,6 +7120,7 @@ async function renderFarmElement(ReactDOMServer, element, routeKey) {
6927
7120
  let settleComplete;
6928
7121
  let rejectComplete;
6929
7122
  const chunks = [];
7123
+ let unflushed = false;
6930
7124
  const decision = new Promise(function(resolve, reject) {
6931
7125
  settleDecision = resolve;
6932
7126
  rejectDecision = reject;
@@ -6949,8 +7143,15 @@ async function renderFarmElement(ReactDOMServer, element, routeKey) {
6949
7143
  const normalized = normalizeChunk(chunk);
6950
7144
  if (streamStarted) streamController.enqueue(normalized);
6951
7145
  else chunks.push(normalized);
7146
+ unflushed = true;
6952
7147
  return true;
6953
7148
  },
7149
+ // React calls this after each flush.
7150
+ flush() {
7151
+ if (!flushMarkers || !streamStarted || streamClosed || !unflushed) return;
7152
+ unflushed = false;
7153
+ streamController.enqueue(normalizeChunk(FARM_FLUSH_MARKER));
7154
+ },
6954
7155
  end() {
6955
7156
  if (streamClosed) return;
6956
7157
  streamClosed = true;
@@ -6979,6 +7180,9 @@ async function renderFarmElement(ReactDOMServer, element, routeKey) {
6979
7180
  streamController = controller;
6980
7181
  },
6981
7182
  cancel(reason) {
7183
+ // React writes its abort instructions: the stream no longer takes them.
7184
+ cancelled = true;
7185
+ streamClosed = true;
6982
7186
  if (pipeableStream && typeof pipeableStream.abort === "function") {
6983
7187
  pipeableStream.abort(reason);
6984
7188
  }
@@ -6998,7 +7202,7 @@ async function renderFarmElement(ReactDOMServer, element, routeKey) {
6998
7202
  onError(error) {
6999
7203
  // Same control-flow guard as the readable-stream path above.
7000
7204
  streamErrors.push(error);
7001
- if (isFarmRedirectError(error) || isFarmNotFoundError(error)) return;
7205
+ if (cancelled || isFarmRedirectError(error) || isFarmNotFoundError(error)) return;
7002
7206
  console.error("[Farm SSR stream]", error);
7003
7207
  },
7004
7208
  });
@@ -7019,6 +7223,11 @@ async function renderFarmElement(ReactDOMServer, element, routeKey) {
7019
7223
 
7020
7224
  streamStarted = true;
7021
7225
  for (const chunk of chunks) streamController.enqueue(chunk);
7226
+ // What React wrote while its shell was ready is the shell; Suspense content follows.
7227
+ if (flushMarkers && unflushed) {
7228
+ unflushed = false;
7229
+ streamController.enqueue(normalizeChunk(FARM_FLUSH_MARKER));
7230
+ }
7022
7231
  if (streamClosed) streamController.close();
7023
7232
  return {
7024
7233
  stream,
@@ -9293,8 +9502,12 @@ ${hasServerRuntimeIntegrations ? `
9293
9502
  shouldHydrateLayout &&
9294
9503
  route.serverTree === true &&
9295
9504
  !route.shouldHydrate &&
9296
- request.headers.get("f-render") === "tree";` : `const farmLayoutKeyOf = null;
9297
- const farmPayloadOnlyNavigation = false;`}
9505
+ request.headers.get("f-render") === "tree";
9506
+ // A navigation the browser streams marks where each React flush ends, so the browser
9507
+ // shows the page before its Suspense content arrives (FARM_FLUSH_MARKER).
9508
+ const farmFlushMarkers = request.headers.get("f-stream") === "flush";` : `const farmLayoutKeyOf = null;
9509
+ const farmPayloadOnlyNavigation = false;
9510
+ const farmFlushMarkers = false;`}
9298
9511
  const renderPageElement = async () => {
9299
9512
  // First, render the page content
9300
9513
  let pageElement;
@@ -9416,7 +9629,7 @@ ${hasServerRuntimeIntegrations ? `
9416
9629
  }
9417
9630
 
9418
9631
  wrappedElement = wrapWithFarmIntegrationProviders(wrappedElement);
9419
- return renderFarmElement(ReactDOMServer, wrappedElement, route.pattern);
9632
+ return renderFarmElement(ReactDOMServer, wrappedElement, route.pattern, farmFlushMarkers);
9420
9633
  };
9421
9634
  const renderedPage = ${hasMiddlewareRuntime ? `await _runWithMiddlewareData(middlewareData, () =>
9422
9635
  _runWithMiddlewareContext(middlewareContext, renderPageElement)
@@ -9539,7 +9752,7 @@ ${hasServerRuntimeIntegrations ? `
9539
9752
  // gets HTML without them.
9540
9753
  responseHeaders["Vary"] = farmSharedCacheableRoute
9541
9754
  ? "F-Layouts"
9542
- : "F-Values, F-Layouts, F-Render";` : ""}
9755
+ : "F-Values, F-Layouts, F-Render, F-Stream";` : ""}
9543
9756
  let html = renderedPage.html;
9544
9757
 
9545
9758
  // Check if the layout already rendered a full HTML document
@@ -11782,7 +11995,7 @@ async function createProjectModuleServer(createViteServer, config, root, buildLi
11782
11995
  }
11783
11996
  async function buildClient2(viteBuild, config, root, srcDir, outputDir) {
11784
11997
  const { farmI18nClientBridgePlugin, farmPlugin, farmServerOnlyEntriesPlugin } = await import("./vite.mjs");
11785
- const { PluginManager: PluginManager2 } = await import("./plugin-4KYXV7BB.mjs");
11998
+ const { PluginManager: PluginManager2 } = await import("./plugin-53SY5YBS.mjs");
11786
11999
  const pluginManager = new PluginManager2({
11787
12000
  config,
11788
12001
  isDev: false,
@@ -11809,7 +12022,7 @@ async function buildClient2(viteBuild, config, root, srcDir, outputDir) {
11809
12022
  }
11810
12023
  async function buildSSR(viteBuild, config, root, srcDir, outputDir) {
11811
12024
  const { farmI18nClientBridgePlugin, farmPlugin } = await import("./vite.mjs");
11812
- const { PluginManager: PluginManager2 } = await import("./plugin-4KYXV7BB.mjs");
12025
+ const { PluginManager: PluginManager2 } = await import("./plugin-53SY5YBS.mjs");
11813
12026
  const pluginManager = new PluginManager2({
11814
12027
  config,
11815
12028
  isDev: false,
@@ -11850,7 +12063,7 @@ function resolveLegacyPageEntry(config, root, srcDir) {
11850
12063
  }
11851
12064
  async function buildNitro(config, routeManager, apiRouteManager, serverRenderer, preset, root, distDir, pluginManager) {
11852
12065
  const [{ createNitroConfig }, { createNitro, build: nitroBuild }] = await Promise.all([
11853
- import("./nitro-UT2J5A5D.mjs"),
12066
+ import("./nitro-2Q5NVY7L.mjs"),
11854
12067
  import("nitro/builder")
11855
12068
  ]);
11856
12069
  let nitroConfig = await createNitroConfig(