@farm.js/core 0.1.0-beta.95 → 0.1.0-beta.97

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 (317) hide show
  1. package/dist/after.cjs +1 -1
  2. package/dist/after.mjs +1 -1
  3. package/dist/agent-runtime.d.mts +3 -2
  4. package/dist/agent-runtime.d.ts +3 -2
  5. package/dist/api/route-manager.cjs +43 -4
  6. package/dist/api/route-manager.d.mts +4 -3
  7. package/dist/api/route-manager.d.ts +4 -3
  8. package/dist/api/route-manager.mjs +7 -7
  9. package/dist/api/runtime.cjs +43 -4
  10. package/dist/api/runtime.d.mts +1 -1
  11. package/dist/api/runtime.d.ts +1 -1
  12. package/dist/api/runtime.mjs +5 -5
  13. package/dist/api.cjs +352 -109
  14. package/dist/api.d.mts +7 -6
  15. package/dist/api.d.ts +7 -6
  16. package/dist/api.mjs +19 -12
  17. package/dist/{app-CIIEvA4r.d.ts → app-CIOx3LvY.d.ts} +4 -4
  18. package/dist/{app-O4AEC1OH.d.mts → app-DBd6437H.d.mts} +4 -4
  19. package/dist/app-markdown.d.mts +4 -3
  20. package/dist/app-markdown.d.ts +4 -3
  21. package/dist/cache.cjs +42 -4
  22. package/dist/cache.d.mts +68 -1
  23. package/dist/cache.d.ts +68 -1
  24. package/dist/cache.mjs +3 -3
  25. package/dist/{chunk-AXVJCMVF.mjs → chunk-2HDOV47R.mjs} +3 -3
  26. package/dist/chunk-2HDOV47R.mjs.map +1 -0
  27. package/dist/{chunk-RBRLLZL5.mjs → chunk-34IAPZBG.mjs} +16 -3
  28. package/dist/chunk-34IAPZBG.mjs.map +1 -0
  29. package/dist/{chunk-VV24CC42.mjs → chunk-35NPLKQJ.mjs} +2 -2
  30. package/dist/{chunk-D7QH7MDU.mjs → chunk-3TWQERDE.mjs} +5 -4
  31. package/dist/chunk-3TWQERDE.mjs.map +1 -0
  32. package/dist/{chunk-RWYRFCLG.mjs → chunk-4X57GXQA.mjs} +2 -2
  33. package/dist/{chunk-KOTSX5JH.mjs → chunk-52BR7LTX.mjs} +30 -21
  34. package/dist/chunk-52BR7LTX.mjs.map +1 -0
  35. package/dist/{chunk-SALMKQXH.mjs → chunk-6EJHNHH4.mjs} +80 -27
  36. package/dist/chunk-6EJHNHH4.mjs.map +1 -0
  37. package/dist/{chunk-ZFNK77WN.mjs → chunk-6JNGOC37.mjs} +2 -2
  38. package/dist/{after.cjs.map → chunk-6JNGOC37.mjs.map} +1 -1
  39. package/dist/{chunk-MOW47IF5.mjs → chunk-6UYVU46O.mjs} +2 -2
  40. package/dist/{chunk-7MABZJIM.mjs → chunk-7PYVLJ4J.mjs} +1 -1
  41. package/dist/chunk-7PYVLJ4J.mjs.map +1 -0
  42. package/dist/{chunk-FLHLPB57.mjs → chunk-D7F7YZ7L.mjs} +93 -67
  43. package/dist/chunk-D7F7YZ7L.mjs.map +1 -0
  44. package/dist/chunk-DU3PKDVQ.mjs +35 -0
  45. package/dist/chunk-DU3PKDVQ.mjs.map +1 -0
  46. package/dist/{chunk-SCFX4UTD.mjs → chunk-EHTUKVSW.mjs} +1 -1
  47. package/dist/chunk-EHTUKVSW.mjs.map +1 -0
  48. package/dist/{chunk-KWCNQUH5.mjs → chunk-EPDIF432.mjs} +526 -50
  49. package/dist/chunk-EPDIF432.mjs.map +1 -0
  50. package/dist/{chunk-A3636IHN.mjs → chunk-FP5Q67FO.mjs} +167 -96
  51. package/dist/chunk-FP5Q67FO.mjs.map +1 -0
  52. package/dist/{chunk-HHZAOTQD.mjs → chunk-GJ7W6LNK.mjs} +7 -6
  53. package/dist/chunk-GJ7W6LNK.mjs.map +1 -0
  54. package/dist/{chunk-RLGUZ3HS.mjs → chunk-I3OOUWO5.mjs} +3 -3
  55. package/dist/{chunk-75CGAL6E.mjs → chunk-IZBX2TEU.mjs} +217 -105
  56. package/dist/chunk-IZBX2TEU.mjs.map +1 -0
  57. package/dist/{chunk-22VG4DFJ.mjs → chunk-J3MPQ4MQ.mjs} +2 -2
  58. package/dist/{chunk-22VG4DFJ.mjs.map → chunk-J3MPQ4MQ.mjs.map} +1 -1
  59. package/dist/{chunk-2LS3KKE7.mjs → chunk-JV7JUD7Q.mjs} +4 -4
  60. package/dist/{chunk-Q3OX763A.mjs → chunk-LXDASSTE.mjs} +2 -2
  61. package/dist/{chunk-ZRBCBOEX.mjs → chunk-N2FY2QZ7.mjs} +28 -3
  62. package/dist/chunk-N2FY2QZ7.mjs.map +1 -0
  63. package/dist/{chunk-MRVJCLYQ.mjs → chunk-PSQ7N4XP.mjs} +4 -2
  64. package/dist/chunk-PSQ7N4XP.mjs.map +1 -0
  65. package/dist/{chunk-HVG3HLQZ.mjs → chunk-Q7WGOOAI.mjs} +3 -3
  66. package/dist/{chunk-WTYAPO5I.mjs → chunk-RCNWMEBT.mjs} +3 -2
  67. package/dist/{chunk-WTYAPO5I.mjs.map → chunk-RCNWMEBT.mjs.map} +1 -1
  68. package/dist/{chunk-3INDBMUU.mjs → chunk-TGDIACZT.mjs} +2 -2
  69. package/dist/{chunk-WB75GIX2.mjs → chunk-TQTB33JS.mjs} +14 -3
  70. package/dist/chunk-TQTB33JS.mjs.map +1 -0
  71. package/dist/{chunk-MH27UH72.mjs → chunk-TT3E2JOF.mjs} +3 -3
  72. package/dist/{chunk-UWRGX3J3.mjs → chunk-UMUWR5XA.mjs} +2 -2
  73. package/dist/{chunk-XTLLHCWU.mjs → chunk-V4VRLVLW.mjs} +52 -31
  74. package/dist/chunk-V4VRLVLW.mjs.map +1 -0
  75. package/dist/{chunk-EXCGBERG.mjs → chunk-WD2EBM3I.mjs} +79 -17
  76. package/dist/chunk-WD2EBM3I.mjs.map +1 -0
  77. package/dist/{chunk-DLBUAJTK.mjs → chunk-WMJGA32P.mjs} +74 -5
  78. package/dist/chunk-WMJGA32P.mjs.map +1 -0
  79. package/dist/{chunk-TKQCJMY7.mjs → chunk-X4SFHKFH.mjs} +7 -4
  80. package/dist/{chunk-TKQCJMY7.mjs.map → chunk-X4SFHKFH.mjs.map} +1 -1
  81. package/dist/{chunk-Q7GPJZCO.mjs → chunk-YIBV77KZ.mjs} +26 -7
  82. package/dist/chunk-YIBV77KZ.mjs.map +1 -0
  83. package/dist/client/lifecycle.mjs +2 -2
  84. package/dist/{client-mcMC334J.d.mts → client-DWoLZ3QU.d.mts} +52 -5
  85. package/dist/{client-d5ONQ-Pd.d.ts → client-DuQuQC1h.d.ts} +52 -5
  86. package/dist/client-cache-BMxuFqwH.d.ts +18 -0
  87. package/dist/client-cache-CCK-fCe0.d.mts +18 -0
  88. package/dist/{client-plugins-BvClItiL.d.mts → client-plugins-B6-07YmP.d.mts} +52 -99
  89. package/dist/{client-plugins-B9Sq-iMg.d.ts → client-plugins-By6MVUX-.d.ts} +52 -99
  90. package/dist/client-plugins.cjs +1 -1
  91. package/dist/client-plugins.d.mts +3 -2
  92. package/dist/client-plugins.d.ts +3 -2
  93. package/dist/client-plugins.mjs +2 -2
  94. package/dist/client.cjs +1046 -211
  95. package/dist/client.d.mts +136 -18
  96. package/dist/client.d.ts +136 -18
  97. package/dist/client.mjs +32 -15
  98. package/dist/config.d.mts +3 -2
  99. package/dist/config.d.ts +3 -2
  100. package/dist/{devtools-S52RRRMN.mjs → devtools-XWZX6CCL.mjs} +5 -5
  101. package/dist/{devtools-client-3XRTBND5.mjs → devtools-client-Z7QQA3Q2.mjs} +56 -17
  102. package/dist/devtools-client-Z7QQA3Q2.mjs.map +1 -0
  103. package/dist/{devtools-ui-NJKFORTG.mjs → devtools-ui-2HG5M4EL.mjs} +3 -1
  104. package/dist/devtools-ui-2HG5M4EL.mjs.map +1 -0
  105. package/dist/docs.cjs +24 -5
  106. package/dist/docs.mjs +5 -5
  107. package/dist/i18n/server.cjs +13 -2
  108. package/dist/i18n/server.d.mts +2 -2
  109. package/dist/i18n/server.d.ts +2 -2
  110. package/dist/i18n/server.mjs +1 -1
  111. package/dist/index.cjs +1928 -894
  112. package/dist/index.d.mts +139 -21
  113. package/dist/index.d.ts +139 -21
  114. package/dist/index.mjs +57 -34
  115. package/dist/index.mjs.map +1 -1
  116. package/dist/integration-api-BT024nuJ.d.mts +97 -0
  117. package/dist/integration-api-BT024nuJ.d.ts +97 -0
  118. package/dist/integrations.d.mts +3 -2
  119. package/dist/integrations.d.ts +3 -2
  120. package/dist/internal/build-runtime.cjs +764 -547
  121. package/dist/internal/build-runtime.d.mts +5 -4
  122. package/dist/internal/build-runtime.d.ts +5 -4
  123. package/dist/internal/build-runtime.mjs +16 -16
  124. package/dist/internal/client-runtime.cjs +1 -1
  125. package/dist/internal/client-runtime.mjs +2 -2
  126. package/dist/internal/config-runtime.cjs +4 -1
  127. package/dist/internal/config-runtime.d.mts +4 -3
  128. package/dist/internal/config-runtime.d.ts +4 -3
  129. package/dist/internal/config-runtime.mjs +4 -4
  130. package/dist/internal/product-telemetry-runtime.cjs +1 -1
  131. package/dist/internal/product-telemetry-runtime.mjs +1 -1
  132. package/dist/internal/production-runtime.cjs +29 -3
  133. package/dist/internal/production-runtime.d.mts +8 -7
  134. package/dist/internal/production-runtime.d.ts +8 -7
  135. package/dist/internal/production-runtime.mjs +5 -5
  136. package/dist/{metadata-route-yV4U6X8h.d.ts → metadata-route-8_V3UonT.d.ts} +1 -1
  137. package/dist/{metadata-route-p4K1l92V.d.mts → metadata-route-CWP_HjGU.d.mts} +1 -1
  138. package/dist/middleware.cjs +28 -2
  139. package/dist/middleware.d.mts +5 -4
  140. package/dist/middleware.d.ts +5 -4
  141. package/dist/middleware.mjs +4 -4
  142. package/dist/navigation.cjs +3 -1
  143. package/dist/navigation.mjs +3 -3
  144. package/dist/observability.cjs +27 -2
  145. package/dist/observability.mjs +1 -1
  146. package/dist/plugin.cjs +528 -349
  147. package/dist/plugin.d.mts +3 -2
  148. package/dist/plugin.d.ts +3 -2
  149. package/dist/plugin.mjs +13 -13
  150. package/dist/{production-runtime-IkB0Qj4i.d.mts → production-runtime-BGRH1dKG.d.mts} +1 -1
  151. package/dist/{production-runtime-0JTch4_d.d.ts → production-runtime-CdmzsDax.d.ts} +1 -1
  152. package/dist/query/client.cjs +68 -29
  153. package/dist/query/client.mjs +69 -30
  154. package/dist/query/client.mjs.map +1 -1
  155. package/dist/{render-plan-Dc8CjNI7.d.ts → render-plan-0GeHiGVZ.d.ts} +1 -1
  156. package/dist/{render-plan-CU31j-Jk.d.mts → render-plan-DLxJYAA5.d.mts} +1 -1
  157. package/dist/renderer-client.cjs +169 -26
  158. package/dist/renderer-client.d.mts +7 -6
  159. package/dist/renderer-client.d.ts +7 -6
  160. package/dist/renderer-client.mjs +16 -19
  161. package/dist/renderer-client.mjs.map +1 -1
  162. package/dist/{request-BXa1KY8i.d.mts → request-BCNXSXLh.d.mts} +1 -1
  163. package/dist/{request-CUUBujZt.d.ts → request-BstWbZ6O.d.ts} +1 -1
  164. package/dist/request.d.mts +4 -3
  165. package/dist/request.d.ts +4 -3
  166. package/dist/{route-Y8lfz1wF.d.ts → route-4pd-EVtw.d.ts} +45 -50
  167. package/dist/{route-Cq3aObmj.d.mts → route-CvEr4Uc9.d.mts} +45 -50
  168. package/dist/routes.cjs +27 -2
  169. package/dist/routes.d.mts +3 -2
  170. package/dist/routes.d.ts +3 -2
  171. package/dist/routes.mjs +4 -4
  172. package/dist/{runtime-j1S3sDTh.d.ts → runtime-BgDQzBiu.d.ts} +1 -0
  173. package/dist/{runtime-DDwvDtS4.d.mts → runtime-CV2UCV-5.d.mts} +1 -0
  174. package/dist/server-action-security.mjs +2 -2
  175. package/dist/server-fn-client.cjs +102 -26
  176. package/dist/server-fn-client.d.mts +6 -0
  177. package/dist/server-fn-client.d.ts +6 -0
  178. package/dist/server-fn-client.mjs +2 -1
  179. package/dist/server-fn.cjs +42 -4
  180. package/dist/server-fn.mjs +5 -5
  181. package/dist/server-plugins.d.mts +4 -3
  182. package/dist/server-plugins.d.ts +4 -3
  183. package/dist/server-query-client.cjs +195 -34
  184. package/dist/server-query-client.d.mts +3 -3
  185. package/dist/server-query-client.d.ts +3 -3
  186. package/dist/server-query-client.mjs +7 -7
  187. package/dist/{server-query-runtime-3zAj77yv.d.ts → server-query-runtime-DXRNhX_3.d.ts} +2 -0
  188. package/dist/{server-query-runtime-B50KAcj5.d.mts → server-query-runtime-aP52iuL5.d.mts} +2 -0
  189. package/dist/server-query.cjs +44 -5
  190. package/dist/server-query.d.mts +4 -0
  191. package/dist/server-query.d.ts +4 -0
  192. package/dist/server-query.mjs +7 -7
  193. package/dist/server.cjs +553 -370
  194. package/dist/server.d.mts +11 -10
  195. package/dist/server.d.ts +11 -10
  196. package/dist/server.mjs +17 -17
  197. package/dist/{spa-router-CyLkwst6.d.mts → spa-router-BeyAVSc6.d.mts} +1 -1
  198. package/dist/{spa-router-BkqGXaV_.d.ts → spa-router-COgu4txb.d.ts} +1 -1
  199. package/dist/testing.cjs +27 -2
  200. package/dist/testing.d.mts +3 -2
  201. package/dist/testing.d.ts +3 -2
  202. package/dist/testing.mjs +9 -9
  203. package/dist/{utils-NKR6SoNv.d.mts → utils-DL2VwDQl.d.mts} +1 -1
  204. package/dist/{utils-B2OHrb9F.d.ts → utils-DkU2c_1B.d.ts} +1 -1
  205. package/dist/version.cjs +1 -1
  206. package/dist/version.mjs +1 -1
  207. package/dist/vite.cjs +536 -353
  208. package/dist/vite.d.mts +3 -2
  209. package/dist/vite.d.ts +3 -2
  210. package/dist/vite.mjs +17 -13
  211. package/package.json +17 -17
  212. package/types/client.d.ts +115 -10
  213. package/dist/agent-runtime.cjs.map +0 -1
  214. package/dist/api/route-manager.cjs.map +0 -1
  215. package/dist/api/runtime.cjs.map +0 -1
  216. package/dist/api.cjs.map +0 -1
  217. package/dist/app-markdown.cjs.map +0 -1
  218. package/dist/cache.cjs.map +0 -1
  219. package/dist/chunk-75CGAL6E.mjs.map +0 -1
  220. package/dist/chunk-7MABZJIM.mjs.map +0 -1
  221. package/dist/chunk-A3636IHN.mjs.map +0 -1
  222. package/dist/chunk-AXVJCMVF.mjs.map +0 -1
  223. package/dist/chunk-D7QH7MDU.mjs.map +0 -1
  224. package/dist/chunk-DLBUAJTK.mjs.map +0 -1
  225. package/dist/chunk-EXCGBERG.mjs.map +0 -1
  226. package/dist/chunk-FLHLPB57.mjs.map +0 -1
  227. package/dist/chunk-HHZAOTQD.mjs.map +0 -1
  228. package/dist/chunk-KOTSX5JH.mjs.map +0 -1
  229. package/dist/chunk-KWCNQUH5.mjs.map +0 -1
  230. package/dist/chunk-MRVJCLYQ.mjs.map +0 -1
  231. package/dist/chunk-Q7GPJZCO.mjs.map +0 -1
  232. package/dist/chunk-RBRLLZL5.mjs.map +0 -1
  233. package/dist/chunk-SALMKQXH.mjs.map +0 -1
  234. package/dist/chunk-SCFX4UTD.mjs.map +0 -1
  235. package/dist/chunk-WB75GIX2.mjs.map +0 -1
  236. package/dist/chunk-XTLLHCWU.mjs.map +0 -1
  237. package/dist/chunk-ZFNK77WN.mjs.map +0 -1
  238. package/dist/chunk-ZRBCBOEX.mjs.map +0 -1
  239. package/dist/client/lifecycle.cjs.map +0 -1
  240. package/dist/client-cache-CopR_MaI.d.mts +0 -6
  241. package/dist/client-cache-Djy_TlE8.d.ts +0 -6
  242. package/dist/client-plugins.cjs.map +0 -1
  243. package/dist/client.cjs.map +0 -1
  244. package/dist/config.cjs.map +0 -1
  245. package/dist/cron.cjs.map +0 -1
  246. package/dist/deferred.cjs.map +0 -1
  247. package/dist/deployment.cjs.map +0 -1
  248. package/dist/devtools-client-3XRTBND5.mjs.map +0 -1
  249. package/dist/devtools-ui-NJKFORTG.mjs.map +0 -1
  250. package/dist/docs.cjs.map +0 -1
  251. package/dist/env-types.cjs.map +0 -1
  252. package/dist/env.cjs.map +0 -1
  253. package/dist/environment/vite.cjs.map +0 -1
  254. package/dist/environment.cjs.map +0 -1
  255. package/dist/font.cjs.map +0 -1
  256. package/dist/headers.cjs.map +0 -1
  257. package/dist/i18n/client.cjs.map +0 -1
  258. package/dist/i18n/index.cjs.map +0 -1
  259. package/dist/i18n/server.cjs.map +0 -1
  260. package/dist/image/server.cjs.map +0 -1
  261. package/dist/image/sharp.cjs.map +0 -1
  262. package/dist/image.cjs.map +0 -1
  263. package/dist/index.cjs.map +0 -1
  264. package/dist/instrumentation.cjs.map +0 -1
  265. package/dist/integrations.cjs.map +0 -1
  266. package/dist/internal/build-runtime.cjs.map +0 -1
  267. package/dist/internal/client-runtime.cjs.map +0 -1
  268. package/dist/internal/config-runtime.cjs.map +0 -1
  269. package/dist/internal/isolated-boundary.cjs.map +0 -1
  270. package/dist/internal/metadata-image-runtime.cjs.map +0 -1
  271. package/dist/internal/product-telemetry-runtime.cjs.map +0 -1
  272. package/dist/internal/production-node-env.cjs.map +0 -1
  273. package/dist/internal/production-runtime.cjs.map +0 -1
  274. package/dist/markdown.cjs.map +0 -1
  275. package/dist/middleware.cjs.map +0 -1
  276. package/dist/navigation.cjs.map +0 -1
  277. package/dist/observability.cjs.map +0 -1
  278. package/dist/plugin.cjs.map +0 -1
  279. package/dist/query/client.cjs.map +0 -1
  280. package/dist/query/index.cjs.map +0 -1
  281. package/dist/query/parsers.cjs.map +0 -1
  282. package/dist/query/server.cjs.map +0 -1
  283. package/dist/renderer/react/client.cjs.map +0 -1
  284. package/dist/renderer/react/server.cjs.map +0 -1
  285. package/dist/renderer/react/vite.cjs.map +0 -1
  286. package/dist/renderer-client.cjs.map +0 -1
  287. package/dist/renderer.cjs.map +0 -1
  288. package/dist/request.cjs.map +0 -1
  289. package/dist/router.cjs.map +0 -1
  290. package/dist/routes.cjs.map +0 -1
  291. package/dist/server-action-security.cjs.map +0 -1
  292. package/dist/server-fn-client.cjs.map +0 -1
  293. package/dist/server-fn.cjs.map +0 -1
  294. package/dist/server-plugins.cjs.map +0 -1
  295. package/dist/server-query-client.cjs.map +0 -1
  296. package/dist/server-query.cjs.map +0 -1
  297. package/dist/server.cjs.map +0 -1
  298. package/dist/storage.cjs.map +0 -1
  299. package/dist/testing.cjs.map +0 -1
  300. package/dist/theme/client.cjs.map +0 -1
  301. package/dist/theme/index.cjs.map +0 -1
  302. package/dist/theme/runtime.cjs.map +0 -1
  303. package/dist/theme/server.cjs.map +0 -1
  304. package/dist/version.cjs.map +0 -1
  305. package/dist/vite.cjs.map +0 -1
  306. package/dist/workflows.cjs.map +0 -1
  307. /package/dist/{chunk-VV24CC42.mjs.map → chunk-35NPLKQJ.mjs.map} +0 -0
  308. /package/dist/{chunk-RWYRFCLG.mjs.map → chunk-4X57GXQA.mjs.map} +0 -0
  309. /package/dist/{chunk-MOW47IF5.mjs.map → chunk-6UYVU46O.mjs.map} +0 -0
  310. /package/dist/{chunk-RLGUZ3HS.mjs.map → chunk-I3OOUWO5.mjs.map} +0 -0
  311. /package/dist/{chunk-2LS3KKE7.mjs.map → chunk-JV7JUD7Q.mjs.map} +0 -0
  312. /package/dist/{chunk-Q3OX763A.mjs.map → chunk-LXDASSTE.mjs.map} +0 -0
  313. /package/dist/{chunk-HVG3HLQZ.mjs.map → chunk-Q7WGOOAI.mjs.map} +0 -0
  314. /package/dist/{chunk-3INDBMUU.mjs.map → chunk-TGDIACZT.mjs.map} +0 -0
  315. /package/dist/{chunk-MH27UH72.mjs.map → chunk-TT3E2JOF.mjs.map} +0 -0
  316. /package/dist/{chunk-UWRGX3J3.mjs.map → chunk-UMUWR5XA.mjs.map} +0 -0
  317. /package/dist/{devtools-S52RRRMN.mjs.map → devtools-XWZX6CCL.mjs.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server-query.ts"],"sourcesContent":["import {\n createFarmCacheKey,\n createRouteDataCacheKey,\n createRouteDataCacheTag,\n getFarmDataCache,\n type RouteDataCacheKey,\n} from \"./cache\";\nimport { getServerActionExecutionContext } from \"./server-action-security\";\nimport {\n createServerFn,\n type AnyServerFnMiddleware,\n type InferServerFnSchemaInput,\n type InferServerFnSchemaOutput,\n type ServerFn,\n type ServerFnContext,\n type ServerFnHandler,\n type ServerFnHandlerContext,\n type ServerFnMiddlewareContext,\n type ServerFnSchema,\n _parseServerFnSchema,\n} from \"./server-fn\";\nimport { createFarmServerQueryResult, type FarmServerQueryResult } from \"./server-query-protocol\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type ServerQueryStaleTime = number | false | `${number}${\"ms\" | \"s\" | \"m\" | \"h\"}`;\n\nexport type ServerQueryKey<TInput, TContext extends object = {}> = (\n context: ServerFnContext<TInput, TContext>,\n) => MaybePromise<RouteDataCacheKey>;\n\nexport type ServerQueryOptions<\n TSchema extends ServerFnSchema | undefined,\n TResult,\n TMiddlewares extends readonly AnyServerFnMiddleware[] = readonly [],\n> = {\n input?: TSchema;\n output?: undefined;\n middleware?: TMiddlewares;\n key: ServerQueryKey<\n TSchema extends ServerFnSchema ? InferServerFnSchemaOutput<TSchema> : unknown,\n ServerFnMiddlewareContext<TMiddlewares>\n >;\n /** Milliseconds, a duration string such as \"30s\", or false for no expiry. */\n staleTime?: ServerQueryStaleTime;\n handler: ServerFnHandler<\n TSchema extends ServerFnSchema ? InferServerFnSchemaOutput<TSchema> : unknown,\n TResult,\n ServerFnMiddlewareContext<TMiddlewares>\n >;\n};\n\nexport type ServerQueryOutputOptions<\n TInputSchema extends ServerFnSchema | undefined,\n TOutputSchema extends ServerFnSchema,\n TMiddlewares extends readonly AnyServerFnMiddleware[] = readonly [],\n> = {\n input?: TInputSchema;\n output: TOutputSchema;\n middleware?: TMiddlewares;\n key: ServerQueryKey<\n TInputSchema extends ServerFnSchema ? InferServerFnSchemaOutput<TInputSchema> : unknown,\n ServerFnMiddlewareContext<TMiddlewares>\n >;\n /** Milliseconds, a duration string such as \"30s\", or false for no expiry. */\n staleTime?: ServerQueryStaleTime;\n handler: ServerFnHandler<\n TInputSchema extends ServerFnSchema ? InferServerFnSchemaOutput<TInputSchema> : unknown,\n unknown,\n ServerFnMiddlewareContext<TMiddlewares>\n >;\n};\n\nexport type ServerQuery<TInput, TResult> = ([unknown] extends [TInput]\n ? (input?: TInput) => Promise<TResult>\n : (input: TInput) => Promise<TResult>) & {\n readonly __farmServerQuery: true;\n readonly __farmServerQueryInput?: unknown;\n readonly __farmServerQueryOutput?: unknown;\n};\n\nexport const FARM_SERVER_QUERY_SYMBOL = Symbol.for(\"farm.server-query\");\n\ntype AnyServerQueryOptions = {\n input?: ServerFnSchema;\n output?: ServerFnSchema;\n middleware?: readonly AnyServerFnMiddleware[];\n key: ServerQueryKey<any, any>;\n staleTime?: ServerQueryStaleTime;\n handler: ServerFnHandler<any, any, any>;\n};\n\nconst requestInflight = new WeakMap<Request, Map<string, Promise<unknown>>>();\nconst detachedInflight = new Map<string, Promise<unknown>>();\n\nexport function createServerQuery<\n TInputSchema extends ServerFnSchema,\n TOutputSchema extends ServerFnSchema,\n const TMiddlewares extends readonly AnyServerFnMiddleware[] = readonly [],\n>(\n options: ServerQueryOutputOptions<TInputSchema, TOutputSchema, TMiddlewares>,\n): ServerQuery<\n InferServerFnSchemaInput<TInputSchema>,\n Awaited<InferServerFnSchemaOutput<TOutputSchema>>\n>;\nexport function createServerQuery<\n TOutputSchema extends ServerFnSchema,\n const TMiddlewares extends readonly AnyServerFnMiddleware[] = readonly [],\n>(\n options: ServerQueryOutputOptions<undefined, TOutputSchema, TMiddlewares>,\n): ServerQuery<unknown, Awaited<InferServerFnSchemaOutput<TOutputSchema>>>;\nexport function createServerQuery<\n TSchema extends ServerFnSchema,\n TResult,\n const TMiddlewares extends readonly AnyServerFnMiddleware[] = readonly [],\n>(\n options: ServerQueryOptions<TSchema, TResult, TMiddlewares>,\n): ServerQuery<InferServerFnSchemaInput<TSchema>, Awaited<TResult>>;\nexport function createServerQuery<\n TResult,\n const TMiddlewares extends readonly AnyServerFnMiddleware[] = readonly [],\n>(\n options: ServerQueryOptions<undefined, TResult, TMiddlewares>,\n): ServerQuery<unknown, Awaited<TResult>>;\nexport function createServerQuery(options: AnyServerQueryOptions): ServerQuery<unknown, unknown> {\n if (!options || typeof options.handler !== \"function\") {\n throw new TypeError(\"createServerQuery requires a handler function\");\n }\n if (typeof options.key !== \"function\") {\n throw new TypeError(\"createServerQuery requires a key function\");\n }\n\n const staleTime = normalizeServerQueryStaleTime(options.staleTime);\n const execute = (\n createServerFn as (options: any) => ServerFn<unknown, FarmServerQueryResult<any>>\n )({\n input: options.input,\n middleware: options.middleware,\n handler: async (context: ServerFnHandlerContext<any, any>) => {\n const routeKey = await options.key(context);\n assertServerQueryKey(routeKey);\n\n const clientKey = createRouteDataCacheKey(routeKey);\n const cacheKey = createFarmCacheKey([\"route-data\", routeKey]);\n const producer = async () => {\n const value = await options.handler(context);\n return _parseServerFnSchema(options.output, value, \"output\", \"createServerQuery\");\n };\n\n let data: unknown;\n let updatedAt: number;\n\n if (staleTime === 0) {\n data = await dedupeServerQueryRequest(cacheKey, context.request, producer);\n updatedAt = Date.now();\n } else {\n const cache = getFarmDataCache();\n data = await cache.getOrSet(cacheKey, producer, {\n tags: [createRouteDataCacheTag(routeKey)],\n revalidate: staleTime === false ? false : staleTime / 1000,\n });\n updatedAt =\n (await cache.getEntryAsync(cacheKey, { allowStale: true }))?.createdAt ?? Date.now();\n }\n\n return createFarmServerQueryResult(data, {\n key: clientKey,\n staleTime,\n updatedAt,\n });\n },\n });\n\n const query = async (input?: unknown) => {\n const result = await execute(input);\n return getServerActionExecutionContext() ? result : result.data;\n };\n\n Object.defineProperties(query, {\n [FARM_SERVER_QUERY_SYMBOL]: {\n value: true,\n enumerable: false,\n },\n __farmServerQuery: {\n value: true,\n enumerable: false,\n },\n __farmServerQueryInput: {\n value: options.input,\n enumerable: false,\n },\n __farmServerQueryOutput: {\n value: options.output,\n enumerable: false,\n },\n });\n\n return query as ServerQuery<unknown, unknown>;\n}\n\nasync function dedupeServerQueryRequest<TData>(\n key: string,\n request: Request | undefined,\n producer: () => Promise<TData>,\n): Promise<TData> {\n let inflight: Map<string, Promise<unknown>>;\n if (request) {\n inflight = requestInflight.get(request) ?? new Map();\n requestInflight.set(request, inflight);\n } else {\n inflight = detachedInflight;\n }\n\n const existing = inflight.get(key) as Promise<TData> | undefined;\n if (existing) return existing;\n\n const promise = Promise.resolve().then(producer);\n inflight.set(key, promise);\n\n try {\n return await promise;\n } finally {\n inflight.delete(key);\n }\n}\n\nfunction normalizeServerQueryStaleTime(value: ServerQueryStaleTime | undefined): number | false {\n if (value === false) return false;\n if (value === undefined) return 0;\n\n if (typeof value === \"number\") {\n if (!Number.isFinite(value) || value < 0) {\n throw new TypeError(\"createServerQuery staleTime must be a non-negative duration\");\n }\n return value;\n }\n\n const match = value.match(/^(\\d+(?:\\.\\d+)?)(ms|s|m|h)$/);\n if (!match) {\n throw new TypeError('createServerQuery staleTime must look like \"250ms\", \"30s\", \"5m\", or \"1h\"');\n }\n\n const amount = Number(match[1]);\n const unit = match[2];\n const multiplier = unit === \"ms\" ? 1 : unit === \"s\" ? 1000 : unit === \"m\" ? 60_000 : 3_600_000;\n return amount * multiplier;\n}\n\nfunction assertServerQueryKey(key: unknown): asserts key is RouteDataCacheKey {\n if (typeof key === \"string\") {\n if (key.trim().length > 0) return;\n } else if (Array.isArray(key)) {\n return;\n }\n\n throw new TypeError(\"createServerQuery key must return a non-empty string or an array\");\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server-query-client.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useRef, useSyncExternalStore } from \"react\";\nimport { getFarmClientDataCache, type FarmClientCacheStatus } from \"./client-cache\";\nimport type { ServerQuery } from \"./server-query\";\nimport {\n createServerQueryCallKey,\n fetchServerQuery,\n type ServerQueryFetchOptions,\n} from \"./server-query-runtime\";\n\nexport {\n beginFarmServerQueryAction,\n completeFarmServerQueryAction,\n fetchServerQuery,\n prefetchServerQuery,\n shouldApplyFarmServerQueryActionResult,\n} from \"./server-query-runtime\";\nexport type {\n FarmServerQueryActionInvocation,\n ServerQueryFetchOptions,\n} from \"./server-query-runtime\";\n\nexport type UseServerQueryOptions = ServerQueryFetchOptions & {\n enabled?: boolean;\n refetchOnWindowFocus?: boolean;\n refetchOnReconnect?: boolean;\n};\n\nexport type UseServerQueryResult<TData> = {\n data: TData | undefined;\n error: Error | null;\n status: FarmClientCacheStatus;\n pending: boolean;\n fetching: boolean;\n stale: boolean;\n refetch: () => Promise<TData>;\n};\n\nexport function useServerQuery<TInput, TData>(\n query: ServerQuery<TInput, TData>,\n input: TInput,\n options: UseServerQueryOptions = {},\n): UseServerQueryResult<TData> {\n const cache = getFarmClientDataCache();\n const key = createServerQueryCallKey(query, input);\n const inputRef = useRef(input);\n const optionsRef = useRef(options);\n const mountedKeyRef = useRef<string | undefined>(undefined);\n inputRef.current = input;\n optionsRef.current = options;\n\n const subscribe = useCallback(\n (listener: () => void) => cache.subscribe(key, listener),\n [cache, key],\n );\n const getSnapshot = useCallback(() => cache.get<TData>(key), [cache, key]);\n const entry = useSyncExternalStore(subscribe, getSnapshot, () => undefined);\n\n const run = useCallback(\n (force = false) =>\n fetchServerQuery(query, inputRef.current, {\n ...optionsRef.current,\n force,\n }),\n [query],\n );\n\n useEffect(() => {\n if (options.enabled === false) {\n // Re-enabling is a new read, even when the query/input key is unchanged.\n mountedKeyRef.current = undefined;\n return;\n }\n\n const firstReadForKey = mountedKeyRef.current !== key;\n if (firstReadForKey) mountedKeyRef.current = key;\n if (\n (firstReadForKey && (!entry || cache.isStale(key))) ||\n (entry?.invalidatedAt !== undefined && !entry.fetching)\n ) {\n void run().catch(() => undefined);\n }\n }, [cache, entry, key, options.enabled, run]);\n\n useEffect(() => {\n if (options.enabled === false || typeof window === \"undefined\") return;\n\n const refreshIfStale = () => {\n if (cache.isStale(key)) void run().catch(() => undefined);\n };\n const onFocus = options.refetchOnWindowFocus === false ? undefined : refreshIfStale;\n const onOnline = options.refetchOnReconnect === false ? undefined : refreshIfStale;\n\n if (onFocus) window.addEventListener(\"focus\", onFocus);\n if (onOnline) window.addEventListener(\"online\", onOnline);\n return () => {\n if (onFocus) window.removeEventListener(\"focus\", onFocus);\n if (onOnline) window.removeEventListener(\"online\", onOnline);\n };\n }, [cache, key, options.enabled, options.refetchOnReconnect, options.refetchOnWindowFocus, run]);\n\n const status = entry?.status ?? (entry ? \"success\" : \"idle\");\n const fetching = entry?.fetching ?? false;\n\n return {\n data: entry?.data,\n error: entry?.error ?? null,\n status,\n pending: status === \"pending\" && (entry?.updatedAt ?? 0) === 0,\n fetching,\n stale: cache.isStale(key),\n refetch: () => run(true),\n };\n}\n"],"mappings":";;;;;;;;;;;;AAEA,SAAS,aAAa,WAAW,QAAQ,4BAA4B;AAqC9D,SAAS,eACd,OACA,OACA,UAAiC,CAAC,GACL;AAC7B,QAAM,QAAQ,uBAAuB;AACrC,QAAM,MAAM,yBAAyB,OAAO,KAAK;AACjD,QAAM,WAAW,OAAO,KAAK;AAC7B,QAAM,aAAa,OAAO,OAAO;AACjC,QAAM,gBAAgB,OAA2B,MAAS;AAC1D,WAAS,UAAU;AACnB,aAAW,UAAU;AAErB,QAAM,YAAY;AAAA,IAChB,CAAC,aAAyB,MAAM,UAAU,KAAK,QAAQ;AAAA,IACvD,CAAC,OAAO,GAAG;AAAA,EACb;AACA,QAAM,cAAc,YAAY,MAAM,MAAM,IAAW,GAAG,GAAG,CAAC,OAAO,GAAG,CAAC;AACzE,QAAM,QAAQ,qBAAqB,WAAW,aAAa,MAAM,MAAS;AAE1E,QAAM,MAAM;AAAA,IACV,CAAC,QAAQ,UACP,iBAAiB,OAAO,SAAS,SAAS;AAAA,MACxC,GAAG,WAAW;AAAA,MACd;AAAA,IACF,CAAC;AAAA,IACH,CAAC,KAAK;AAAA,EACR;AAEA,YAAU,MAAM;AACd,QAAI,QAAQ,YAAY,OAAO;AAE7B,oBAAc,UAAU;AACxB;AAAA,IACF;AAEA,UAAM,kBAAkB,cAAc,YAAY;AAClD,QAAI,gBAAiB,eAAc,UAAU;AAC7C,QACG,oBAAoB,CAAC,SAAS,MAAM,QAAQ,GAAG,MAC/C,OAAO,kBAAkB,UAAa,CAAC,MAAM,UAC9C;AACA,WAAK,IAAI,EAAE,MAAM,MAAM,MAAS;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,OAAO,OAAO,KAAK,QAAQ,SAAS,GAAG,CAAC;AAE5C,YAAU,MAAM;AACd,QAAI,QAAQ,YAAY,SAAS,OAAO,WAAW,YAAa;AAEhE,UAAM,iBAAiB,6BAAM;AAC3B,UAAI,MAAM,QAAQ,GAAG,EAAG,MAAK,IAAI,EAAE,MAAM,MAAM,MAAS;AAAA,IAC1D,GAFuB;AAGvB,UAAM,UAAU,QAAQ,yBAAyB,QAAQ,SAAY;AACrE,UAAM,WAAW,QAAQ,uBAAuB,QAAQ,SAAY;AAEpE,QAAI,QAAS,QAAO,iBAAiB,SAAS,OAAO;AACrD,QAAI,SAAU,QAAO,iBAAiB,UAAU,QAAQ;AACxD,WAAO,MAAM;AACX,UAAI,QAAS,QAAO,oBAAoB,SAAS,OAAO;AACxD,UAAI,SAAU,QAAO,oBAAoB,UAAU,QAAQ;AAAA,IAC7D;AAAA,EACF,GAAG,CAAC,OAAO,KAAK,QAAQ,SAAS,QAAQ,oBAAoB,QAAQ,sBAAsB,GAAG,CAAC;AAE/F,QAAM,SAAS,OAAO,WAAW,QAAQ,YAAY;AACrD,QAAM,WAAW,OAAO,YAAY;AAEpC,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,OAAO,OAAO,SAAS;AAAA,IACvB;AAAA,IACA,SAAS,WAAW,cAAc,OAAO,aAAa,OAAO;AAAA,IAC7D;AAAA,IACA,OAAO,MAAM,QAAQ,GAAG;AAAA,IACxB,SAAS,6BAAM,IAAI,IAAI,GAAd;AAAA,EACX;AACF;AA3EgB;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/mutation-client.ts","../src/fetcher-client.tsx","../src/store.ts","../src/client/link.tsx","../src/provider.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport { isAPIRouteRef, type APIResult, type ClientOptions } from \"./api/client\";\n\nexport type MutationStatus = \"idle\" | \"pending\" | \"success\" | \"error\";\n\nexport type AnyMutationTarget = (...args: any[]) => Promise<any>;\n\nexport type InferMutationVariables<TTarget extends AnyMutationTarget> =\n Parameters<TTarget> extends [] ? undefined : Parameters<TTarget>[0];\n\nexport type InferMutationData<TTarget extends AnyMutationTarget> = TTarget extends {\n readonly __farmRouteData: infer TData;\n}\n ? TData\n : Awaited<ReturnType<TTarget>>;\n\nexport type InferMutationError<TTarget extends AnyMutationTarget> = TTarget extends {\n readonly __farmServerFnError: infer TError;\n}\n ? TError\n : TTarget extends (...args: any[]) => Promise<APIResult<any, infer TError>>\n ? TError\n : Error;\n\nexport type MutationOptimisticContext<TVariables, TData> = {\n variables: TVariables | undefined;\n current: TData | null;\n};\n\nexport type UseMutationOptions<TVariables, TData, TError = Error> = {\n initialData?: TData | null;\n resetOnMutate?: boolean;\n optimistic?: (context: MutationOptimisticContext<TVariables, TData>) => TData | null | undefined;\n rollbackOnError?: boolean;\n /**\n * Options forwarded to generated `api.route.method` clients.\n * Server functions ignore this field.\n */\n request?: ClientOptions<TData, TError>;\n onSuccess?: (data: TData, variables: TVariables | undefined) => void;\n onError?: (error: TError, variables: TVariables | undefined) => void;\n onSettled?: (data: TData | null, error: TError | null, variables: TVariables | undefined) => void;\n};\n\ntype MutationInput<TTarget extends AnyMutationTarget> = InferMutationVariables<TTarget>;\n\ntype MutationData<TTarget extends AnyMutationTarget> = InferMutationData<TTarget>;\n\ntype MutationError<TTarget extends AnyMutationTarget> = InferMutationError<TTarget>;\n\nexport type MutationAsync<TTarget extends AnyMutationTarget, TData = MutationData<TTarget>> =\n [] extends Parameters<TTarget>\n ? (variables?: MutationInput<TTarget>) => Promise<TData>\n : (variables: MutationInput<TTarget>) => Promise<TData>;\n\nexport type MutationTrigger<TTarget extends AnyMutationTarget> =\n [] extends Parameters<TTarget>\n ? (variables?: MutationInput<TTarget>) => void\n : (variables: MutationInput<TTarget>) => void;\n\nexport type UseMutationReturn<\n TTarget extends AnyMutationTarget,\n TData = MutationData<TTarget>,\n TError = MutationError<TTarget>,\n> = {\n pending: boolean;\n status: MutationStatus;\n data: TData | null;\n error: TError | null;\n variables: MutationInput<TTarget> | undefined;\n mutate: MutationTrigger<TTarget>;\n mutateAsync: MutationAsync<TTarget, TData>;\n reset: () => void;\n};\n\ntype MutationState<TVariables, TData, TError> = {\n pendingCount: number;\n status: MutationStatus;\n data: TData | null;\n error: TError | null;\n variables: TVariables | undefined;\n};\n\n/**\n * Track a generated API route mutation or a Farm server function with one\n * React lifecycle.\n *\n * API routes keep using their existing fetch transport and request options.\n * Server functions keep using their configured server-function transport.\n */\nexport function useMutation<TTarget extends AnyMutationTarget>(\n target: TTarget,\n options: UseMutationOptions<\n MutationInput<TTarget>,\n MutationData<TTarget>,\n MutationError<TTarget>\n > = {},\n): UseMutationReturn<TTarget> {\n type TVariables = MutationInput<TTarget>;\n type TData = MutationData<TTarget>;\n type TError = MutationError<TTarget>;\n\n const initialData = options.initialData ?? null;\n const optionsRef = useRef(options);\n const targetRef = useRef(target);\n const requestIdRef = useRef(0);\n const initialState: MutationState<TVariables, TData, TError> = {\n pendingCount: 0,\n status: \"idle\",\n data: initialData,\n error: null,\n variables: undefined,\n };\n const stateRef = useRef(initialState);\n const [state, setState] = useState<MutationState<TVariables, TData, TError>>(initialState);\n\n optionsRef.current = options;\n targetRef.current = target;\n\n const setMutationState = useCallback(\n (\n value:\n | MutationState<TVariables, TData, TError>\n | ((\n current: MutationState<TVariables, TData, TError>,\n ) => MutationState<TVariables, TData, TError>),\n ) => {\n setState((current) => {\n const next = typeof value === \"function\" ? value(current) : value;\n stateRef.current = next;\n return next;\n });\n },\n [],\n );\n\n const mutateAsync = useCallback(\n async (variables?: TVariables) => {\n const requestId = ++requestIdRef.current;\n const currentOptions = optionsRef.current;\n const previousData = stateRef.current.data;\n const optimisticData = currentOptions.optimistic?.({\n variables,\n current: previousData,\n });\n const hasOptimisticData = optimisticData !== undefined;\n\n setMutationState((current) => ({\n pendingCount: current.pendingCount + 1,\n status: \"pending\",\n data: hasOptimisticData\n ? optimisticData\n : currentOptions.resetOnMutate === false\n ? current.data\n : null,\n error: null,\n variables,\n }));\n\n try {\n const mutationTarget = targetRef.current;\n const rawResult = isAPIRouteRef(mutationTarget)\n ? await mutationTarget(variables, currentOptions.request)\n : await mutationTarget(variables);\n const data = unwrapMutationResult<TData, TError>(rawResult, isAPIRouteRef(mutationTarget));\n const isLatestRequest = requestId === requestIdRef.current;\n\n setMutationState((current) => {\n const pendingCount = Math.max(0, current.pendingCount - 1);\n if (!isLatestRequest) {\n return {\n ...current,\n pendingCount,\n status: pendingCount > 0 ? \"pending\" : current.status,\n };\n }\n\n return {\n pendingCount,\n status: \"success\",\n data,\n error: null,\n variables,\n };\n });\n\n if (isLatestRequest) {\n currentOptions.onSuccess?.(data, variables);\n currentOptions.onSettled?.(data, null, variables);\n }\n\n return data;\n } catch (cause) {\n const error = normalizeMutationError(cause) as TError;\n const isLatestRequest = requestId === requestIdRef.current;\n\n setMutationState((current) => {\n const pendingCount = Math.max(0, current.pendingCount - 1);\n if (!isLatestRequest) {\n return {\n ...current,\n pendingCount,\n status: pendingCount > 0 ? \"pending\" : current.status,\n };\n }\n\n return {\n pendingCount,\n status: \"error\",\n data:\n hasOptimisticData && currentOptions.rollbackOnError\n ? previousData\n : currentOptions.resetOnMutate === false\n ? current.data\n : null,\n error,\n variables,\n };\n });\n\n if (isLatestRequest) {\n currentOptions.onError?.(error, variables);\n currentOptions.onSettled?.(null, error, variables);\n }\n\n throw error;\n }\n },\n [setMutationState],\n ) as MutationAsync<TTarget, TData>;\n\n const mutate = useCallback(\n (variables?: TVariables) => {\n void mutateAsync(variables as never).catch(() => {});\n },\n [mutateAsync],\n ) as MutationTrigger<TTarget>;\n\n const reset = useCallback(() => {\n requestIdRef.current += 1;\n setMutationState({\n pendingCount: 0,\n status: \"idle\",\n data: optionsRef.current.initialData ?? null,\n error: null,\n variables: undefined,\n });\n }, [setMutationState]);\n\n return useMemo(\n () => ({\n pending: state.pendingCount > 0,\n status: state.status,\n data: state.data,\n error: state.error,\n variables: state.variables,\n mutate,\n mutateAsync,\n reset,\n }),\n [\n mutate,\n mutateAsync,\n reset,\n state.data,\n state.error,\n state.pendingCount,\n state.status,\n state.variables,\n ],\n );\n}\n\nfunction unwrapMutationResult<TData, TError>(result: unknown, apiRoute: boolean): TData {\n if (!apiRoute) return result as TData;\n\n const apiResult = result as APIResult<TData, TError>;\n if (apiResult.error) {\n throw apiResult.error;\n }\n\n return apiResult.data as TData;\n}\n\nfunction normalizeMutationError(error: unknown): Error {\n if (error instanceof Error) return error;\n\n const normalized = new Error(typeof error === \"string\" ? error : \"Mutation failed\");\n (normalized as Error & { cause?: unknown }).cause = error;\n return normalized;\n}\n","\"use client\";\n\nimport {\n createElement,\n useCallback,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type FormEvent,\n type FormHTMLAttributes,\n} from \"react\";\nimport { getAPIRouteRefMetadata, isAPIRouteRef } from \"./api/client\";\nimport {\n useMutation,\n type AnyMutationTarget,\n type InferMutationData,\n type InferMutationError,\n type InferMutationVariables,\n type MutationStatus,\n type UseMutationOptions,\n} from \"./mutation-client\";\n\nexport type FetcherState = \"idle\" | \"submitting\";\n\nexport type FetcherFormDataContext = {\n form: HTMLFormElement | null;\n submitter: HTMLElement | null;\n};\n\nexport type UseFetcherOptions<TTarget extends AnyMutationTarget> = UseMutationOptions<\n InferMutationVariables<TTarget>,\n InferMutationData<TTarget>,\n InferMutationError<TTarget>\n> & {\n /**\n * Convert browser FormData into the target's typed variables.\n *\n * Generated API routes default to `{ body: Object.fromEntries(formData) }`\n * (or `{ query: ... }` for GET/HEAD). Server functions receive FormData\n * directly so their input schema remains authoritative.\n */\n mapFormData?: (\n formData: FormData,\n context: FetcherFormDataContext,\n ) => InferMutationVariables<TTarget>;\n};\n\nexport type FetcherFormProps = Omit<FormHTMLAttributes<HTMLFormElement>, \"action\" | \"onSubmit\"> & {\n /**\n * Override the native form fallback. By default server functions remain the\n * action and generated GET/POST API routes use their real URL.\n */\n action?: string | ((formData: FormData) => void | Promise<void>);\n onSubmit?: (event: FormEvent<HTMLFormElement>) => void;\n};\n\ntype FetcherInput<TTarget extends AnyMutationTarget> = InferMutationVariables<TTarget> | FormData;\n\nexport type FetcherSubmitAsync<TTarget extends AnyMutationTarget> =\n [] extends Parameters<TTarget>\n ? (input?: FetcherInput<TTarget>) => Promise<InferMutationData<TTarget>>\n : (input: FetcherInput<TTarget>) => Promise<InferMutationData<TTarget>>;\n\nexport type FetcherSubmit<TTarget extends AnyMutationTarget> =\n [] extends Parameters<TTarget>\n ? (input?: FetcherInput<TTarget>) => void\n : (input: FetcherInput<TTarget>) => void;\n\nexport type UseFetcherReturn<TTarget extends AnyMutationTarget> = {\n state: FetcherState;\n status: MutationStatus;\n pending: boolean;\n data: InferMutationData<TTarget> | null;\n error: InferMutationError<TTarget> | null;\n variables: InferMutationVariables<TTarget> | undefined;\n formData: FormData | null;\n submit: FetcherSubmit<TTarget>;\n submitAsync: FetcherSubmitAsync<TTarget>;\n Form: ComponentType<FetcherFormProps>;\n reset: () => void;\n};\n\nconst formDataContexts = new WeakMap<FormData, FetcherFormDataContext>();\n\n/**\n * Run a typed server function or generated API operation without navigating.\n *\n * `fetcher.Form` progressively keeps a server function as the native form\n * action, while hydration intercepts submissions into this fetcher lifecycle.\n */\nexport function useFetcher<TTarget extends AnyMutationTarget>(\n target: TTarget,\n options: UseFetcherOptions<TTarget> = {},\n): UseFetcherReturn<TTarget> {\n const targetRef = useRef(target);\n const optionsRef = useRef(options);\n const submissionIdRef = useRef(0);\n const [formData, setFormData] = useState<FormData | null>(null);\n const mutation = useMutation(target, options);\n\n targetRef.current = target;\n optionsRef.current = options;\n\n const submitAsync = useCallback(\n async (input?: FetcherInput<TTarget>) => {\n const submissionId = ++submissionIdRef.current;\n const submittedFormData = isFormData(input) ? input : null;\n setFormData(submittedFormData);\n\n try {\n const variables = submittedFormData\n ? mapFetcherFormData(targetRef.current, submittedFormData, optionsRef.current)\n : input;\n return await mutation.mutateAsync(variables as InferMutationVariables<TTarget>);\n } finally {\n if (submissionId === submissionIdRef.current) {\n setFormData(null);\n }\n }\n },\n [mutation.mutateAsync],\n ) as FetcherSubmitAsync<TTarget>;\n\n const submit = useCallback(\n (input?: FetcherInput<TTarget>) => {\n void submitAsync(input as never).catch(() => {});\n },\n [submitAsync],\n ) as FetcherSubmit<TTarget>;\n\n const Form = useMemo(() => {\n const FetcherForm = ({ action, method, encType, onSubmit, ...props }: FetcherFormProps) => {\n const targetValue = targetRef.current;\n const metadata = getAPIRouteRefMetadata(targetValue);\n const nativeAction = action ?? resolveFetcherFormAction(targetValue, metadata);\n const nativeMethod =\n method ??\n (metadata && (metadata.method === \"GET\" || metadata.method === \"POST\")\n ? metadata.method.toLowerCase()\n : metadata\n ? \"post\"\n : undefined);\n const functionAction = typeof nativeAction === \"function\";\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>) => {\n onSubmit?.(event);\n if (event.defaultPrevented) return;\n\n event.preventDefault();\n const submitter = getSubmitter(event);\n const nextFormData = createSubmitterFormData(event.currentTarget, submitter);\n formDataContexts.set(nextFormData, {\n form: event.currentTarget,\n submitter,\n });\n void submitAsync(nextFormData as never).catch(() => {});\n };\n\n return createElement(\"form\", {\n ...props,\n action: nativeAction as FormHTMLAttributes<HTMLFormElement>[\"action\"],\n method: functionAction ? undefined : nativeMethod,\n encType: functionAction ? undefined : encType,\n onSubmit: handleSubmit,\n });\n };\n\n FetcherForm.displayName = \"FetcherForm\";\n return FetcherForm;\n }, [submitAsync]);\n\n const reset = useCallback(() => {\n submissionIdRef.current += 1;\n setFormData(null);\n mutation.reset();\n }, [mutation.reset]);\n\n return useMemo(\n () => ({\n state: mutation.pending ? \"submitting\" : \"idle\",\n status: mutation.status,\n pending: mutation.pending,\n data: mutation.data,\n error: mutation.error,\n variables: mutation.variables,\n formData,\n submit,\n submitAsync,\n Form,\n reset,\n }),\n [\n Form,\n formData,\n mutation.data,\n mutation.error,\n mutation.pending,\n mutation.status,\n mutation.variables,\n reset,\n submit,\n submitAsync,\n ],\n );\n}\n\nfunction mapFetcherFormData<TTarget extends AnyMutationTarget>(\n target: TTarget,\n formData: FormData,\n options: UseFetcherOptions<TTarget>,\n): InferMutationVariables<TTarget> | FormData {\n const context = formDataContexts.get(formData) ?? { form: null, submitter: null };\n if (options.mapFormData) {\n return options.mapFormData(formData, context);\n }\n if (!isAPIRouteRef(target)) {\n return formData;\n }\n\n const values = formDataToObject(formData);\n const method = getAPIRouteRefMetadata(target)?.method;\n return (\n method === \"GET\" || method === \"HEAD\" ? { query: values } : { body: values }\n ) as InferMutationVariables<TTarget>;\n}\n\nfunction resolveFetcherFormAction(\n target: AnyMutationTarget,\n metadata: ReturnType<typeof getAPIRouteRefMetadata>,\n): string | AnyMutationTarget | undefined {\n if (!metadata) return isProgressiveFormAction(target) ? target : undefined;\n if (metadata.sameOrigin) return metadata.path;\n\n return new URL(metadata.path, metadata.baseURL).href;\n}\n\nfunction formDataToObject(\n formData: FormData,\n): Record<string, FormDataEntryValue | FormDataEntryValue[]> {\n const output: Record<string, FormDataEntryValue | FormDataEntryValue[]> = Object.create(null);\n for (const [key, value] of formData.entries()) {\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") continue;\n const current = output[key];\n if (current === undefined) {\n output[key] = value;\n } else if (Array.isArray(current)) {\n current.push(value);\n } else {\n output[key] = [current, value];\n }\n }\n return output;\n}\n\nfunction createSubmitterFormData(form: HTMLFormElement, submitter: HTMLElement | null): FormData {\n try {\n return new FormData(form, submitter as HTMLElement | undefined);\n } catch {\n const formData = new FormData(form);\n const candidate = submitter as\n | (HTMLElement & { disabled?: boolean; name?: string; value?: string })\n | null;\n if (candidate && !candidate.disabled && candidate.name) {\n formData.append(candidate.name, candidate.value ?? \"\");\n }\n return formData;\n }\n}\n\nfunction getSubmitter(event: FormEvent<HTMLFormElement>): HTMLElement | null {\n const nativeEvent = event.nativeEvent as SubmitEvent;\n return nativeEvent.submitter instanceof HTMLElement ? nativeEvent.submitter : null;\n}\n\nfunction isProgressiveFormAction(target: AnyMutationTarget): boolean {\n const candidate = target as AnyMutationTarget & {\n __farmServerFn?: unknown;\n $$FORM_ACTION?: unknown;\n $$typeof?: unknown;\n };\n return (\n candidate.__farmServerFn === true ||\n typeof candidate.$$FORM_ACTION === \"function\" ||\n candidate.$$typeof === Symbol.for(\"react.server.reference\")\n );\n}\n\nfunction isFormData(value: unknown): value is FormData {\n if (!value || typeof value !== \"object\") return false;\n return (\n (typeof FormData !== \"undefined\" && value instanceof FormData) ||\n (Object.prototype.toString.call(value) === \"[object FormData]\" &&\n typeof (value as { entries?: unknown }).entries === \"function\")\n );\n}\n","import { useSyncExternalStore } from \"react\";\n\nexport type StoreState = Record<string, any>;\nexport type StoreValueUpdater<T> = T | ((previous: T) => T);\nexport type StorePatch<T extends StoreState> = Partial<T> | ((state: T) => Partial<T>);\nexport type StoreListener<T extends StoreState> = (state: T, previousState: T) => void;\nexport type StoreKeyListener<T extends StoreState, K extends keyof T> = (\n value: T[K],\n previousValue: T[K],\n) => void;\nexport type StoreKeysListener<T extends StoreState, K extends keyof T> = (\n value: Pick<T, K>,\n previousValue: Pick<T, K>,\n) => void;\n\ntype StoreSubscription<T extends StoreState> = {\n keys: readonly (keyof T)[] | null;\n notify: (state: T, previousState: T) => void;\n};\n\ntype ReservedStoreKey = \"use\" | \"get\" | \"set\" | \"replace\" | \"reset\" | \"subscribe\";\n\ntype FieldAccessor<T extends StoreState, K extends keyof T> = {\n (): T[K];\n get(): T[K];\n set(value: StoreValueUpdater<T[K]>): T[K];\n subscribe(listener: StoreKeyListener<T, K>): () => void;\n};\n\nexport type StoreFields<T extends StoreState> = {\n [K in keyof T]: FieldAccessor<T, K>;\n};\n\nexport interface StoreApi<T extends StoreState> {\n use(): T;\n use<K extends keyof T>(key: K): T[K];\n use<K extends keyof T>(keys: readonly K[]): Pick<T, K>;\n get(): T;\n get<K extends keyof T>(key: K): T[K];\n set<K extends keyof T>(key: K, value: StoreValueUpdater<T[K]>): T[K];\n set(patch: StorePatch<T>): T;\n replace(nextState: T | ((state: T) => T)): T;\n reset(): T;\n subscribe(listener: StoreListener<T>): () => void;\n subscribe<K extends keyof T>(key: K, listener: StoreKeyListener<T, K>): () => void;\n subscribe<K extends keyof T>(keys: readonly K[], listener: StoreKeysListener<T, K>): () => void;\n}\n\nexport type Store<T extends StoreState, TMethods extends Record<string, any> = {}> = StoreApi<T> &\n StoreFields<T> &\n TMethods;\n\nconst RESERVED_STORE_KEYS = new Set<ReservedStoreKey>([\n \"use\",\n \"get\",\n \"set\",\n \"replace\",\n \"reset\",\n \"subscribe\",\n]);\n\nfunction cloneState<T extends StoreState>(state: T): T {\n return { ...state };\n}\n\nfunction pickState<T extends StoreState, K extends keyof T>(\n state: T,\n keys: readonly K[],\n): Pick<T, K> {\n const slice = {} as Pick<T, K>;\n\n for (const key of keys) {\n slice[key] = state[key];\n }\n\n return slice;\n}\n\nfunction getChangedKeys<T extends StoreState>(state: T, previousState: T): (keyof T)[] {\n const keys = new Set<keyof T>([\n ...(Object.keys(state) as (keyof T)[]),\n ...(Object.keys(previousState) as (keyof T)[]),\n ]);\n\n return [...keys].filter((key) => !Object.is(state[key], previousState[key]));\n}\n\nfunction normalizeKeys<T extends StoreState, K extends keyof T>(keys: readonly K[]): readonly K[] {\n return Array.from(new Set(keys));\n}\n\nfunction resolveValue<T>(value: StoreValueUpdater<T>, previousValue: T): T {\n return typeof value === \"function\" ? (value as (previousValue: T) => T)(previousValue) : value;\n}\n\nfunction isStoreKey(value: unknown): value is string | number | symbol {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"symbol\";\n}\n\nexport function createStore<T extends StoreState, TMethods extends Record<string, any> = {}>(\n initialState: T,\n extend?: (store: Store<T>) => TMethods,\n): Store<T, TMethods> {\n const initialSnapshot = cloneState(initialState);\n let state = cloneState(initialState);\n const subscriptions = new Set<StoreSubscription<T>>();\n\n const addSubscription = (\n keys: readonly (keyof T)[] | null,\n notify: (state: T, previousState: T) => void,\n ) => {\n const subscription: StoreSubscription<T> = { keys, notify };\n subscriptions.add(subscription);\n return () => {\n subscriptions.delete(subscription);\n };\n };\n\n const emit = (nextState: T, previousState: T) => {\n const changedKeys = getChangedKeys(nextState, previousState);\n\n if (changedKeys.length === 0) {\n return;\n }\n\n const changedKeySet = new Set(changedKeys);\n\n for (const subscription of subscriptions) {\n if (subscription.keys === null || subscription.keys.some((key) => changedKeySet.has(key))) {\n subscription.notify(nextState, previousState);\n }\n }\n };\n\n const getState = (key?: keyof T) => {\n return key === undefined ? state : state[key];\n };\n\n const replaceState = (nextState: T | ((state: T) => T)) => {\n const previousState = state;\n const resolvedState =\n typeof nextState === \"function\" ? (nextState as (state: T) => T)(previousState) : nextState;\n state = resolvedState;\n emit(state, previousState);\n return state;\n };\n\n const setState = (keyOrPatch: keyof T | StorePatch<T>, value?: StoreValueUpdater<T[keyof T]>) => {\n const previousState = state;\n let nextState: T;\n\n if (isStoreKey(keyOrPatch)) {\n const key = keyOrPatch as keyof T;\n const nextValue = resolveValue(value as StoreValueUpdater<T[keyof T]>, previousState[key]);\n\n if (Object.is(previousState[key], nextValue)) {\n return nextValue;\n }\n\n nextState = {\n ...previousState,\n [key]: nextValue,\n };\n state = nextState;\n emit(nextState, previousState);\n return nextValue;\n }\n\n const patch: Partial<T> =\n typeof keyOrPatch === \"function\"\n ? (keyOrPatch as (state: T) => Partial<T>)(previousState)\n : (keyOrPatch as Partial<T>);\n\n nextState = {\n ...previousState,\n ...patch,\n };\n state = nextState;\n emit(nextState, previousState);\n return nextState;\n };\n\n const subscribeState = (\n keyOrListener: keyof T | readonly (keyof T)[] | StoreListener<T>,\n listener?: StoreKeyListener<T, keyof T> | StoreKeysListener<T, keyof T>,\n ) => {\n if (typeof keyOrListener === \"function\") {\n return addSubscription(null, (nextState, previousState) => {\n (keyOrListener as StoreListener<T>)(nextState, previousState);\n });\n }\n\n if (Array.isArray(keyOrListener)) {\n const keys = normalizeKeys(keyOrListener);\n return addSubscription(keys, (nextState, previousState) => {\n (listener as StoreKeysListener<T, keyof T>)(\n pickState(nextState, keys),\n pickState(previousState, keys),\n );\n });\n }\n\n const key = keyOrListener as keyof T;\n return addSubscription([key], (nextState, previousState) => {\n (listener as StoreKeyListener<T, keyof T>)(nextState[key], previousState[key]);\n });\n };\n\n const useStateValue = <K extends keyof T>(keyOrKeys?: K | readonly K[]) => {\n if (Array.isArray(keyOrKeys)) {\n const keys = normalizeKeys(keyOrKeys);\n let lastState = state;\n let lastSlice = pickState(state, keys);\n const getSnapshot = () => {\n if (lastState !== state) {\n lastState = state;\n lastSlice = pickState(state, keys);\n }\n\n return lastSlice;\n };\n\n return useSyncExternalStore(\n (notify) => addSubscription(keys, () => notify()),\n getSnapshot,\n getSnapshot,\n );\n }\n\n if (typeof keyOrKeys === \"string\") {\n return useSyncExternalStore(\n (notify) => addSubscription([keyOrKeys], () => notify()),\n () => state[keyOrKeys],\n () => state[keyOrKeys],\n );\n }\n\n return useSyncExternalStore(\n (notify) => addSubscription(null, () => notify()),\n () => state,\n () => state,\n );\n };\n\n const store = {\n use: useStateValue,\n get: getState,\n set: setState,\n replace: replaceState,\n reset: () => replaceState(cloneState(initialSnapshot)),\n subscribe: subscribeState,\n } as Store<T>;\n\n for (const key of Object.keys(initialSnapshot) as (keyof T)[]) {\n if (RESERVED_STORE_KEYS.has(key as ReservedStoreKey)) {\n throw new Error(\n `createStore does not allow the reserved key \"${String(key)}\" in the initial state.`,\n );\n }\n\n const field = (() => useStateValue(key)) as FieldAccessor<T, typeof key>;\n field.get = () => state[key];\n field.set = (value) => setState(key, value) as T[typeof key];\n field.subscribe = (listener) => subscribeState(key, listener as StoreKeyListener<T, keyof T>);\n\n Object.defineProperty(store, key, {\n configurable: false,\n enumerable: true,\n value: field,\n writable: false,\n });\n }\n\n if (extend) {\n const methods = extend(store);\n\n for (const [name, method] of Object.entries(methods)) {\n if (name in store) {\n throw new Error(\n `createStore cannot attach the method \"${name}\" because it already exists.`,\n );\n }\n\n Object.defineProperty(store, name, {\n configurable: false,\n enumerable: true,\n value: method,\n writable: false,\n });\n }\n }\n\n return store as Store<T, TMethods>;\n}\n","\"use client\";\n\nimport type React from \"react\";\nimport { forwardRef, useEffect, useRef, useCallback, type AnchorHTMLAttributes } from \"react\";\nimport {\n buildFarmRoutePath,\n type FarmRouterBuildOptions,\n type FarmRouterPathParam,\n type FarmRouterPathParams,\n} from \"../router\";\nimport type { FarmViewTransitionMode } from \"./spa-router\";\nimport { isFarmLocaleChangeHref, localizeActiveFarmHref } from \"../i18n/client-runtime\";\nimport type { FarmI18nLocale } from \"../i18n/types\";\nimport { getFarmTrailingSlashPreference } from \"../trailing-slash\";\nimport { applyFarmBasePath, getFarmBasePath } from \"../base-path\";\nimport { useOptionalFarm } from \"../provider\";\n\n/**\n * Prefetch strategy (TanStack Router–style):\n * - \"intent\": prefetch on hover and touchstart (with prefetchDelay)\n * - \"viewport\": prefetch when link enters viewport (IntersectionObserver)\n * - \"render\": prefetch as soon as the link is mounted\n * - \"none\" | false: no prefetch\n */\nexport type PrefetchBehavior = false | \"intent\" | \"viewport\" | \"render\" | \"none\";\n\n/** @internal Legacy prefetch mode for backward compatibility */\ntype PrefetchLegacy = boolean | \"hover\" | \"viewport\" | \"none\";\n\n/**\n * Augment this interface via the generated farm.d.ts so Link href is typed\n * without passing a generic. Defaults to string when not augmented.\n */\nexport interface LinkDefaultRoute {}\n\nexport type DefaultRoutePath = LinkDefaultRoute extends { _: infer TRoute extends string }\n ? TRoute\n : string;\n\nexport type DefaultRoutePattern = LinkDefaultRoute extends {\n pattern: infer TRoute extends string;\n}\n ? TRoute\n : DefaultRoutePath;\n\nexport type DefaultRouteHref = DefaultRoutePath | DefaultRoutePattern;\n\nexport type RouteHref<TRoute extends string> =\n | TRoute\n | `${TRoute}?${string}`\n | `${TRoute}#${string}`\n | `${TRoute}?${string}#${string}`;\n\n/** A generated route with params already filled into its pathname. */\nexport type ResolvedRouteHref = RouteHref<DefaultRoutePath>;\n\nexport type RouteParamValue = Exclude<FarmRouterPathParam, null | undefined>;\nexport type RouteOptionalParamValue = FarmRouterPathParam;\nexport type RouteParams<TRoute extends string> = string extends TRoute\n ? FarmRouterPathParams\n : ExtractRouteParams<StripRouteSuffix<TRoute>>;\n\n/** URI schemes recognized as typed external Link targets. Apps may augment this interface. */\nexport interface LinkExternalUriSchemes {\n about: true;\n blob: true;\n data: true;\n file: true;\n ftp: true;\n ftps: true;\n geo: true;\n git: true;\n http: true;\n https: true;\n im: true;\n intent: true;\n irc: true;\n ircs: true;\n magnet: true;\n mailto: true;\n market: true;\n sms: true;\n ssh: true;\n tel: true;\n urn: true;\n vscode: true;\n webcal: true;\n ws: true;\n wss: true;\n}\n\ntype ExternalUriScheme = Extract<keyof LinkExternalUriSchemes, string>;\n\ntype UriSchemeLetter =\n | \"a\"\n | \"b\"\n | \"c\"\n | \"d\"\n | \"e\"\n | \"f\"\n | \"g\"\n | \"h\"\n | \"i\"\n | \"j\"\n | \"k\"\n | \"l\"\n | \"m\"\n | \"n\"\n | \"o\"\n | \"p\"\n | \"q\"\n | \"r\"\n | \"s\"\n | \"t\"\n | \"u\"\n | \"v\"\n | \"w\"\n | \"x\"\n | \"y\"\n | \"z\";\ntype UriSchemeStart = UriSchemeLetter | Uppercase<UriSchemeLetter>;\ntype UriSchemeCharacter =\n | UriSchemeStart\n | \"0\"\n | \"1\"\n | \"2\"\n | \"3\"\n | \"4\"\n | \"5\"\n | \"6\"\n | \"7\"\n | \"8\"\n | \"9\"\n | \"+\"\n | \"-\"\n | \".\";\ntype IsUriSchemeTail<TValue extends string> = TValue extends \"\"\n ? true\n : TValue extends `${infer First}${infer Rest}`\n ? First extends UriSchemeCharacter\n ? IsUriSchemeTail<Rest>\n : false\n : false;\ntype IsUriScheme<TValue extends string> = TValue extends `${infer First}${infer Rest}`\n ? First extends UriSchemeStart\n ? IsUriSchemeTail<Rest>\n : false\n : false;\n\ntype KnownExternalHref = `//${string}` | `${ExternalUriScheme}:${string}`;\n\n/** External URLs; these are never type-checked as routes. */\nexport type ExternalHref<THref extends string = string> = string extends THref\n ? KnownExternalHref\n : THref extends `//${string}`\n ? THref\n : THref extends `${infer Scheme}:${string}`\n ? IsUriScheme<Scheme> extends true\n ? THref\n : never\n : never;\n\ntype StripRouteSuffix<TRoute extends string> = TRoute extends `${infer Path}?${string}`\n ? StripRouteSuffix<Path>\n : TRoute extends `${infer Path}#${string}`\n ? StripRouteSuffix<Path>\n : TRoute;\n\ntype ExtractRouteParams<TRoute extends string> = Simplify<\n ExtractOptionalCatchAllParams<TRoute> &\n ExtractCatchAllParams<TRoute> &\n ExtractDynamicParams<TRoute>\n>;\n\ntype ExtractOptionalCatchAllParams<TRoute extends string> =\n TRoute extends `${string}[[...${infer Param}]]${infer Rest}`\n ? { [Key in Param]?: RouteOptionalParamValue } & ExtractOptionalCatchAllParams<Rest>\n : {};\n\ntype ExtractCatchAllParams<TRoute extends string> =\n TRoute extends `${string}[...${infer Param}]${infer Rest}`\n ? Param extends `[...${string}`\n ? ExtractCatchAllParams<Rest>\n : { [Key in Param]: RouteParamValue } & ExtractCatchAllParams<Rest>\n : {};\n\ntype ExtractDynamicParams<TRoute extends string> =\n TRoute extends `${string}[${infer Param}]${infer Rest}`\n ? Param extends `...${string}` | `[...${string}`\n ? ExtractDynamicParams<Rest>\n : { [Key in Param]: RouteParamValue } & ExtractDynamicParams<Rest>\n : {};\n\ntype Simplify<T> = { [Key in keyof T]: T[Key] } & {};\n\ntype HasRouteParams<TRoute extends string> = keyof RouteParams<TRoute> extends never ? false : true;\n\ntype RoutesWithRequiredParams<TRoute extends string> = TRoute extends string\n ? HasRouteParams<TRoute> extends true\n ? TRoute\n : never\n : never;\n\ntype LinkRouteParamsProps<TRoute extends string> = string extends TRoute\n ? { params?: FarmRouterPathParams }\n : HasRouteParams<TRoute> extends true\n ? { params: RouteParams<TRoute> }\n : { params?: FarmRouterPathParams };\n\ntype LinkRouteTargetProps<TRoute extends string> = [RoutesWithRequiredParams<TRoute>] extends [\n never,\n]\n ? {\n /** Internal route path with all params already resolved. */\n href: RouteHref<TRoute>;\n params?: FarmRouterPathParams;\n }\n : TRoute extends string\n ? {\n /** Internal route path or route pattern. */\n href: RouteHref<TRoute>;\n } & LinkRouteParamsProps<TRoute>\n : never;\n\ntype LinkExternalTargetProps<THref extends string = string> = {\n /** External URL; these are never type-checked as app routes. */\n href: ExternalHref<THref>;\n params?: never;\n};\n\ntype LinkTargetProps<TRoute extends string, THref extends string> =\n | LinkExternalTargetProps<THref>\n | LinkRouteTargetProps<TRoute>;\n\nexport type LinkProps<\n TRoute extends string = DefaultRouteHref,\n THref extends string = string,\n> = Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"href\"> &\n LinkTargetProps<TRoute, THref> & {\n /**\n * When to prefetch. TanStack-style: \"intent\" (hover+touch), \"viewport\", \"render\", or \"none\".\n * Legacy: true (intent+viewport), \"hover\" (intent), \"viewport\", false/\"none\".\n */\n prefetch?: PrefetchBehavior | PrefetchLegacy;\n /** Search params appended after route params are resolved. */\n query?: FarmRouterBuildOptions[\"query\"];\n /** Hash appended after route params and search params are resolved. */\n hash?: string;\n /** Add a trailing slash to the generated internal href. */\n trailingSlash?: boolean;\n /** Delay in ms before intent-based prefetch (hover/touch). Default 50. */\n prefetchDelay?: number;\n /** Replace current history entry instead of pushing */\n replace?: boolean;\n /** Scroll to top after navigation (default: true) */\n scroll?: boolean;\n /** Wrap this SPA navigation in a browser View Transition when supported. */\n viewTransition?: FarmViewTransitionMode;\n /** Preserve the active locale by default, or navigate using this locale. */\n locale?: FarmI18nLocale;\n };\n\nfunction isModifierEvent(e: React.MouseEvent): boolean {\n return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey);\n}\n\nfunction isExternalUrl(href: string): boolean {\n return href.startsWith(\"//\") || /^[a-zA-Z][a-zA-Z\\d+.-]*:/.test(href);\n}\n\nfunction getRouter(): {\n prefetch(href: string): Promise<void>;\n observeForPrefetch(el: HTMLAnchorElement): void;\n unobserveForPrefetch(el: HTMLAnchorElement): void;\n navigate(\n href: string,\n opts: { replace?: boolean; scroll?: boolean; viewTransition?: FarmViewTransitionMode },\n ): void;\n} | null {\n if (typeof window !== \"undefined\" && (window as any).__FARM_SPA_ROUTER__) {\n return (window as any).__FARM_SPA_ROUTER__;\n }\n return null;\n}\n\nfunction normalizePrefetch(prefetch: LinkProps[\"prefetch\"]): {\n intent: boolean;\n viewport: boolean;\n render: boolean;\n} {\n if (prefetch === false || prefetch === \"none\") {\n return { intent: false, viewport: false, render: false };\n }\n if (prefetch === true) {\n return { intent: true, viewport: true, render: false };\n }\n if (prefetch === \"hover\") {\n return { intent: true, viewport: false, render: false };\n }\n if (prefetch === \"intent\") {\n return { intent: true, viewport: false, render: false };\n }\n if (prefetch === \"viewport\") {\n return { intent: false, viewport: true, render: false };\n }\n if (prefetch === \"render\") {\n return { intent: false, viewport: false, render: true };\n }\n return { intent: false, viewport: false, render: false };\n}\n\nfunction LinkInner<TRoute extends string = DefaultRouteHref, THref extends string = string>(\n {\n href,\n params,\n query,\n hash,\n trailingSlash,\n prefetch = true,\n prefetchDelay = 50,\n replace = false,\n scroll = true,\n viewTransition = false,\n locale,\n onClick,\n target,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n onBlur,\n onTouchStart,\n ...props\n }: LinkProps<TRoute, THref>,\n ref: React.ForwardedRef<HTMLAnchorElement>,\n) {\n const elementRef = useRef<HTMLAnchorElement | null>(null);\n const intentTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const activePrefetch = useRef<symbol | null>(null);\n const farm = useOptionalFarm();\n\n const { intent, viewport, render } = normalizePrefetch(prefetch);\n const baseHref = resolveLinkHref(href, params, {\n query,\n hash,\n trailingSlash: trailingSlash ?? getFarmTrailingSlashPreference(),\n });\n const localizedHref = localizeActiveFarmHref(baseHref, locale);\n const resolvedHref = isExternalUrl(localizedHref)\n ? localizedHref\n : applyFarmBasePath(localizedHref, farm?.basePath ?? getFarmBasePath());\n const isExternal = isExternalUrl(resolvedHref);\n\n const doPrefetch = useCallback(() => {\n if (isExternal || activePrefetch.current) return;\n const router = getRouter();\n if (!router) return;\n const token = Symbol(resolvedHref);\n activePrefetch.current = token;\n const reset = () => {\n if (activePrefetch.current === token) activePrefetch.current = null;\n };\n try {\n void router.prefetch(resolvedHref).then(reset, reset);\n } catch {\n reset();\n }\n }, [resolvedHref, isExternal]);\n\n useEffect(() => {\n activePrefetch.current = null;\n }, [resolvedHref]);\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element || isExternal) return;\n\n const router = getRouter();\n if (!router) return;\n\n if (viewport) {\n router.observeForPrefetch(element);\n return () => router.unobserveForPrefetch(element);\n }\n }, [resolvedHref, viewport, isExternal]);\n\n useEffect(() => {\n if (!render || isExternal) return;\n\n let cancelled = false;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const tryRenderPrefetch = () => {\n if (cancelled || activePrefetch.current) return;\n\n const router = getRouter();\n if (!router) {\n timeoutId = setTimeout(tryRenderPrefetch, 30);\n return;\n }\n\n doPrefetch();\n };\n\n tryRenderPrefetch();\n\n return () => {\n cancelled = true;\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n }, [render, isExternal, resolvedHref, doPrefetch]);\n\n useEffect(() => {\n return () => {\n if (intentTimeoutRef.current) {\n clearTimeout(intentTimeoutRef.current);\n intentTimeoutRef.current = null;\n }\n };\n }, []);\n\n const cancelIntent = useCallback(() => {\n if (intentTimeoutRef.current) {\n clearTimeout(intentTimeoutRef.current);\n intentTimeoutRef.current = null;\n }\n }, []);\n\n const scheduleIntentPrefetch = useCallback(() => {\n if (isExternal || !intent || activePrefetch.current) return;\n cancelIntent();\n intentTimeoutRef.current = setTimeout(() => {\n intentTimeoutRef.current = null;\n doPrefetch();\n }, prefetchDelay);\n }, [intent, isExternal, prefetchDelay, doPrefetch, cancelIntent]);\n\n const handleMouseEnter = useCallback(\n (event: React.MouseEvent<HTMLAnchorElement>) => {\n onMouseEnter?.(event);\n scheduleIntentPrefetch();\n },\n [onMouseEnter, scheduleIntentPrefetch],\n );\n\n const handleMouseLeave = useCallback(\n (event: React.MouseEvent<HTMLAnchorElement>) => {\n onMouseLeave?.(event);\n cancelIntent();\n },\n [onMouseLeave, cancelIntent],\n );\n\n const handleTouchStart = useCallback(\n (event: React.TouchEvent<HTMLAnchorElement>) => {\n onTouchStart?.(event);\n scheduleIntentPrefetch();\n },\n [onTouchStart, scheduleIntentPrefetch],\n );\n\n const handleFocus = useCallback(\n (event: React.FocusEvent<HTMLAnchorElement>) => {\n onFocus?.(event);\n scheduleIntentPrefetch();\n },\n [onFocus, scheduleIntentPrefetch],\n );\n\n const handleBlur = useCallback(\n (event: React.FocusEvent<HTMLAnchorElement>) => {\n onBlur?.(event);\n cancelIntent();\n },\n [onBlur, cancelIntent],\n );\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLAnchorElement>) => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n if (isExternal) return;\n if (event.currentTarget.hasAttribute(\"download\")) return;\n if (target && target !== \"_self\") return;\n if (isModifierEvent(event)) return;\n if (event.button !== 0) return;\n\n if (typeof window !== \"undefined\") {\n event.preventDefault();\n if (isFarmLocaleChangeHref(localizedHref)) {\n window.location.assign(resolvedHref);\n return;\n }\n const router = getRouter();\n if (router) {\n router.navigate(resolvedHref, { replace, scroll, viewTransition });\n } else {\n if (replace) window.location.replace(resolvedHref);\n else window.location.href = resolvedHref;\n }\n }\n },\n [localizedHref, resolvedHref, replace, scroll, viewTransition, target, isExternal, onClick],\n );\n\n const setRefs = useCallback(\n (node: HTMLAnchorElement | null) => {\n elementRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLAnchorElement | null>).current = node;\n },\n [ref],\n );\n\n return (\n <a\n ref={setRefs}\n href={resolvedHref}\n target={target}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onTouchStart={handleTouchStart}\n {...props}\n data-farm-link=\"\"\n data-replace={replace ? \"\" : undefined}\n data-no-scroll={!scroll ? \"\" : undefined}\n data-view-transition={\n viewTransition === \"auto\" ? \"auto\" : viewTransition ? \"true\" : undefined\n }\n />\n );\n}\n\nconst LinkWithRef = forwardRef(LinkInner);\nLinkWithRef.displayName = \"Link\";\n\ntype LinkComponentType = <TRoute extends string = DefaultRouteHref, THref extends string = string>(\n props: LinkProps<TRoute, THref> & { ref?: React.ForwardedRef<HTMLAnchorElement> },\n) => React.ReactElement;\n\nexport const Link = LinkWithRef as unknown as LinkComponentType;\n\nfunction resolveLinkHref(\n href: string,\n params: FarmRouterPathParams | undefined,\n options: FarmRouterBuildOptions,\n) {\n if (isExternalUrl(href)) return href;\n\n const { pathname, query, hash } = splitInternalHref(href);\n\n const resolvedHref = buildFarmRoutePath(pathname, params, {\n query: mergeQueryParams(query, options.query),\n hash: options.hash ?? hash,\n trailingSlash: options.trailingSlash,\n });\n\n return applyPreservedSearchParams(resolvedHref);\n}\n\nfunction splitInternalHref(href: string) {\n try {\n const url = new URL(href, \"http://farm.local\");\n return {\n pathname: url.pathname || \"/\",\n query: url.searchParams,\n hash: url.hash ? url.hash.slice(1) : undefined,\n };\n } catch {\n const [withoutHash, rawHash] = href.split(\"#\", 2);\n const [pathname, rawQuery] = withoutHash.split(\"?\", 2);\n return {\n pathname: pathname || \"/\",\n query: new URLSearchParams(rawQuery || \"\"),\n hash: rawHash,\n };\n }\n}\n\nfunction mergeQueryParams(\n current: URLSearchParams,\n next: FarmRouterBuildOptions[\"query\"],\n): URLSearchParams | undefined {\n const merged = new URLSearchParams(current);\n\n if (next instanceof URLSearchParams) {\n for (const [key, value] of next.entries()) {\n merged.append(key, value);\n }\n } else if (next) {\n for (const [key, value] of Object.entries(next)) {\n const values = Array.isArray(value) ? value : [value];\n for (const item of values) {\n if (item == null) continue;\n merged.append(key, String(item));\n }\n }\n }\n\n return merged.toString() ? merged : undefined;\n}\n\nfunction applyPreservedSearchParams(href: string): string {\n if (typeof window === \"undefined\") return href;\n\n const manifest = (window as any).__FARM_MANIFEST__;\n const routes =\n manifest?.routes && typeof manifest.routes === \"object\" ? Object.values(manifest.routes) : [];\n if (routes.length === 0) return href;\n\n const url = new URL(href, window.location.origin);\n const route = routes.find((candidate: any) => matchManifestRoute(url.pathname, candidate));\n const preserve = Array.isArray((route as any)?.search?.preserve)\n ? ((route as any).search.preserve as string[])\n : [];\n if (preserve.length === 0) return href;\n\n const current = new URLSearchParams(window.location.search);\n let changed = false;\n\n for (const key of preserve) {\n if (url.searchParams.has(key) || !current.has(key)) continue;\n for (const value of current.getAll(key)) {\n url.searchParams.append(key, value);\n changed = true;\n }\n }\n\n if (!changed) return href;\n return `${url.pathname}${url.search}${url.hash}`;\n}\n\nfunction matchManifestRoute(pathname: string, route: any): boolean {\n if (!route || !Array.isArray(route.segments)) return false;\n const routeSegments = route.segments;\n const normalized = pathname === \"/\" ? \"\" : pathname.replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n const pathSegments = normalized ? normalized.split(\"/\") : [];\n const hasCatchAll = routeSegments.some((segment: any) => segment.isCatchAll);\n\n if (!hasCatchAll && pathSegments.length !== routeSegments.length) {\n return false;\n }\n\n for (let index = 0; index < routeSegments.length; index++) {\n const routeSegment = routeSegments[index];\n const pathSegment = pathSegments[index];\n\n if (routeSegment.isCatchAll) {\n return true;\n }\n\n if (pathSegment === undefined) {\n if (routeSegment.isOptional) continue;\n return false;\n }\n\n if (!routeSegment.isDynamic && routeSegment.segment !== pathSegment) {\n return false;\n }\n }\n\n return pathSegments.length === routeSegments.length || hasCatchAll;\n}\n","import React, { createContext, useContext, type ReactNode } from \"react\";\nimport type { FarmConfig } from \"./types\";\nimport { normalizeFarmBasePath } from \"./base-path\";\n\ninterface FarmContextValue {\n config: FarmConfig;\n basePath: string;\n}\n\nconst FarmContext = createContext<FarmContextValue | null>(null);\n\ninterface FarmProviderProps {\n children: ReactNode;\n config: FarmConfig;\n}\n\n/**\n * Farm.js context provider for client-side components\n */\nexport function FarmProvider({ children, config }: FarmProviderProps) {\n const value: FarmContextValue = {\n config,\n basePath: normalizeFarmBasePath(config.basePath),\n };\n\n return <FarmContext.Provider value={value}>{children}</FarmContext.Provider>;\n}\n\n/**\n * Hook to access Farm.js configuration and utilities\n */\nexport function useFarm(): FarmContextValue {\n const context = useContext(FarmContext);\n\n if (!context) {\n throw new Error(\"useFarm must be used within a FarmProvider\");\n }\n\n return context;\n}\n\n/** @internal Read Farm context when a component can also use a runtime fallback. */\nexport function useOptionalFarm(): FarmContextValue | null {\n return useContext(FarmContext);\n}\n\n/**\n * Hook to get the current base path\n */\nexport function useBasePath(): string {\n const { basePath } = useFarm();\n return basePath;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAEA,SAAS,aAAa,SAAS,QAAQ,gBAAgB;AA0FhD,SAAS,YACd,QACA,UAII,CAAC,GACuB;AAK5B,QAAM,cAAc,QAAQ,eAAe;AAC3C,QAAM,aAAa,OAAO,OAAO;AACjC,QAAM,YAAY,OAAO,MAAM;AAC/B,QAAM,eAAe,OAAO,CAAC;AAC7B,QAAM,eAAyD;AAAA,IAC7D,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AACA,QAAM,WAAW,OAAO,YAAY;AACpC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAmD,YAAY;AAEzF,aAAW,UAAU;AACrB,YAAU,UAAU;AAEpB,QAAM,mBAAmB;AAAA,IACvB,CACE,UAKG;AACH,eAAS,CAAC,YAAY;AACpB,cAAM,OAAO,OAAO,UAAU,aAAa,MAAM,OAAO,IAAI;AAC5D,iBAAS,UAAU;AACnB,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,cAAc;AAAA,IAClB,OAAO,cAA2B;AAChC,YAAM,YAAY,EAAE,aAAa;AACjC,YAAM,iBAAiB,WAAW;AAClC,YAAM,eAAe,SAAS,QAAQ;AACtC,YAAM,iBAAiB,eAAe,aAAa;AAAA,QACjD;AAAA,QACA,SAAS;AAAA,MACX,CAAC;AACD,YAAM,oBAAoB,mBAAmB;AAE7C,uBAAiB,CAAC,aAAa;AAAA,QAC7B,cAAc,QAAQ,eAAe;AAAA,QACrC,QAAQ;AAAA,QACR,MAAM,oBACF,iBACA,eAAe,kBAAkB,QAC/B,QAAQ,OACR;AAAA,QACN,OAAO;AAAA,QACP;AAAA,MACF,EAAE;AAEF,UAAI;AACF,cAAM,iBAAiB,UAAU;AACjC,cAAM,YAAY,cAAc,cAAc,IAC1C,MAAM,eAAe,WAAW,eAAe,OAAO,IACtD,MAAM,eAAe,SAAS;AAClC,cAAM,OAAO,qBAAoC,WAAW,cAAc,cAAc,CAAC;AACzF,cAAM,kBAAkB,cAAc,aAAa;AAEnD,yBAAiB,CAAC,YAAY;AAC5B,gBAAM,eAAe,KAAK,IAAI,GAAG,QAAQ,eAAe,CAAC;AACzD,cAAI,CAAC,iBAAiB;AACpB,mBAAO;AAAA,cACL,GAAG;AAAA,cACH;AAAA,cACA,QAAQ,eAAe,IAAI,YAAY,QAAQ;AAAA,YACjD;AAAA,UACF;AAEA,iBAAO;AAAA,YACL;AAAA,YACA,QAAQ;AAAA,YACR;AAAA,YACA,OAAO;AAAA,YACP;AAAA,UACF;AAAA,QACF,CAAC;AAED,YAAI,iBAAiB;AACnB,yBAAe,YAAY,MAAM,SAAS;AAC1C,yBAAe,YAAY,MAAM,MAAM,SAAS;AAAA,QAClD;AAEA,eAAO;AAAA,MACT,SAAS,OAAO;AACd,cAAM,QAAQ,uBAAuB,KAAK;AAC1C,cAAM,kBAAkB,cAAc,aAAa;AAEnD,yBAAiB,CAAC,YAAY;AAC5B,gBAAM,eAAe,KAAK,IAAI,GAAG,QAAQ,eAAe,CAAC;AACzD,cAAI,CAAC,iBAAiB;AACpB,mBAAO;AAAA,cACL,GAAG;AAAA,cACH;AAAA,cACA,QAAQ,eAAe,IAAI,YAAY,QAAQ;AAAA,YACjD;AAAA,UACF;AAEA,iBAAO;AAAA,YACL;AAAA,YACA,QAAQ;AAAA,YACR,MACE,qBAAqB,eAAe,kBAChC,eACA,eAAe,kBAAkB,QAC/B,QAAQ,OACR;AAAA,YACR;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AAED,YAAI,iBAAiB;AACnB,yBAAe,UAAU,OAAO,SAAS;AACzC,yBAAe,YAAY,MAAM,OAAO,SAAS;AAAA,QACnD;AAEA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,gBAAgB;AAAA,EACnB;AAEA,QAAM,SAAS;AAAA,IACb,CAAC,cAA2B;AAC1B,WAAK,YAAY,SAAkB,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACrD;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,QAAQ,YAAY,MAAM;AAC9B,iBAAa,WAAW;AACxB,qBAAiB;AAAA,MACf,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,MAAM,WAAW,QAAQ,eAAe;AAAA,MACxC,OAAO;AAAA,MACP,WAAW;AAAA,IACb,CAAC;AAAA,EACH,GAAG,CAAC,gBAAgB,CAAC;AAErB,SAAO;AAAA,IACL,OAAO;AAAA,MACL,SAAS,MAAM,eAAe;AAAA,MAC9B,QAAQ,MAAM;AAAA,MACd,MAAM,MAAM;AAAA,MACZ,OAAO,MAAM;AAAA,MACb,WAAW,MAAM;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AACF;AArLgB;AAuLhB,SAAS,qBAAoC,QAAiB,UAA0B;AACtF,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,YAAY;AAClB,MAAI,UAAU,OAAO;AACnB,UAAM,UAAU;AAAA,EAClB;AAEA,SAAO,UAAU;AACnB;AATS;AAWT,SAAS,uBAAuB,OAAuB;AACrD,MAAI,iBAAiB,MAAO,QAAO;AAEnC,QAAM,aAAa,IAAI,MAAM,OAAO,UAAU,WAAW,QAAQ,iBAAiB;AAClF,EAAC,WAA2C,QAAQ;AACpD,SAAO;AACT;AANS;;;AC5RT;AAAA,EACE;AAAA,EACA,eAAAA;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAIK;AAwEP,IAAM,mBAAmB,oBAAI,QAA0C;AAQhE,SAAS,WACd,QACA,UAAsC,CAAC,GACZ;AAC3B,QAAM,YAAYC,QAAO,MAAM;AAC/B,QAAM,aAAaA,QAAO,OAAO;AACjC,QAAM,kBAAkBA,QAAO,CAAC;AAChC,QAAM,CAAC,UAAU,WAAW,IAAIC,UAA0B,IAAI;AAC9D,QAAM,WAAW,YAAY,QAAQ,OAAO;AAE5C,YAAU,UAAU;AACpB,aAAW,UAAU;AAErB,QAAM,cAAcC;AAAA,IAClB,OAAO,UAAkC;AACvC,YAAM,eAAe,EAAE,gBAAgB;AACvC,YAAM,oBAAoB,WAAW,KAAK,IAAI,QAAQ;AACtD,kBAAY,iBAAiB;AAE7B,UAAI;AACF,cAAM,YAAY,oBACd,mBAAmB,UAAU,SAAS,mBAAmB,WAAW,OAAO,IAC3E;AACJ,eAAO,MAAM,SAAS,YAAY,SAA4C;AAAA,MAChF,UAAE;AACA,YAAI,iBAAiB,gBAAgB,SAAS;AAC5C,sBAAY,IAAI;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,SAAS,WAAW;AAAA,EACvB;AAEA,QAAM,SAASA;AAAA,IACb,CAAC,UAAkC;AACjC,WAAK,YAAY,KAAc,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACjD;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,OAAOC,SAAQ,MAAM;AACzB,UAAM,cAAc,wBAAC,EAAE,QAAQ,QAAQ,SAAS,UAAU,GAAG,MAAM,MAAwB;AACzF,YAAM,cAAc,UAAU;AAC9B,YAAM,WAAW,uBAAuB,WAAW;AACnD,YAAM,eAAe,UAAU,yBAAyB,aAAa,QAAQ;AAC7E,YAAM,eACJ,WACC,aAAa,SAAS,WAAW,SAAS,SAAS,WAAW,UAC3D,SAAS,OAAO,YAAY,IAC5B,WACE,SACA;AACR,YAAM,iBAAiB,OAAO,iBAAiB;AAE/C,YAAM,eAAe,wBAAC,UAAsC;AAC1D,mBAAW,KAAK;AAChB,YAAI,MAAM,iBAAkB;AAE5B,cAAM,eAAe;AACrB,cAAM,YAAY,aAAa,KAAK;AACpC,cAAM,eAAe,wBAAwB,MAAM,eAAe,SAAS;AAC3E,yBAAiB,IAAI,cAAc;AAAA,UACjC,MAAM,MAAM;AAAA,UACZ;AAAA,QACF,CAAC;AACD,aAAK,YAAY,YAAqB,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MACxD,GAZqB;AAcrB,aAAO,cAAc,QAAQ;AAAA,QAC3B,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,QAAQ,iBAAiB,SAAY;AAAA,QACrC,SAAS,iBAAiB,SAAY;AAAA,QACtC,UAAU;AAAA,MACZ,CAAC;AAAA,IACH,GAlCoB;AAoCpB,gBAAY,cAAc;AAC1B,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,QAAQD,aAAY,MAAM;AAC9B,oBAAgB,WAAW;AAC3B,gBAAY,IAAI;AAChB,aAAS,MAAM;AAAA,EACjB,GAAG,CAAC,SAAS,KAAK,CAAC;AAEnB,SAAOC;AAAA,IACL,OAAO;AAAA,MACL,OAAO,SAAS,UAAU,eAAe;AAAA,MACzC,QAAQ,SAAS;AAAA,MACjB,SAAS,SAAS;AAAA,MAClB,MAAM,SAAS;AAAA,MACf,OAAO,SAAS;AAAA,MAChB,WAAW,SAAS;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAlHgB;AAoHhB,SAAS,mBACP,QACA,UACA,SAC4C;AAC5C,QAAM,UAAU,iBAAiB,IAAI,QAAQ,KAAK,EAAE,MAAM,MAAM,WAAW,KAAK;AAChF,MAAI,QAAQ,aAAa;AACvB,WAAO,QAAQ,YAAY,UAAU,OAAO;AAAA,EAC9C;AACA,MAAI,CAAC,cAAc,MAAM,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,iBAAiB,QAAQ;AACxC,QAAM,SAAS,uBAAuB,MAAM,GAAG;AAC/C,SACE,WAAW,SAAS,WAAW,SAAS,EAAE,OAAO,OAAO,IAAI,EAAE,MAAM,OAAO;AAE/E;AAlBS;AAoBT,SAAS,yBACP,QACA,UACwC;AACxC,MAAI,CAAC,SAAU,QAAO,wBAAwB,MAAM,IAAI,SAAS;AACjE,MAAI,SAAS,WAAY,QAAO,SAAS;AAEzC,SAAO,IAAI,IAAI,SAAS,MAAM,SAAS,OAAO,EAAE;AAClD;AARS;AAUT,SAAS,iBACP,UAC2D;AAC3D,QAAM,SAAoE,uBAAO,OAAO,IAAI;AAC5F,aAAW,CAAC,KAAK,KAAK,KAAK,SAAS,QAAQ,GAAG;AAC7C,QAAI,QAAQ,eAAe,QAAQ,iBAAiB,QAAQ,YAAa;AACzE,UAAM,UAAU,OAAO,GAAG;AAC1B,QAAI,YAAY,QAAW;AACzB,aAAO,GAAG,IAAI;AAAA,IAChB,WAAW,MAAM,QAAQ,OAAO,GAAG;AACjC,cAAQ,KAAK,KAAK;AAAA,IACpB,OAAO;AACL,aAAO,GAAG,IAAI,CAAC,SAAS,KAAK;AAAA,IAC/B;AAAA,EACF;AACA,SAAO;AACT;AAhBS;AAkBT,SAAS,wBAAwB,MAAuB,WAAyC;AAC/F,MAAI;AACF,WAAO,IAAI,SAAS,MAAM,SAAoC;AAAA,EAChE,QAAQ;AACN,UAAM,WAAW,IAAI,SAAS,IAAI;AAClC,UAAM,YAAY;AAGlB,QAAI,aAAa,CAAC,UAAU,YAAY,UAAU,MAAM;AACtD,eAAS,OAAO,UAAU,MAAM,UAAU,SAAS,EAAE;AAAA,IACvD;AACA,WAAO;AAAA,EACT;AACF;AAbS;AAeT,SAAS,aAAa,OAAuD;AAC3E,QAAM,cAAc,MAAM;AAC1B,SAAO,YAAY,qBAAqB,cAAc,YAAY,YAAY;AAChF;AAHS;AAKT,SAAS,wBAAwB,QAAoC;AACnE,QAAM,YAAY;AAKlB,SACE,UAAU,mBAAmB,QAC7B,OAAO,UAAU,kBAAkB,cACnC,UAAU,aAAa,uBAAO,IAAI,wBAAwB;AAE9D;AAXS;AAaT,SAAS,WAAW,OAAmC;AACrD,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,SACG,OAAO,aAAa,eAAe,iBAAiB,YACpD,OAAO,UAAU,SAAS,KAAK,KAAK,MAAM,uBACzC,OAAQ,MAAgC,YAAY;AAE1D;AAPS;;;AChST,SAAS,4BAA4B;AAoDrC,IAAM,sBAAsB,oBAAI,IAAsB;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,WAAiC,OAAa;AACrD,SAAO,EAAE,GAAG,MAAM;AACpB;AAFS;AAIT,SAAS,UACP,OACA,MACY;AACZ,QAAM,QAAQ,CAAC;AAEf,aAAW,OAAO,MAAM;AACtB,UAAM,GAAG,IAAI,MAAM,GAAG;AAAA,EACxB;AAEA,SAAO;AACT;AAXS;AAaT,SAAS,eAAqC,OAAU,eAA+B;AACrF,QAAM,OAAO,oBAAI,IAAa;AAAA,IAC5B,GAAI,OAAO,KAAK,KAAK;AAAA,IACrB,GAAI,OAAO,KAAK,aAAa;AAAA,EAC/B,CAAC;AAED,SAAO,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,GAAG,MAAM,GAAG,GAAG,cAAc,GAAG,CAAC,CAAC;AAC7E;AAPS;AAST,SAAS,cAAuD,MAAkC;AAChG,SAAO,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC;AACjC;AAFS;AAIT,SAAS,aAAgB,OAA6B,eAAqB;AACzE,SAAO,OAAO,UAAU,aAAc,MAAkC,aAAa,IAAI;AAC3F;AAFS;AAIT,SAAS,WAAW,OAAmD;AACrE,SAAO,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU;AACpF;AAFS;AAIF,SAAS,YACd,cACA,QACoB;AACpB,QAAM,kBAAkB,WAAW,YAAY;AAC/C,MAAI,QAAQ,WAAW,YAAY;AACnC,QAAM,gBAAgB,oBAAI,IAA0B;AAEpD,QAAM,kBAAkB,wBACtB,MACA,WACG;AACH,UAAM,eAAqC,EAAE,MAAM,OAAO;AAC1D,kBAAc,IAAI,YAAY;AAC9B,WAAO,MAAM;AACX,oBAAc,OAAO,YAAY;AAAA,IACnC;AAAA,EACF,GATwB;AAWxB,QAAM,OAAO,wBAAC,WAAc,kBAAqB;AAC/C,UAAM,cAAc,eAAe,WAAW,aAAa;AAE3D,QAAI,YAAY,WAAW,GAAG;AAC5B;AAAA,IACF;AAEA,UAAM,gBAAgB,IAAI,IAAI,WAAW;AAEzC,eAAW,gBAAgB,eAAe;AACxC,UAAI,aAAa,SAAS,QAAQ,aAAa,KAAK,KAAK,CAAC,QAAQ,cAAc,IAAI,GAAG,CAAC,GAAG;AACzF,qBAAa,OAAO,WAAW,aAAa;AAAA,MAC9C;AAAA,IACF;AAAA,EACF,GAda;AAgBb,QAAM,WAAW,wBAAC,QAAkB;AAClC,WAAO,QAAQ,SAAY,QAAQ,MAAM,GAAG;AAAA,EAC9C,GAFiB;AAIjB,QAAMC,gBAAe,wBAAC,cAAqC;AACzD,UAAM,gBAAgB;AACtB,UAAM,gBACJ,OAAO,cAAc,aAAc,UAA8B,aAAa,IAAI;AACpF,YAAQ;AACR,SAAK,OAAO,aAAa;AACzB,WAAO;AAAA,EACT,GAPqB;AASrB,QAAM,WAAW,wBAAC,YAAqC,UAA0C;AAC/F,UAAM,gBAAgB;AACtB,QAAI;AAEJ,QAAI,WAAW,UAAU,GAAG;AAC1B,YAAM,MAAM;AACZ,YAAM,YAAY,aAAa,OAAwC,cAAc,GAAG,CAAC;AAEzF,UAAI,OAAO,GAAG,cAAc,GAAG,GAAG,SAAS,GAAG;AAC5C,eAAO;AAAA,MACT;AAEA,kBAAY;AAAA,QACV,GAAG;AAAA,QACH,CAAC,GAAG,GAAG;AAAA,MACT;AACA,cAAQ;AACR,WAAK,WAAW,aAAa;AAC7B,aAAO;AAAA,IACT;AAEA,UAAM,QACJ,OAAO,eAAe,aACjB,WAAwC,aAAa,IACrD;AAEP,gBAAY;AAAA,MACV,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AACA,YAAQ;AACR,SAAK,WAAW,aAAa;AAC7B,WAAO;AAAA,EACT,GAjCiB;AAmCjB,QAAM,iBAAiB,wBACrB,eACA,aACG;AACH,QAAI,OAAO,kBAAkB,YAAY;AACvC,aAAO,gBAAgB,MAAM,CAAC,WAAW,kBAAkB;AACzD,QAAC,cAAmC,WAAW,aAAa;AAAA,MAC9D,CAAC;AAAA,IACH;AAEA,QAAI,MAAM,QAAQ,aAAa,GAAG;AAChC,YAAM,OAAO,cAAc,aAAa;AACxC,aAAO,gBAAgB,MAAM,CAAC,WAAW,kBAAkB;AACzD,QAAC;AAAA,UACC,UAAU,WAAW,IAAI;AAAA,UACzB,UAAU,eAAe,IAAI;AAAA,QAC/B;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,MAAM;AACZ,WAAO,gBAAgB,CAAC,GAAG,GAAG,CAAC,WAAW,kBAAkB;AAC1D,MAAC,SAA0C,UAAU,GAAG,GAAG,cAAc,GAAG,CAAC;AAAA,IAC/E,CAAC;AAAA,EACH,GAxBuB;AA0BvB,QAAM,gBAAgB,wBAAoB,cAAiC;AACzE,QAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,YAAM,OAAO,cAAc,SAAS;AACpC,UAAI,YAAY;AAChB,UAAI,YAAY,UAAU,OAAO,IAAI;AACrC,YAAM,cAAc,6BAAM;AACxB,YAAI,cAAc,OAAO;AACvB,sBAAY;AACZ,sBAAY,UAAU,OAAO,IAAI;AAAA,QACnC;AAEA,eAAO;AAAA,MACT,GAPoB;AASpB,aAAO;AAAA,QACL,CAAC,WAAW,gBAAgB,MAAM,MAAM,OAAO,CAAC;AAAA,QAChD;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,cAAc,UAAU;AACjC,aAAO;AAAA,QACL,CAAC,WAAW,gBAAgB,CAAC,SAAS,GAAG,MAAM,OAAO,CAAC;AAAA,QACvD,MAAM,MAAM,SAAS;AAAA,QACrB,MAAM,MAAM,SAAS;AAAA,MACvB;AAAA,IACF;AAEA,WAAO;AAAA,MACL,CAAC,WAAW,gBAAgB,MAAM,MAAM,OAAO,CAAC;AAAA,MAChD,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF,GAlCsB;AAoCtB,QAAM,QAAQ;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,SAASA;AAAA,IACT,OAAO,6BAAMA,cAAa,WAAW,eAAe,CAAC,GAA9C;AAAA,IACP,WAAW;AAAA,EACb;AAEA,aAAW,OAAO,OAAO,KAAK,eAAe,GAAkB;AAC7D,QAAI,oBAAoB,IAAI,GAAuB,GAAG;AACpD,YAAM,IAAI;AAAA,QACR,gDAAgD,OAAO,GAAG,CAAC;AAAA,MAC7D;AAAA,IACF;AAEA,UAAM,QAAS,8BAAM,cAAc,GAAG,IAAvB;AACf,UAAM,MAAM,MAAM,MAAM,GAAG;AAC3B,UAAM,MAAM,CAAC,UAAU,SAAS,KAAK,KAAK;AAC1C,UAAM,YAAY,CAAC,aAAa,eAAe,KAAK,QAAwC;AAE5F,WAAO,eAAe,OAAO,KAAK;AAAA,MAChC,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ;AACV,UAAM,UAAU,OAAO,KAAK;AAE5B,eAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,OAAO,GAAG;AACpD,UAAI,QAAQ,OAAO;AACjB,cAAM,IAAI;AAAA,UACR,yCAAyC,IAAI;AAAA,QAC/C;AAAA,MACF;AAEA,aAAO,eAAe,OAAO,MAAM;AAAA,QACjC,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAlMgB;;;AChGhB,SAAS,YAAY,WAAW,UAAAC,SAAQ,eAAAC,oBAA8C;;;ACHtF,SAAgB,eAAe,kBAAkC;AAyBxD;AAhBT,IAAM,cAAc,cAAuC,IAAI;AAUxD,SAAS,aAAa,EAAE,UAAU,OAAO,GAAsB;AACpE,QAAM,QAA0B;AAAA,IAC9B;AAAA,IACA,UAAU,sBAAsB,OAAO,QAAQ;AAAA,EACjD;AAEA,SAAO,oBAAC,YAAY,UAAZ,EAAqB,OAAe,UAAS;AACvD;AAPgB;AAuBT,SAAS,kBAA2C;AACzD,SAAO,WAAW,WAAW;AAC/B;AAFgB;;;AD0dZ,gBAAAC,YAAA;AA9PJ,SAAS,gBAAgB,GAA8B;AACrD,SAAO,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE;AACpD;AAFS;AAIT,SAAS,cAAc,MAAuB;AAC5C,SAAO,KAAK,WAAW,IAAI,KAAK,2BAA2B,KAAK,IAAI;AACtE;AAFS;AAIT,SAAS,YAQA;AACP,MAAI,OAAO,WAAW,eAAgB,OAAe,qBAAqB;AACxE,WAAQ,OAAe;AAAA,EACzB;AACA,SAAO;AACT;AAbS;AAeT,SAAS,kBAAkBC,WAIzB;AACA,MAAIA,cAAa,SAASA,cAAa,QAAQ;AAC7C,WAAO,EAAE,QAAQ,OAAO,UAAU,OAAO,QAAQ,MAAM;AAAA,EACzD;AACA,MAAIA,cAAa,MAAM;AACrB,WAAO,EAAE,QAAQ,MAAM,UAAU,MAAM,QAAQ,MAAM;AAAA,EACvD;AACA,MAAIA,cAAa,SAAS;AACxB,WAAO,EAAE,QAAQ,MAAM,UAAU,OAAO,QAAQ,MAAM;AAAA,EACxD;AACA,MAAIA,cAAa,UAAU;AACzB,WAAO,EAAE,QAAQ,MAAM,UAAU,OAAO,QAAQ,MAAM;AAAA,EACxD;AACA,MAAIA,cAAa,YAAY;AAC3B,WAAO,EAAE,QAAQ,OAAO,UAAU,MAAM,QAAQ,MAAM;AAAA,EACxD;AACA,MAAIA,cAAa,UAAU;AACzB,WAAO,EAAE,QAAQ,OAAO,UAAU,OAAO,QAAQ,KAAK;AAAA,EACxD;AACA,SAAO,EAAE,QAAQ,OAAO,UAAU,OAAO,QAAQ,MAAM;AACzD;AAxBS;AA0BT,SAAS,UACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAAA,YAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,aAAaC,QAAiC,IAAI;AACxD,QAAM,mBAAmBA,QAA6C,IAAI;AAC1E,QAAM,iBAAiBA,QAAsB,IAAI;AACjD,QAAM,OAAO,gBAAgB;AAE7B,QAAM,EAAE,QAAQ,UAAU,OAAO,IAAI,kBAAkBD,SAAQ;AAC/D,QAAM,WAAW,gBAAgB,MAAM,QAAQ;AAAA,IAC7C;AAAA,IACA;AAAA,IACA,eAAe,iBAAiB,+BAA+B;AAAA,EACjE,CAAC;AACD,QAAM,gBAAgB,uBAAuB,UAAU,MAAM;AAC7D,QAAM,eAAe,cAAc,aAAa,IAC5C,gBACA,kBAAkB,eAAe,MAAM,YAAY,gBAAgB,CAAC;AACxE,QAAM,aAAa,cAAc,YAAY;AAE7C,QAAM,aAAaE,aAAY,MAAM;AACnC,QAAI,cAAc,eAAe,QAAS;AAC1C,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ;AACb,UAAM,QAAQ,OAAO,YAAY;AACjC,mBAAe,UAAU;AACzB,UAAM,QAAQ,6BAAM;AAClB,UAAI,eAAe,YAAY,MAAO,gBAAe,UAAU;AAAA,IACjE,GAFc;AAGd,QAAI;AACF,WAAK,OAAO,SAAS,YAAY,EAAE,KAAK,OAAO,KAAK;AAAA,IACtD,QAAQ;AACN,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,cAAc,UAAU,CAAC;AAE7B,YAAU,MAAM;AACd,mBAAe,UAAU;AAAA,EAC3B,GAAG,CAAC,YAAY,CAAC;AAEjB,YAAU,MAAM;AACd,UAAM,UAAU,WAAW;AAC3B,QAAI,CAAC,WAAW,WAAY;AAE5B,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ;AAEb,QAAI,UAAU;AACZ,aAAO,mBAAmB,OAAO;AACjC,aAAO,MAAM,OAAO,qBAAqB,OAAO;AAAA,IAClD;AAAA,EACF,GAAG,CAAC,cAAc,UAAU,UAAU,CAAC;AAEvC,YAAU,MAAM;AACd,QAAI,CAAC,UAAU,WAAY;AAE3B,QAAI,YAAY;AAChB,QAAI,YAAkD;AAEtD,UAAM,oBAAoB,6BAAM;AAC9B,UAAI,aAAa,eAAe,QAAS;AAEzC,YAAM,SAAS,UAAU;AACzB,UAAI,CAAC,QAAQ;AACX,oBAAY,WAAW,mBAAmB,EAAE;AAC5C;AAAA,MACF;AAEA,iBAAW;AAAA,IACb,GAV0B;AAY1B,sBAAkB;AAElB,WAAO,MAAM;AACX,kBAAY;AACZ,UAAI,WAAW;AACb,qBAAa,SAAS;AAAA,MACxB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,YAAY,cAAc,UAAU,CAAC;AAEjD,YAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,iBAAiB,SAAS;AAC5B,qBAAa,iBAAiB,OAAO;AACrC,yBAAiB,UAAU;AAAA,MAC7B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,eAAeA,aAAY,MAAM;AACrC,QAAI,iBAAiB,SAAS;AAC5B,mBAAa,iBAAiB,OAAO;AACrC,uBAAiB,UAAU;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,yBAAyBA,aAAY,MAAM;AAC/C,QAAI,cAAc,CAAC,UAAU,eAAe,QAAS;AACrD,iBAAa;AACb,qBAAiB,UAAU,WAAW,MAAM;AAC1C,uBAAiB,UAAU;AAC3B,iBAAW;AAAA,IACb,GAAG,aAAa;AAAA,EAClB,GAAG,CAAC,QAAQ,YAAY,eAAe,YAAY,YAAY,CAAC;AAEhE,QAAM,mBAAmBA;AAAA,IACvB,CAAC,UAA+C;AAC9C,qBAAe,KAAK;AACpB,6BAAuB;AAAA,IACzB;AAAA,IACA,CAAC,cAAc,sBAAsB;AAAA,EACvC;AAEA,QAAM,mBAAmBA;AAAA,IACvB,CAAC,UAA+C;AAC9C,qBAAe,KAAK;AACpB,mBAAa;AAAA,IACf;AAAA,IACA,CAAC,cAAc,YAAY;AAAA,EAC7B;AAEA,QAAM,mBAAmBA;AAAA,IACvB,CAAC,UAA+C;AAC9C,qBAAe,KAAK;AACpB,6BAAuB;AAAA,IACzB;AAAA,IACA,CAAC,cAAc,sBAAsB;AAAA,EACvC;AAEA,QAAM,cAAcA;AAAA,IAClB,CAAC,UAA+C;AAC9C,gBAAU,KAAK;AACf,6BAAuB;AAAA,IACzB;AAAA,IACA,CAAC,SAAS,sBAAsB;AAAA,EAClC;AAEA,QAAM,aAAaA;AAAA,IACjB,CAAC,UAA+C;AAC9C,eAAS,KAAK;AACd,mBAAa;AAAA,IACf;AAAA,IACA,CAAC,QAAQ,YAAY;AAAA,EACvB;AAEA,QAAM,cAAcA;AAAA,IAClB,CAAC,UAA+C;AAC9C,gBAAU,KAAK;AACf,UAAI,MAAM,iBAAkB;AAC5B,UAAI,WAAY;AAChB,UAAI,MAAM,cAAc,aAAa,UAAU,EAAG;AAClD,UAAI,UAAU,WAAW,QAAS;AAClC,UAAI,gBAAgB,KAAK,EAAG;AAC5B,UAAI,MAAM,WAAW,EAAG;AAExB,UAAI,OAAO,WAAW,aAAa;AACjC,cAAM,eAAe;AACrB,YAAI,uBAAuB,aAAa,GAAG;AACzC,iBAAO,SAAS,OAAO,YAAY;AACnC;AAAA,QACF;AACA,cAAM,SAAS,UAAU;AACzB,YAAI,QAAQ;AACV,iBAAO,SAAS,cAAc,EAAE,SAAS,QAAQ,eAAe,CAAC;AAAA,QACnE,OAAO;AACL,cAAI,QAAS,QAAO,SAAS,QAAQ,YAAY;AAAA,cAC5C,QAAO,SAAS,OAAO;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,eAAe,cAAc,SAAS,QAAQ,gBAAgB,QAAQ,YAAY,OAAO;AAAA,EAC5F;AAEA,QAAM,UAAUA;AAAA,IACd,CAAC,SAAmC;AAClC,iBAAW,UAAU;AACrB,UAAI,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA,eAC9B,IAAK,CAAC,IAAyD,UAAU;AAAA,IACpF;AAAA,IACA,CAAC,GAAG;AAAA,EACN;AAEA,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,MACT,cAAc;AAAA,MACd,cAAc;AAAA,MACd,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,cAAc;AAAA,MACb,GAAG;AAAA,MACJ,kBAAe;AAAA,MACf,gBAAc,UAAU,KAAK;AAAA,MAC7B,kBAAgB,CAAC,SAAS,KAAK;AAAA,MAC/B,wBACE,mBAAmB,SAAS,SAAS,iBAAiB,SAAS;AAAA;AAAA,EAEnE;AAEJ;AAhOS;AAkOT,IAAM,cAAc,WAAW,SAAS;AACxC,YAAY,cAAc;AAMnB,IAAM,OAAO;AAEpB,SAAS,gBACP,MACA,QACA,SACA;AACA,MAAI,cAAc,IAAI,EAAG,QAAO;AAEhC,QAAM,EAAE,UAAU,OAAO,KAAK,IAAI,kBAAkB,IAAI;AAExD,QAAM,eAAe,mBAAmB,UAAU,QAAQ;AAAA,IACxD,OAAO,iBAAiB,OAAO,QAAQ,KAAK;AAAA,IAC5C,MAAM,QAAQ,QAAQ;AAAA,IACtB,eAAe,QAAQ;AAAA,EACzB,CAAC;AAED,SAAO,2BAA2B,YAAY;AAChD;AAhBS;AAkBT,SAAS,kBAAkB,MAAc;AACvC,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,MAAM,mBAAmB;AAC7C,WAAO;AAAA,MACL,UAAU,IAAI,YAAY;AAAA,MAC1B,OAAO,IAAI;AAAA,MACX,MAAM,IAAI,OAAO,IAAI,KAAK,MAAM,CAAC,IAAI;AAAA,IACvC;AAAA,EACF,QAAQ;AACN,UAAM,CAAC,aAAa,OAAO,IAAI,KAAK,MAAM,KAAK,CAAC;AAChD,UAAM,CAAC,UAAU,QAAQ,IAAI,YAAY,MAAM,KAAK,CAAC;AACrD,WAAO;AAAA,MACL,UAAU,YAAY;AAAA,MACtB,OAAO,IAAI,gBAAgB,YAAY,EAAE;AAAA,MACzC,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAjBS;AAmBT,SAAS,iBACP,SACA,MAC6B;AAC7B,QAAM,SAAS,IAAI,gBAAgB,OAAO;AAE1C,MAAI,gBAAgB,iBAAiB;AACnC,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,QAAQ,GAAG;AACzC,aAAO,OAAO,KAAK,KAAK;AAAA,IAC1B;AAAA,EACF,WAAW,MAAM;AACf,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,YAAM,SAAS,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AACpD,iBAAW,QAAQ,QAAQ;AACzB,YAAI,QAAQ,KAAM;AAClB,eAAO,OAAO,KAAK,OAAO,IAAI,CAAC;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,SAAO,OAAO,SAAS,IAAI,SAAS;AACtC;AArBS;AAuBT,SAAS,2BAA2B,MAAsB;AACxD,MAAI,OAAO,WAAW,YAAa,QAAO;AAE1C,QAAM,WAAY,OAAe;AACjC,QAAM,SACJ,UAAU,UAAU,OAAO,SAAS,WAAW,WAAW,OAAO,OAAO,SAAS,MAAM,IAAI,CAAC;AAC9F,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,QAAM,MAAM,IAAI,IAAI,MAAM,OAAO,SAAS,MAAM;AAChD,QAAM,QAAQ,OAAO,KAAK,CAAC,cAAmB,mBAAmB,IAAI,UAAU,SAAS,CAAC;AACzF,QAAM,WAAW,MAAM,QAAS,OAAe,QAAQ,QAAQ,IACzD,MAAc,OAAO,WACvB,CAAC;AACL,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,QAAM,UAAU,IAAI,gBAAgB,OAAO,SAAS,MAAM;AAC1D,MAAI,UAAU;AAEd,aAAW,OAAO,UAAU;AAC1B,QAAI,IAAI,aAAa,IAAI,GAAG,KAAK,CAAC,QAAQ,IAAI,GAAG,EAAG;AACpD,eAAW,SAAS,QAAQ,OAAO,GAAG,GAAG;AACvC,UAAI,aAAa,OAAO,KAAK,KAAK;AAClC,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,GAAG,IAAI,QAAQ,GAAG,IAAI,MAAM,GAAG,IAAI,IAAI;AAChD;AA5BS;AA8BT,SAAS,mBAAmB,UAAkB,OAAqB;AACjE,MAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,MAAM,QAAQ,EAAG,QAAO;AACrD,QAAM,gBAAgB,MAAM;AAC5B,QAAM,aAAa,aAAa,MAAM,KAAK,SAAS,QAAQ,QAAQ,EAAE,EAAE,QAAQ,QAAQ,EAAE;AAC1F,QAAM,eAAe,aAAa,WAAW,MAAM,GAAG,IAAI,CAAC;AAC3D,QAAM,cAAc,cAAc,KAAK,CAAC,YAAiB,QAAQ,UAAU;AAE3E,MAAI,CAAC,eAAe,aAAa,WAAW,cAAc,QAAQ;AAChE,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ,GAAG,QAAQ,cAAc,QAAQ,SAAS;AACzD,UAAM,eAAe,cAAc,KAAK;AACxC,UAAM,cAAc,aAAa,KAAK;AAEtC,QAAI,aAAa,YAAY;AAC3B,aAAO;AAAA,IACT;AAEA,QAAI,gBAAgB,QAAW;AAC7B,UAAI,aAAa,WAAY;AAC7B,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,aAAa,aAAa,aAAa,YAAY,aAAa;AACnE,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,aAAa,WAAW,cAAc,UAAU;AACzD;AA9BS;","names":["useCallback","useMemo","useRef","useState","useRef","useState","useCallback","useMemo","replaceState","useRef","useCallback","jsx","prefetch","useRef","useCallback"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/client/spa-router.ts","../src/client/history-sync.ts"],"sourcesContent":["\"use client\";\n\nimport { readDeferredDataResponse } from \"../deferred\";\nimport { notifyHistoryChange, notifyRouterHistoryChange } from \"./history-sync\";\nimport {\n createFarmDeploymentMismatchError,\n createFarmDeploymentRequestHeaders,\n isFarmDeploymentMismatchResponse,\n} from \"../deployment\";\nimport { getHashTargetElement } from \"./hash-target\";\nimport { isFarmExternalNavigationURL } from \"./navigation-url\";\nimport type { FarmClientNavigationSession, FarmClientPluginManager } from \"./plugin\";\nimport { _hydrateFarmI18n, isFarmLocaleChangeHref } from \"../i18n/client-runtime\";\nimport type { FarmI18nClientSnapshot } from \"../i18n/types\";\nimport type { FarmIslandStrategy } from \"../island\";\nimport type { FarmRouteRenderPlan } from \"../navigation/render-plan\";\n\nexport { getHashTargetElement } from \"./hash-target\";\nexport { isFarmExternalNavigationURL } from \"./navigation-url\";\n\n/**\n * Farm.js SPA Router\n *\n * Provides client-side navigation without full page reloads.\n * Features:\n * - Prefetch on viewport intersection\n * - Prefetch on hover\n * - Page caching\n * - History API integration\n * - Scroll restoration\n */\n\ninterface PageData {\n props: Record<string, any>;\n modulePath: string;\n loadingModulePath?: string | null;\n canonicalPath?: string;\n isClientComponent?: boolean;\n shouldHydrate?: boolean;\n islandStrategy?: FarmIslandStrategy | null;\n renderPlan?: FarmRouteRenderPlan;\n fragment?: {\n html: string;\n layoutPatterns: string[];\n };\n metadata?: {\n title?: string;\n description?: string;\n };\n layoutModules?: string[];\n routeSlots?: RouteSlotPageData[];\n interception?: {\n from?: string;\n slots: string[];\n };\n i18n?: FarmI18nClientSnapshot;\n}\n\ninterface RouteSlotPageData {\n name: string;\n ownerPattern: string;\n containerId: string;\n interception: boolean;\n fallback: boolean;\n modulePath: string;\n isClientComponent: boolean;\n shouldHydrate: boolean;\n props: Record<string, any>;\n}\n\nexport interface RouterOptions {\n prefetchTimeout?: number;\n cacheMaxAge?: number;\n scrollRestoration?: boolean;\n shouldUseDocumentNavigation?: (pathname: string) => boolean;\n deploymentId?: string;\n}\n\ninterface CacheEntry {\n data: PageData;\n timestamp: number;\n}\n\nexport interface FarmNavigationBlockerContext {\n from: string;\n to: string;\n action: \"push\" | \"replace\" | \"pop\";\n}\n\nexport type FarmNavigationBlocker = (\n context: FarmNavigationBlockerContext,\n) => boolean | void | Promise<boolean | void>;\n\nexport type FarmViewTransitionMode = boolean | \"auto\";\n\nexport interface FarmNavigateOptions {\n replace?: boolean;\n scroll?: boolean;\n state?: unknown;\n viewTransition?: FarmViewTransitionMode;\n /** Re-fetch the current route even when its URL has not changed. */\n refresh?: boolean;\n}\n\nexport interface FarmNavigationLocation {\n href: string;\n pathname: string;\n search: string;\n hash: string;\n}\n\nexport interface FarmNavigationState {\n state: \"idle\" | \"loading\";\n pending: boolean;\n from: string | null;\n to: FarmNavigationLocation | null;\n action: FarmNavigationBlockerContext[\"action\"] | null;\n startedAt: number | null;\n}\n\nexport type FarmNavigationListener = (state: FarmNavigationState) => void;\n\nconst FARM_PAGE_STATE_KEY = \"__farmPageState\";\nconst FARM_INTERCEPT_FROM_KEY = \"__farmInterceptFrom\";\nconst FARM_HISTORY_INDEX_KEY = \"__farmHistoryIndex\";\n\nfunction readHistoryIndex(state: unknown): number | null {\n if (!state || typeof state !== \"object\") return null;\n const value = (state as Record<string, unknown>)[FARM_HISTORY_INDEX_KEY];\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\nconst IDLE_NAVIGATION_STATE: FarmNavigationState = {\n state: \"idle\",\n pending: false,\n from: null,\n to: null,\n action: null,\n startedAt: null,\n};\n\nfunction getActiveLayoutChainHeader(): string | undefined {\n if (typeof document === \"undefined\") return undefined;\n const patterns = Array.from(\n document.querySelectorAll<HTMLElement>('[data-farm-layout-boundary=\"true\"]'),\n )\n .map((element) => element.dataset.farmLayoutPattern)\n .filter((pattern): pattern is string => Boolean(pattern));\n return patterns.length > 0 ? JSON.stringify(patterns) : undefined;\n}\n\n// Global router instance\nlet routerInstance: SPARouter | null = null;\n\nexport class SPARouter {\n private cache: Map<string, CacheEntry> = new Map();\n private prefetchingUrls: Set<string> = new Set();\n private observers: Map<Element, IntersectionObserver> = new Map();\n private prefetchTimers: Map<Element, ReturnType<typeof setTimeout>> = new Map();\n private blockers: Set<FarmNavigationBlocker> = new Set();\n private unloadBlockers: Map<FarmNavigationBlocker, () => boolean> = new Map();\n private navigationListeners: Set<FarmNavigationListener> = new Set();\n private navigationState: FarmNavigationState = IDLE_NAVIGATION_STATE;\n private currentHistoryPath: string | null = null;\n private currentHistoryIndex: number | null = null;\n private suppressNextPopState = false;\n private navigationSequence = 0;\n private activeNavigation?: {\n id: number;\n controller: AbortController;\n };\n private scrollElements: Map<string, HTMLElement> = new Map();\n private options: Required<Omit<RouterOptions, \"deploymentId\">> &\n Pick<RouterOptions, \"deploymentId\">;\n private onNavigate?: (data: PageData) => Promise<void>;\n private clientPlugins?: Pick<\n FarmClientPluginManager,\n | \"beginNavigation\"\n | \"markNavigationLoaded\"\n | \"resolveNavigation\"\n | \"scheduleNavigationRendered\"\n | \"failNavigation\"\n >;\n\n private readonly onPopState = (event: PopStateEvent) => {\n void this.handlePopState(event);\n };\n\n private readonly onBeforeUnload = (event: BeforeUnloadEvent) => {\n if (this.shouldBlockUnload()) {\n event.preventDefault();\n event.returnValue = \"\";\n }\n this.saveScrollPosition(window.location.pathname + window.location.search);\n };\n\n constructor(options: RouterOptions = {}) {\n this.options = {\n prefetchTimeout: options.prefetchTimeout ?? 100,\n cacheMaxAge: options.cacheMaxAge ?? 30000, // 30 seconds\n scrollRestoration: options.scrollRestoration ?? true,\n shouldUseDocumentNavigation: options.shouldUseDocumentNavigation ?? (() => false),\n deploymentId: options.deploymentId ?? readBrowserDeploymentId(),\n };\n\n if (typeof window !== \"undefined\") {\n // Listen for popstate (back/forward navigation)\n window.addEventListener(\"popstate\", this.onPopState);\n\n // Save scroll position before unload\n window.addEventListener(\"beforeunload\", this.onBeforeUnload);\n\n // Track the rendered location and its position in the history stack so\n // popstate can report a real `from` and revert blocked traversals.\n this.currentHistoryPath = window.location.pathname + window.location.search;\n const existingIndex = readHistoryIndex(window.history.state);\n if (existingIndex == null) {\n try {\n window.history.replaceState(\n {\n ...((window.history.state as object | null) ?? {}),\n [FARM_HISTORY_INDEX_KEY]: 0,\n },\n \"\",\n window.location.href,\n );\n this.currentHistoryIndex = 0;\n } catch {\n this.currentHistoryIndex = null;\n }\n } else {\n this.currentHistoryIndex = existingIndex;\n }\n }\n }\n\n /** Remove global listeners. Intended for tests and teardown. */\n destroy(): void {\n if (typeof window === \"undefined\") return;\n this.cancelActiveNavigation();\n for (const observer of this.observers.values()) observer.disconnect();\n for (const timer of this.prefetchTimers.values()) clearTimeout(timer);\n this.observers.clear();\n this.prefetchTimers.clear();\n window.removeEventListener(\"popstate\", this.onPopState);\n window.removeEventListener(\"beforeunload\", this.onBeforeUnload);\n }\n\n /**\n * Set the navigation handler that updates React\n */\n setNavigationHandler(handler: (data: PageData) => Promise<void>) {\n this.onNavigate = handler;\n }\n\n /**\n * Connect Farm's browser plugin lifecycle to SPA navigation.\n */\n setClientPluginManager(manager: FarmClientPluginManager) {\n this.clientPlugins = manager;\n }\n\n /**\n * Navigate to a new URL\n */\n async navigate(href: string, options: FarmNavigateOptions = {}): Promise<void> {\n const {\n replace = false,\n scroll = true,\n state,\n viewTransition = false,\n refresh = false,\n } = options;\n\n // Parse the URL\n const url = new URL(href, window.location.origin);\n const pathname = url.pathname;\n const search = url.search;\n const fullPath = pathname + search;\n\n if (\n isFarmExternalNavigationURL(url, window.location.origin) ||\n isFarmLocaleChangeHref(url.toString()) ||\n this.options.shouldUseDocumentNavigation(pathname)\n ) {\n this.cancelActiveNavigation();\n if (replace) window.location.replace(url.toString());\n else window.location.assign(url.toString());\n return;\n }\n\n // Same page navigation - update fragment history without fetching route data.\n if (!refresh && pathname === window.location.pathname && search === window.location.search) {\n this.cancelActiveNavigation();\n if (url.hash === window.location.hash) return;\n\n this.writePageState(\n replace ? \"replace\" : \"push\",\n state === undefined ? readPageState() : state,\n url.toString(),\n );\n if (scroll) {\n if (url.hash) {\n getHashTargetElement(url.hash)?.scrollIntoView();\n } else {\n window.scrollTo(0, 0);\n }\n }\n return;\n }\n\n const from = window.location.pathname + window.location.search;\n if (\n await this.shouldBlockNavigation({\n from,\n to: fullPath,\n action: replace ? \"replace\" : \"push\",\n })\n ) {\n return;\n }\n\n // Save current scroll position\n if (this.options.scrollRestoration) {\n this.saveScrollPosition(window.location.pathname + window.location.search);\n }\n\n const navigation = this.startNavigation({\n from,\n to: createNavigationLocation(url),\n action: replace ? \"replace\" : \"push\",\n });\n\n let clientNavigation: FarmClientNavigationSession | undefined;\n try {\n clientNavigation = await this.clientPlugins?.beginNavigation({\n from,\n to: url,\n action: replace ? \"replace\" : \"push\",\n });\n if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n\n // Fetch page data (from cache or server)\n const pageData = await this.fetchPageData(\n fullPath,\n true,\n from,\n refresh,\n navigation.controller.signal,\n );\n if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n if (clientNavigation) {\n await this.clientPlugins?.markNavigationLoaded(clientNavigation, pageData);\n }\n if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n\n await this.runViewTransition(viewTransition, () =>\n this.isCurrentNavigation(navigation, clientNavigation)\n ? this.commitNavigation({\n fullPath,\n pageData,\n pathname,\n replace,\n scroll,\n state,\n url,\n })\n : Promise.resolve(),\n );\n if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n\n if (clientNavigation) {\n await this.clientPlugins?.resolveNavigation(clientNavigation);\n void this.clientPlugins?.scheduleNavigationRendered(clientNavigation);\n }\n this.finishNavigation(navigation);\n } catch (error) {\n if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n if (clientNavigation) {\n await this.clientPlugins?.failNavigation(clientNavigation, error);\n }\n this.finishNavigation(navigation);\n console.error(\"[Farm.js] Navigation error:\", error);\n // Fall back to full page navigation\n window.location.href = href;\n }\n }\n\n /**\n * Re-render the active route from the server while preserving the document,\n * shared layouts, client runtime, and browser history entry.\n */\n refresh(options: Omit<FarmNavigateOptions, \"replace\" | \"refresh\"> = {}): Promise<void> {\n return this.navigate(window.location.href, {\n ...options,\n replace: true,\n refresh: true,\n scroll: options.scroll ?? false,\n });\n }\n\n /**\n * Prefetch a URL\n */\n async prefetch(href: string): Promise<void> {\n if (isFarmLocaleChangeHref(href)) return;\n const url = new URL(href, window.location.origin);\n if (isFarmExternalNavigationURL(url, window.location.origin)) return;\n if (this.options.shouldUseDocumentNavigation(url.pathname)) return;\n const fullPath = url.pathname + url.search;\n const interceptFrom = window.location.pathname + window.location.search;\n\n // Skip if already prefetching or cached\n if (this.prefetchingUrls.has(fullPath)) return;\n if (this.isCached(fullPath, interceptFrom)) return;\n\n this.prefetchingUrls.add(fullPath);\n\n try {\n await this.fetchPageData(fullPath, false, interceptFrom);\n } catch (error) {\n console.warn(\"[Farm.js] Prefetch failed:\", href, error);\n } finally {\n this.prefetchingUrls.delete(fullPath);\n }\n }\n\n /**\n * Observe an element for viewport intersection (prefetch when visible)\n */\n observeForPrefetch(element: HTMLAnchorElement): void {\n if (typeof IntersectionObserver === \"undefined\") return;\n\n const href = element.getAttribute(\"href\");\n if (!href || this.isExternalUrl(href)) return;\n this.unobserveForPrefetch(element);\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n if (this.observers.get(element) !== observer) continue;\n // Delay prefetch slightly to avoid prefetching during scroll\n const timer = setTimeout(() => {\n if (this.prefetchTimers.get(element) !== timer) return;\n this.prefetchTimers.delete(element);\n void this.prefetch(href);\n }, this.options.prefetchTimeout);\n this.prefetchTimers.set(element, timer);\n\n // Stop observing after first intersection\n observer.unobserve(element);\n this.observers.delete(element);\n }\n }\n },\n { rootMargin: \"200px\" }, // Start prefetching when 200px from viewport\n );\n\n observer.observe(element);\n this.observers.set(element, observer);\n }\n\n /**\n * Stop observing an element\n */\n unobserveForPrefetch(element: HTMLAnchorElement): void {\n const observer = this.observers.get(element);\n if (observer) {\n observer.unobserve(element);\n this.observers.delete(element);\n }\n const timer = this.prefetchTimers.get(element);\n if (timer !== undefined) {\n clearTimeout(timer);\n this.prefetchTimers.delete(element);\n }\n }\n\n addBlocker(blocker: FarmNavigationBlocker, shouldBlockUnload?: () => boolean): () => void {\n this.blockers.add(blocker);\n this.unloadBlockers.set(\n blocker,\n shouldBlockUnload ?? (() => this.evaluateBlockerForUnload(blocker)),\n );\n return () => {\n this.blockers.delete(blocker);\n this.unloadBlockers.delete(blocker);\n };\n }\n\n getNavigationState(): FarmNavigationState {\n return this.navigationState;\n }\n\n subscribeNavigation(listener: FarmNavigationListener): () => void {\n this.navigationListeners.add(listener);\n listener(this.navigationState);\n return () => {\n this.navigationListeners.delete(listener);\n };\n }\n\n registerScrollElement(key: string, element: HTMLElement): () => void {\n this.scrollElements.set(key, element);\n this.restoreScrollElement(window.location.pathname + window.location.search, key, element);\n return () => {\n if (this.scrollElements.get(key) === element) {\n this.scrollElements.delete(key);\n }\n };\n }\n\n pushState(state: unknown, href?: string): void {\n this.writePageState(\"push\", state, href);\n }\n\n replaceState(state: unknown, href?: string): void {\n this.writePageState(\"replace\", state, href);\n }\n\n /** @internal Keep shallow URL-search writes inside the router's history bookkeeping. */\n writeURLSearch(action: \"push\" | \"replace\", href: string): void {\n this.writePageState(action, readPageState(), href, false);\n }\n\n private async commitNavigation(options: {\n fullPath: string;\n pageData: PageData;\n pathname: string;\n replace: boolean;\n scroll: boolean;\n state: unknown;\n url: URL;\n }): Promise<void> {\n const historyUrl = new URL(\n options.pageData.canonicalPath || options.fullPath,\n window.location.origin,\n );\n historyUrl.hash = options.url.hash;\n const historyPath = historyUrl.pathname + historyUrl.search + historyUrl.hash;\n const historyState = createHistoryState(\n historyPath,\n options.state,\n options.replace ? window.history.state : undefined,\n options.pageData.interception?.from ?? null,\n ) as Record<string, unknown>;\n const nextHistoryIndex =\n this.currentHistoryIndex == null\n ? null\n : options.replace\n ? this.currentHistoryIndex\n : this.currentHistoryIndex + 1;\n if (nextHistoryIndex != null) {\n historyState[FARM_HISTORY_INDEX_KEY] = nextHistoryIndex;\n }\n if (options.replace) {\n window.history.replaceState(historyState, \"\", historyPath);\n } else {\n window.history.pushState(historyState, \"\", historyPath);\n }\n this.currentHistoryIndex = nextHistoryIndex;\n this.currentHistoryPath =\n new URL(historyPath, window.location.origin).pathname +\n new URL(historyPath, window.location.origin).search;\n notifyRouterHistoryChange();\n\n this.updateDocumentMetadata(options.pageData.metadata);\n\n _hydrateFarmI18n(options.pageData.i18n);\n\n if (this.onNavigate) {\n await this.onNavigate(options.pageData);\n }\n\n if (options.scroll) {\n if (options.url.hash) {\n const element = getHashTargetElement(options.url.hash);\n if (element) {\n element.scrollIntoView();\n }\n } else {\n window.scrollTo(0, 0);\n }\n } else if (this.options.scrollRestoration) {\n this.restoreScrollPosition(this.currentHistoryPath ?? options.fullPath);\n }\n }\n\n private async runViewTransition(\n mode: FarmViewTransitionMode,\n callback: () => Promise<void>,\n ): Promise<void> {\n if (!mode || typeof document === \"undefined\") {\n await callback();\n return;\n }\n\n const startViewTransition = (document as any).startViewTransition;\n if (typeof startViewTransition !== \"function\") {\n await callback();\n return;\n }\n\n const transition = startViewTransition.call(document, () => callback());\n const updateDone = transition?.updateCallbackDone || transition?.ready;\n if (updateDone && typeof updateDone.then === \"function\") {\n await updateDone;\n }\n transition?.finished?.catch?.(() => undefined);\n }\n\n /**\n * Fetch page data from cache or server\n */\n private async fetchPageData(\n path: string,\n recover = true,\n interceptFrom?: string,\n fresh = false,\n signal?: AbortSignal,\n ): Promise<PageData> {\n const cacheKey = getPageDataCacheKey(path, interceptFrom);\n // Check cache first\n const cached = fresh ? undefined : this.cache.get(cacheKey);\n if (cached && Date.now() - cached.timestamp < this.options.cacheMaxAge) {\n return cached.data;\n }\n\n // Fetch from server. The active layout chain lets the server omit shared\n // shell HTML from the fragment without inspecting component source.\n const activeLayoutChain = getActiveLayoutChainHeader();\n const response = await fetch(`/__farm/page-data?path=${encodeURIComponent(path)}`, {\n signal,\n headers: createFarmDeploymentRequestHeaders(this.options.deploymentId, {\n Accept: \"application/x-farm-deferred+json, application/json\",\n \"X-Farm-SPA\": \"1\",\n ...(activeLayoutChain ? { \"X-Farm-Layout-Chain\": activeLayoutChain } : {}),\n ...(interceptFrom ? { \"X-Farm-Intercept-From\": interceptFrom } : {}),\n }),\n });\n\n if (isFarmDeploymentMismatchResponse(response, this.options.deploymentId)) {\n const error = createFarmDeploymentMismatchError(\n response,\n this.options.deploymentId || \"unknown\",\n );\n dispatchDeploymentMismatch(error);\n if (recover) {\n window.location.assign(path);\n }\n throw error;\n }\n\n if (!response.ok) {\n throw new Error(`Failed to fetch page data: ${response.status}`);\n }\n\n const data = await readDeferredDataResponse<PageData>(response);\n\n // Cache the result\n this.cache.set(cacheKey, {\n data,\n timestamp: Date.now(),\n });\n\n return data;\n }\n\n /**\n * Put the browser URL back on the rendered page after a blocked pop. When\n * both entries carry a Farm history index the traversal is reversed\n * exactly; otherwise the current path is pushed again, which restores the\n * address bar at the cost of one extra history entry.\n */\n private revertBlockedPopState(event: PopStateEvent, from: string): void {\n const eventIndex = readHistoryIndex(event.state);\n if (eventIndex != null && this.currentHistoryIndex != null) {\n const delta = eventIndex - this.currentHistoryIndex;\n if (delta !== 0) {\n this.suppressNextPopState = true;\n window.history.go(-delta);\n return;\n }\n }\n\n try {\n const restoredState: Record<string, unknown> = {\n path: from,\n };\n if (this.currentHistoryIndex != null && eventIndex != null) {\n restoredState[FARM_HISTORY_INDEX_KEY] = eventIndex + 1;\n this.currentHistoryIndex = eventIndex + 1;\n }\n window.history.pushState(restoredState, \"\", from);\n } catch {\n // Leave the URL as-is if the history API rejects the write; the\n // rendered page is still the blocked-from page.\n }\n }\n\n /**\n * Handle browser back/forward navigation\n */\n private async handlePopState(event: PopStateEvent): Promise<void> {\n if (document.documentElement.dataset.farmDocsRuntime === \"true\") return;\n\n if (this.suppressNextPopState) {\n // This traversal is our own revert of a blocked pop; the rendered page\n // never changed.\n this.suppressNextPopState = false;\n return;\n }\n\n const path = window.location.pathname + window.location.search;\n // The browser has already moved to the destination entry, so its state\n // describes `to`; the page still rendered is the tracked current path.\n const from = this.currentHistoryPath ?? path;\n\n if (\n await this.shouldBlockNavigation({\n from,\n to: path,\n action: \"pop\",\n })\n ) {\n this.revertBlockedPopState(event, from);\n return;\n }\n\n this.currentHistoryPath = path;\n this.currentHistoryIndex = readHistoryIndex(event.state);\n\n const navigation = this.startNavigation({\n from,\n to: createNavigationLocation(new URL(window.location.href)),\n action: \"pop\",\n });\n\n let clientNavigation: FarmClientNavigationSession | undefined;\n try {\n clientNavigation = await this.clientPlugins?.beginNavigation({\n from: null,\n to: window.location.href,\n action: \"pop\",\n });\n if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n const interceptFrom =\n typeof event.state?.[FARM_INTERCEPT_FROM_KEY] === \"string\"\n ? event.state[FARM_INTERCEPT_FROM_KEY]\n : undefined;\n const pageData = await this.fetchPageData(\n path,\n true,\n interceptFrom,\n false,\n navigation.controller.signal,\n );\n if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n if (clientNavigation) {\n await this.clientPlugins?.markNavigationLoaded(clientNavigation, pageData);\n }\n if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n\n this.updateDocumentMetadata(pageData.metadata);\n\n _hydrateFarmI18n(pageData.i18n);\n\n // Call the navigation handler to update React\n if (this.onNavigate) {\n await this.onNavigate(pageData);\n }\n\n // Restore scroll position\n if (this.options.scrollRestoration) {\n this.restoreScrollPosition(window.location.pathname + window.location.search);\n }\n\n if (clientNavigation) {\n await this.clientPlugins?.resolveNavigation(clientNavigation);\n void this.clientPlugins?.scheduleNavigationRendered(clientNavigation);\n }\n this.finishNavigation(navigation);\n } catch (error) {\n if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n if (clientNavigation) {\n await this.clientPlugins?.failNavigation(clientNavigation, error);\n }\n this.finishNavigation(navigation);\n console.error(\"[Farm.js] Popstate navigation error:\", error);\n // Reload the page as fallback\n window.location.reload();\n }\n }\n\n /**\n * Check if URL is cached\n */\n private isCached(path: string, interceptFrom?: string): boolean {\n const cached = this.cache.get(getPageDataCacheKey(path, interceptFrom));\n return cached !== undefined && Date.now() - cached.timestamp < this.options.cacheMaxAge;\n }\n\n /**\n * Check if URL is external\n */\n private isExternalUrl(href: string): boolean {\n return href.startsWith(\"http://\") || href.startsWith(\"https://\") || href.startsWith(\"//\");\n }\n\n private async shouldBlockNavigation(context: FarmNavigationBlockerContext): Promise<boolean> {\n for (const blocker of this.blockers) {\n if (await blocker(context)) {\n return true;\n }\n }\n return false;\n }\n\n private evaluateBlockerForUnload(blocker: FarmNavigationBlocker): boolean {\n const path = window.location.pathname + window.location.search;\n const result = blocker({ from: path, to: path, action: \"replace\" });\n if (result && typeof result !== \"boolean\") {\n void result.catch(() => undefined);\n return true;\n }\n return result === true;\n }\n\n private shouldBlockUnload(): boolean {\n for (const blocker of this.blockers) {\n try {\n if (this.unloadBlockers.get(blocker)?.()) return true;\n } catch {\n return true;\n }\n }\n return false;\n }\n\n private updateDocumentMetadata(metadata: PageData[\"metadata\"]): void {\n document.title = metadata?.title || \"Farm.js App\";\n\n let description = document.querySelector('meta[name=\"description\"]');\n if (!metadata?.description) {\n description?.remove();\n return;\n }\n\n if (!description) {\n description = document.createElement(\"meta\");\n description.setAttribute(\"name\", \"description\");\n document.head.appendChild(description);\n }\n description.setAttribute(\"content\", metadata.description);\n }\n\n private startNavigation(options: {\n from: string;\n to: FarmNavigationLocation;\n action: FarmNavigationBlockerContext[\"action\"];\n }): { id: number; controller: AbortController } {\n this.activeNavigation?.controller.abort(\"superseded\");\n const navigation = {\n id: ++this.navigationSequence,\n controller: new AbortController(),\n };\n this.activeNavigation = navigation;\n this.setNavigationState({\n state: \"loading\",\n pending: true,\n from: options.from,\n to: options.to,\n action: options.action,\n startedAt: Date.now(),\n });\n return navigation;\n }\n\n private isCurrentNavigation(\n navigation: { id: number; controller: AbortController },\n clientNavigation?: FarmClientNavigationSession,\n ): boolean {\n return (\n this.activeNavigation?.id === navigation.id &&\n !navigation.controller.signal.aborted &&\n !clientNavigation?.signal.aborted\n );\n }\n\n private finishNavigation(navigation: { id: number; controller: AbortController }): void {\n if (this.activeNavigation?.id !== navigation.id) return;\n this.activeNavigation = undefined;\n this.setNavigationState(IDLE_NAVIGATION_STATE);\n }\n\n private cancelActiveNavigation(): void {\n if (!this.activeNavigation) return;\n this.activeNavigation.controller.abort(\"superseded\");\n this.activeNavigation = undefined;\n this.setNavigationState(IDLE_NAVIGATION_STATE);\n }\n\n private setNavigationState(state: FarmNavigationState): void {\n this.navigationState = state;\n for (const listener of this.navigationListeners) {\n listener(state);\n }\n }\n\n private writePageState(\n action: \"push\" | \"replace\",\n state: unknown,\n href?: string,\n notify = true,\n ): void {\n if (typeof window === \"undefined\") return;\n\n const url = href ? new URL(href, window.location.origin).toString() : window.location.href;\n const parsedUrl = new URL(url);\n const nextPath = parsedUrl.pathname + parsedUrl.search;\n const historyPath = nextPath + parsedUrl.hash;\n const nextState = createHistoryState(historyPath, state, window.history.state) as Record<\n string,\n unknown\n >;\n\n if (action === \"replace\") {\n window.history.replaceState(nextState, \"\", url);\n } else {\n if (this.currentHistoryIndex != null) {\n nextState[FARM_HISTORY_INDEX_KEY] = this.currentHistoryIndex + 1;\n }\n window.history.pushState(nextState, \"\", url);\n this.currentHistoryIndex =\n this.currentHistoryIndex == null ? null : this.currentHistoryIndex + 1;\n }\n this.currentHistoryPath = nextPath;\n\n if (notify) notifyHistoryChange(\"page-state\");\n }\n\n /**\n * Save scroll position for a path\n */\n private saveScrollPosition(path: string): void {\n try {\n sessionStorage.setItem(\n `farm-scroll-${path}`,\n JSON.stringify({ x: window.scrollX, y: window.scrollY }),\n );\n for (const [key, element] of this.scrollElements) {\n sessionStorage.setItem(\n getScrollElementStorageKey(path, key),\n JSON.stringify({ x: element.scrollLeft, y: element.scrollTop }),\n );\n }\n } catch {\n // Ignore storage errors\n }\n }\n\n /**\n * Restore scroll position for a path\n */\n private restoreScrollPosition(path: string): void {\n try {\n const saved = sessionStorage.getItem(`farm-scroll-${path}`);\n if (saved) {\n const { x, y } = JSON.parse(saved);\n setTimeout(() => window.scrollTo(x, y), 0);\n }\n for (const [key, element] of this.scrollElements) {\n this.restoreScrollElement(path, key, element);\n }\n } catch {\n // Ignore storage errors\n }\n }\n\n private restoreScrollElement(path: string, key: string, element: HTMLElement): void {\n try {\n const saved = sessionStorage.getItem(getScrollElementStorageKey(path, key));\n if (!saved) return;\n const { x, y } = JSON.parse(saved);\n setTimeout(() => {\n element.scrollLeft = x;\n element.scrollTop = y;\n }, 0);\n } catch {\n // Ignore storage errors\n }\n }\n\n /**\n * Clear the page cache\n */\n clearCache(): void {\n this.cache.clear();\n }\n}\n\nfunction readBrowserDeploymentId(): string | undefined {\n if (typeof window === \"undefined\") return undefined;\n\n const runtimeId = (window as Window & { __FARM_DEPLOYMENT_ID__?: unknown })\n .__FARM_DEPLOYMENT_ID__;\n if (typeof runtimeId === \"string\" && runtimeId) return runtimeId;\n\n return document.querySelector<HTMLMetaElement>('meta[name=\"farm-deployment-id\"]')?.content;\n}\n\nfunction dispatchDeploymentMismatch(error: Error): void {\n if (typeof window === \"undefined\" || typeof CustomEvent === \"undefined\") return;\n window.dispatchEvent(new CustomEvent(\"farm:deployment-mismatch\", { detail: error }));\n}\n\n/**\n * Get or create the global router instance\n */\nexport function getInstalledFarmSPARouter(): SPARouter | undefined {\n if (typeof window === \"undefined\") return undefined;\n return (window as Window & { __FARM_SPA_ROUTER__?: SPARouter }).__FARM_SPA_ROUTER__;\n}\n\nexport function getRouter(): SPARouter {\n if (typeof window === \"undefined\") {\n // Return a no-op router for SSR\n return new SPARouter();\n }\n\n const installedRouter = getInstalledFarmSPARouter();\n if (installedRouter) {\n routerInstance = installedRouter;\n return installedRouter;\n }\n\n if (!routerInstance) {\n routerInstance = new SPARouter();\n }\n\n return routerInstance;\n}\n\n/**\n * Navigate to a URL using the SPA router\n */\nexport function navigateTo(href: string, options?: FarmNavigateOptions): Promise<void> {\n return getRouter().navigate(href, options);\n}\n\n/**\n * Prefetch a URL\n */\nexport function prefetch(href: string): Promise<void> {\n return getRouter().prefetch(href);\n}\n\nexport function pushState(state: unknown, href?: string): void {\n getRouter().pushState(state, href);\n}\n\nexport function replaceState(state: unknown, href?: string): void {\n getRouter().replaceState(state, href);\n}\n\nexport function readPageState<TState = unknown>(): TState | null {\n if (typeof window === \"undefined\") return null;\n const state = window.history.state;\n if (!state || typeof state !== \"object\") return null;\n return ((state as Record<string, unknown>)[FARM_PAGE_STATE_KEY] as TState | undefined) ?? null;\n}\n\nfunction createHistoryState(\n path: string,\n pageState: unknown,\n currentState?: unknown,\n interceptFrom?: string | null,\n) {\n const base =\n currentState && typeof currentState === \"object\" ? { ...(currentState as object) } : {};\n const nextState: Record<string, unknown> = {\n ...base,\n path,\n [FARM_PAGE_STATE_KEY]: pageState,\n };\n if (interceptFrom === null) {\n delete nextState[FARM_INTERCEPT_FROM_KEY];\n } else if (interceptFrom) {\n nextState[FARM_INTERCEPT_FROM_KEY] = interceptFrom;\n }\n return nextState;\n}\n\nfunction getPageDataCacheKey(path: string, interceptFrom?: string): string {\n return interceptFrom ? `${path}\\nintercept:${interceptFrom}` : path;\n}\n\nfunction createNavigationLocation(url: URL): FarmNavigationLocation {\n return {\n href: url.href,\n pathname: url.pathname,\n search: url.search,\n hash: url.hash,\n };\n}\n\nfunction getScrollElementStorageKey(path: string, key: string): string {\n return `farm-scroll-${path}:${key}`;\n}\n","import { getInstalledFarmSPARouter, type SPARouter } from \"./spa-router\";\n\n/** Fired after programmatic history writes that must not start a navigation. */\nexport const FARM_HISTORY_CHANGE_EVENT = \"farm:historychange\";\n\nexport type FarmHistoryChangeKind = \"url-search\" | \"page-state\";\n\nexport interface FarmHistoryChangeDetail {\n kind: FarmHistoryChangeKind;\n}\n\n/** Write shallow URL history through the installed SPA router when available. */\nexport function writeFarmURLSearchHistory(action: \"push\" | \"replace\", href: string): boolean {\n const router = getInstalledFarmSPARouter();\n if (!router) return false;\n const writeURLSearch = (router as { writeURLSearch?: SPARouter[\"writeURLSearch\"] })\n .writeURLSearch;\n if (typeof writeURLSearch !== \"function\") return false;\n if (window.history.state !== null && typeof window.history.state !== \"object\") return false;\n writeURLSearch.call(router, action, href);\n return true;\n}\n\nfunction dispatchHistoryChange(kind: FarmHistoryChangeKind): void {\n window.dispatchEvent(\n new CustomEvent<FarmHistoryChangeDetail>(FARM_HISTORY_CHANGE_EVENT, {\n detail: { kind },\n }),\n );\n}\n\n/**\n * Notify history observers after pushState/replaceState.\n *\n * Farm's SPA router treats `popstate` as real back/forward navigation, so a\n * dedicated event is used instead. `url-search` keeps the nuqs-style synthetic\n * `popstate` when no Farm router is installed, so standalone `useQueryState`\n * consumers still resync; `page-state` is Farm-internal and never falls back.\n */\nexport function notifyHistoryChange(kind: FarmHistoryChangeKind): void {\n if (typeof window === \"undefined\") return;\n\n setTimeout(() => {\n if (kind === \"url-search\" && !getInstalledFarmSPARouter()) {\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n return;\n }\n\n dispatchHistoryChange(kind);\n }, 0);\n}\n\n/** Notify observers after a Farm router commit without simulating traversal. */\nexport function notifyRouterHistoryChange(): void {\n if (typeof window === \"undefined\") return;\n setTimeout(() => dispatchHistoryChange(\"url-search\"), 0);\n}\n\nexport function subscribeHistoryChange(listener: () => void): () => void {\n if (typeof window === \"undefined\") return () => {};\n\n window.addEventListener(\"popstate\", listener);\n window.addEventListener(FARM_HISTORY_CHANGE_EVENT, listener);\n\n return () => {\n window.removeEventListener(\"popstate\", listener);\n window.removeEventListener(FARM_HISTORY_CHANGE_EVENT, listener);\n };\n}\n"],"mappings":"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","names":[]}