@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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cache.ts"],"sourcesContent":["import { emitFarmEvent } from \"./observability\";\nimport { notifyFarmCacheInvalidation, notifyFarmCacheTask } from \"./cache-invalidation\";\nimport { getActiveFarmI18nSnapshot } from \"./i18n/bridge\";\n\nexport { applyFarmCacheInvalidations } from \"./cache-invalidation\";\n\nexport type RevalidateTagProfile =\n | \"max\"\n | \"default\"\n | \"seconds\"\n | \"minutes\"\n | \"hours\"\n | \"days\"\n | \"weeks\"\n | \"months\"\n | { expire?: number };\n\nexport interface FarmCacheOptions {\n /**\n * Tag cached data so it can be invalidated with revalidateTag/updateTag.\n */\n tags?: readonly string[];\n /**\n * Path tags let revalidatePath invalidate data tied to a route.\n */\n paths?: readonly string[];\n /**\n * Time in seconds before the entry becomes stale. False means no TTL.\n */\n revalidate?: number | false;\n}\n\nexport interface FarmCacheSetOptions extends FarmCacheOptions {\n createdAt?: number;\n}\n\nexport type RouteDataCacheKey = string | readonly unknown[];\n\nexport type FarmCacheInvalidationTarget =\n | { key: RouteDataCacheKey }\n | { path: string }\n | { tag: string };\n\ndeclare const FARM_DEFINED_CACHE_KEY_DATA: unique symbol;\n\n/**\n * A regular Farm cache key carrying the data shape stored under that key.\n *\n * The brand exists only in TypeScript. At runtime the value remains the\n * original string or structured array, so all existing cache APIs continue to\n * accept untyped keys.\n */\nexport type DefinedCacheKey<TData, TKey extends RouteDataCacheKey = RouteDataCacheKey> = TKey & {\n readonly [FARM_DEFINED_CACHE_KEY_DATA]: TData;\n};\n\nexport type CacheKeyFactory<\n TData,\n TArguments extends readonly unknown[],\n TKey extends RouteDataCacheKey = RouteDataCacheKey,\n> = (...args: TArguments) => DefinedCacheKey<TData, TKey>;\n\nexport type InferCacheKeyData<TKey> =\n TKey extends DefinedCacheKey<infer TData, RouteDataCacheKey> ? TData : unknown;\n\n/**\n * Optionally add a data type to an existing string/array cache-key factory.\n *\n * This helper does not introduce a new runtime key representation. Calling the\n * returned factory produces the exact key returned by `factory`.\n */\nexport function defineCacheKey<TData>() {\n return <const TArguments extends readonly unknown[], const TKey extends RouteDataCacheKey>(\n factory: (...args: TArguments) => TKey,\n ): CacheKeyFactory<TData, TArguments, TKey> => {\n if (typeof factory !== \"function\") {\n throw new TypeError(\"defineCacheKey expects a key factory function.\");\n }\n\n return ((...args: TArguments) => {\n const key = factory(...args);\n if (typeof key !== \"string\" && !Array.isArray(key)) {\n throw new TypeError(\n \"A defined cache key factory must return a string or structured array.\",\n );\n }\n return key as DefinedCacheKey<TData, TKey>;\n }) as CacheKeyFactory<TData, TArguments, TKey>;\n };\n}\n\nexport interface FarmCacheEntry<T = unknown> {\n key: string;\n value: T;\n tags: readonly string[];\n /**\n * Adapter tag versions captured before the cached value was produced.\n * A later version makes the entry stale across every server instance.\n */\n tagVersions?: Readonly<Record<string, number>>;\n createdAt: number;\n createdVersion?: number;\n revalidate?: number | false;\n}\n\ninterface InternalFarmCacheEntry<T = unknown> {\n key: string;\n value: T;\n tags: Set<string>;\n tagVersions?: Readonly<Record<string, number>>;\n createdAt: number;\n createdVersion: number;\n revalidate?: number | false;\n}\n\n/**\n * Asynchronous persistence contract used by distributed Farm caches.\n *\n * Implementations are responsible for serializing cache entries and making\n * tag version updates atomic when the backing service supports it.\n */\nexport interface FarmCacheAdapter {\n readonly name?: string;\n get<T = unknown>(key: string): Promise<FarmCacheEntry<T> | null | undefined>;\n set<T = unknown>(key: string, entry: FarmCacheEntry<T>): Promise<void>;\n delete(key: string): Promise<void>;\n clear?(): Promise<void>;\n getTagVersions?(tags: readonly string[]): Promise<Readonly<Record<string, number>>>;\n invalidateTags?(tags: readonly string[]): Promise<void>;\n /** Atomically acquire a short-lived regeneration lease. */\n acquireLease?(key: string, ttlMs: number): Promise<string | null | undefined>;\n /** Release the lease only when the supplied ownership token still matches. */\n releaseLease?(key: string, token: string): Promise<void>;\n}\n\nexport interface FarmClientCacheUserConfig {\n /**\n * Module path, relative to the project root, whose default export is a\n * client cache adapter (`defineClientCacheAdapter`). The module is bundled\n * into the browser entry; the server never imports it.\n */\n adapter?: string;\n /** Extra version salt, typically a build or deploy id; entries persisted under another salt are dropped. */\n version?: string;\n /** Debounce for persisted write-behind flushes, in milliseconds. */\n flushDelayMs?: number;\n}\n\nexport interface FarmCacheUserConfig {\n /** Shared cache implementation, for example a Redis-backed adapter. */\n adapter?: FarmCacheAdapter;\n /** Prefix isolating applications and deployments sharing one adapter. */\n namespace?: string;\n /** Browser cache persistence; see the client cache adapter documentation. */\n client?: FarmClientCacheUserConfig;\n /**\n * Coordinate cache fills across processes when the adapter implements\n * acquireLease/releaseLease. Set false to disable.\n */\n lease?:\n | false\n | {\n ttlMs?: number;\n waitTimeoutMs?: number;\n pollIntervalMs?: number;\n };\n}\n\nexport interface FarmCacheStorage {\n getItem<T = unknown>(key: string): Promise<T | null>;\n setItem<T = unknown>(key: string, value: T): Promise<unknown>;\n removeItem(key: string): Promise<unknown>;\n clear?(base?: string): Promise<unknown>;\n}\n\nexport interface StorageFarmCacheAdapterOptions {\n /** Prefix used inside the supplied storage client. */\n base?: string;\n}\n\n/**\n * Adapt a Farm/unstorage-compatible key-value client to the cache contract.\n *\n * This is a portable baseline adapter. Provider-specific adapters should use\n * their atomic increment/transaction primitives for tag invalidation.\n */\nexport function storageCacheAdapter(\n storage: FarmCacheStorage,\n options: StorageFarmCacheAdapterOptions = {},\n): FarmCacheAdapter {\n if (!storage || typeof storage.getItem !== \"function\" || typeof storage.setItem !== \"function\") {\n throw new TypeError(\"storageCacheAdapter expects a compatible storage client.\");\n }\n\n const base = normalizeCacheNamespace(options.base || \"farm-cache\");\n const entryKey = (key: string) => `${base}:entry:${key}`;\n const tagKey = (tag: string) => `${base}:tag:${tag}`;\n\n return {\n name: \"storage\",\n get: <T>(key: string) => storage.getItem<FarmCacheEntry<T>>(entryKey(key)),\n set: async <T>(key: string, entry: FarmCacheEntry<T>) => {\n await storage.setItem(entryKey(key), entry);\n },\n delete: async (key: string) => {\n await storage.removeItem(entryKey(key));\n },\n clear: storage.clear\n ? async () => {\n await storage.clear!(base);\n }\n : undefined,\n getTagVersions: async (tags) => {\n const versions = await Promise.all(\n tags.map(async (tag) => {\n const value = await storage.getItem<number>(tagKey(tag));\n return [tag, normalizeAdapterVersion(value)] as const;\n }),\n );\n return Object.fromEntries(versions);\n },\n invalidateTags: async (tags) => {\n await Promise.all(\n tags.map(async (tag) => {\n const key = tagKey(tag);\n const current = normalizeAdapterVersion(await storage.getItem<number>(key));\n await storage.setItem(key, Math.max(Date.now(), current + 1));\n }),\n );\n },\n };\n}\n\nexport interface GetFarmCacheEntryOptions {\n allowStale?: boolean;\n now?: number;\n}\n\ninterface FarmCacheStaleEntry {\n tags: Iterable<string>;\n createdAt: number;\n createdVersion?: number;\n revalidate?: number | false;\n}\n\nexport class FarmDataCache {\n private entries = new Map<string, InternalFarmCacheEntry>();\n private inflight = new Map<string, Promise<unknown>>();\n private invalidatedTagVersions = new Map<string, number>();\n private version = 0;\n private generation = 0;\n private adapter?: FarmCacheAdapter;\n private namespace = \"farm\";\n private local = true;\n private lease = {\n enabled: true,\n ttlMs: 10_000,\n waitTimeoutMs: 10_000,\n pollIntervalMs: 25,\n };\n\n constructor(config: FarmCacheUserConfig = {}) {\n this.configure(config);\n }\n\n configure(config: FarmCacheUserConfig = {}): void {\n this.generation++;\n this.entries.clear();\n this.inflight.clear();\n this.invalidatedTagVersions.clear();\n this.version = 0;\n this.adapter = config.adapter;\n this.namespace = normalizeCacheNamespace(config.namespace || \"farm\");\n this.local = !config.adapter;\n this.lease =\n config.lease === false\n ? { ...this.lease, enabled: false }\n : {\n enabled: true,\n ttlMs: normalizePositiveDuration(config.lease?.ttlMs, 10_000, \"cache.lease.ttlMs\"),\n waitTimeoutMs: normalizePositiveDuration(\n config.lease?.waitTimeoutMs,\n 10_000,\n \"cache.lease.waitTimeoutMs\",\n ),\n pollIntervalMs: normalizePositiveDuration(\n config.lease?.pollIntervalMs,\n 25,\n \"cache.lease.pollIntervalMs\",\n ),\n };\n }\n\n get adapterName(): string {\n return this.adapter?.name || (this.adapter ? \"custom\" : \"memory\");\n }\n\n get hasAdapter(): boolean {\n return this.adapter !== undefined;\n }\n\n get size(): number {\n return this.entries.size;\n }\n\n get<T>(key: string, options: GetFarmCacheEntryOptions = {}): T | undefined {\n return this.getEntry<T>(key, options)?.value;\n }\n\n getEntry<T = unknown>(\n key: string,\n options: GetFarmCacheEntryOptions = {},\n ): FarmCacheEntry<T> | undefined {\n const entry = this.entries.get(key) as InternalFarmCacheEntry<T> | undefined;\n if (!entry) {\n emitFarmEvent({ type: \"cache.miss\", key });\n return undefined;\n }\n\n const stale = this.isStale(entry, options.now);\n if (stale) {\n emitFarmEvent({\n type: \"cache.stale\",\n key,\n tags: Array.from(entry.tags),\n revalidate: entry.revalidate,\n });\n }\n\n if (!options.allowStale && stale) {\n emitFarmEvent({ type: \"cache.miss\", key, reason: \"stale\" });\n return undefined;\n }\n\n emitFarmEvent({\n type: \"cache.hit\",\n key,\n tags: Array.from(entry.tags),\n revalidate: entry.revalidate,\n stale,\n });\n\n return this.toPublicEntry(entry);\n }\n\n async getEntryAsync<T = unknown>(\n key: string,\n options: GetFarmCacheEntryOptions = {},\n ): Promise<FarmCacheEntry<T> | undefined> {\n if (this.local) {\n const localEntry = this.getEntry<T>(key, options);\n if (localEntry) return localEntry;\n }\n\n if (!this.adapter) {\n return this.local ? undefined : this.getEntry<T>(key, options);\n }\n\n const generation = this.generation;\n const adapter = this.adapter;\n const namespace = this.namespace;\n const entry = await adapter.get<T>(`${namespace}:entry:${key}`);\n if (generation !== this.generation) return undefined;\n if (!entry) {\n emitFarmEvent({ type: \"cache.miss\", key });\n return undefined;\n }\n\n assertFarmCacheEntry(entry, key);\n const stale = await this.isAdapterEntryStale(entry, options.now, adapter, namespace);\n if (generation !== this.generation) return undefined;\n if (stale) {\n emitFarmEvent({\n type: \"cache.stale\",\n key,\n tags: [...entry.tags],\n revalidate: entry.revalidate,\n });\n if (!options.allowStale) {\n emitFarmEvent({ type: \"cache.miss\", key, reason: \"stale\" });\n return undefined;\n }\n }\n\n emitFarmEvent({\n type: \"cache.hit\",\n key,\n tags: [...entry.tags],\n revalidate: entry.revalidate,\n stale,\n });\n\n if (this.local && !stale) {\n this.hydrateLocalEntry(entry);\n }\n return { ...entry, key };\n }\n\n set<T>(key: string, value: T, options: FarmCacheSetOptions = {}): FarmCacheEntry<T> {\n const tags = new Set<string>();\n for (const tag of options.tags ?? []) {\n tags.add(normalizeCacheTag(tag));\n }\n for (const routePath of options.paths ?? []) {\n tags.add(createPathCacheTag(routePath));\n }\n\n const entry: InternalFarmCacheEntry<T> = {\n key,\n value,\n tags,\n tagVersions: undefined,\n createdAt: options.createdAt ?? Date.now(),\n createdVersion: ++this.version,\n revalidate: normalizeRevalidate(options.revalidate),\n };\n\n this.entries.set(key, entry);\n emitFarmEvent({\n type: \"cache.set\",\n key,\n tags: Array.from(tags),\n revalidate: entry.revalidate,\n });\n return this.toPublicEntry(entry);\n }\n\n async setAsync<T>(\n key: string,\n value: T,\n options: FarmCacheSetOptions = {},\n tagVersions?: Readonly<Record<string, number>>,\n ): Promise<FarmCacheEntry<T>> {\n return this.writeAsync(key, value, options, tagVersions);\n }\n\n private async writeAsync<T>(\n key: string,\n value: T,\n options: FarmCacheSetOptions,\n tagVersions?: Readonly<Record<string, number>>,\n createdVersion?: number,\n ): Promise<FarmCacheEntry<T>> {\n const tags = normalizeCacheOptionsTags(options);\n const capturedVersions =\n tagVersions ?? (await this.getAdapterTagVersions(Array.from(tags.values())));\n const entry: FarmCacheEntry<T> = {\n key,\n value,\n tags: Array.from(tags),\n tagVersions: capturedVersions,\n createdAt: options.createdAt ?? Date.now(),\n createdVersion: createdVersion ?? ++this.version,\n revalidate: normalizeRevalidate(options.revalidate),\n };\n\n if (this.local) {\n this.hydrateLocalEntry(entry);\n }\n if (this.adapter) {\n await this.adapter.set(this.createAdapterKey(key), entry);\n }\n\n emitFarmEvent({\n type: \"cache.set\",\n key,\n tags: [...entry.tags],\n revalidate: entry.revalidate,\n });\n return entry;\n }\n\n delete(key: string): boolean {\n const deleted = this.entries.delete(key);\n emitFarmEvent({ type: \"cache.delete\", key, deleted });\n return deleted;\n }\n\n async deleteAsync(key: string): Promise<boolean> {\n const deleted = this.entries.delete(key);\n if (this.adapter) {\n await this.adapter.delete(this.createAdapterKey(key));\n }\n emitFarmEvent({ type: \"cache.delete\", key, deleted: this.adapter ? true : deleted });\n return this.adapter ? true : deleted;\n }\n\n clear(): void {\n const count = this.entries.size;\n this.generation++;\n this.entries.clear();\n this.inflight.clear();\n this.invalidatedTagVersions.clear();\n this.version = 0;\n emitFarmEvent({ type: \"cache.clear\", count });\n }\n\n async clearAsync(): Promise<void> {\n this.clear();\n await this.adapter?.clear?.();\n }\n\n isStale(entry: FarmCacheStaleEntry, now = Date.now()): boolean {\n if (\n typeof entry.revalidate === \"number\" &&\n entry.revalidate >= 0 &&\n now - entry.createdAt >= entry.revalidate * 1000\n ) {\n return true;\n }\n\n for (const tag of entry.tags) {\n const invalidatedVersion = this.invalidatedTagVersions.get(normalizeCacheTag(tag));\n if (\n typeof invalidatedVersion === \"number\" &&\n typeof entry.createdVersion === \"number\" &&\n invalidatedVersion > entry.createdVersion\n ) {\n return true;\n }\n }\n\n return false;\n }\n\n async isStaleAsync(entry: FarmCacheEntry, now = Date.now()): Promise<boolean> {\n if (this.adapter) {\n return this.isAdapterEntryStale(entry, now);\n }\n return this.isStale(entry, now);\n }\n\n revalidateTag(\n tag: string,\n options: { source?: \"revalidateTag\" | \"updateTag\"; profile?: RevalidateTagProfile } = {},\n ): number {\n const normalized = normalizeCacheTag(tag);\n const count = this.invalidateTag(normalized);\n emitFarmEvent(\n options.source === \"updateTag\"\n ? { type: \"cache.updateTag\", tag: normalized, count }\n : { type: \"cache.revalidateTag\", tag: normalized, profile: options.profile, count },\n );\n return count;\n }\n\n async revalidateTagAsync(\n tag: string,\n options: { source?: \"revalidateTag\" | \"updateTag\"; profile?: RevalidateTagProfile } = {},\n ): Promise<number> {\n const normalized = normalizeCacheTag(tag);\n const count = this.invalidateTag(normalized);\n await this.adapter?.invalidateTags?.([this.createAdapterTag(normalized)]);\n emitFarmEvent(\n options.source === \"updateTag\"\n ? { type: \"cache.updateTag\", tag: normalized, count }\n : { type: \"cache.revalidateTag\", tag: normalized, profile: options.profile, count },\n );\n return count;\n }\n\n revalidatePath(routePath: string): number {\n const normalizedPath = normalizeRevalidatePath(routePath);\n const pathTag = createPathCacheTag(normalizedPath);\n const pprCount = this.countEntriesForTags([pathTag, \"ppr\"]);\n const count = this.invalidateTag(pathTag);\n emitFarmEvent({ type: \"cache.revalidatePath\", path: normalizedPath, count });\n\n if (pprCount > 0) {\n emitFarmEvent({\n type: \"ppr.shell.invalidated\",\n route: normalizedPath,\n reason: \"revalidatePath\",\n count: pprCount,\n });\n }\n\n return count;\n }\n\n async revalidatePathAsync(routePath: string): Promise<number> {\n const normalizedPath = normalizeRevalidatePath(routePath);\n const pathTag = createPathCacheTag(normalizedPath);\n const pprCount = this.countEntriesForTags([pathTag, \"ppr\"]);\n const count = this.invalidateTag(pathTag);\n await this.adapter?.invalidateTags?.([this.createAdapterTag(pathTag)]);\n emitFarmEvent({ type: \"cache.revalidatePath\", path: normalizedPath, count });\n\n if (pprCount > 0) {\n emitFarmEvent({\n type: \"ppr.shell.invalidated\",\n route: normalizedPath,\n reason: \"revalidatePath\",\n count: pprCount,\n });\n }\n\n return count;\n }\n\n async getOrSet<T>(\n key: string,\n producer: () => Promise<T> | T,\n options: FarmCacheOptions = {},\n ): Promise<T> {\n const cached = await this.getEntryAsync<T>(key);\n if (cached) {\n return cached.value;\n }\n\n const inflight = this.inflight.get(key) as Promise<T> | undefined;\n if (inflight) {\n emitFarmEvent({ type: \"cache.dedupe\", key });\n return inflight;\n }\n\n const tags = Array.from(normalizeCacheOptionsTags(options));\n const generation = this.generation;\n const promise = this.fillCacheEntry(key, producer, options, tags, generation)\n .catch((error) => {\n emitFarmEvent({ type: \"cache.error\", key, operation: \"set\", error });\n throw error;\n })\n .finally(() => {\n if (this.inflight.get(key) === promise) {\n this.inflight.delete(key);\n }\n });\n\n this.inflight.set(key, promise);\n return promise;\n }\n\n private async fillCacheEntry<T>(\n key: string,\n producer: () => Promise<T> | T,\n options: FarmCacheOptions,\n tags: readonly string[],\n generation: number,\n ): Promise<T> {\n const adapter = this.adapter;\n const namespace = this.namespace;\n const lease = { ...this.lease };\n const leaseKey = `${namespace}:lease:${key}`;\n let leaseToken: string | null | undefined;\n\n if (adapter?.acquireLease && adapter.releaseLease && lease.enabled) {\n leaseToken = await adapter.acquireLease(leaseKey, lease.ttlMs);\n if (!leaseToken) {\n const shared = await this.waitForAdapterEntry<T>(\n key,\n adapter,\n namespace,\n lease,\n generation,\n );\n if (shared) {\n emitFarmEvent({ type: \"cache.dedupe\", key });\n return shared.value;\n }\n if (generation === this.generation) {\n leaseToken = await adapter.acquireLease(leaseKey, lease.ttlMs);\n }\n }\n }\n\n try {\n const initialCreatedVersion = this.version;\n const initialTagVersions = await this.getAdapterTagVersions(tags, adapter, namespace);\n const value = await producer();\n if (generation === this.generation) {\n await this.writeAsync(key, value, options, initialTagVersions, initialCreatedVersion);\n }\n return value;\n } finally {\n if (leaseToken && adapter?.releaseLease) {\n await adapter.releaseLease(leaseKey, leaseToken);\n }\n }\n }\n\n private async waitForAdapterEntry<T>(\n key: string,\n adapter: FarmCacheAdapter,\n namespace: string,\n lease: typeof this.lease,\n generation: number,\n ): Promise<FarmCacheEntry<T> | undefined> {\n const deadline = Date.now() + lease.waitTimeoutMs;\n while (Date.now() < deadline) {\n await delay(lease.pollIntervalMs);\n if (generation !== this.generation) return undefined;\n const entry = await adapter.get<T>(`${namespace}:entry:${key}`);\n if (generation !== this.generation) return undefined;\n if (!entry) {\n emitFarmEvent({ type: \"cache.miss\", key });\n continue;\n }\n assertFarmCacheEntry(entry, key);\n const stale = await this.isAdapterEntryStale(entry, Date.now(), adapter, namespace);\n if (generation !== this.generation) return undefined;\n if (stale) {\n emitFarmEvent({\n type: \"cache.stale\",\n key,\n tags: [...entry.tags],\n revalidate: entry.revalidate,\n });\n emitFarmEvent({ type: \"cache.miss\", key, reason: \"stale\" });\n } else {\n emitFarmEvent({\n type: \"cache.hit\",\n key,\n tags: [...entry.tags],\n revalidate: entry.revalidate,\n stale: false,\n });\n return { ...entry, key };\n }\n }\n return undefined;\n }\n\n private countEntriesForTag(tag: string): number {\n let count = 0;\n for (const entry of this.entries.values()) {\n if (entry.tags.has(tag)) {\n count++;\n }\n }\n return count;\n }\n\n private countEntriesForTags(tags: readonly string[]): number {\n let count = 0;\n for (const entry of this.entries.values()) {\n if (tags.every((tag) => entry.tags.has(tag))) {\n count++;\n }\n }\n return count;\n }\n\n private invalidateTag(normalizedTag: string): number {\n this.invalidatedTagVersions.set(normalizedTag, ++this.version);\n return this.countEntriesForTag(normalizedTag);\n }\n\n private toPublicEntry<T>(entry: InternalFarmCacheEntry<T>): FarmCacheEntry<T> {\n return {\n key: entry.key,\n value: entry.value,\n tags: Array.from(entry.tags),\n tagVersions: entry.tagVersions,\n createdAt: entry.createdAt,\n createdVersion: entry.createdVersion,\n revalidate: entry.revalidate,\n };\n }\n\n private hydrateLocalEntry<T>(entry: FarmCacheEntry<T>): void {\n this.entries.set(entry.key, {\n key: entry.key,\n value: entry.value,\n tags: new Set(entry.tags.map(normalizeCacheTag)),\n tagVersions: entry.tagVersions,\n createdAt: entry.createdAt,\n createdVersion: entry.createdVersion ?? ++this.version,\n revalidate: normalizeRevalidate(entry.revalidate),\n });\n }\n\n private createAdapterKey(key: string): string {\n return `${this.namespace}:entry:${key}`;\n }\n\n private createAdapterTag(tag: string): string {\n return `${this.namespace}:tag:${tag}`;\n }\n\n private async getAdapterTagVersions(\n tags: readonly string[],\n adapter = this.adapter,\n namespace = this.namespace,\n ): Promise<Readonly<Record<string, number>>> {\n if (!adapter?.getTagVersions || tags.length === 0) return {};\n\n const normalized = tags.map(normalizeCacheTag);\n const physicalTags = normalized.map((tag) => `${namespace}:tag:${tag}`);\n const versions = await adapter.getTagVersions(physicalTags);\n return Object.fromEntries(\n normalized.map((tag, index) => [\n tag,\n normalizeAdapterVersion(versions[physicalTags[index]!]),\n ]),\n );\n }\n\n private async isAdapterEntryStale(\n entry: FarmCacheEntry,\n now = Date.now(),\n adapter = this.adapter,\n namespace = this.namespace,\n ): Promise<boolean> {\n if (\n typeof entry.revalidate === \"number\" &&\n entry.revalidate >= 0 &&\n now - entry.createdAt >= entry.revalidate * 1000\n ) {\n return true;\n }\n\n const currentVersions = await this.getAdapterTagVersions(entry.tags, adapter, namespace);\n for (const tag of entry.tags) {\n if (\n normalizeAdapterVersion(currentVersions[tag]) >\n normalizeAdapterVersion(entry.tagVersions?.[tag])\n ) {\n return true;\n }\n }\n return false;\n }\n}\n\nconst FARM_DATA_CACHE_SYMBOL = Symbol.for(\"farm.dataCache\");\nconst farmDataCacheGlobal = globalThis as typeof globalThis & {\n [FARM_DATA_CACHE_SYMBOL]?: FarmDataCache;\n};\nconst sharedFarmDataCache = (farmDataCacheGlobal[FARM_DATA_CACHE_SYMBOL] ??= new FarmDataCache());\n\nexport function getFarmDataCache(): FarmDataCache {\n return sharedFarmDataCache;\n}\n\nexport function configureFarmCache(config: FarmCacheUserConfig | undefined): void {\n sharedFarmDataCache.configure(config);\n}\n\n/**\n * Wrap an async function so its results are cached and shared across requests,\n * processes, and restarts.\n *\n * The cache key is built from the wrapped function's identity (its name and a\n * hash of its source), the active locale, `keyParts`, and the call arguments.\n * Deriving identity from the source — rather than the closure instance — is\n * deliberate: it keeps the key stable across processes and restarts so a\n * distributed cache adapter can share entries between server instances.\n *\n * The consequence is that two closures with **identical source text but\n * different captured variables** produce the same identity. Pass those captured\n * values in `keyParts` so they take part in the key; otherwise the closures\n * share a cache entry and return each other's data:\n *\n * ```ts\n * // Collides: both closures have identical source, and `table` is captured,\n * // not an argument, so it never reaches the key.\n * const makeLoader = (table: string) =>\n * unstable_cache(async (id: number) => db.get(table, id));\n *\n * // Correct: the captured value disambiguates the two closures.\n * const makeLoader = (table: string) =>\n * unstable_cache(async (id: number) => db.get(table, id), [table]);\n * ```\n *\n * Values passed as call arguments already participate in the key and do not\n * need to be repeated in `keyParts`.\n *\n * @param fn The async function to memoize.\n * @param keyParts Extra values that identify this call site. Include every\n * variable the function closes over that is not one of its arguments.\n * @param options Tags, paths, and revalidation settings for the cached entry.\n */\nexport function unstable_cache<Args extends unknown[], Result>(\n fn: (...args: Args) => Result | Promise<Result>,\n keyParts: readonly unknown[] = [],\n options: FarmCacheOptions = {},\n): (...args: Args) => Promise<Result> {\n return async (...args: Args): Promise<Result> => {\n const locale = getActiveFarmI18nSnapshot()?.locale;\n const key = createFarmCacheKey([\n \"unstable_cache\",\n getFunctionCacheIdentity(fn),\n locale ? [\"locale\", locale] : null,\n keyParts,\n args,\n ]);\n return getFarmDataCache().getOrSet<Result>(key, () => fn(...args), options);\n };\n}\n\n/**\n * Invalidate every cache entry carrying `tag`.\n *\n * Observability note: the `count` on the emitted `cache.revalidateTag` event is\n * derived from Farm's process-local entry tracking. With a shared `cache.adapter`\n * configured, entries live in the adapter rather than in local memory, so the\n * count can read as `0` even though the invalidation is still propagated to the\n * adapter and applied. Treat it as a best-effort signal, not a distributed count.\n */\nexport function revalidateTag(_tag: string, _profile?: RevalidateTagProfile): void | Promise<void> {\n const cache = getFarmDataCache();\n if (cache.hasAdapter) {\n const task = cache\n .revalidateTagAsync(_tag, {\n source: \"revalidateTag\",\n profile: _profile,\n })\n .then(() => undefined);\n notifyFarmCacheTask(task);\n return task;\n }\n cache.revalidateTag(_tag, {\n source: \"revalidateTag\",\n profile: _profile,\n });\n}\n\nexport function updateTag(tag: string): void | Promise<void> {\n const cache = getFarmDataCache();\n if (cache.hasAdapter) {\n const task = cache.revalidateTagAsync(tag, { source: \"updateTag\" }).then(() => undefined);\n notifyFarmCacheTask(task);\n return task;\n }\n cache.revalidateTag(tag, { source: \"updateTag\" });\n}\n\n/**\n * Invalidate cached data for a route path (and its PPR shell, if any).\n *\n * Observability note: the `count` on the emitted `cache.revalidatePath` event and\n * the `ppr.shell.invalidated` event are derived from process-local entry tracking.\n * With a shared `cache.adapter`, PPR shells live in the adapter rather than in\n * local memory, so the count can read as `0` and `ppr.shell.invalidated` may not\n * be emitted even though the invalidation is still propagated to the adapter and\n * applied.\n */\nexport function revalidatePath(routePath: string): void | Promise<void> {\n const cache = getFarmDataCache();\n if (cache.hasAdapter) {\n const task = cache.revalidatePathAsync(routePath).then(() => undefined);\n notifyFarmCacheTask(task);\n return task;\n }\n cache.revalidatePath(routePath);\n}\n\nexport function invalidate(key: RouteDataCacheKey): void | Promise<void> {\n const clientKey = createRouteDataCacheKey(key);\n const task = updateTag(createRouteDataCacheTag(key));\n notifyFarmCacheInvalidation(clientKey);\n return task;\n}\n\nexport function invalidateRouteData(key: RouteDataCacheKey): void | Promise<void> {\n return invalidate(key);\n}\n\n/**\n * Apply a normalized set of invalidation targets and return browser cache keys\n * that should be carried with an action/endpoint response.\n */\nexport async function applyFarmCacheInvalidationTargets(\n targets: readonly FarmCacheInvalidationTarget[],\n): Promise<readonly string[]> {\n if (!Array.isArray(targets)) {\n throw new TypeError(\"Cache invalidations must resolve to an array of targets.\");\n }\n\n const clientKeys: string[] = [];\n for (const target of targets) {\n assertFarmCacheInvalidationTarget(target);\n if (\"key\" in target) {\n await invalidate(target.key);\n clientKeys.push(createRouteDataCacheKey(target.key));\n } else if (\"path\" in target) {\n await revalidatePath(target.path);\n } else {\n await updateTag(target.tag);\n }\n }\n return Array.from(new Set(clientKeys));\n}\n\nexport function createPathCacheTag(routePath: string): string {\n return `path:${normalizeRevalidatePath(routePath)}`;\n}\n\nexport function createRouteDataCacheTag(key: RouteDataCacheKey): string {\n return `route-data:${createRouteDataCacheKey(key)}`;\n}\n\nexport function createRouteDataCacheKey(key: RouteDataCacheKey): string {\n return createFarmCacheKey(Array.isArray(key) ? key : [key]);\n}\n\nexport function normalizeRevalidatePath(routePath: string): string {\n if (typeof routePath !== \"string\") {\n throw new TypeError(\"revalidatePath expects a path string.\");\n }\n\n let normalized = routePath.trim();\n if (!normalized) {\n throw new Error(\"revalidatePath expects a non-empty path.\");\n }\n\n try {\n if (/^https?:\\/\\//i.test(normalized)) {\n normalized = new URL(normalized).pathname;\n }\n } catch {\n // Keep the original path if URL parsing fails.\n }\n\n normalized = normalized.split(/[?#]/, 1)[0] ?? normalized;\n normalized = normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n normalized = normalized.replace(/\\/{2,}/g, \"/\");\n if (normalized.length > 1) {\n normalized = normalized.replace(/\\/+$/, \"\");\n }\n return normalized || \"/\";\n}\n\nexport function createFarmCacheKey(parts: readonly unknown[]): string {\n return stableSerialize(parts);\n}\n\nfunction normalizeRevalidate(revalidate: number | false | undefined): number | false | undefined {\n if (revalidate === false || revalidate === undefined) {\n return revalidate;\n }\n if (!Number.isFinite(revalidate) || revalidate < 0) {\n return undefined;\n }\n // 0 is meaningful: the entry is stale immediately, i.e. always re-produced.\n return revalidate;\n}\n\nfunction normalizeCacheTag(tag: string): string {\n if (typeof tag !== \"string\") {\n throw new TypeError(\"Cache tags must be strings.\");\n }\n const normalized = tag.trim();\n if (!normalized) {\n throw new Error(\"Cache tags cannot be empty.\");\n }\n return normalized;\n}\n\nfunction normalizeCacheNamespace(namespace: string): string {\n if (typeof namespace !== \"string\") {\n throw new TypeError(\"Cache namespace must be a string.\");\n }\n const normalized = namespace.trim().replace(/:+$/g, \"\");\n if (!normalized) {\n throw new Error(\"Cache namespace cannot be empty.\");\n }\n return normalized;\n}\n\nfunction normalizeAdapterVersion(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0 ? value : 0;\n}\n\nfunction normalizePositiveDuration(\n value: number | undefined,\n fallback: number,\n name: string,\n): number {\n if (value === undefined) return fallback;\n if (!Number.isFinite(value) || value <= 0) {\n throw new TypeError(`${name} must be a positive number of milliseconds.`);\n }\n return Math.floor(value);\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction normalizeCacheOptionsTags(options: FarmCacheOptions): Set<string> {\n const tags = new Set<string>();\n for (const tag of options.tags ?? []) {\n tags.add(normalizeCacheTag(tag));\n }\n for (const routePath of options.paths ?? []) {\n tags.add(createPathCacheTag(routePath));\n }\n return tags;\n}\n\nfunction assertFarmCacheEntry(\n entry: FarmCacheEntry,\n expectedKey: string,\n): asserts entry is FarmCacheEntry {\n if (\n !entry ||\n typeof entry !== \"object\" ||\n entry.key !== expectedKey ||\n !Array.isArray(entry.tags) ||\n typeof entry.createdAt !== \"number\"\n ) {\n throw new TypeError(\n `Cache adapter returned an invalid entry for ${JSON.stringify(expectedKey)}.`,\n );\n }\n}\n\nfunction assertFarmCacheInvalidationTarget(\n target: unknown,\n): asserts target is FarmCacheInvalidationTarget {\n if (!target || typeof target !== \"object\") {\n throw new TypeError(\"Cache invalidation targets must be { key }, { path }, or { tag }.\");\n }\n\n if (\"key\" in target) {\n const key = (target as { key?: unknown }).key;\n if (typeof key === \"string\" || Array.isArray(key)) return;\n } else if (\"path\" in target && typeof (target as { path?: unknown }).path === \"string\") {\n return;\n } else if (\"tag\" in target && typeof (target as { tag?: unknown }).tag === \"string\") {\n return;\n }\n\n throw new TypeError(\"Cache invalidation targets must contain a string/array key, path, or tag.\");\n}\n\nfunction getFunctionCacheIdentity(fn: Function): string {\n // The name alone collides across modules — two different functions both\n // named getUser would share cache entries. Include a hash of the source so\n // only genuinely identical functions share, and the identity stays stable\n // across processes and restarts.\n const name = fn.name || \"anonymous\";\n return `${name}:${hashFunctionSource(String(fn))}`;\n}\n\nfunction hashFunctionSource(source: string): string {\n // FNV-1a, 32-bit.\n let hash = 0x811c9dc5;\n for (let index = 0; index < source.length; index++) {\n hash ^= source.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(36);\n}\n\nfunction compareCodepoint(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction serializeBinaryBytes(bytes: Uint8Array): string {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction stableSerialize(value: unknown, seen = new WeakSet<object>()): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n\n const valueType = typeof value;\n if (valueType === \"string\") return JSON.stringify(value);\n if (valueType === \"number\" || valueType === \"boolean\" || valueType === \"bigint\") {\n return `${valueType}:${String(value)}`;\n }\n if (valueType === \"symbol\") {\n return `symbol:${String(value)}`;\n }\n if (valueType === \"function\") {\n return `function:${getFunctionCacheIdentity(value as Function)}`;\n }\n\n if (value instanceof Date) {\n // toISOString throws on an Invalid Date. Key building must not throw on a\n // supported type, so all invalid dates share one stable marker and the\n // caller's own validation decides what to do with the input.\n return Number.isNaN(value.getTime()) ? \"date:invalid\" : `date:${value.toISOString()}`;\n }\n if (value instanceof URL) {\n return `url:${value.toString()}`;\n }\n if (value instanceof RegExp) {\n return `regexp:${value.toString()}`;\n }\n if (value instanceof ArrayBuffer) {\n return `arraybuffer:${serializeBinaryBytes(new Uint8Array(value))}`;\n }\n if (typeof SharedArrayBuffer !== \"undefined\" && value instanceof SharedArrayBuffer) {\n return `sharedarraybuffer:${serializeBinaryBytes(new Uint8Array(value))}`;\n }\n if (ArrayBuffer.isView(value)) {\n const viewType = Object.prototype.toString.call(value).slice(8, -1);\n const bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n return `binary:${viewType}:${serializeBinaryBytes(bytes)}`;\n }\n\n if (value && typeof value === \"object\") {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n\n if (Array.isArray(value)) {\n const items: string[] = [];\n for (let index = 0; index < value.length; index++) {\n items.push(\n Object.prototype.hasOwnProperty.call(value, index)\n ? stableSerialize(value[index], seen)\n : \"[Hole]\",\n );\n }\n seen.delete(value);\n return `[${items.join(\",\")}]`;\n }\n\n // Set and Map keep their contents internally, so Object.entries is empty\n // for both. Serialize the contents and sort them by codepoint so equal\n // contents give the same key regardless of insertion order.\n if (value instanceof Set) {\n const items = Array.from(value, (item) => stableSerialize(item, seen)).sort(compareCodepoint);\n seen.delete(value);\n return `set:[${items.join(\",\")}]`;\n }\n if (value instanceof Map) {\n const items = Array.from(\n value,\n ([key, item]) => `[${stableSerialize(key, seen)},${stableSerialize(item, seen)}]`,\n ).sort(compareCodepoint);\n seen.delete(value);\n return `map:[${items.join(\",\")}]`;\n }\n\n // Codepoint comparison, not localeCompare: the host locale must not\n // change how a \"stable\" key serializes, or invalidations computed on one\n // server can miss entries written by another.\n const entries = Object.entries(value as Record<string, unknown>).sort(([a], [b]) =>\n compareCodepoint(a, b),\n );\n const serialized = entries\n .map(([key, item]) => `${JSON.stringify(key)}:${stableSerialize(item, seen)}`)\n .join(\",\");\n\n seen.delete(value);\n return `{${serialized}}`;\n }\n\n return String(value);\n}\n"],"mappings":";;;;;;;;;;;;;;;AAuEO,SAAS,iBAAwB;AACtC,SAAO,CACL,YAC6C;AAC7C,QAAI,OAAO,YAAY,YAAY;AACjC,YAAM,IAAI,UAAU,gDAAgD;AAAA,IACtE;AAEA,YAAQ,IAAI,SAAqB;AAC/B,YAAM,MAAM,QAAQ,GAAG,IAAI;AAC3B,UAAI,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,GAAG,GAAG;AAClD,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAlBgB;AAmHT,SAAS,oBACd,SACA,UAA0C,CAAC,GACzB;AAClB,MAAI,CAAC,WAAW,OAAO,QAAQ,YAAY,cAAc,OAAO,QAAQ,YAAY,YAAY;AAC9F,UAAM,IAAI,UAAU,0DAA0D;AAAA,EAChF;AAEA,QAAM,OAAO,wBAAwB,QAAQ,QAAQ,YAAY;AACjE,QAAM,WAAW,wBAAC,QAAgB,GAAG,IAAI,UAAU,GAAG,IAArC;AACjB,QAAM,SAAS,wBAAC,QAAgB,GAAG,IAAI,QAAQ,GAAG,IAAnC;AAEf,SAAO;AAAA,IACL,MAAM;AAAA,IACN,KAAK,wBAAI,QAAgB,QAAQ,QAA2B,SAAS,GAAG,CAAC,GAApE;AAAA,IACL,KAAK,8BAAU,KAAa,UAA6B;AACvD,YAAM,QAAQ,QAAQ,SAAS,GAAG,GAAG,KAAK;AAAA,IAC5C,GAFK;AAAA,IAGL,QAAQ,8BAAO,QAAgB;AAC7B,YAAM,QAAQ,WAAW,SAAS,GAAG,CAAC;AAAA,IACxC,GAFQ;AAAA,IAGR,OAAO,QAAQ,QACX,YAAY;AACV,YAAM,QAAQ,MAAO,IAAI;AAAA,IAC3B,IACA;AAAA,IACJ,gBAAgB,8BAAO,SAAS;AAC9B,YAAM,WAAW,MAAM,QAAQ;AAAA,QAC7B,KAAK,IAAI,OAAO,QAAQ;AACtB,gBAAM,QAAQ,MAAM,QAAQ,QAAgB,OAAO,GAAG,CAAC;AACvD,iBAAO,CAAC,KAAK,wBAAwB,KAAK,CAAC;AAAA,QAC7C,CAAC;AAAA,MACH;AACA,aAAO,OAAO,YAAY,QAAQ;AAAA,IACpC,GARgB;AAAA,IAShB,gBAAgB,8BAAO,SAAS;AAC9B,YAAM,QAAQ;AAAA,QACZ,KAAK,IAAI,OAAO,QAAQ;AACtB,gBAAM,MAAM,OAAO,GAAG;AACtB,gBAAM,UAAU,wBAAwB,MAAM,QAAQ,QAAgB,GAAG,CAAC;AAC1E,gBAAM,QAAQ,QAAQ,KAAK,KAAK,IAAI,KAAK,IAAI,GAAG,UAAU,CAAC,CAAC;AAAA,QAC9D,CAAC;AAAA,MACH;AAAA,IACF,GARgB;AAAA,EASlB;AACF;AA7CgB;AA2DT,IAAM,iBAAN,MAAM,eAAc;AAAA,EAgBzB,YAAY,SAA8B,CAAC,GAAG;AAf9C,SAAQ,UAAU,oBAAI,IAAoC;AAC1D,SAAQ,WAAW,oBAAI,IAA8B;AACrD,SAAQ,yBAAyB,oBAAI,IAAoB;AACzD,SAAQ,UAAU;AAClB,SAAQ,aAAa;AAErB,SAAQ,YAAY;AACpB,SAAQ,QAAQ;AAChB,SAAQ,QAAQ;AAAA,MACd,SAAS;AAAA,MACT,OAAO;AAAA,MACP,eAAe;AAAA,MACf,gBAAgB;AAAA,IAClB;AAGE,SAAK,UAAU,MAAM;AAAA,EACvB;AAAA,EAEA,UAAU,SAA8B,CAAC,GAAS;AAChD,SAAK;AACL,SAAK,QAAQ,MAAM;AACnB,SAAK,SAAS,MAAM;AACpB,SAAK,uBAAuB,MAAM;AAClC,SAAK,UAAU;AACf,SAAK,UAAU,OAAO;AACtB,SAAK,YAAY,wBAAwB,OAAO,aAAa,MAAM;AACnE,SAAK,QAAQ,CAAC,OAAO;AACrB,SAAK,QACH,OAAO,UAAU,QACb,EAAE,GAAG,KAAK,OAAO,SAAS,MAAM,IAChC;AAAA,MACE,SAAS;AAAA,MACT,OAAO,0BAA0B,OAAO,OAAO,OAAO,KAAQ,mBAAmB;AAAA,MACjF,eAAe;AAAA,QACb,OAAO,OAAO;AAAA,QACd;AAAA,QACA;AAAA,MACF;AAAA,MACA,gBAAgB;AAAA,QACd,OAAO,OAAO;AAAA,QACd;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACR;AAAA,EAEA,IAAI,cAAsB;AACxB,WAAO,KAAK,SAAS,SAAS,KAAK,UAAU,WAAW;AAAA,EAC1D;AAAA,EAEA,IAAI,aAAsB;AACxB,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAO,KAAa,UAAoC,CAAC,GAAkB;AACzE,WAAO,KAAK,SAAY,KAAK,OAAO,GAAG;AAAA,EACzC;AAAA,EAEA,SACE,KACA,UAAoC,CAAC,GACN;AAC/B,UAAM,QAAQ,KAAK,QAAQ,IAAI,GAAG;AAClC,QAAI,CAAC,OAAO;AACV,oBAAc,EAAE,MAAM,cAAc,IAAI,CAAC;AACzC,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,KAAK,QAAQ,OAAO,QAAQ,GAAG;AAC7C,QAAI,OAAO;AACT,oBAAc;AAAA,QACZ,MAAM;AAAA,QACN;AAAA,QACA,MAAM,MAAM,KAAK,MAAM,IAAI;AAAA,QAC3B,YAAY,MAAM;AAAA,MACpB,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,QAAQ,cAAc,OAAO;AAChC,oBAAc,EAAE,MAAM,cAAc,KAAK,QAAQ,QAAQ,CAAC;AAC1D,aAAO;AAAA,IACT;AAEA,kBAAc;AAAA,MACZ,MAAM;AAAA,MACN;AAAA,MACA,MAAM,MAAM,KAAK,MAAM,IAAI;AAAA,MAC3B,YAAY,MAAM;AAAA,MAClB;AAAA,IACF,CAAC;AAED,WAAO,KAAK,cAAc,KAAK;AAAA,EACjC;AAAA,EAEA,MAAM,cACJ,KACA,UAAoC,CAAC,GACG;AACxC,QAAI,KAAK,OAAO;AACd,YAAM,aAAa,KAAK,SAAY,KAAK,OAAO;AAChD,UAAI,WAAY,QAAO;AAAA,IACzB;AAEA,QAAI,CAAC,KAAK,SAAS;AACjB,aAAO,KAAK,QAAQ,SAAY,KAAK,SAAY,KAAK,OAAO;AAAA,IAC/D;AAEA,UAAM,aAAa,KAAK;AACxB,UAAM,UAAU,KAAK;AACrB,UAAM,YAAY,KAAK;AACvB,UAAM,QAAQ,MAAM,QAAQ,IAAO,GAAG,SAAS,UAAU,GAAG,EAAE;AAC9D,QAAI,eAAe,KAAK,WAAY,QAAO;AAC3C,QAAI,CAAC,OAAO;AACV,oBAAc,EAAE,MAAM,cAAc,IAAI,CAAC;AACzC,aAAO;AAAA,IACT;AAEA,yBAAqB,OAAO,GAAG;AAC/B,UAAM,QAAQ,MAAM,KAAK,oBAAoB,OAAO,QAAQ,KAAK,SAAS,SAAS;AACnF,QAAI,eAAe,KAAK,WAAY,QAAO;AAC3C,QAAI,OAAO;AACT,oBAAc;AAAA,QACZ,MAAM;AAAA,QACN;AAAA,QACA,MAAM,CAAC,GAAG,MAAM,IAAI;AAAA,QACpB,YAAY,MAAM;AAAA,MACpB,CAAC;AACD,UAAI,CAAC,QAAQ,YAAY;AACvB,sBAAc,EAAE,MAAM,cAAc,KAAK,QAAQ,QAAQ,CAAC;AAC1D,eAAO;AAAA,MACT;AAAA,IACF;AAEA,kBAAc;AAAA,MACZ,MAAM;AAAA,MACN;AAAA,MACA,MAAM,CAAC,GAAG,MAAM,IAAI;AAAA,MACpB,YAAY,MAAM;AAAA,MAClB;AAAA,IACF,CAAC;AAED,QAAI,KAAK,SAAS,CAAC,OAAO;AACxB,WAAK,kBAAkB,KAAK;AAAA,IAC9B;AACA,WAAO,EAAE,GAAG,OAAO,IAAI;AAAA,EACzB;AAAA,EAEA,IAAO,KAAa,OAAU,UAA+B,CAAC,GAAsB;AAClF,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,OAAO,QAAQ,QAAQ,CAAC,GAAG;AACpC,WAAK,IAAI,kBAAkB,GAAG,CAAC;AAAA,IACjC;AACA,eAAW,aAAa,QAAQ,SAAS,CAAC,GAAG;AAC3C,WAAK,IAAI,mBAAmB,SAAS,CAAC;AAAA,IACxC;AAEA,UAAM,QAAmC;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,WAAW,QAAQ,aAAa,KAAK,IAAI;AAAA,MACzC,gBAAgB,EAAE,KAAK;AAAA,MACvB,YAAY,oBAAoB,QAAQ,UAAU;AAAA,IACpD;AAEA,SAAK,QAAQ,IAAI,KAAK,KAAK;AAC3B,kBAAc;AAAA,MACZ,MAAM;AAAA,MACN;AAAA,MACA,MAAM,MAAM,KAAK,IAAI;AAAA,MACrB,YAAY,MAAM;AAAA,IACpB,CAAC;AACD,WAAO,KAAK,cAAc,KAAK;AAAA,EACjC;AAAA,EAEA,MAAM,SACJ,KACA,OACA,UAA+B,CAAC,GAChC,aAC4B;AAC5B,WAAO,KAAK,WAAW,KAAK,OAAO,SAAS,WAAW;AAAA,EACzD;AAAA,EAEA,MAAc,WACZ,KACA,OACA,SACA,aACA,gBAC4B;AAC5B,UAAM,OAAO,0BAA0B,OAAO;AAC9C,UAAM,mBACJ,eAAgB,MAAM,KAAK,sBAAsB,MAAM,KAAK,KAAK,OAAO,CAAC,CAAC;AAC5E,UAAM,QAA2B;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,MAAM,MAAM,KAAK,IAAI;AAAA,MACrB,aAAa;AAAA,MACb,WAAW,QAAQ,aAAa,KAAK,IAAI;AAAA,MACzC,gBAAgB,kBAAkB,EAAE,KAAK;AAAA,MACzC,YAAY,oBAAoB,QAAQ,UAAU;AAAA,IACpD;AAEA,QAAI,KAAK,OAAO;AACd,WAAK,kBAAkB,KAAK;AAAA,IAC9B;AACA,QAAI,KAAK,SAAS;AAChB,YAAM,KAAK,QAAQ,IAAI,KAAK,iBAAiB,GAAG,GAAG,KAAK;AAAA,IAC1D;AAEA,kBAAc;AAAA,MACZ,MAAM;AAAA,MACN;AAAA,MACA,MAAM,CAAC,GAAG,MAAM,IAAI;AAAA,MACpB,YAAY,MAAM;AAAA,IACpB,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,KAAsB;AAC3B,UAAM,UAAU,KAAK,QAAQ,OAAO,GAAG;AACvC,kBAAc,EAAE,MAAM,gBAAgB,KAAK,QAAQ,CAAC;AACpD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,KAA+B;AAC/C,UAAM,UAAU,KAAK,QAAQ,OAAO,GAAG;AACvC,QAAI,KAAK,SAAS;AAChB,YAAM,KAAK,QAAQ,OAAO,KAAK,iBAAiB,GAAG,CAAC;AAAA,IACtD;AACA,kBAAc,EAAE,MAAM,gBAAgB,KAAK,SAAS,KAAK,UAAU,OAAO,QAAQ,CAAC;AACnF,WAAO,KAAK,UAAU,OAAO;AAAA,EAC/B;AAAA,EAEA,QAAc;AACZ,UAAM,QAAQ,KAAK,QAAQ;AAC3B,SAAK;AACL,SAAK,QAAQ,MAAM;AACnB,SAAK,SAAS,MAAM;AACpB,SAAK,uBAAuB,MAAM;AAClC,SAAK,UAAU;AACf,kBAAc,EAAE,MAAM,eAAe,MAAM,CAAC;AAAA,EAC9C;AAAA,EAEA,MAAM,aAA4B;AAChC,SAAK,MAAM;AACX,UAAM,KAAK,SAAS,QAAQ;AAAA,EAC9B;AAAA,EAEA,QAAQ,OAA4B,MAAM,KAAK,IAAI,GAAY;AAC7D,QACE,OAAO,MAAM,eAAe,YAC5B,MAAM,cAAc,KACpB,MAAM,MAAM,aAAa,MAAM,aAAa,KAC5C;AACA,aAAO;AAAA,IACT;AAEA,eAAW,OAAO,MAAM,MAAM;AAC5B,YAAM,qBAAqB,KAAK,uBAAuB,IAAI,kBAAkB,GAAG,CAAC;AACjF,UACE,OAAO,uBAAuB,YAC9B,OAAO,MAAM,mBAAmB,YAChC,qBAAqB,MAAM,gBAC3B;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,OAAuB,MAAM,KAAK,IAAI,GAAqB;AAC5E,QAAI,KAAK,SAAS;AAChB,aAAO,KAAK,oBAAoB,OAAO,GAAG;AAAA,IAC5C;AACA,WAAO,KAAK,QAAQ,OAAO,GAAG;AAAA,EAChC;AAAA,EAEA,cACE,KACA,UAAsF,CAAC,GAC/E;AACR,UAAM,aAAa,kBAAkB,GAAG;AACxC,UAAM,QAAQ,KAAK,cAAc,UAAU;AAC3C;AAAA,MACE,QAAQ,WAAW,cACf,EAAE,MAAM,mBAAmB,KAAK,YAAY,MAAM,IAClD,EAAE,MAAM,uBAAuB,KAAK,YAAY,SAAS,QAAQ,SAAS,MAAM;AAAA,IACtF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,mBACJ,KACA,UAAsF,CAAC,GACtE;AACjB,UAAM,aAAa,kBAAkB,GAAG;AACxC,UAAM,QAAQ,KAAK,cAAc,UAAU;AAC3C,UAAM,KAAK,SAAS,iBAAiB,CAAC,KAAK,iBAAiB,UAAU,CAAC,CAAC;AACxE;AAAA,MACE,QAAQ,WAAW,cACf,EAAE,MAAM,mBAAmB,KAAK,YAAY,MAAM,IAClD,EAAE,MAAM,uBAAuB,KAAK,YAAY,SAAS,QAAQ,SAAS,MAAM;AAAA,IACtF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,WAA2B;AACxC,UAAM,iBAAiB,wBAAwB,SAAS;AACxD,UAAM,UAAU,mBAAmB,cAAc;AACjD,UAAM,WAAW,KAAK,oBAAoB,CAAC,SAAS,KAAK,CAAC;AAC1D,UAAM,QAAQ,KAAK,cAAc,OAAO;AACxC,kBAAc,EAAE,MAAM,wBAAwB,MAAM,gBAAgB,MAAM,CAAC;AAE3E,QAAI,WAAW,GAAG;AAChB,oBAAc;AAAA,QACZ,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,oBAAoB,WAAoC;AAC5D,UAAM,iBAAiB,wBAAwB,SAAS;AACxD,UAAM,UAAU,mBAAmB,cAAc;AACjD,UAAM,WAAW,KAAK,oBAAoB,CAAC,SAAS,KAAK,CAAC;AAC1D,UAAM,QAAQ,KAAK,cAAc,OAAO;AACxC,UAAM,KAAK,SAAS,iBAAiB,CAAC,KAAK,iBAAiB,OAAO,CAAC,CAAC;AACrE,kBAAc,EAAE,MAAM,wBAAwB,MAAM,gBAAgB,MAAM,CAAC;AAE3E,QAAI,WAAW,GAAG;AAChB,oBAAc;AAAA,QACZ,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SACJ,KACA,UACA,UAA4B,CAAC,GACjB;AACZ,UAAM,SAAS,MAAM,KAAK,cAAiB,GAAG;AAC9C,QAAI,QAAQ;AACV,aAAO,OAAO;AAAA,IAChB;AAEA,UAAM,WAAW,KAAK,SAAS,IAAI,GAAG;AACtC,QAAI,UAAU;AACZ,oBAAc,EAAE,MAAM,gBAAgB,IAAI,CAAC;AAC3C,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,MAAM,KAAK,0BAA0B,OAAO,CAAC;AAC1D,UAAM,aAAa,KAAK;AACxB,UAAM,UAAU,KAAK,eAAe,KAAK,UAAU,SAAS,MAAM,UAAU,EACzE,MAAM,CAAC,UAAU;AAChB,oBAAc,EAAE,MAAM,eAAe,KAAK,WAAW,OAAO,MAAM,CAAC;AACnE,YAAM;AAAA,IACR,CAAC,EACA,QAAQ,MAAM;AACb,UAAI,KAAK,SAAS,IAAI,GAAG,MAAM,SAAS;AACtC,aAAK,SAAS,OAAO,GAAG;AAAA,MAC1B;AAAA,IACF,CAAC;AAEH,SAAK,SAAS,IAAI,KAAK,OAAO;AAC9B,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,eACZ,KACA,UACA,SACA,MACA,YACY;AACZ,UAAM,UAAU,KAAK;AACrB,UAAM,YAAY,KAAK;AACvB,UAAM,QAAQ,EAAE,GAAG,KAAK,MAAM;AAC9B,UAAM,WAAW,GAAG,SAAS,UAAU,GAAG;AAC1C,QAAI;AAEJ,QAAI,SAAS,gBAAgB,QAAQ,gBAAgB,MAAM,SAAS;AAClE,mBAAa,MAAM,QAAQ,aAAa,UAAU,MAAM,KAAK;AAC7D,UAAI,CAAC,YAAY;AACf,cAAM,SAAS,MAAM,KAAK;AAAA,UACxB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,YAAI,QAAQ;AACV,wBAAc,EAAE,MAAM,gBAAgB,IAAI,CAAC;AAC3C,iBAAO,OAAO;AAAA,QAChB;AACA,YAAI,eAAe,KAAK,YAAY;AAClC,uBAAa,MAAM,QAAQ,aAAa,UAAU,MAAM,KAAK;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,wBAAwB,KAAK;AACnC,YAAM,qBAAqB,MAAM,KAAK,sBAAsB,MAAM,SAAS,SAAS;AACpF,YAAM,QAAQ,MAAM,SAAS;AAC7B,UAAI,eAAe,KAAK,YAAY;AAClC,cAAM,KAAK,WAAW,KAAK,OAAO,SAAS,oBAAoB,qBAAqB;AAAA,MACtF;AACA,aAAO;AAAA,IACT,UAAE;AACA,UAAI,cAAc,SAAS,cAAc;AACvC,cAAM,QAAQ,aAAa,UAAU,UAAU;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,oBACZ,KACA,SACA,WACA,OACA,YACwC;AACxC,UAAM,WAAW,KAAK,IAAI,IAAI,MAAM;AACpC,WAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,YAAM,MAAM,MAAM,cAAc;AAChC,UAAI,eAAe,KAAK,WAAY,QAAO;AAC3C,YAAM,QAAQ,MAAM,QAAQ,IAAO,GAAG,SAAS,UAAU,GAAG,EAAE;AAC9D,UAAI,eAAe,KAAK,WAAY,QAAO;AAC3C,UAAI,CAAC,OAAO;AACV,sBAAc,EAAE,MAAM,cAAc,IAAI,CAAC;AACzC;AAAA,MACF;AACA,2BAAqB,OAAO,GAAG;AAC/B,YAAM,QAAQ,MAAM,KAAK,oBAAoB,OAAO,KAAK,IAAI,GAAG,SAAS,SAAS;AAClF,UAAI,eAAe,KAAK,WAAY,QAAO;AAC3C,UAAI,OAAO;AACT,sBAAc;AAAA,UACZ,MAAM;AAAA,UACN;AAAA,UACA,MAAM,CAAC,GAAG,MAAM,IAAI;AAAA,UACpB,YAAY,MAAM;AAAA,QACpB,CAAC;AACD,sBAAc,EAAE,MAAM,cAAc,KAAK,QAAQ,QAAQ,CAAC;AAAA,MAC5D,OAAO;AACL,sBAAc;AAAA,UACZ,MAAM;AAAA,UACN;AAAA,UACA,MAAM,CAAC,GAAG,MAAM,IAAI;AAAA,UACpB,YAAY,MAAM;AAAA,UAClB,OAAO;AAAA,QACT,CAAC;AACD,eAAO,EAAE,GAAG,OAAO,IAAI;AAAA,MACzB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,KAAqB;AAC9C,QAAI,QAAQ;AACZ,eAAW,SAAS,KAAK,QAAQ,OAAO,GAAG;AACzC,UAAI,MAAM,KAAK,IAAI,GAAG,GAAG;AACvB;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,MAAiC;AAC3D,QAAI,QAAQ;AACZ,eAAW,SAAS,KAAK,QAAQ,OAAO,GAAG;AACzC,UAAI,KAAK,MAAM,CAAC,QAAQ,MAAM,KAAK,IAAI,GAAG,CAAC,GAAG;AAC5C;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,eAA+B;AACnD,SAAK,uBAAuB,IAAI,eAAe,EAAE,KAAK,OAAO;AAC7D,WAAO,KAAK,mBAAmB,aAAa;AAAA,EAC9C;AAAA,EAEQ,cAAiB,OAAqD;AAC5E,WAAO;AAAA,MACL,KAAK,MAAM;AAAA,MACX,OAAO,MAAM;AAAA,MACb,MAAM,MAAM,KAAK,MAAM,IAAI;AAAA,MAC3B,aAAa,MAAM;AAAA,MACnB,WAAW,MAAM;AAAA,MACjB,gBAAgB,MAAM;AAAA,MACtB,YAAY,MAAM;AAAA,IACpB;AAAA,EACF;AAAA,EAEQ,kBAAqB,OAAgC;AAC3D,SAAK,QAAQ,IAAI,MAAM,KAAK;AAAA,MAC1B,KAAK,MAAM;AAAA,MACX,OAAO,MAAM;AAAA,MACb,MAAM,IAAI,IAAI,MAAM,KAAK,IAAI,iBAAiB,CAAC;AAAA,MAC/C,aAAa,MAAM;AAAA,MACnB,WAAW,MAAM;AAAA,MACjB,gBAAgB,MAAM,kBAAkB,EAAE,KAAK;AAAA,MAC/C,YAAY,oBAAoB,MAAM,UAAU;AAAA,IAClD,CAAC;AAAA,EACH;AAAA,EAEQ,iBAAiB,KAAqB;AAC5C,WAAO,GAAG,KAAK,SAAS,UAAU,GAAG;AAAA,EACvC;AAAA,EAEQ,iBAAiB,KAAqB;AAC5C,WAAO,GAAG,KAAK,SAAS,QAAQ,GAAG;AAAA,EACrC;AAAA,EAEA,MAAc,sBACZ,MACA,UAAU,KAAK,SACf,YAAY,KAAK,WAC0B;AAC3C,QAAI,CAAC,SAAS,kBAAkB,KAAK,WAAW,EAAG,QAAO,CAAC;AAE3D,UAAM,aAAa,KAAK,IAAI,iBAAiB;AAC7C,UAAM,eAAe,WAAW,IAAI,CAAC,QAAQ,GAAG,SAAS,QAAQ,GAAG,EAAE;AACtE,UAAM,WAAW,MAAM,QAAQ,eAAe,YAAY;AAC1D,WAAO,OAAO;AAAA,MACZ,WAAW,IAAI,CAAC,KAAK,UAAU;AAAA,QAC7B;AAAA,QACA,wBAAwB,SAAS,aAAa,KAAK,CAAE,CAAC;AAAA,MACxD,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,oBACZ,OACA,MAAM,KAAK,IAAI,GACf,UAAU,KAAK,SACf,YAAY,KAAK,WACC;AAClB,QACE,OAAO,MAAM,eAAe,YAC5B,MAAM,cAAc,KACpB,MAAM,MAAM,aAAa,MAAM,aAAa,KAC5C;AACA,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB,MAAM,KAAK,sBAAsB,MAAM,MAAM,SAAS,SAAS;AACvF,eAAW,OAAO,MAAM,MAAM;AAC5B,UACE,wBAAwB,gBAAgB,GAAG,CAAC,IAC5C,wBAAwB,MAAM,cAAc,GAAG,CAAC,GAChD;AACA,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAlkB2B;AAApB,IAAM,gBAAN;AAokBP,IAAM,yBAAyB,uBAAO,IAAI,gBAAgB;AAC1D,IAAM,sBAAsB;AAG5B,IAAM,sBAAuB,8FAAgD,IAAI,cAAc;AAExF,SAAS,mBAAkC;AAChD,SAAO;AACT;AAFgB;AAIT,SAAS,mBAAmB,QAA+C;AAChF,sBAAoB,UAAU,MAAM;AACtC;AAFgB;AAsCT,SAAS,eACd,IACA,WAA+B,CAAC,GAChC,UAA4B,CAAC,GACO;AACpC,SAAO,UAAU,SAAgC;AAC/C,UAAM,SAAS,0BAA0B,GAAG;AAC5C,UAAM,MAAM,mBAAmB;AAAA,MAC7B;AAAA,MACA,yBAAyB,EAAE;AAAA,MAC3B,SAAS,CAAC,UAAU,MAAM,IAAI;AAAA,MAC9B;AAAA,MACA;AAAA,IACF,CAAC;AACD,WAAO,iBAAiB,EAAE,SAAiB,KAAK,MAAM,GAAG,GAAG,IAAI,GAAG,OAAO;AAAA,EAC5E;AACF;AAhBgB;AA2BT,SAAS,cAAc,MAAc,UAAuD;AACjG,QAAM,QAAQ,iBAAiB;AAC/B,MAAI,MAAM,YAAY;AACpB,UAAM,OAAO,MACV,mBAAmB,MAAM;AAAA,MACxB,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC,EACA,KAAK,MAAM,MAAS;AACvB,wBAAoB,IAAI;AACxB,WAAO;AAAA,EACT;AACA,QAAM,cAAc,MAAM;AAAA,IACxB,QAAQ;AAAA,IACR,SAAS;AAAA,EACX,CAAC;AACH;AAhBgB;AAkBT,SAAS,UAAU,KAAmC;AAC3D,QAAM,QAAQ,iBAAiB;AAC/B,MAAI,MAAM,YAAY;AACpB,UAAM,OAAO,MAAM,mBAAmB,KAAK,EAAE,QAAQ,YAAY,CAAC,EAAE,KAAK,MAAM,MAAS;AACxF,wBAAoB,IAAI;AACxB,WAAO;AAAA,EACT;AACA,QAAM,cAAc,KAAK,EAAE,QAAQ,YAAY,CAAC;AAClD;AARgB;AAoBT,SAAS,eAAe,WAAyC;AACtE,QAAM,QAAQ,iBAAiB;AAC/B,MAAI,MAAM,YAAY;AACpB,UAAM,OAAO,MAAM,oBAAoB,SAAS,EAAE,KAAK,MAAM,MAAS;AACtE,wBAAoB,IAAI;AACxB,WAAO;AAAA,EACT;AACA,QAAM,eAAe,SAAS;AAChC;AARgB;AAUT,SAAS,WAAW,KAA8C;AACvE,QAAM,YAAY,wBAAwB,GAAG;AAC7C,QAAM,OAAO,UAAU,wBAAwB,GAAG,CAAC;AACnD,8BAA4B,SAAS;AACrC,SAAO;AACT;AALgB;AAOT,SAAS,oBAAoB,KAA8C;AAChF,SAAO,WAAW,GAAG;AACvB;AAFgB;AAQhB,eAAsB,kCACpB,SAC4B;AAC5B,MAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B,UAAM,IAAI,UAAU,0DAA0D;AAAA,EAChF;AAEA,QAAM,aAAuB,CAAC;AAC9B,aAAW,UAAU,SAAS;AAC5B,sCAAkC,MAAM;AACxC,QAAI,SAAS,QAAQ;AACnB,YAAM,WAAW,OAAO,GAAG;AAC3B,iBAAW,KAAK,wBAAwB,OAAO,GAAG,CAAC;AAAA,IACrD,WAAW,UAAU,QAAQ;AAC3B,YAAM,eAAe,OAAO,IAAI;AAAA,IAClC,OAAO;AACL,YAAM,UAAU,OAAO,GAAG;AAAA,IAC5B;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI,IAAI,UAAU,CAAC;AACvC;AApBsB;AAsBf,SAAS,mBAAmB,WAA2B;AAC5D,SAAO,QAAQ,wBAAwB,SAAS,CAAC;AACnD;AAFgB;AAIT,SAAS,wBAAwB,KAAgC;AACtE,SAAO,cAAc,wBAAwB,GAAG,CAAC;AACnD;AAFgB;AAIT,SAAS,wBAAwB,KAAgC;AACtE,SAAO,mBAAmB,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC;AAC5D;AAFgB;AAIT,SAAS,wBAAwB,WAA2B;AACjE,MAAI,OAAO,cAAc,UAAU;AACjC,UAAM,IAAI,UAAU,uCAAuC;AAAA,EAC7D;AAEA,MAAI,aAAa,UAAU,KAAK;AAChC,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AAEA,MAAI;AACF,QAAI,gBAAgB,KAAK,UAAU,GAAG;AACpC,mBAAa,IAAI,IAAI,UAAU,EAAE;AAAA,IACnC;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,eAAa,WAAW,MAAM,QAAQ,CAAC,EAAE,CAAC,KAAK;AAC/C,eAAa,WAAW,WAAW,GAAG,IAAI,aAAa,IAAI,UAAU;AACrE,eAAa,WAAW,QAAQ,WAAW,GAAG;AAC9C,MAAI,WAAW,SAAS,GAAG;AACzB,iBAAa,WAAW,QAAQ,QAAQ,EAAE;AAAA,EAC5C;AACA,SAAO,cAAc;AACvB;AAzBgB;AA2BT,SAAS,mBAAmB,OAAmC;AACpE,SAAO,gBAAgB,KAAK;AAC9B;AAFgB;AAIhB,SAAS,oBAAoB,YAAoE;AAC/F,MAAI,eAAe,SAAS,eAAe,QAAW;AACpD,WAAO;AAAA,EACT;AACA,MAAI,CAAC,OAAO,SAAS,UAAU,KAAK,aAAa,GAAG;AAClD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AATS;AAWT,SAAS,kBAAkB,KAAqB;AAC9C,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,IAAI,UAAU,6BAA6B;AAAA,EACnD;AACA,QAAM,aAAa,IAAI,KAAK;AAC5B,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC/C;AACA,SAAO;AACT;AATS;AAWT,SAAS,wBAAwB,WAA2B;AAC1D,MAAI,OAAO,cAAc,UAAU;AACjC,UAAM,IAAI,UAAU,mCAAmC;AAAA,EACzD;AACA,QAAM,aAAa,UAAU,KAAK,EAAE,QAAQ,QAAQ,EAAE;AACtD,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AACA,SAAO;AACT;AATS;AAWT,SAAS,wBAAwB,OAAwB;AACvD,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ,IAAI,QAAQ;AACpF;AAFS;AAIT,SAAS,0BACP,OACA,UACA,MACQ;AACR,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG;AACzC,UAAM,IAAI,UAAU,GAAG,IAAI,6CAA6C;AAAA,EAC1E;AACA,SAAO,KAAK,MAAM,KAAK;AACzB;AAVS;AAYT,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAFS;AAIT,SAAS,0BAA0B,SAAwC;AACzE,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,OAAO,QAAQ,QAAQ,CAAC,GAAG;AACpC,SAAK,IAAI,kBAAkB,GAAG,CAAC;AAAA,EACjC;AACA,aAAW,aAAa,QAAQ,SAAS,CAAC,GAAG;AAC3C,SAAK,IAAI,mBAAmB,SAAS,CAAC;AAAA,EACxC;AACA,SAAO;AACT;AATS;AAWT,SAAS,qBACP,OACA,aACiC;AACjC,MACE,CAAC,SACD,OAAO,UAAU,YACjB,MAAM,QAAQ,eACd,CAAC,MAAM,QAAQ,MAAM,IAAI,KACzB,OAAO,MAAM,cAAc,UAC3B;AACA,UAAM,IAAI;AAAA,MACR,+CAA+C,KAAK,UAAU,WAAW,CAAC;AAAA,IAC5E;AAAA,EACF;AACF;AAfS;AAiBT,SAAS,kCACP,QAC+C;AAC/C,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,UAAM,IAAI,UAAU,mEAAmE;AAAA,EACzF;AAEA,MAAI,SAAS,QAAQ;AACnB,UAAM,MAAO,OAA6B;AAC1C,QAAI,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,EAAG;AAAA,EACrD,WAAW,UAAU,UAAU,OAAQ,OAA8B,SAAS,UAAU;AACtF;AAAA,EACF,WAAW,SAAS,UAAU,OAAQ,OAA6B,QAAQ,UAAU;AACnF;AAAA,EACF;AAEA,QAAM,IAAI,UAAU,2EAA2E;AACjG;AAjBS;AAmBT,SAAS,yBAAyB,IAAsB;AAKtD,QAAM,OAAO,GAAG,QAAQ;AACxB,SAAO,GAAG,IAAI,IAAI,mBAAmB,OAAO,EAAE,CAAC,CAAC;AAClD;AAPS;AAST,SAAS,mBAAmB,QAAwB;AAElD,MAAI,OAAO;AACX,WAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS;AAClD,YAAQ,OAAO,WAAW,KAAK;AAC/B,WAAO,KAAK,KAAK,MAAM,QAAU;AAAA,EACnC;AACA,UAAQ,SAAS,GAAG,SAAS,EAAE;AACjC;AARS;AAUT,SAAS,iBAAiB,GAAW,GAAmB;AACtD,SAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;AAClC;AAFS;AAIT,SAAS,qBAAqB,OAA2B;AACvD,SAAO,MAAM,KAAK,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAChF;AAFS;AAIT,SAAS,gBAAgB,OAAgB,OAAO,oBAAI,QAAgB,GAAW;AAC7E,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,UAAU,OAAW,QAAO;AAEhC,QAAM,YAAY,OAAO;AACzB,MAAI,cAAc,SAAU,QAAO,KAAK,UAAU,KAAK;AACvD,MAAI,cAAc,YAAY,cAAc,aAAa,cAAc,UAAU;AAC/E,WAAO,GAAG,SAAS,IAAI,OAAO,KAAK,CAAC;AAAA,EACtC;AACA,MAAI,cAAc,UAAU;AAC1B,WAAO,UAAU,OAAO,KAAK,CAAC;AAAA,EAChC;AACA,MAAI,cAAc,YAAY;AAC5B,WAAO,YAAY,yBAAyB,KAAiB,CAAC;AAAA,EAChE;AAEA,MAAI,iBAAiB,MAAM;AAIzB,WAAO,OAAO,MAAM,MAAM,QAAQ,CAAC,IAAI,iBAAiB,QAAQ,MAAM,YAAY,CAAC;AAAA,EACrF;AACA,MAAI,iBAAiB,KAAK;AACxB,WAAO,OAAO,MAAM,SAAS,CAAC;AAAA,EAChC;AACA,MAAI,iBAAiB,QAAQ;AAC3B,WAAO,UAAU,MAAM,SAAS,CAAC;AAAA,EACnC;AACA,MAAI,iBAAiB,aAAa;AAChC,WAAO,eAAe,qBAAqB,IAAI,WAAW,KAAK,CAAC,CAAC;AAAA,EACnE;AACA,MAAI,OAAO,sBAAsB,eAAe,iBAAiB,mBAAmB;AAClF,WAAO,qBAAqB,qBAAqB,IAAI,WAAW,KAAK,CAAC,CAAC;AAAA,EACzE;AACA,MAAI,YAAY,OAAO,KAAK,GAAG;AAC7B,UAAM,WAAW,OAAO,UAAU,SAAS,KAAK,KAAK,EAAE,MAAM,GAAG,EAAE;AAClE,UAAM,QAAQ,IAAI,WAAW,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC7E,WAAO,UAAU,QAAQ,IAAI,qBAAqB,KAAK,CAAC;AAAA,EAC1D;AAEA,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,QAAI,KAAK,IAAI,KAAK,GAAG;AACnB,aAAO;AAAA,IACT;AACA,SAAK,IAAI,KAAK;AAEd,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAM,QAAkB,CAAC;AACzB,eAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;AACjD,cAAM;AAAA,UACJ,OAAO,UAAU,eAAe,KAAK,OAAO,KAAK,IAC7C,gBAAgB,MAAM,KAAK,GAAG,IAAI,IAClC;AAAA,QACN;AAAA,MACF;AACA,WAAK,OAAO,KAAK;AACjB,aAAO,IAAI,MAAM,KAAK,GAAG,CAAC;AAAA,IAC5B;AAKA,QAAI,iBAAiB,KAAK;AACxB,YAAM,QAAQ,MAAM,KAAK,OAAO,CAAC,SAAS,gBAAgB,MAAM,IAAI,CAAC,EAAE,KAAK,gBAAgB;AAC5F,WAAK,OAAO,KAAK;AACjB,aAAO,QAAQ,MAAM,KAAK,GAAG,CAAC;AAAA,IAChC;AACA,QAAI,iBAAiB,KAAK;AACxB,YAAM,QAAQ,MAAM;AAAA,QAClB;AAAA,QACA,CAAC,CAAC,KAAK,IAAI,MAAM,IAAI,gBAAgB,KAAK,IAAI,CAAC,IAAI,gBAAgB,MAAM,IAAI,CAAC;AAAA,MAChF,EAAE,KAAK,gBAAgB;AACvB,WAAK,OAAO,KAAK;AACjB,aAAO,QAAQ,MAAM,KAAK,GAAG,CAAC;AAAA,IAChC;AAKA,UAAM,UAAU,OAAO,QAAQ,KAAgC,EAAE;AAAA,MAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAC5E,iBAAiB,GAAG,CAAC;AAAA,IACvB;AACA,UAAM,aAAa,QAChB,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,GAAG,KAAK,UAAU,GAAG,CAAC,IAAI,gBAAgB,MAAM,IAAI,CAAC,EAAE,EAC5E,KAAK,GAAG;AAEX,SAAK,OAAO,KAAK;AACjB,WAAO,IAAI,UAAU;AAAA,EACvB;AAEA,SAAO,OAAO,KAAK;AACrB;AA3FS;","names":[]}
@@ -13,16 +13,29 @@ function getFarmCacheInvalidationState() {
13
13
  });
14
14
  }
15
15
  __name(getFarmCacheInvalidationState, "getFarmCacheInvalidationState");
16
+ function warnFarmCacheListenerError(scope, error) {
17
+ const detail = error instanceof Error ? error.stack ?? error.message : String(error);
18
+ console.warn(`[farm:cache] ${scope} listener failed: ${detail}`);
19
+ }
20
+ __name(warnFarmCacheListenerError, "warnFarmCacheListenerError");
16
21
  function notifyFarmCacheInvalidation(key) {
17
22
  if (typeof key !== "string" || key.length === 0) return;
18
23
  for (const listener of getFarmCacheInvalidationState().listeners) {
19
- listener(key);
24
+ try {
25
+ listener(key);
26
+ } catch (error) {
27
+ warnFarmCacheListenerError("invalidation", error);
28
+ }
20
29
  }
21
30
  }
22
31
  __name(notifyFarmCacheInvalidation, "notifyFarmCacheInvalidation");
23
32
  function notifyFarmCacheTask(task) {
24
33
  for (const listener of getFarmCacheInvalidationState().taskListeners) {
25
- listener(task);
34
+ try {
35
+ listener(task);
36
+ } catch (error) {
37
+ warnFarmCacheListenerError("task", error);
38
+ }
26
39
  }
27
40
  }
28
41
  __name(notifyFarmCacheTask, "notifyFarmCacheTask");
@@ -78,4 +91,4 @@ export {
78
91
  subscribeFarmCacheInvalidation,
79
92
  subscribeFarmCacheTask
80
93
  };
81
- //# sourceMappingURL=chunk-RBRLLZL5.mjs.map
94
+ //# sourceMappingURL=chunk-34IAPZBG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cache-invalidation.ts"],"sourcesContent":["export type FarmCacheInvalidationListener = (key: string) => void;\nexport type FarmCacheTaskListener = (task: Promise<void>) => void;\n\nexport const FARM_CACHE_INVALIDATION_HEADER = \"x-farm-cache-invalidations\";\n\ntype FarmCacheInvalidationState = {\n listeners: Set<FarmCacheInvalidationListener>;\n taskListeners: Set<FarmCacheTaskListener>;\n};\n\nconst FARM_CACHE_INVALIDATION_STATE = Symbol.for(\"farm.cacheInvalidationState\");\nconst globalState = globalThis as typeof globalThis & {\n [FARM_CACHE_INVALIDATION_STATE]?: FarmCacheInvalidationState;\n};\n\nfunction getFarmCacheInvalidationState(): FarmCacheInvalidationState {\n return (globalState[FARM_CACHE_INVALIDATION_STATE] ??= {\n listeners: new Set(),\n taskListeners: new Set(),\n });\n}\n\nfunction warnFarmCacheListenerError(scope: string, error: unknown): void {\n const detail = error instanceof Error ? (error.stack ?? error.message) : String(error);\n console.warn(`[farm:cache] ${scope} listener failed: ${detail}`);\n}\n\nexport function notifyFarmCacheInvalidation(key: string): void {\n if (typeof key !== \"string\" || key.length === 0) return;\n\n for (const listener of getFarmCacheInvalidationState().listeners) {\n // Isolate listeners: one throwing observer must not abort the remaining\n // listeners (or the rest of a multi-key batch in applyFarmCacheInvalidations)\n // and must not surface as a 500 when invalidation runs inside a request.\n try {\n listener(key);\n } catch (error) {\n warnFarmCacheListenerError(\"invalidation\", error);\n }\n }\n}\n\nexport function notifyFarmCacheTask(task: Promise<void>): void {\n for (const listener of getFarmCacheInvalidationState().taskListeners) {\n try {\n listener(task);\n } catch (error) {\n warnFarmCacheListenerError(\"task\", error);\n }\n }\n}\n\nexport function applyFarmCacheInvalidations(keys: unknown): void {\n if (!Array.isArray(keys)) return;\n\n for (const key of keys) {\n if (typeof key === \"string\") {\n notifyFarmCacheInvalidation(key);\n }\n }\n}\n\nexport function encodeFarmCacheInvalidations(keys: readonly string[]): string | null {\n const normalized = Array.from(\n new Set(keys.filter((key) => typeof key === \"string\" && key.length > 0)),\n );\n if (normalized.length === 0) return null;\n return encodeURIComponent(JSON.stringify(normalized));\n}\n\nexport function decodeFarmCacheInvalidations(value: string | null | undefined): readonly string[] {\n if (!value) return [];\n\n try {\n const parsed = JSON.parse(decodeURIComponent(value));\n return Array.isArray(parsed)\n ? Array.from(\n new Set(parsed.filter((key): key is string => typeof key === \"string\" && key.length > 0)),\n )\n : [];\n } catch {\n return [];\n }\n}\n\nexport function subscribeFarmCacheInvalidation(\n listener: FarmCacheInvalidationListener,\n): () => void {\n const state = getFarmCacheInvalidationState();\n state.listeners.add(listener);\n return () => state.listeners.delete(listener);\n}\n\nexport function subscribeFarmCacheTask(listener: FarmCacheTaskListener): () => void {\n const state = getFarmCacheInvalidationState();\n state.taskListeners.add(listener);\n return () => state.taskListeners.delete(listener);\n}\n"],"mappings":";;;;;AAGO,IAAM,iCAAiC;AAO9C,IAAM,gCAAgC,uBAAO,IAAI,6BAA6B;AAC9E,IAAM,cAAc;AAIpB,SAAS,gCAA4D;AACnE,SAAQ,4FAA+C;AAAA,IACrD,WAAW,oBAAI,IAAI;AAAA,IACnB,eAAe,oBAAI,IAAI;AAAA,EACzB;AACF;AALS;AAOT,SAAS,2BAA2B,OAAe,OAAsB;AACvE,QAAM,SAAS,iBAAiB,QAAS,MAAM,SAAS,MAAM,UAAW,OAAO,KAAK;AACrF,UAAQ,KAAK,gBAAgB,KAAK,qBAAqB,MAAM,EAAE;AACjE;AAHS;AAKF,SAAS,4BAA4B,KAAmB;AAC7D,MAAI,OAAO,QAAQ,YAAY,IAAI,WAAW,EAAG;AAEjD,aAAW,YAAY,8BAA8B,EAAE,WAAW;AAIhE,QAAI;AACF,eAAS,GAAG;AAAA,IACd,SAAS,OAAO;AACd,iCAA2B,gBAAgB,KAAK;AAAA,IAClD;AAAA,EACF;AACF;AAbgB;AAeT,SAAS,oBAAoB,MAA2B;AAC7D,aAAW,YAAY,8BAA8B,EAAE,eAAe;AACpE,QAAI;AACF,eAAS,IAAI;AAAA,IACf,SAAS,OAAO;AACd,iCAA2B,QAAQ,KAAK;AAAA,IAC1C;AAAA,EACF;AACF;AARgB;AAUT,SAAS,4BAA4B,MAAqB;AAC/D,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG;AAE1B,aAAW,OAAO,MAAM;AACtB,QAAI,OAAO,QAAQ,UAAU;AAC3B,kCAA4B,GAAG;AAAA,IACjC;AAAA,EACF;AACF;AARgB;AAUT,SAAS,6BAA6B,MAAwC;AACnF,QAAM,aAAa,MAAM;AAAA,IACvB,IAAI,IAAI,KAAK,OAAO,CAAC,QAAQ,OAAO,QAAQ,YAAY,IAAI,SAAS,CAAC,CAAC;AAAA,EACzE;AACA,MAAI,WAAW,WAAW,EAAG,QAAO;AACpC,SAAO,mBAAmB,KAAK,UAAU,UAAU,CAAC;AACtD;AANgB;AAQT,SAAS,6BAA6B,OAAqD;AAChG,MAAI,CAAC,MAAO,QAAO,CAAC;AAEpB,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,mBAAmB,KAAK,CAAC;AACnD,WAAO,MAAM,QAAQ,MAAM,IACvB,MAAM;AAAA,MACJ,IAAI,IAAI,OAAO,OAAO,CAAC,QAAuB,OAAO,QAAQ,YAAY,IAAI,SAAS,CAAC,CAAC;AAAA,IAC1F,IACA,CAAC;AAAA,EACP,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAbgB;AAeT,SAAS,+BACd,UACY;AACZ,QAAM,QAAQ,8BAA8B;AAC5C,QAAM,UAAU,IAAI,QAAQ;AAC5B,SAAO,MAAM,MAAM,UAAU,OAAO,QAAQ;AAC9C;AANgB;AAQT,SAAS,uBAAuB,UAA6C;AAClF,QAAM,QAAQ,8BAA8B;AAC5C,QAAM,cAAc,IAAI,QAAQ;AAChC,SAAO,MAAM,MAAM,cAAc,OAAO,QAAQ;AAClD;AAJgB;","names":[]}
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  subscribeFarmCacheInvalidation,
6
6
  subscribeFarmCacheTask
7
- } from "./chunk-RBRLLZL5.mjs";
7
+ } from "./chunk-34IAPZBG.mjs";
8
8
  import {
9
9
  __name
10
10
  } from "./chunk-CGILA3WO.mjs";
@@ -499,4 +499,4 @@ export {
499
499
  getServerActionSignal,
500
500
  getServerActionInvalidations
501
501
  };
502
- //# sourceMappingURL=chunk-VV24CC42.mjs.map
502
+ //# sourceMappingURL=chunk-35NPLKQJ.mjs.map
@@ -15,19 +15,19 @@ import {
15
15
  import {
16
16
  isMultipartSchema,
17
17
  matchAPIRoute
18
- } from "./chunk-XTLLHCWU.mjs";
18
+ } from "./chunk-V4VRLVLW.mjs";
19
19
  import {
20
20
  DEFAULT_FARM_API_BASE_PATH,
21
21
  normalizeFarmAPIBasePath
22
22
  } from "./chunk-6YPPIPKR.mjs";
23
23
  import {
24
24
  applyFarmCacheInvalidationTargets
25
- } from "./chunk-AXVJCMVF.mjs";
25
+ } from "./chunk-2HDOV47R.mjs";
26
26
  import {
27
27
  FARM_CACHE_INVALIDATION_HEADER,
28
28
  decodeFarmCacheInvalidations,
29
29
  encodeFarmCacheInvalidations
30
- } from "./chunk-RBRLLZL5.mjs";
30
+ } from "./chunk-34IAPZBG.mjs";
31
31
  import {
32
32
  _runWithCurrentRequest
33
33
  } from "./chunk-EDWCT2JF.mjs";
@@ -110,6 +110,7 @@ function createEndpoint(pathOrOptions, optionsOrHandler, maybeHandler) {
110
110
  body: options.body,
111
111
  inputBody: isMultipartSchema(options.body) ? "form-data" : options.body,
112
112
  query: options.query,
113
+ inputQuery: options.query,
113
114
  headers: options.headers,
114
115
  response: null,
115
116
  errors
@@ -764,4 +765,4 @@ export {
764
765
  isWebResponse,
765
766
  createEndpointFailureResponse
766
767
  };
767
- //# sourceMappingURL=chunk-D7QH7MDU.mjs.map
768
+ //# sourceMappingURL=chunk-3TWQERDE.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api/endpoint.ts","../src/api/route-schema.ts","../src/api/route.ts","../src/api/plugin-route-runtime.ts","../src/api/runtime.ts"],"sourcesContent":["import { createEndpoint as betterCallEndpoint } from \"better-call\";\nimport { applyFarmCacheInvalidationTargets, type FarmCacheInvalidationTarget } from \"../cache\";\nimport { isMultipartSchema, type MultipartSchema, type TypedFormData } from \"./transport\";\nimport type { RouteSchema, RouteSchemaInput, RouteSchemaOutput } from \"./route-schema\";\n\n// Share the route factory's Zod and Standard Schema contract.\ntype AnySchema = RouteSchema;\n\ntype MaybePromise<T> = T | Promise<T>;\ntype Simplify<T> = { [TKey in keyof T]: T[TKey] } & {};\ntype UnionToIntersection<T> = (T extends unknown ? (value: T) => void : never) extends (\n value: infer TIntersection,\n) => void\n ? TIntersection\n : never;\n\n// Handlers receive parsed output; callers supply the schema input.\ntype InferOutput<T> = RouteSchemaOutput<T>;\n\ntype InferInput<T> = T extends { _input: infer I }\n ? I\n : T extends { \"~standard\": unknown }\n ? RouteSchemaInput<T>\n : T extends { parse: (data: infer I) => unknown }\n ? I\n : unknown;\n\ntype InferBodyInput<T> =\n T extends MultipartSchema<AnySchema> ? TypedFormData<InferInput<T>> : InferInput<T>;\n\ntype InferHeadersOutput<T> = [T] extends [never]\n ? Record<string, string>\n : T extends AnySchema\n ? InferOutput<T>\n : Record<string, string>;\n\nexport type EndpointErrorSchema = AnySchema & { parse: (data: unknown) => unknown };\n\ntype EndpointErrorDefinitionBase<TStatus extends number> = {\n status: TStatus;\n /** Public message safe to expose to API callers. */\n message?: string;\n};\n\nexport type EndpointErrorDefinition<\n TSchema extends EndpointErrorSchema = EndpointErrorSchema,\n TStatus extends number = number,\n> = EndpointErrorDefinitionBase<TStatus> &\n (\n | {\n /** Schema for the public error payload exposed to API callers. */\n data: TSchema;\n schema?: never;\n }\n | {\n data?: never;\n /** @deprecated Use `data` for consistency with server functions. */\n schema: TSchema;\n }\n );\n\nexport type EndpointErrorDefinitions = Record<\n string,\n EndpointErrorDefinition<EndpointErrorSchema, number>\n>;\n\ntype InferEndpointErrorSchema<TDefinition> = TDefinition extends {\n data: infer TSchema extends AnySchema;\n}\n ? TSchema\n : TDefinition extends { schema: infer TSchema extends AnySchema }\n ? TSchema\n : never;\n\nexport type EndpointErrorContracts<TErrors extends EndpointErrorDefinitions> = {\n [TCode in keyof TErrors]: {\n data: InferOutput<InferEndpointErrorSchema<TErrors[TCode]>>;\n status: TErrors[TCode][\"status\"];\n };\n};\n\nexport type EndpointErrorHandler<TErrors extends EndpointErrorDefinitions> = <\n TCode extends keyof TErrors & string,\n>(\n code: TCode,\n data: InferInput<InferEndpointErrorSchema<TErrors[TCode]>>,\n) => never;\n\n/** @deprecated Use `EndpointErrorHandler`. */\nexport type EndpointFail<TErrors extends EndpointErrorDefinitions> = EndpointErrorHandler<TErrors>;\n\nexport class EndpointFailure<TCode extends string = string, TData = unknown> extends Error {\n readonly code: TCode;\n readonly data: TData;\n readonly status: number;\n\n constructor(\n code: TCode,\n data: TData,\n options: {\n status: number;\n message: string;\n },\n ) {\n super(options.message);\n this.name = \"EndpointFailure\";\n this.code = code;\n this.data = data;\n this.status = options.status;\n }\n}\n\nexport function isEndpointFailure(value: unknown): value is EndpointFailure<string, unknown> {\n return value instanceof EndpointFailure;\n}\n\nexport type EndpointParamValue = string | string[];\nexport type EndpointParams = Record<string, EndpointParamValue>;\n\nexport type EndpointMiddlewareContext<\n TContext extends object = {},\n TBody = unknown,\n TQuery = unknown,\n THeaders = Record<string, string>,\n> = {\n body: TBody;\n query: TQuery;\n headers: THeaders;\n request: Request;\n /** Context accumulated from middleware that ran earlier in the chain. */\n context: Readonly<TContext>;\n params: EndpointParams;\n};\n\nexport type EndpointMiddlewareResult<TProvidedContext extends object = object> =\n | TProvidedContext\n | true\n | false\n | Response;\n\n/** A plain async function. No wrapper or `next()` callback is required. */\nexport type EndpointMiddleware<\n TProvidedContext extends object = object,\n TContext extends object = {},\n TBody = unknown,\n TQuery = unknown,\n THeaders = Record<string, string>,\n> = (\n ctx: EndpointMiddlewareContext<TContext, TBody, TQuery, THeaders>,\n) => MaybePromise<EndpointMiddlewareResult<TProvidedContext>>;\n\nexport type AnyEndpointMiddleware = (ctx: EndpointMiddlewareContext<any, any, any, any>) => unknown;\n\nexport type EndpointInvalidationTarget = FarmCacheInvalidationTarget;\n\nexport type EndpointInvalidationContext<\n TContext extends object = {},\n TBody = unknown,\n TQuery = unknown,\n THeaders = Record<string, string>,\n> = EndpointMiddlewareContext<TContext, TBody, TQuery, THeaders> & {\n /** The raw value returned by the endpoint handler. */\n result: unknown;\n};\n\nexport type EndpointInvalidations<\n TContext extends object = {},\n TBody = unknown,\n TQuery = unknown,\n THeaders = Record<string, string>,\n> =\n | readonly EndpointInvalidationTarget[]\n | ((\n context: EndpointInvalidationContext<TContext, TBody, TQuery, THeaders>,\n ) => readonly EndpointInvalidationTarget[] | Promise<readonly EndpointInvalidationTarget[]>);\n\ntype ValidateEndpointMiddlewares<TMiddlewares extends readonly AnyEndpointMiddleware[]> = {\n readonly [TIndex in keyof TMiddlewares]: TMiddlewares[TIndex] extends AnyEndpointMiddleware\n ? [Awaited<ReturnType<TMiddlewares[TIndex]>>] extends [EndpointMiddlewareResult<object>]\n ? TMiddlewares[TIndex]\n : never\n : never;\n};\n\ntype ContextFromMiddlewareResult<TResult> =\n Exclude<TResult, Response | boolean> extends infer TContext\n ? [TContext] extends [never]\n ? {}\n : TContext extends object\n ? TContext\n : {}\n : {};\n\ntype ContextFromMiddleware<TMiddleware> = TMiddleware extends (...args: any[]) => infer TResult\n ? ContextFromMiddlewareResult<Awaited<TResult>>\n : {};\n\nexport type InferEndpointMiddlewareContext<\n TMiddlewares extends readonly ((...args: any[]) => any)[],\n TContext extends object = {},\n> = TMiddlewares extends readonly [infer TMiddleware, ...infer TRest]\n ? TMiddleware extends (...args: any[]) => any\n ? TRest extends readonly ((...args: any[]) => any)[]\n ? InferEndpointMiddlewareContext<\n TRest,\n Simplify<TContext & ContextFromMiddleware<TMiddleware>>\n >\n : Simplify<TContext>\n : Simplify<TContext>\n : number extends TMiddlewares[\"length\"]\n ? Simplify<TContext & UnionToIntersection<ContextFromMiddleware<TMiddlewares[number]>>>\n : Simplify<TContext>;\n\nexport type EndpointOptions<\n TBody extends AnySchema = never,\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TMiddlewares extends readonly AnyEndpointMiddleware[] = readonly [],\n TErrors extends EndpointErrorDefinitions = {},\n> = {\n method?: \"GET\" | \"HEAD\" | \"QUERY\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"OPTIONS\";\n body?: TBody;\n query?: TQuery;\n headers?: THeaders;\n middleware?: TMiddlewares;\n /**\n * Cache keys, tags, and route paths made stale after a successful handler result.\n * The resolver receives validated input and middleware context.\n */\n invalidates?: EndpointInvalidations<\n InferEndpointMiddlewareContext<TMiddlewares>,\n InferOutput<TBody>,\n InferOutput<TQuery>,\n InferHeadersOutput<THeaders>\n >;\n errors?: TErrors;\n /** @deprecated Use plain functions in `middleware` for Farm endpoint middleware. */\n use?: any[];\n};\n\nexport type EndpointHandler<\n TBody extends AnySchema = never,\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n TContext extends object = {},\n TErrors extends EndpointErrorDefinitions = {},\n> = (ctx: {\n body: InferOutput<TBody>;\n query: InferOutput<TQuery>;\n headers: InferHeadersOutput<THeaders>;\n request: Request;\n context: Readonly<TContext>;\n params: EndpointParams;\n error: EndpointErrorHandler<TErrors>;\n /** @deprecated Use `error`. */\n fail: EndpointFail<TErrors>;\n}) => Promise<TResponse> | TResponse;\n\n// Type to represent an endpoint with its input/output types\nexport type TypedEndpoint<\n TBody = never,\n TQuery = never,\n TResponse = any,\n THeaders = Record<string, string>,\n TErrors = never,\n TBodyInput = TBody,\n TQueryInput = TQuery,\n> = {\n __types: {\n body: TBody;\n inputBody: TBodyInput;\n query: TQuery;\n inputQuery: TQueryInput;\n headers: THeaders;\n response: TResponse;\n errors: TErrors;\n };\n __path?: string;\n __method?: string;\n} & ((options?: { body?: TBodyInput; query?: TQueryInput }) => Promise<TResponse>);\n\ntype CreatedEndpoint<\n TBody extends AnySchema,\n TQuery extends AnySchema,\n THeaders extends AnySchema,\n TResponse,\n TErrors extends EndpointErrorDefinitions = {},\n> = TypedEndpoint<\n InferOutput<TBody>,\n InferOutput<TQuery>,\n Awaited<TResponse>,\n InferHeadersOutput<THeaders>,\n EndpointErrorContracts<TErrors>,\n InferBodyInput<TBody>,\n InferInput<TQuery>\n>;\n\ntype AnyEndpointOptions = EndpointOptions<\n AnySchema,\n AnySchema,\n AnySchema,\n readonly AnyEndpointMiddleware[],\n EndpointErrorDefinitions\n>;\ntype EndpointBodyFromOptions<TOptions> = TOptions extends {\n body: infer TBody extends AnySchema;\n}\n ? TBody\n : never;\ntype EndpointQueryFromOptions<TOptions> = TOptions extends {\n query: infer TQuery extends AnySchema;\n}\n ? TQuery\n : never;\ntype EndpointHeadersFromOptions<TOptions> = TOptions extends {\n headers: infer THeaders extends AnySchema;\n}\n ? THeaders\n : never;\ntype EndpointMiddlewaresFromOptions<TOptions> = TOptions extends {\n middleware: infer TMiddlewares extends readonly AnyEndpointMiddleware[];\n}\n ? TMiddlewares\n : readonly [];\ntype EndpointErrorsFromOptions<TOptions> = TOptions extends {\n errors: infer TErrors extends EndpointErrorDefinitions;\n}\n ? TErrors\n : {};\ntype MethodlessEndpointOptions = Omit<AnyEndpointOptions, \"method\">;\ntype EndpointHandlerFromOptions<TOptions, TResponse> = EndpointHandler<\n EndpointBodyFromOptions<TOptions>,\n EndpointQueryFromOptions<TOptions>,\n EndpointHeadersFromOptions<TOptions>,\n TResponse,\n InferEndpointMiddlewareContext<EndpointMiddlewaresFromOptions<TOptions>>,\n EndpointErrorsFromOptions<TOptions>\n>;\ntype ValidatedEndpointHandlerFromOptions<TOptions, TResponse> = EndpointHandlerFromOptions<\n TOptions,\n TResponse\n> &\n (EndpointMiddlewaresFromOptions<TOptions> extends ValidateEndpointMiddlewares<\n EndpointMiddlewaresFromOptions<TOptions>\n >\n ? unknown\n : never);\ntype CreatedEndpointFromOptions<TOptions, TResponse> = CreatedEndpoint<\n EndpointBodyFromOptions<TOptions>,\n EndpointQueryFromOptions<TOptions>,\n EndpointHeadersFromOptions<TOptions>,\n TResponse,\n EndpointErrorsFromOptions<TOptions>\n>;\n\n/**\n * Create a Farm.js API endpoint\n *\n * Supports two patterns:\n * 1. File-based routing (path auto-inferred from file location):\n * `export const POST = createEndpoint({ method: 'POST', body: schema }, handler)`\n * `createEndpoint({ method: 'GET', query: z.object({...}) }, handler)`\n *\n * 2. Explicit path (for routes.ts at project root):\n * `createEndpoint('/api/hello', { method: 'GET', query: z.object({...}) }, handler)`\n */\nexport function createEndpoint<const TOptions extends AnyEndpointOptions, TResponse = any>(\n options: TOptions,\n handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function createEndpoint<const TOptions extends AnyEndpointOptions, TResponse = any>(\n path: string,\n options: TOptions,\n handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function createEndpoint<\n TBody extends AnySchema = never,\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n>(\n options: EndpointOptions<TBody, TQuery, THeaders, readonly []>,\n handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function createEndpoint<\n TBody extends AnySchema = never,\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n>(\n path: string,\n options: EndpointOptions<TBody, TQuery, THeaders, readonly []>,\n handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function createEndpoint(\n pathOrOptions:\n | string\n | EndpointOptions<any, any, any, readonly AnyEndpointMiddleware[], EndpointErrorDefinitions>,\n optionsOrHandler:\n | EndpointOptions<any, any, any, readonly AnyEndpointMiddleware[], EndpointErrorDefinitions>\n | EndpointHandler<any, any, any, any, any, EndpointErrorDefinitions>,\n maybeHandler?: EndpointHandler<any, any, any, any, any, EndpointErrorDefinitions>,\n): TypedEndpoint<any, any, any, any> {\n // Determine if first arg is path or options\n let path: string;\n let options: EndpointOptions<\n any,\n any,\n any,\n readonly AnyEndpointMiddleware[],\n EndpointErrorDefinitions\n >;\n let handler: EndpointHandler<any, any, any, any, any, EndpointErrorDefinitions>;\n\n if (typeof pathOrOptions === \"string\") {\n // createEndpoint('/path', options, handler)\n path = pathOrOptions;\n options = optionsOrHandler as typeof options;\n handler = maybeHandler as typeof handler;\n } else {\n // createEndpoint(options, handler) - path will be set by API plugin from file location\n path = \"\";\n options = pathOrOptions;\n handler = optionsOrHandler as typeof handler;\n }\n\n if (typeof handler !== \"function\") {\n throw new TypeError(\"createEndpoint requires a handler function\");\n }\n\n const middleware = normalizeEndpointMiddleware(options.middleware);\n const errors = normalizeEndpointErrors(options.errors);\n const error = createEndpointErrorHandler(errors);\n const wrappedHandler = (async (ctx: EndpointMiddlewareContext<any, any, any, any>) => {\n const execution = await runEndpointMiddleware(\n middleware,\n ctx,\n handler,\n error,\n options.invalidates,\n );\n return execution.result;\n }) as typeof handler;\n const {\n middleware: _middleware,\n errors: _errors,\n invalidates: _invalidates,\n ...betterCallOptions\n } = options;\n\n // Create the endpoint - path will be set later by API plugin if not provided\n // We use a temporary path that will be replaced when the router is created\n const endpoint = betterCallEndpoint(\n path || \"/__farm_auto_path__\",\n betterCallOptions as any,\n wrappedHandler as any,\n ) as any;\n\n // Store the path and type information on the endpoint for later access\n // Empty/undefined path means it will be inferred from file location by the API plugin\n endpoint.__path = path || undefined;\n endpoint.__method = options.method || \"GET\";\n endpoint.__autoPath = !path; // Flag to indicate path should be auto-inferred\n endpoint.__handler = wrappedHandler; // Used by Farm's route runtime.\n endpoint.__farmInvoke = (ctx: EndpointMiddlewareContext<any, any, any, any>) =>\n runEndpointMiddleware(middleware, ctx, handler, error, options.invalidates);\n endpoint.__middleware = middleware;\n endpoint.__sourceHandler = handler;\n endpoint.__invalidates = options.invalidates;\n endpoint.__errors = errors;\n\n // Store type information for inference\n endpoint.__types = {\n body: options.body,\n inputBody: isMultipartSchema(options.body) ? \"form-data\" : options.body,\n query: options.query,\n inputQuery: options.query,\n headers: options.headers,\n response: null as any,\n errors,\n };\n\n return endpoint as any;\n}\n\nconst EMPTY_ENDPOINT_MIDDLEWARE = Object.freeze([]) as readonly AnyEndpointMiddleware[];\nconst EMPTY_ENDPOINT_CONTEXT = Object.freeze(Object.create(null)) as Readonly<\n Record<string | symbol, unknown>\n>;\nconst UNSAFE_ENDPOINT_CONTEXT_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nfunction normalizeEndpointErrors(\n definitions: EndpointErrorDefinitions | undefined,\n): Readonly<EndpointErrorDefinitions> {\n if (definitions === undefined) return Object.freeze({});\n if (!isPlainEndpointContext(definitions)) {\n throw new TypeError(\"createEndpoint errors must be an object\");\n }\n\n const normalized: EndpointErrorDefinitions = Object.create(null);\n for (const [code, definition] of Object.entries(definitions)) {\n if (!code.trim()) {\n throw new TypeError(\"Endpoint error codes cannot be empty\");\n }\n if (!definition || typeof definition !== \"object\") {\n throw new TypeError(`Endpoint error \"${code}\" must be an object`);\n }\n if (\n !Number.isInteger(definition.status) ||\n definition.status < 400 ||\n definition.status > 599\n ) {\n throw new TypeError(`Endpoint error \"${code}\" status must be an integer between 400 and 599`);\n }\n const dataSchema = resolveEndpointErrorSchema(definition);\n if (!dataSchema || typeof dataSchema.parse !== \"function\") {\n throw new TypeError(`Endpoint error \"${code}\" requires a data schema with parse()`);\n }\n if (definition.message !== undefined && typeof definition.message !== \"string\") {\n throw new TypeError(`Endpoint error \"${code}\" message must be a string`);\n }\n\n normalized[code] = Object.freeze({ ...definition });\n }\n\n return Object.freeze(normalized);\n}\n\nfunction resolveEndpointErrorSchema(\n definition: EndpointErrorDefinition<EndpointErrorSchema, number>,\n): EndpointErrorSchema | undefined {\n if (definition.data && definition.schema) {\n throw new TypeError(\"Endpoint errors cannot define both data and schema\");\n }\n return definition.data ?? definition.schema;\n}\n\nfunction createEndpointErrorHandler(\n definitions: Readonly<EndpointErrorDefinitions>,\n): EndpointErrorHandler<EndpointErrorDefinitions> {\n return ((code: string, data: unknown): never => {\n const definition = definitions[code];\n if (!definition) {\n throw new TypeError(`Endpoint error \"${code}\" is not declared`);\n }\n\n const parsed = resolveEndpointErrorSchema(definition)!.parse(data);\n throw new EndpointFailure(code, parsed, {\n status: definition.status,\n message: definition.message ?? \"Request failed\",\n });\n }) as EndpointErrorHandler<EndpointErrorDefinitions>;\n}\n\nfunction normalizeEndpointMiddleware(\n middleware: readonly AnyEndpointMiddleware[] | undefined,\n): readonly AnyEndpointMiddleware[] {\n if (middleware === undefined) return EMPTY_ENDPOINT_MIDDLEWARE;\n if (!Array.isArray(middleware)) {\n throw new TypeError(\"createEndpoint middleware must be an array of functions\");\n }\n\n const normalized = [...middleware];\n for (const entry of normalized) {\n if (typeof entry !== \"function\") {\n throw new TypeError(\"createEndpoint middleware entries must be functions\");\n }\n }\n\n return Object.freeze(normalized);\n}\n\nasync function runEndpointMiddleware(\n middleware: readonly AnyEndpointMiddleware[],\n handlerContext: EndpointMiddlewareContext<any, any, any, any>,\n handler: EndpointHandler<any, any, any, any, any, EndpointErrorDefinitions>,\n error: EndpointErrorHandler<EndpointErrorDefinitions>,\n invalidations: EndpointInvalidations<any, any, any, any> | undefined,\n): Promise<{\n result: unknown;\n context: Readonly<Record<string | symbol, unknown>>;\n handlerExecuted: boolean;\n invalidations: readonly string[];\n}> {\n let context = createInitialEndpointContext(handlerContext.context);\n\n for (let index = 0; index < middleware.length; index++) {\n const result = await middleware[index]({ ...handlerContext, context });\n\n if (isEndpointResponse(result)) {\n return {\n result,\n context,\n handlerExecuted: false,\n invalidations: [],\n };\n }\n if (result === false) {\n return {\n result: forbiddenEndpointResponse(),\n context,\n handlerExecuted: false,\n invalidations: [],\n };\n }\n if (result === true) continue;\n\n if (!isPlainEndpointContext(result)) {\n throw new TypeError(\n `Endpoint middleware ${index + 1} must return an object, true, false, or a Response`,\n );\n }\n\n context = mergeEndpointContext(context, result, index);\n }\n\n const result = await handler({ ...handlerContext, context, error, fail: error });\n return {\n result,\n context,\n handlerExecuted: true,\n invalidations: await applyEndpointInvalidations(\n invalidations,\n {\n ...handlerContext,\n context,\n result,\n },\n result,\n ),\n };\n}\n\nasync function applyEndpointInvalidations(\n declaration: EndpointInvalidations<any, any, any, any> | undefined,\n context: EndpointInvalidationContext<any, any, any, any>,\n result: unknown,\n): Promise<readonly string[]> {\n if (!declaration || (isEndpointResponse(result) && result.status >= 400)) {\n return [];\n }\n\n const targets = typeof declaration === \"function\" ? await declaration(context) : declaration;\n if (!Array.isArray(targets)) {\n throw new TypeError(\n \"Endpoint invalidates must resolve to an array of { key }, { path }, or { tag } targets\",\n );\n }\n\n return applyFarmCacheInvalidationTargets(targets);\n}\n\nfunction createInitialEndpointContext(value: unknown) {\n if (value === undefined || value === null) return EMPTY_ENDPOINT_CONTEXT;\n if (!isPlainEndpointContext(value)) {\n throw new TypeError(\"Endpoint context must be a plain object\");\n }\n\n return mergeEndpointContext(EMPTY_ENDPOINT_CONTEXT, value);\n}\n\nfunction mergeEndpointContext(\n current: Readonly<Record<string | symbol, unknown>>,\n added: object,\n middlewareIndex?: number,\n) {\n const next = Object.assign(Object.create(null), current) as Record<string | symbol, unknown>;\n\n for (const key of Reflect.ownKeys(added)) {\n if (!Object.prototype.propertyIsEnumerable.call(added, key)) continue;\n if (typeof key === \"string\" && UNSAFE_ENDPOINT_CONTEXT_KEYS.has(key)) {\n throw new TypeError(`Endpoint middleware cannot provide the unsafe context key \"${key}\"`);\n }\n if (Object.prototype.hasOwnProperty.call(current, key)) {\n const source =\n middlewareIndex === undefined\n ? \"Endpoint context\"\n : `Endpoint middleware ${middlewareIndex + 1}`;\n throw new TypeError(`${source} cannot replace the existing context key \"${String(key)}\"`);\n }\n next[key] = (added as Record<string | symbol, unknown>)[key];\n }\n\n return Object.freeze(next);\n}\n\nfunction isPlainEndpointContext(value: unknown): value is object {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction isEndpointResponse(value: unknown): value is Response {\n return (\n value instanceof Response ||\n (typeof value === \"object\" &&\n value !== null &&\n \"headers\" in value &&\n \"status\" in value &&\n typeof (value as Response).arrayBuffer === \"function\")\n );\n}\n\nfunction forbiddenEndpointResponse() {\n return new Response(JSON.stringify({ error: \"Forbidden\" }), {\n status: 403,\n headers: { \"Content-Type\": \"application/json\" },\n });\n}\n\n/**\n * Convenience method for GET requests\n */\nexport function GET<T = any>(\n handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function GET<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n options: TOptions,\n handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function GET<\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n>(\n options: Omit<EndpointOptions<never, TQuery, THeaders, readonly []>, \"method\">,\n handler: EndpointHandler<never, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<never, TQuery, THeaders, TResponse>;\nexport function GET(...args: any[]): any {\n if (args.length === 1) {\n return createEndpoint(\"\", { method: \"GET\" }, args[0]);\n }\n return createEndpoint(\"\", { ...args[0], method: \"GET\" }, args[1]);\n}\n\n/**\n * Convenience method for HEAD requests\n */\nexport function HEAD<T = any>(\n handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function HEAD<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n options: TOptions,\n handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function HEAD<\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n>(\n options: Omit<EndpointOptions<never, TQuery, THeaders, readonly []>, \"method\">,\n handler: EndpointHandler<never, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<never, TQuery, THeaders, TResponse>;\nexport function HEAD(...args: any[]): any {\n if (args.length === 1) {\n return createEndpoint(\"\", { method: \"HEAD\" }, args[0]);\n }\n return createEndpoint(\"\", { ...args[0], method: \"HEAD\" }, args[1]);\n}\n\n/**\n * Convenience method for safe, idempotent QUERY requests with a request body\n */\nexport function QUERY<T = any>(\n handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function QUERY<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n options: TOptions,\n handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function QUERY<\n TBody extends AnySchema = never,\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n>(\n options: Omit<EndpointOptions<TBody, TQuery, THeaders, readonly []>, \"method\">,\n handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function QUERY(...args: any[]): any {\n if (args.length === 1) {\n return createEndpoint(\"\", { method: \"QUERY\" }, args[0]);\n }\n return createEndpoint(\"\", { ...args[0], method: \"QUERY\" }, args[1]);\n}\n\n/**\n * Convenience method for POST requests\n */\nexport function POST<T = any>(\n handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function POST<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n options: TOptions,\n handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function POST<\n TBody extends AnySchema = never,\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n>(\n options: Omit<EndpointOptions<TBody, TQuery, THeaders, readonly []>, \"method\">,\n handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function POST(...args: any[]): any {\n if (args.length === 1) {\n return createEndpoint(\"\", { method: \"POST\" }, args[0]);\n }\n return createEndpoint(\"\", { ...args[0], method: \"POST\" }, args[1]);\n}\n\n/**\n * Convenience method for PUT requests\n */\nexport function PUT<T = any>(\n handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function PUT<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n options: TOptions,\n handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function PUT<\n TBody extends AnySchema = never,\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n>(\n options: Omit<EndpointOptions<TBody, TQuery, THeaders, readonly []>, \"method\">,\n handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function PUT(...args: any[]): any {\n if (args.length === 1) {\n return createEndpoint(\"\", { method: \"PUT\" }, args[0]);\n }\n return createEndpoint(\"\", { ...args[0], method: \"PUT\" }, args[1]);\n}\n\n/**\n * Convenience method for DELETE requests\n */\nexport function DELETE<T = any>(\n handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function DELETE<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n options: TOptions,\n handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function DELETE<\n TBody extends AnySchema = never,\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n>(\n options: Omit<EndpointOptions<TBody, TQuery, THeaders, readonly []>, \"method\">,\n handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function DELETE(...args: any[]): any {\n if (args.length === 1) {\n return createEndpoint(\"\", { method: \"DELETE\" }, args[0]);\n }\n return createEndpoint(\"\", { ...args[0], method: \"DELETE\" }, args[1]);\n}\n\n/**\n * Convenience method for PATCH requests\n */\nexport function PATCH<T = any>(\n handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function PATCH<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n options: TOptions,\n handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function PATCH<\n TBody extends AnySchema = never,\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n>(\n options: Omit<EndpointOptions<TBody, TQuery, THeaders, readonly []>, \"method\">,\n handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function PATCH(...args: any[]): any {\n if (args.length === 1) {\n return createEndpoint(\"\", { method: \"PATCH\" }, args[0]);\n }\n return createEndpoint(\"\", { ...args[0], method: \"PATCH\" }, args[1]);\n}\n\n/**\n * Convenience method for OPTIONS requests\n */\nexport function OPTIONS<T = any>(\n handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function OPTIONS<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n options: TOptions,\n handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function OPTIONS<\n TBody extends AnySchema = never,\n TQuery extends AnySchema = never,\n THeaders extends AnySchema = never,\n TResponse = any,\n>(\n options: Omit<EndpointOptions<TBody, TQuery, THeaders, readonly []>, \"method\">,\n handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function OPTIONS(...args: any[]): any {\n if (args.length === 1) {\n return createEndpoint(\"\", { method: \"OPTIONS\" }, args[0]);\n }\n return createEndpoint(\"\", { ...args[0], method: \"OPTIONS\" }, args[1]);\n}\n","/** Server-only schema contract shared by declarative routes and the API runtime. */\nexport interface RouteSchema {\n readonly _input?: unknown;\n readonly _output?: unknown;\n parse?: (value: unknown) => unknown;\n parseAsync?: (value: unknown) => Promise<unknown>;\n readonly \"~standard\"?: {\n readonly types?: { input: unknown; output: unknown };\n validate(value: unknown): unknown;\n };\n}\n\nexport type RouteSchemaInput<T> = T extends { _input: infer I }\n ? I\n : T extends { \"~standard\": { types?: { input: infer I } } }\n ? I\n : unknown;\n\nexport type RouteSchemaOutput<T> = T extends { _output: infer O }\n ? O\n : T extends { \"~standard\": { types?: { output: infer O } } }\n ? O\n : T extends { parse: (...args: any[]) => infer O }\n ? Awaited<O>\n : unknown;\n\nexport async function parseRouteSchema(schema: RouteSchema, value: unknown): Promise<unknown> {\n if (schema[\"~standard\"]) {\n const result = (await schema[\"~standard\"].validate(value)) as {\n value?: unknown;\n issues?: readonly unknown[];\n };\n if (result.issues)\n throw Object.assign(new Error(\"Validation failed\"), { issues: result.issues });\n return result.value;\n }\n if (schema.parseAsync) return schema.parseAsync(value);\n if (schema.parse) return schema.parse(value);\n throw new TypeError(\"Route validators must implement Standard Schema or parse().\");\n}\n","import {\n createEndpoint,\n type TypedEndpoint,\n type AnyEndpointMiddleware,\n type EndpointMiddlewareResult,\n type InferEndpointMiddlewareContext,\n} from \"./endpoint\";\nimport {\n assertBrowserStableRoutePath,\n assertUniqueRouteParameters,\n getRoutePatternShape,\n} from \"../routing/specificity\";\nimport type { RouteSchema, RouteSchemaInput, RouteSchemaOutput } from \"./route-schema\";\n\nexport type RouteMethod =\n | \"GET\"\n | \"HEAD\"\n | \"QUERY\"\n | \"POST\"\n | \"PUT\"\n | \"PATCH\"\n | \"DELETE\"\n | \"OPTIONS\";\nexport type RoutePathParams<Path extends string> = Path extends `${infer Head}/${infer Tail}`\n ? RoutePathParams<Head> & RoutePathParams<Tail>\n : Path extends `[[...${infer Name}]]`\n ? { [K in Name]?: string[] }\n : Path extends `[...${infer Name}]`\n ? { [K in Name]: string[] }\n : Path extends `[${infer Name}]`\n ? { [K in Name]: string }\n : {};\n\nexport interface RouteInputSchemas {\n body?: RouteSchema;\n query?: RouteSchema;\n params?: RouteSchema;\n headers?: RouteSchema;\n}\ntype Input<I, K extends PropertyKey> = K extends keyof I ? RouteSchemaInput<I[K]> : never;\ntype Output<I, K extends PropertyKey, Fallback = unknown> = K extends keyof I\n ? RouteSchemaOutput<I[K]>\n : Fallback;\n/** JSON responses have wire types, not server-side instances such as Date. */\nexport type RouteJSON<T> = T extends Response\n ? unknown\n : T extends { toJSON(): infer J }\n ? RouteJSON<J>\n : T extends bigint | symbol | ((...args: any[]) => any)\n ? never\n : T extends readonly (infer V)[]\n ? RouteJSON<V>[]\n : T extends object\n ? { [K in keyof T]: RouteJSON<T[K]> }\n : T;\n\nexport type RouteDefinition<\n P extends string = string,\n M extends RouteMethod = RouteMethod,\n E = any,\n> = {\n readonly path: P;\n readonly method: M;\n readonly endpoint: E;\n};\n\ntype RouteEndpoint<P extends string, I extends RouteInputSchemas, R> = TypedEndpoint<\n Output<I, \"body\">,\n Input<I, \"query\">,\n RouteJSON<R>,\n Input<I, \"headers\">,\n never,\n Input<I, \"body\">\n> & {\n __types: { params: RoutePathParams<P>; inputHeaders: Input<I, \"headers\"> };\n};\n\ntype TrimStart<P extends string> = P extends `/${infer Rest}` ? TrimStart<Rest> : P;\ntype Join<P extends string, C extends string> = C extends \"\" ? P : `${P}/${TrimStart<C>}`;\ntype ParamsCheck<P extends string, I extends RouteInputSchemas> = I extends { params: infer S }\n ? Exclude<keyof RoutePathParams<P>, keyof RouteSchemaOutput<S>> extends never\n ? Exclude<keyof RouteSchemaOutput<S>, keyof RoutePathParams<P>> extends never\n ? unknown\n : { __error_unknown_route_params: never }\n : { __error_missing_route_params: never }\n : unknown;\n\ntype RouteMiddlewareResults = readonly (\n | EndpointMiddlewareResult\n | Promise<EndpointMiddlewareResult>\n)[];\n// Infer callback results directly so inline middleware is contextually typed before\n// its returned context is exposed to the route handler.\ntype RouteMiddlewares<Results extends readonly unknown[]> = {\n readonly [K in keyof Results]: (context: Parameters<AnyEndpointMiddleware>[0]) => Results[K];\n};\n\nexport type RouteOptions<\n P extends string,\n I extends RouteInputSchemas,\n O extends RouteSchema | undefined,\n R,\n MiddlewareResults extends RouteMiddlewareResults = RouteMiddlewareResults,\n> = {\n input?: I & ParamsCheck<P, I>;\n /** Validate plain JSON handler results. Raw Response/stream results are never buffered. */\n output?: O;\n middleware?: RouteMiddlewares<MiddlewareResults>;\n handler(\n request: Request,\n context: {\n input: {\n body: Output<I, \"body\">;\n query: Output<I, \"query\", Record<string, string | string[]>>;\n headers: Output<I, \"headers\", Record<string, string>>;\n params: Output<I, \"params\", RoutePathParams<P>>;\n };\n params: Output<I, \"params\", RoutePathParams<P>>;\n context: Readonly<InferEndpointMiddlewareContext<RouteMiddlewares<MiddlewareResults>>>;\n },\n ): R | Promise<R>;\n};\n\ntype RouteBuilder<P extends string, M extends RouteMethod> = <\n const C extends string,\n const MiddlewareResults extends RouteMiddlewareResults,\n const I extends RouteInputSchemas = {},\n O extends RouteSchema | undefined = undefined,\n R = unknown,\n>(\n path: C,\n options: RouteOptions<Join<P, C>, I, O, R, MiddlewareResults>,\n) => RouteDefinition<\n Join<P, C>,\n M,\n RouteEndpoint<\n Join<P, C>,\n I,\n Extract<Awaited<R>, Response> extends never\n ? O extends RouteSchema\n ? RouteSchemaOutput<O>\n : Awaited<R>\n : unknown\n >\n>;\n\nexport type RouteFactory<P extends string = \"\"> = {\n [M in Lowercase<RouteMethod>]: RouteBuilder<P, Uppercase<M> & RouteMethod>;\n} & {\n /** Return a new builder; never mutate the parent scope. */\n scope<const C extends string>(path: C): RouteFactory<Join<P, C>>;\n};\n\nexport type PluginRoutes = readonly RouteDefinition[];\nexport type PluginRoutesFactory<R extends PluginRoutes = PluginRoutes> = (context: {\n route: RouteFactory;\n}) => R;\n\nexport function createRouteFactory(): RouteFactory {\n return createRouteFactoryAt(\"\");\n}\n\nfunction createRouteFactoryAt(prefix: string): RouteFactory {\n const factory: Record<string, unknown> = {\n scope(child: string) {\n return createRouteFactoryAt(joinRoutePath(prefix, child));\n },\n };\n for (const method of [\n \"GET\",\n \"HEAD\",\n \"QUERY\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"OPTIONS\",\n ] as const) {\n factory[method.toLowerCase()] = (\n child: string,\n options: RouteOptions<string, any, any, any>,\n ) => {\n const path = joinRoutePath(prefix, child);\n const input = options.input ?? {};\n const endpoint = createEndpoint(\n path,\n {\n method,\n body: input.body,\n query: input.query,\n headers: input.headers,\n middleware: options.middleware,\n },\n (ctx) =>\n options.handler(ctx.request, {\n input: { body: ctx.body, query: ctx.query, headers: ctx.headers, params: ctx.params },\n params: ctx.params,\n context: ctx.context,\n }),\n ) as any;\n endpoint.__types.params = input.params;\n endpoint.__output = options.output;\n return Object.freeze({ path, method, endpoint });\n };\n }\n return Object.freeze(factory) as RouteFactory;\n}\n\nfunction joinRoutePath(prefix: string, child: string): string {\n if (typeof child !== \"string\") throw new TypeError(\"Route paths must be strings.\");\n const path = child === \"\" ? prefix : `${prefix}/${child.replace(/^\\//, \"\")}`;\n if (!(path === \"/api\" || path.startsWith(\"/api/\")) || /[?#]|\\/\\/|\\/$/.test(path)) {\n throw new TypeError(\n `Plugin route \"${path}\" must be a canonical /api path without a query, hash, or empty segment.`,\n );\n }\n assertBrowserStableRoutePath(path);\n assertUniqueRouteParameters(path, \"api\");\n getRoutePatternShape(path, \"api\");\n for (const segment of path.split(\"/\")) {\n if ([\"__proto__\", \"constructor\", \"prototype\", \"$params\"].includes(segment)) {\n throw new TypeError(`Route segment \"${segment}\" is reserved.`);\n }\n }\n return path;\n}\n\ntype UnionToIntersection<U> = (U extends unknown ? (v: U) => void : never) extends (\n v: infer I,\n) => void\n ? I\n : never;\ntype RouteTree<P extends string, M extends string, E> = P extends `${infer Head}/${infer Tail}`\n ? { [K in Head]: RouteTree<Tail, M, E> }\n : P extends \"\"\n ? { [K in Lowercase<M>]: E }\n : { [K in P]: { [Method in Lowercase<M>]: E } };\ntype HasMethodSegment<P extends string> = P extends `${infer H}/${infer T}`\n ? H extends Lowercase<RouteMethod>\n ? true\n : HasMethodSegment<T>\n : P extends Lowercase<RouteMethod>\n ? true\n : false;\ntype DefinitionTree<D> =\n D extends RouteDefinition<infer P, infer M, infer E>\n ? string extends P\n ? {}\n : (P extends `/api/integrations${string}` ? true : HasMethodSegment<P>) extends true\n ? { [K in P extends `/api/${infer C}` ? `/${C}` : \"/\"]: { [Method in Lowercase<M>]: E } }\n : RouteTree<P extends `/api/${infer C}` ? C : \"\", M, E>\n : {};\nexport type PluginAPIRouter<C> = C extends { plugins: readonly (infer P)[] }\n ? UnionToIntersection<\n P extends { routes?: PluginRoutesFactory<infer R> } ? DefinitionTree<R[number]> : {}\n >\n : {};\n\nexport function resolvePluginRoutes(\n plugins: readonly { name: string; routes?: PluginRoutesFactory }[] = [],\n): PluginRoutes {\n return plugins.flatMap((plugin) => {\n if (!plugin.routes) return [];\n const routes = plugin.routes({ route: createRouteFactory() });\n if (!Array.isArray(routes))\n throw new TypeError(`Plugin \"${plugin.name}\" routes must return an array synchronously.`);\n for (const route of routes) {\n if (\n !route ||\n joinRoutePath(\"\", route.path) !== route.path ||\n typeof route.endpoint !== \"function\" ||\n ![\"GET\", \"HEAD\", \"QUERY\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"OPTIONS\"].includes(\n route.method,\n )\n ) {\n throw new TypeError(`Plugin \"${plugin.name}\" returned an invalid API route.`);\n }\n }\n return routes;\n });\n}\n","import { resolvePluginRoutes, type PluginRoutesFactory } from \"./route\";\nimport { registerAPIRouteShape } from \"./route-shape\";\n\ninterface MountedRoute {\n path: string;\n methods: string[];\n endpoints: Record<string, any>;\n filePath?: string;\n pluginMethods?: string[];\n}\n\n/** The same registration step is used by dev discovery and the production bundle. */\nexport function mergePluginAPIRoutes(\n existing: readonly MountedRoute[],\n plugins: readonly { name: string; routes?: PluginRoutesFactory }[],\n expected?: readonly { path: string; methods: readonly string[] }[],\n): Array<MountedRoute & { filePath: string }> {\n const routes = new Map<string, MountedRoute & { filePath: string }>();\n const shapes = new Map();\n for (const route of existing) {\n registerAPIRouteShape(shapes, route.path, route.filePath || route.path, \"app\");\n routes.set(route.path, {\n ...route,\n filePath: route.filePath || \"\",\n methods: [...route.methods],\n endpoints: { ...route.endpoints },\n });\n }\n for (const definition of resolvePluginRoutes(plugins)) {\n registerAPIRouteShape(shapes, definition.path, `plugin:${definition.path}`, \"app\");\n let route = routes.get(definition.path);\n if (route?.methods.includes(definition.method)) {\n throw new Error(\n `Duplicate API route for ${definition.method} ${definition.path}. Plugin routes cannot override app or other plugin endpoints.`,\n );\n }\n if (!route) {\n route = { path: definition.path, filePath: \"\", methods: [], endpoints: {} };\n routes.set(definition.path, route);\n }\n route.methods.push(definition.method);\n route.pluginMethods = [...(route.pluginMethods ?? []), definition.method];\n route.endpoints[definition.method] = definition.endpoint;\n }\n const result = [...routes.values()];\n if (expected) {\n const signature = (entries: readonly { path: string; methods: readonly string[] }[]) =>\n entries\n .map(({ path, methods }) => `${path}:${[...methods].sort().join(\",\")}`)\n .sort()\n .join(\"\\n\");\n if (signature(result) !== signature(expected)) {\n throw new Error(\n \"Plugin API routes changed between build and runtime. Route paths and methods must be stable across environments; rebuild the app.\",\n );\n }\n }\n return result;\n}\n","import { _runWithCurrentRequest } from \"../server/request\";\nimport {\n decodeFarmCacheInvalidations,\n encodeFarmCacheInvalidations,\n FARM_CACHE_INVALIDATION_HEADER,\n} from \"../cache-invalidation\";\nimport { isEndpointFailure, type EndpointFailure } from \"./endpoint\";\nimport {\n bufferFarmRequestBody,\n createFarmRequestBodyErrorResponse,\n DEFAULT_FARM_SERVER_BODY_SIZE_LIMIT,\n} from \"../server-http\";\nimport { DEFAULT_FARM_API_BASE_PATH, normalizeFarmAPIBasePath } from \"./config\";\nimport { resolveFarmAPICanonicalPathname } from \"./server-path\";\nimport { parseRouteSchema } from \"./route-schema\";\nimport { omitFarmResponseBody } from \"../response-body\";\n\nexport { registerAPIRouteShape, type APIRouteShapeSource } from \"./route-shape\";\nexport { mergePluginAPIRoutes } from \"./plugin-route-runtime\";\n\nexport {\n matchAPIRoute,\n type APIRouteParams,\n type APIRouteParamValue,\n type APIRouteMatch,\n} from \"./route-pattern\";\nimport { matchAPIRoute, type APIRouteParams, type APIRouteMatch } from \"./route-pattern\";\ninterface APIRouteMethodTable {\n methods: string[];\n endpoints: Record<string, any>;\n}\n\nexport function resolveAPIRouteEndpoint(\n route: APIRouteMethodTable,\n method: string,\n): any | undefined {\n const normalizedMethod = method.toUpperCase();\n return (\n route.endpoints[normalizedMethod] ??\n (normalizedMethod === \"HEAD\" ? route.endpoints.GET : undefined)\n );\n}\n\nexport function getAllowedAPIRouteMethods(route: APIRouteMethodTable): string[] {\n const methods = [...route.methods];\n const getIndex = methods.indexOf(\"GET\");\n if (getIndex >= 0 && !methods.includes(\"HEAD\")) {\n methods.splice(getIndex + 1, 0, \"HEAD\");\n }\n return methods;\n}\n\n/** Match canonical routes through a configurable same-origin public API path. */\nexport function matchAPIRouteAtBasePath<T extends { path: string }>(\n routes: Map<string, T>,\n pathname: string,\n serverBasePath = DEFAULT_FARM_API_BASE_PATH,\n): APIRouteMatch<T> | null {\n const directMatch = matchAPIRoute(routes, pathname);\n if (directMatch) return directMatch;\n\n const canonicalPathname = resolveFarmAPICanonicalPathname(pathname, serverBasePath);\n return canonicalPathname === pathname ? null : matchAPIRoute(routes, canonicalPathname);\n}\n\n/** Test whether a pathname belongs to the configured local API surface. */\nexport function isFarmAPIPathname(\n pathname: string,\n serverBasePath = DEFAULT_FARM_API_BASE_PATH,\n): boolean {\n const basePath = normalizeFarmAPIBasePath(serverBasePath);\n return basePath !== \"/\" && (pathname === basePath || pathname.startsWith(`${basePath}/`));\n}\n\nexport async function invokeAPIRouteEndpoint(\n endpoint: any,\n request: Request,\n params: APIRouteParams = {},\n bodySizeLimit = DEFAULT_FARM_SERVER_BODY_SIZE_LIMIT,\n): Promise<Response> {\n try {\n request = await bufferFarmRequestBody(request, bodySizeLimit);\n } catch (error) {\n const response = createFarmRequestBodyErrorResponse(error);\n if (response) return response;\n throw error;\n }\n\n const response = await _runWithCurrentRequest(request, () =>\n invokeAPIRouteEndpointInContext(endpoint, request, params),\n );\n\n if (request.method.toUpperCase() !== \"HEAD\") {\n return response;\n }\n\n return omitFarmResponseBody(response);\n}\n\nasync function invokeAPIRouteEndpointInContext(\n endpoint: any,\n request: Request,\n params: APIRouteParams,\n): Promise<Response> {\n const queryContentTypeError = validateQueryContentType(request);\n if (queryContentTypeError) {\n return queryContentTypeError;\n }\n\n // `createEndpoint` brands its parsed-context handler explicitly. Plain route\n // exports always receive the Web Request regardless of their parameter name;\n // inferring a calling convention from `Function#toString()` misclassified\n // valid handlers named `context`, `ctx`, or using destructuring.\n const farmHandler = endpoint.__handler || null;\n\n if (!farmHandler) {\n const result = await endpoint(request, {\n params: Promise.resolve(params),\n });\n return normalizeRouteResponse(result);\n }\n\n const url = new URL(request.url);\n // Repeated keys collect into arrays, the same representation the rest of the\n // framework hands to routes, and the same helper this path already uses for\n // urlencoded and multipart bodies. Spread back onto a normal object so an\n // endpoint without a query schema still receives the object shape it did\n // before; `entriesToObject` has already dropped the prototype-poisoning keys.\n const query: Record<string, string | string[]> = {\n ...searchParamsToObject(url.searchParams),\n };\n\n let body: any = undefined;\n if (request.method.toUpperCase() !== \"GET\" && request.method.toUpperCase() !== \"HEAD\") {\n const parsedBody = await readRequestBody(request);\n if (parsedBody.error) return parsedBody.error;\n body = parsedBody.body;\n }\n\n const headers = Object.fromEntries(request.headers.entries());\n const types = endpoint.__types || {};\n\n const queryValidation = await validateInput(types.query, query, \"Invalid query parameters\");\n if (queryValidation instanceof Response) {\n return queryValidation;\n }\n\n const bodyValidation = await validateInput(types.body, body, \"Invalid request body\");\n if (bodyValidation instanceof Response) {\n return bodyValidation;\n }\n\n const headersValidation = await validateInput(types.headers, headers, \"Invalid request headers\");\n if (headersValidation instanceof Response) {\n return headersValidation;\n }\n\n const paramsValidation = await validateInput(types.params, params, \"Invalid route parameters\");\n if (paramsValidation instanceof Response) return paramsValidation;\n\n const handlerContext = {\n query: queryValidation,\n body: bodyValidation,\n headers: headersValidation,\n request,\n context: {},\n params: paramsValidation,\n };\n let execution: {\n result: unknown;\n context: unknown;\n handlerExecuted: boolean;\n invalidations: readonly string[];\n };\n try {\n execution =\n typeof endpoint.__farmInvoke === \"function\"\n ? await endpoint.__farmInvoke(handlerContext)\n : {\n result: await farmHandler(handlerContext),\n context: handlerContext.context,\n handlerExecuted: true,\n invalidations: [],\n };\n } catch (error) {\n if (isEndpointFailure(error)) {\n return createEndpointFailureResponse(error);\n }\n throw error;\n }\n\n if (execution.handlerExecuted && endpoint.__output && !isWebResponse(execution.result)) {\n try {\n execution.result = await parseRouteSchema(endpoint.__output, execution.result);\n } catch {\n throw new Error(\"API route returned a value that does not match its output schema.\");\n }\n }\n const response = normalizeRouteResponse(execution.result);\n return attachEndpointInvalidations(response, execution.invalidations);\n}\n\nfunction validateQueryContentType(request: Request): Response | null {\n if (request.method.toUpperCase() !== \"QUERY\" || request.headers.has(\"content-type\")) {\n return null;\n }\n\n return new Response(\n JSON.stringify({\n error: \"Invalid QUERY request\",\n message: \"QUERY requests must include a Content-Type header.\",\n }),\n {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n}\n\nexport function normalizeRouteResponse(result: unknown): Response {\n if (isWebResponse(result)) {\n return result;\n }\n\n if (result === undefined) {\n return new Response(null, { status: 204 });\n }\n\n return new Response(JSON.stringify(result), {\n status: 200,\n headers: { \"Content-Type\": \"application/json\" },\n });\n}\n\nexport function isWebResponse(value: unknown): value is Response {\n return (\n value instanceof Response ||\n (typeof value === \"object\" &&\n value !== null &&\n \"headers\" in value &&\n \"status\" in value &&\n typeof (value as Response).arrayBuffer === \"function\")\n );\n}\n\nfunction attachEndpointInvalidations(response: Response, keys: readonly string[]): Response {\n const existing = decodeFarmCacheInvalidations(\n response.headers.get(FARM_CACHE_INVALIDATION_HEADER),\n );\n const encoded = encodeFarmCacheInvalidations([...existing, ...keys]);\n if (!encoded) return response;\n\n const headers = new Headers(response.headers);\n headers.set(FARM_CACHE_INVALIDATION_HEADER, encoded);\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\nexport function createEndpointFailureResponse(failure: EndpointFailure<string, unknown>): Response {\n return new Response(\n JSON.stringify({\n error: {\n code: failure.code,\n message: failure.message,\n data: failure.data,\n },\n }),\n {\n status: failure.status,\n headers: {\n \"cache-control\": \"no-store\",\n \"content-type\": \"application/json\",\n },\n },\n );\n}\n\ninterface RequestBodyParseResult {\n body?: unknown;\n error?: Response;\n}\n\nasync function readRequestBody(request: Request): Promise<RequestBodyParseResult> {\n const contentType = request.headers.get(\"content-type\")?.split(\";\", 1)[0]?.trim().toLowerCase();\n\n try {\n if (contentType === \"multipart/form-data\") {\n return { body: formDataToObject(await request.clone().formData()) };\n }\n\n const text = await request.clone().text();\n if (!text) return { body: undefined };\n if (contentType === \"application/x-www-form-urlencoded\") {\n return { body: searchParamsToObject(new URLSearchParams(text)) };\n }\n if (contentType === \"application/json\" || contentType?.endsWith(\"+json\")) {\n return { body: JSON.parse(text) };\n }\n\n // Preserve the previous permissive behavior for callers that omit the\n // content type but still send JSON.\n return { body: JSON.parse(text) };\n } catch {\n if (contentType === \"application/json\" || contentType?.endsWith(\"+json\")) {\n return {\n error: new Response(\n JSON.stringify({\n error: \"Invalid request body\",\n message: \"The request body is not valid JSON.\",\n }),\n {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n },\n ),\n };\n }\n // The body format is unsupported or malformed. Schema validation below\n // will turn the missing value into a typed 400 response when applicable.\n }\n\n return { body: undefined };\n}\n\nfunction formDataToObject(\n formData: FormData,\n): Record<string, FormDataEntryValue | FormDataEntryValue[]> {\n return entriesToObject(formData.entries());\n}\n\nfunction searchParamsToObject(searchParams: URLSearchParams): Record<string, string | string[]> {\n return entriesToObject(searchParams.entries());\n}\n\nfunction entriesToObject<TValue>(\n entries: IterableIterator<[string, TValue]>,\n): Record<string, TValue | TValue[]> {\n const output: Record<string, TValue | TValue[]> = Object.create(null);\n for (const [key, value] of 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\nasync function validateInput(\n schema: any,\n value: unknown,\n error: string,\n): Promise<unknown | Response> {\n if (!schema) return value;\n try {\n return await parseRouteSchema(schema, value);\n } catch (validationError: any) {\n return Response.json(\n {\n error,\n details: (validationError.issues || validationError.errors || []).map((issue: any) => ({\n path: issue.path,\n message: issue.message,\n code: issue.code,\n })),\n },\n { status: 400 },\n );\n }\n}\n"],"mappings":"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","names":["result","response"]}
@@ -16,7 +16,7 @@ import {
16
16
  } from "./chunk-35SSRS5K.mjs";
17
17
  import {
18
18
  emitFarmEvent
19
- } from "./chunk-ZRBCBOEX.mjs";
19
+ } from "./chunk-N2FY2QZ7.mjs";
20
20
  import {
21
21
  resolveFarmRequestURL
22
22
  } from "./chunk-EDWCT2JF.mjs";
@@ -638,4 +638,4 @@ export {
638
638
  appendMiddlewareRoutePath,
639
639
  MiddlewareManager
640
640
  };
641
- //# sourceMappingURL=chunk-RWYRFCLG.mjs.map
641
+ //# sourceMappingURL=chunk-4X57GXQA.mjs.map
@@ -1,10 +1,11 @@
1
1
  import {
2
+ attachRevalidationListeners,
2
3
  createServerQueryCallKey,
3
4
  fetchServerQuery
4
- } from "./chunk-EXCGBERG.mjs";
5
+ } from "./chunk-WD2EBM3I.mjs";
5
6
  import {
6
7
  getFarmClientDataCache
7
- } from "./chunk-DLBUAJTK.mjs";
8
+ } from "./chunk-WMJGA32P.mjs";
8
9
  import {
9
10
  __name
10
11
  } from "./chunk-CGILA3WO.mjs";
@@ -17,19 +18,29 @@ function useServerQuery(query, input, options = {}) {
17
18
  const inputRef = useRef(input);
18
19
  const optionsRef = useRef(options);
19
20
  const mountedKeyRef = useRef(void 0);
21
+ const pendingInvalidationRef = useRef(false);
20
22
  inputRef.current = input;
21
23
  optionsRef.current = options;
22
24
  const subscribe = useCallback(
23
- (listener) => cache.subscribe(key, listener),
25
+ (listener) => cache.subscribe(key, (event) => {
26
+ if (event === "invalidate") pendingInvalidationRef.current = true;
27
+ else if (cache.get(key)?.fetching) {
28
+ pendingInvalidationRef.current = false;
29
+ }
30
+ listener();
31
+ }),
24
32
  [cache, key]
25
33
  );
26
34
  const getSnapshot = useCallback(() => cache.get(key), [cache, key]);
27
35
  const entry = useSyncExternalStore(subscribe, getSnapshot, () => void 0);
28
36
  const run = useCallback(
29
- (force = false) => fetchServerQuery(query, inputRef.current, {
30
- ...optionsRef.current,
31
- force
32
- }),
37
+ (force = false) => {
38
+ pendingInvalidationRef.current = false;
39
+ return fetchServerQuery(query, inputRef.current, {
40
+ ...optionsRef.current,
41
+ force
42
+ });
43
+ },
33
44
  [query]
34
45
  );
35
46
  useEffect(() => {
@@ -39,23 +50,21 @@ function useServerQuery(query, input, options = {}) {
39
50
  }
40
51
  const firstReadForKey = mountedKeyRef.current !== key;
41
52
  if (firstReadForKey) mountedKeyRef.current = key;
42
- if (firstReadForKey && (!entry || cache.isStale(key)) || entry?.invalidatedAt !== void 0 && !entry.fetching) {
53
+ if (firstReadForKey && (!entry || cache.isStale(key)) || pendingInvalidationRef.current && entry?.invalidatedAt !== void 0 && !entry.fetching) {
43
54
  void run().catch(() => void 0);
44
55
  }
45
56
  }, [cache, entry, key, options.enabled, run]);
46
57
  useEffect(() => {
47
- if (options.enabled === false || typeof window === "undefined") return;
48
- const refreshIfStale = /* @__PURE__ */ __name(() => {
49
- if (cache.isStale(key)) void run().catch(() => void 0);
50
- }, "refreshIfStale");
51
- const onFocus = options.refetchOnWindowFocus === false ? void 0 : refreshIfStale;
52
- const onOnline = options.refetchOnReconnect === false ? void 0 : refreshIfStale;
53
- if (onFocus) window.addEventListener("focus", onFocus);
54
- if (onOnline) window.addEventListener("online", onOnline);
55
- return () => {
56
- if (onFocus) window.removeEventListener("focus", onFocus);
57
- if (onOnline) window.removeEventListener("online", onOnline);
58
- };
58
+ if (options.enabled === false) return;
59
+ return attachRevalidationListeners(
60
+ () => {
61
+ if (cache.isStale(key)) void run().catch(() => void 0);
62
+ },
63
+ {
64
+ refetchOnWindowFocus: options.refetchOnWindowFocus,
65
+ refetchOnReconnect: options.refetchOnReconnect
66
+ }
67
+ );
59
68
  }, [cache, key, options.enabled, options.refetchOnReconnect, options.refetchOnWindowFocus, run]);
60
69
  const status = entry?.status ?? (entry ? "success" : "idle");
61
70
  const fetching = entry?.fetching ?? false;
@@ -74,4 +83,4 @@ __name(useServerQuery, "useServerQuery");
74
83
  export {
75
84
  useServerQuery
76
85
  };
77
- //# sourceMappingURL=chunk-KOTSX5JH.mjs.map
86
+ //# sourceMappingURL=chunk-52BR7LTX.mjs.map
@@ -0,0 +1 @@
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 { attachRevalidationListeners } from \"./client-revalidation\";\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 const pendingInvalidationRef = useRef(false);\n inputRef.current = input;\n optionsRef.current = options;\n\n const subscribe = useCallback(\n (listener: () => void) =>\n cache.subscribe(key, (event) => {\n if (event === \"invalidate\") pendingInvalidationRef.current = true;\n else if (cache.get(key)?.fetching) {\n // A shared read consumes this invalidation for every subscriber, even\n // when React batches its pending and error snapshots into one render.\n pendingInvalidationRef.current = false;\n }\n listener();\n }),\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 pendingInvalidationRef.current = false;\n return fetchServerQuery(query, inputRef.current, {\n ...optionsRef.current,\n force,\n });\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 (pendingInvalidationRef.current && 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) return;\n\n return attachRevalidationListeners(\n () => {\n if (cache.isStale(key)) void run().catch(() => undefined);\n },\n {\n refetchOnWindowFocus: options.refetchOnWindowFocus,\n refetchOnReconnect: options.refetchOnReconnect,\n },\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;AAsC9D,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,QAAM,yBAAyB,OAAO,KAAK;AAC3C,WAAS,UAAU;AACnB,aAAW,UAAU;AAErB,QAAM,YAAY;AAAA,IAChB,CAAC,aACC,MAAM,UAAU,KAAK,CAAC,UAAU;AAC9B,UAAI,UAAU,aAAc,wBAAuB,UAAU;AAAA,eACpD,MAAM,IAAI,GAAG,GAAG,UAAU;AAGjC,+BAAuB,UAAU;AAAA,MACnC;AACA,eAAS;AAAA,IACX,CAAC;AAAA,IACH,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,UAAU;AACjB,6BAAuB,UAAU;AACjC,aAAO,iBAAiB,OAAO,SAAS,SAAS;AAAA,QAC/C,GAAG,WAAW;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,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,uBAAuB,WAAW,OAAO,kBAAkB,UAAa,CAAC,MAAM,UAChF;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,MAAO;AAE/B,WAAO;AAAA,MACL,MAAM;AACJ,YAAI,MAAM,QAAQ,GAAG,EAAG,MAAK,IAAI,EAAE,MAAM,MAAM,MAAS;AAAA,MAC1D;AAAA,MACA;AAAA,QACE,sBAAsB,QAAQ;AAAA,QAC9B,oBAAoB,QAAQ;AAAA,MAC9B;AAAA,IACF;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;AApFgB;","names":[]}