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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. package/dist/after.cjs +1 -1
  2. package/dist/after.mjs +1 -1
  3. package/dist/agent-runtime.d.mts +3 -2
  4. package/dist/agent-runtime.d.ts +3 -2
  5. package/dist/api/route-manager.cjs +43 -4
  6. package/dist/api/route-manager.d.mts +4 -3
  7. package/dist/api/route-manager.d.ts +4 -3
  8. package/dist/api/route-manager.mjs +7 -7
  9. package/dist/api/runtime.cjs +43 -4
  10. package/dist/api/runtime.d.mts +1 -1
  11. package/dist/api/runtime.d.ts +1 -1
  12. package/dist/api/runtime.mjs +5 -5
  13. package/dist/api.cjs +352 -109
  14. package/dist/api.d.mts +7 -6
  15. package/dist/api.d.ts +7 -6
  16. package/dist/api.mjs +19 -12
  17. package/dist/{app-CIIEvA4r.d.ts → app-CIOx3LvY.d.ts} +4 -4
  18. package/dist/{app-O4AEC1OH.d.mts → app-DBd6437H.d.mts} +4 -4
  19. package/dist/app-markdown.d.mts +4 -3
  20. package/dist/app-markdown.d.ts +4 -3
  21. package/dist/cache.cjs +42 -4
  22. package/dist/cache.d.mts +68 -1
  23. package/dist/cache.d.ts +68 -1
  24. package/dist/cache.mjs +3 -3
  25. package/dist/{chunk-AXVJCMVF.mjs → chunk-2HDOV47R.mjs} +3 -3
  26. package/dist/chunk-2HDOV47R.mjs.map +1 -0
  27. package/dist/{chunk-RBRLLZL5.mjs → chunk-34IAPZBG.mjs} +16 -3
  28. package/dist/chunk-34IAPZBG.mjs.map +1 -0
  29. package/dist/{chunk-VV24CC42.mjs → chunk-35NPLKQJ.mjs} +2 -2
  30. package/dist/{chunk-D7QH7MDU.mjs → chunk-3TWQERDE.mjs} +5 -4
  31. package/dist/chunk-3TWQERDE.mjs.map +1 -0
  32. package/dist/{chunk-RWYRFCLG.mjs → chunk-4X57GXQA.mjs} +2 -2
  33. package/dist/{chunk-KOTSX5JH.mjs → chunk-52BR7LTX.mjs} +30 -21
  34. package/dist/chunk-52BR7LTX.mjs.map +1 -0
  35. package/dist/{chunk-SALMKQXH.mjs → chunk-6EJHNHH4.mjs} +80 -27
  36. package/dist/chunk-6EJHNHH4.mjs.map +1 -0
  37. package/dist/{chunk-ZFNK77WN.mjs → chunk-6JNGOC37.mjs} +2 -2
  38. package/dist/{after.cjs.map → chunk-6JNGOC37.mjs.map} +1 -1
  39. package/dist/{chunk-MOW47IF5.mjs → chunk-6UYVU46O.mjs} +2 -2
  40. package/dist/{chunk-7MABZJIM.mjs → chunk-7PYVLJ4J.mjs} +1 -1
  41. package/dist/chunk-7PYVLJ4J.mjs.map +1 -0
  42. package/dist/{chunk-FLHLPB57.mjs → chunk-D7F7YZ7L.mjs} +93 -67
  43. package/dist/chunk-D7F7YZ7L.mjs.map +1 -0
  44. package/dist/chunk-DU3PKDVQ.mjs +35 -0
  45. package/dist/chunk-DU3PKDVQ.mjs.map +1 -0
  46. package/dist/{chunk-SCFX4UTD.mjs → chunk-EHTUKVSW.mjs} +1 -1
  47. package/dist/chunk-EHTUKVSW.mjs.map +1 -0
  48. package/dist/{chunk-KWCNQUH5.mjs → chunk-EPDIF432.mjs} +526 -50
  49. package/dist/chunk-EPDIF432.mjs.map +1 -0
  50. package/dist/{chunk-A3636IHN.mjs → chunk-FP5Q67FO.mjs} +167 -96
  51. package/dist/chunk-FP5Q67FO.mjs.map +1 -0
  52. package/dist/{chunk-HHZAOTQD.mjs → chunk-GJ7W6LNK.mjs} +7 -6
  53. package/dist/chunk-GJ7W6LNK.mjs.map +1 -0
  54. package/dist/{chunk-RLGUZ3HS.mjs → chunk-I3OOUWO5.mjs} +3 -3
  55. package/dist/{chunk-75CGAL6E.mjs → chunk-IZBX2TEU.mjs} +217 -105
  56. package/dist/chunk-IZBX2TEU.mjs.map +1 -0
  57. package/dist/{chunk-22VG4DFJ.mjs → chunk-J3MPQ4MQ.mjs} +2 -2
  58. package/dist/{chunk-22VG4DFJ.mjs.map → chunk-J3MPQ4MQ.mjs.map} +1 -1
  59. package/dist/{chunk-2LS3KKE7.mjs → chunk-JV7JUD7Q.mjs} +4 -4
  60. package/dist/{chunk-Q3OX763A.mjs → chunk-LXDASSTE.mjs} +2 -2
  61. package/dist/{chunk-ZRBCBOEX.mjs → chunk-N2FY2QZ7.mjs} +28 -3
  62. package/dist/chunk-N2FY2QZ7.mjs.map +1 -0
  63. package/dist/{chunk-MRVJCLYQ.mjs → chunk-PSQ7N4XP.mjs} +4 -2
  64. package/dist/chunk-PSQ7N4XP.mjs.map +1 -0
  65. package/dist/{chunk-HVG3HLQZ.mjs → chunk-Q7WGOOAI.mjs} +3 -3
  66. package/dist/{chunk-WTYAPO5I.mjs → chunk-RCNWMEBT.mjs} +3 -2
  67. package/dist/{chunk-WTYAPO5I.mjs.map → chunk-RCNWMEBT.mjs.map} +1 -1
  68. package/dist/{chunk-3INDBMUU.mjs → chunk-TGDIACZT.mjs} +2 -2
  69. package/dist/{chunk-WB75GIX2.mjs → chunk-TQTB33JS.mjs} +14 -3
  70. package/dist/chunk-TQTB33JS.mjs.map +1 -0
  71. package/dist/{chunk-MH27UH72.mjs → chunk-TT3E2JOF.mjs} +3 -3
  72. package/dist/{chunk-UWRGX3J3.mjs → chunk-UMUWR5XA.mjs} +2 -2
  73. package/dist/{chunk-XTLLHCWU.mjs → chunk-V4VRLVLW.mjs} +52 -31
  74. package/dist/chunk-V4VRLVLW.mjs.map +1 -0
  75. package/dist/{chunk-EXCGBERG.mjs → chunk-WD2EBM3I.mjs} +79 -17
  76. package/dist/chunk-WD2EBM3I.mjs.map +1 -0
  77. package/dist/{chunk-DLBUAJTK.mjs → chunk-WMJGA32P.mjs} +74 -5
  78. package/dist/chunk-WMJGA32P.mjs.map +1 -0
  79. package/dist/{chunk-TKQCJMY7.mjs → chunk-X4SFHKFH.mjs} +7 -4
  80. package/dist/{chunk-TKQCJMY7.mjs.map → chunk-X4SFHKFH.mjs.map} +1 -1
  81. package/dist/{chunk-Q7GPJZCO.mjs → chunk-YIBV77KZ.mjs} +26 -7
  82. package/dist/chunk-YIBV77KZ.mjs.map +1 -0
  83. package/dist/client/lifecycle.mjs +2 -2
  84. package/dist/{client-mcMC334J.d.mts → client-DWoLZ3QU.d.mts} +52 -5
  85. package/dist/{client-d5ONQ-Pd.d.ts → client-DuQuQC1h.d.ts} +52 -5
  86. package/dist/client-cache-BMxuFqwH.d.ts +18 -0
  87. package/dist/client-cache-CCK-fCe0.d.mts +18 -0
  88. package/dist/{client-plugins-BvClItiL.d.mts → client-plugins-B6-07YmP.d.mts} +52 -99
  89. package/dist/{client-plugins-B9Sq-iMg.d.ts → client-plugins-By6MVUX-.d.ts} +52 -99
  90. package/dist/client-plugins.cjs +1 -1
  91. package/dist/client-plugins.d.mts +3 -2
  92. package/dist/client-plugins.d.ts +3 -2
  93. package/dist/client-plugins.mjs +2 -2
  94. package/dist/client.cjs +1046 -211
  95. package/dist/client.d.mts +136 -18
  96. package/dist/client.d.ts +136 -18
  97. package/dist/client.mjs +32 -15
  98. package/dist/config.d.mts +3 -2
  99. package/dist/config.d.ts +3 -2
  100. package/dist/{devtools-S52RRRMN.mjs → devtools-XWZX6CCL.mjs} +5 -5
  101. package/dist/{devtools-client-3XRTBND5.mjs → devtools-client-Z7QQA3Q2.mjs} +56 -17
  102. package/dist/devtools-client-Z7QQA3Q2.mjs.map +1 -0
  103. package/dist/{devtools-ui-NJKFORTG.mjs → devtools-ui-2HG5M4EL.mjs} +3 -1
  104. package/dist/devtools-ui-2HG5M4EL.mjs.map +1 -0
  105. package/dist/docs.cjs +24 -5
  106. package/dist/docs.mjs +5 -5
  107. package/dist/i18n/server.cjs +13 -2
  108. package/dist/i18n/server.d.mts +2 -2
  109. package/dist/i18n/server.d.ts +2 -2
  110. package/dist/i18n/server.mjs +1 -1
  111. package/dist/index.cjs +1928 -894
  112. package/dist/index.d.mts +139 -21
  113. package/dist/index.d.ts +139 -21
  114. package/dist/index.mjs +57 -34
  115. package/dist/index.mjs.map +1 -1
  116. package/dist/integration-api-BT024nuJ.d.mts +97 -0
  117. package/dist/integration-api-BT024nuJ.d.ts +97 -0
  118. package/dist/integrations.d.mts +3 -2
  119. package/dist/integrations.d.ts +3 -2
  120. package/dist/internal/build-runtime.cjs +764 -547
  121. package/dist/internal/build-runtime.d.mts +5 -4
  122. package/dist/internal/build-runtime.d.ts +5 -4
  123. package/dist/internal/build-runtime.mjs +16 -16
  124. package/dist/internal/client-runtime.cjs +1 -1
  125. package/dist/internal/client-runtime.mjs +2 -2
  126. package/dist/internal/config-runtime.cjs +4 -1
  127. package/dist/internal/config-runtime.d.mts +4 -3
  128. package/dist/internal/config-runtime.d.ts +4 -3
  129. package/dist/internal/config-runtime.mjs +4 -4
  130. package/dist/internal/product-telemetry-runtime.cjs +1 -1
  131. package/dist/internal/product-telemetry-runtime.mjs +1 -1
  132. package/dist/internal/production-runtime.cjs +29 -3
  133. package/dist/internal/production-runtime.d.mts +8 -7
  134. package/dist/internal/production-runtime.d.ts +8 -7
  135. package/dist/internal/production-runtime.mjs +5 -5
  136. package/dist/{metadata-route-yV4U6X8h.d.ts → metadata-route-8_V3UonT.d.ts} +1 -1
  137. package/dist/{metadata-route-p4K1l92V.d.mts → metadata-route-CWP_HjGU.d.mts} +1 -1
  138. package/dist/middleware.cjs +28 -2
  139. package/dist/middleware.d.mts +5 -4
  140. package/dist/middleware.d.ts +5 -4
  141. package/dist/middleware.mjs +4 -4
  142. package/dist/navigation.cjs +3 -1
  143. package/dist/navigation.mjs +3 -3
  144. package/dist/observability.cjs +27 -2
  145. package/dist/observability.mjs +1 -1
  146. package/dist/plugin.cjs +528 -349
  147. package/dist/plugin.d.mts +3 -2
  148. package/dist/plugin.d.ts +3 -2
  149. package/dist/plugin.mjs +13 -13
  150. package/dist/{production-runtime-IkB0Qj4i.d.mts → production-runtime-BGRH1dKG.d.mts} +1 -1
  151. package/dist/{production-runtime-0JTch4_d.d.ts → production-runtime-CdmzsDax.d.ts} +1 -1
  152. package/dist/query/client.cjs +68 -29
  153. package/dist/query/client.mjs +69 -30
  154. package/dist/query/client.mjs.map +1 -1
  155. package/dist/{render-plan-Dc8CjNI7.d.ts → render-plan-0GeHiGVZ.d.ts} +1 -1
  156. package/dist/{render-plan-CU31j-Jk.d.mts → render-plan-DLxJYAA5.d.mts} +1 -1
  157. package/dist/renderer-client.cjs +169 -26
  158. package/dist/renderer-client.d.mts +7 -6
  159. package/dist/renderer-client.d.ts +7 -6
  160. package/dist/renderer-client.mjs +16 -19
  161. package/dist/renderer-client.mjs.map +1 -1
  162. package/dist/{request-BXa1KY8i.d.mts → request-BCNXSXLh.d.mts} +1 -1
  163. package/dist/{request-CUUBujZt.d.ts → request-BstWbZ6O.d.ts} +1 -1
  164. package/dist/request.d.mts +4 -3
  165. package/dist/request.d.ts +4 -3
  166. package/dist/{route-Y8lfz1wF.d.ts → route-4pd-EVtw.d.ts} +45 -50
  167. package/dist/{route-Cq3aObmj.d.mts → route-CvEr4Uc9.d.mts} +45 -50
  168. package/dist/routes.cjs +27 -2
  169. package/dist/routes.d.mts +3 -2
  170. package/dist/routes.d.ts +3 -2
  171. package/dist/routes.mjs +4 -4
  172. package/dist/{runtime-j1S3sDTh.d.ts → runtime-BgDQzBiu.d.ts} +1 -0
  173. package/dist/{runtime-DDwvDtS4.d.mts → runtime-CV2UCV-5.d.mts} +1 -0
  174. package/dist/server-action-security.mjs +2 -2
  175. package/dist/server-fn-client.cjs +102 -26
  176. package/dist/server-fn-client.d.mts +6 -0
  177. package/dist/server-fn-client.d.ts +6 -0
  178. package/dist/server-fn-client.mjs +2 -1
  179. package/dist/server-fn.cjs +42 -4
  180. package/dist/server-fn.mjs +5 -5
  181. package/dist/server-plugins.d.mts +4 -3
  182. package/dist/server-plugins.d.ts +4 -3
  183. package/dist/server-query-client.cjs +195 -34
  184. package/dist/server-query-client.d.mts +3 -3
  185. package/dist/server-query-client.d.ts +3 -3
  186. package/dist/server-query-client.mjs +7 -7
  187. package/dist/{server-query-runtime-3zAj77yv.d.ts → server-query-runtime-DXRNhX_3.d.ts} +2 -0
  188. package/dist/{server-query-runtime-B50KAcj5.d.mts → server-query-runtime-aP52iuL5.d.mts} +2 -0
  189. package/dist/server-query.cjs +44 -5
  190. package/dist/server-query.d.mts +4 -0
  191. package/dist/server-query.d.ts +4 -0
  192. package/dist/server-query.mjs +7 -7
  193. package/dist/server.cjs +553 -370
  194. package/dist/server.d.mts +11 -10
  195. package/dist/server.d.ts +11 -10
  196. package/dist/server.mjs +17 -17
  197. package/dist/{spa-router-CyLkwst6.d.mts → spa-router-BeyAVSc6.d.mts} +1 -1
  198. package/dist/{spa-router-BkqGXaV_.d.ts → spa-router-COgu4txb.d.ts} +1 -1
  199. package/dist/testing.cjs +27 -2
  200. package/dist/testing.d.mts +3 -2
  201. package/dist/testing.d.ts +3 -2
  202. package/dist/testing.mjs +9 -9
  203. package/dist/{utils-NKR6SoNv.d.mts → utils-DL2VwDQl.d.mts} +1 -1
  204. package/dist/{utils-B2OHrb9F.d.ts → utils-DkU2c_1B.d.ts} +1 -1
  205. package/dist/version.cjs +1 -1
  206. package/dist/version.mjs +1 -1
  207. package/dist/vite.cjs +536 -353
  208. package/dist/vite.d.mts +3 -2
  209. package/dist/vite.d.ts +3 -2
  210. package/dist/vite.mjs +17 -13
  211. package/package.json +17 -17
  212. package/types/client.d.ts +115 -10
  213. package/dist/agent-runtime.cjs.map +0 -1
  214. package/dist/api/route-manager.cjs.map +0 -1
  215. package/dist/api/runtime.cjs.map +0 -1
  216. package/dist/api.cjs.map +0 -1
  217. package/dist/app-markdown.cjs.map +0 -1
  218. package/dist/cache.cjs.map +0 -1
  219. package/dist/chunk-75CGAL6E.mjs.map +0 -1
  220. package/dist/chunk-7MABZJIM.mjs.map +0 -1
  221. package/dist/chunk-A3636IHN.mjs.map +0 -1
  222. package/dist/chunk-AXVJCMVF.mjs.map +0 -1
  223. package/dist/chunk-D7QH7MDU.mjs.map +0 -1
  224. package/dist/chunk-DLBUAJTK.mjs.map +0 -1
  225. package/dist/chunk-EXCGBERG.mjs.map +0 -1
  226. package/dist/chunk-FLHLPB57.mjs.map +0 -1
  227. package/dist/chunk-HHZAOTQD.mjs.map +0 -1
  228. package/dist/chunk-KOTSX5JH.mjs.map +0 -1
  229. package/dist/chunk-KWCNQUH5.mjs.map +0 -1
  230. package/dist/chunk-MRVJCLYQ.mjs.map +0 -1
  231. package/dist/chunk-Q7GPJZCO.mjs.map +0 -1
  232. package/dist/chunk-RBRLLZL5.mjs.map +0 -1
  233. package/dist/chunk-SALMKQXH.mjs.map +0 -1
  234. package/dist/chunk-SCFX4UTD.mjs.map +0 -1
  235. package/dist/chunk-WB75GIX2.mjs.map +0 -1
  236. package/dist/chunk-XTLLHCWU.mjs.map +0 -1
  237. package/dist/chunk-ZFNK77WN.mjs.map +0 -1
  238. package/dist/chunk-ZRBCBOEX.mjs.map +0 -1
  239. package/dist/client/lifecycle.cjs.map +0 -1
  240. package/dist/client-cache-CopR_MaI.d.mts +0 -6
  241. package/dist/client-cache-Djy_TlE8.d.ts +0 -6
  242. package/dist/client-plugins.cjs.map +0 -1
  243. package/dist/client.cjs.map +0 -1
  244. package/dist/config.cjs.map +0 -1
  245. package/dist/cron.cjs.map +0 -1
  246. package/dist/deferred.cjs.map +0 -1
  247. package/dist/deployment.cjs.map +0 -1
  248. package/dist/devtools-client-3XRTBND5.mjs.map +0 -1
  249. package/dist/devtools-ui-NJKFORTG.mjs.map +0 -1
  250. package/dist/docs.cjs.map +0 -1
  251. package/dist/env-types.cjs.map +0 -1
  252. package/dist/env.cjs.map +0 -1
  253. package/dist/environment/vite.cjs.map +0 -1
  254. package/dist/environment.cjs.map +0 -1
  255. package/dist/font.cjs.map +0 -1
  256. package/dist/headers.cjs.map +0 -1
  257. package/dist/i18n/client.cjs.map +0 -1
  258. package/dist/i18n/index.cjs.map +0 -1
  259. package/dist/i18n/server.cjs.map +0 -1
  260. package/dist/image/server.cjs.map +0 -1
  261. package/dist/image/sharp.cjs.map +0 -1
  262. package/dist/image.cjs.map +0 -1
  263. package/dist/index.cjs.map +0 -1
  264. package/dist/instrumentation.cjs.map +0 -1
  265. package/dist/integrations.cjs.map +0 -1
  266. package/dist/internal/build-runtime.cjs.map +0 -1
  267. package/dist/internal/client-runtime.cjs.map +0 -1
  268. package/dist/internal/config-runtime.cjs.map +0 -1
  269. package/dist/internal/isolated-boundary.cjs.map +0 -1
  270. package/dist/internal/metadata-image-runtime.cjs.map +0 -1
  271. package/dist/internal/product-telemetry-runtime.cjs.map +0 -1
  272. package/dist/internal/production-node-env.cjs.map +0 -1
  273. package/dist/internal/production-runtime.cjs.map +0 -1
  274. package/dist/markdown.cjs.map +0 -1
  275. package/dist/middleware.cjs.map +0 -1
  276. package/dist/navigation.cjs.map +0 -1
  277. package/dist/observability.cjs.map +0 -1
  278. package/dist/plugin.cjs.map +0 -1
  279. package/dist/query/client.cjs.map +0 -1
  280. package/dist/query/index.cjs.map +0 -1
  281. package/dist/query/parsers.cjs.map +0 -1
  282. package/dist/query/server.cjs.map +0 -1
  283. package/dist/renderer/react/client.cjs.map +0 -1
  284. package/dist/renderer/react/server.cjs.map +0 -1
  285. package/dist/renderer/react/vite.cjs.map +0 -1
  286. package/dist/renderer-client.cjs.map +0 -1
  287. package/dist/renderer.cjs.map +0 -1
  288. package/dist/request.cjs.map +0 -1
  289. package/dist/router.cjs.map +0 -1
  290. package/dist/routes.cjs.map +0 -1
  291. package/dist/server-action-security.cjs.map +0 -1
  292. package/dist/server-fn-client.cjs.map +0 -1
  293. package/dist/server-fn.cjs.map +0 -1
  294. package/dist/server-plugins.cjs.map +0 -1
  295. package/dist/server-query-client.cjs.map +0 -1
  296. package/dist/server-query.cjs.map +0 -1
  297. package/dist/server.cjs.map +0 -1
  298. package/dist/storage.cjs.map +0 -1
  299. package/dist/testing.cjs.map +0 -1
  300. package/dist/theme/client.cjs.map +0 -1
  301. package/dist/theme/index.cjs.map +0 -1
  302. package/dist/theme/runtime.cjs.map +0 -1
  303. package/dist/theme/server.cjs.map +0 -1
  304. package/dist/version.cjs.map +0 -1
  305. package/dist/vite.cjs.map +0 -1
  306. package/dist/workflows.cjs.map +0 -1
  307. /package/dist/{chunk-VV24CC42.mjs.map → chunk-35NPLKQJ.mjs.map} +0 -0
  308. /package/dist/{chunk-RWYRFCLG.mjs.map → chunk-4X57GXQA.mjs.map} +0 -0
  309. /package/dist/{chunk-MOW47IF5.mjs.map → chunk-6UYVU46O.mjs.map} +0 -0
  310. /package/dist/{chunk-RLGUZ3HS.mjs.map → chunk-I3OOUWO5.mjs.map} +0 -0
  311. /package/dist/{chunk-2LS3KKE7.mjs.map → chunk-JV7JUD7Q.mjs.map} +0 -0
  312. /package/dist/{chunk-Q3OX763A.mjs.map → chunk-LXDASSTE.mjs.map} +0 -0
  313. /package/dist/{chunk-HVG3HLQZ.mjs.map → chunk-Q7WGOOAI.mjs.map} +0 -0
  314. /package/dist/{chunk-3INDBMUU.mjs.map → chunk-TGDIACZT.mjs.map} +0 -0
  315. /package/dist/{chunk-MH27UH72.mjs.map → chunk-TT3E2JOF.mjs.map} +0 -0
  316. /package/dist/{chunk-UWRGX3J3.mjs.map → chunk-UMUWR5XA.mjs.map} +0 -0
  317. /package/dist/{devtools-S52RRRMN.mjs.map → devtools-XWZX6CCL.mjs.map} +0 -0
@@ -1,7 +1,16 @@
1
1
  import {
2
+ invokeMutationWithRetry
3
+ } from "./chunk-6EJHNHH4.mjs";
4
+ import {
5
+ applyServerFnOptimisticUpdates,
2
6
  getAPIRouteRefMetadata,
3
- isAPIRouteRef
4
- } from "./chunk-75CGAL6E.mjs";
7
+ isAPIRouteRef,
8
+ resolveServerFnInvalidateTargets,
9
+ settleServerFnOptimisticUpdates
10
+ } from "./chunk-IZBX2TEU.mjs";
11
+ import {
12
+ notifyClientObserver
13
+ } from "./chunk-DU3PKDVQ.mjs";
5
14
  import {
6
15
  buildFarmRoutePath
7
16
  } from "./chunk-X5GRVT7B.mjs";
@@ -9,9 +18,18 @@ import {
9
18
  isFarmLocaleChangeHref,
10
19
  localizeActiveFarmHref
11
20
  } from "./chunk-ULD4ENAH.mjs";
21
+ import {
22
+ getFarmClientDataCache
23
+ } from "./chunk-WMJGA32P.mjs";
12
24
  import {
13
25
  getFarmTrailingSlashPreference
14
26
  } from "./chunk-RCNUKRBF.mjs";
27
+ import {
28
+ decodeFarmCacheInvalidations,
29
+ encodeFarmCacheInvalidations,
30
+ notifyFarmCacheInvalidation,
31
+ subscribeFarmCacheInvalidation
32
+ } from "./chunk-34IAPZBG.mjs";
15
33
  import {
16
34
  applyFarmBasePath,
17
35
  getFarmBasePath,
@@ -23,65 +41,156 @@ import {
23
41
 
24
42
  // src/mutation-client.ts
25
43
  import { useCallback, useMemo, useRef, useState } from "react";
44
+
45
+ // src/client-network-status.ts
46
+ function isNavigatorOnline() {
47
+ if (typeof navigator === "undefined" || typeof navigator.onLine !== "boolean") return true;
48
+ return navigator.onLine;
49
+ }
50
+ __name(isNavigatorOnline, "isNavigatorOnline");
51
+ function subscribeOnline(listener) {
52
+ if (typeof window === "undefined") return () => {
53
+ };
54
+ window.addEventListener("online", listener);
55
+ return () => window.removeEventListener("online", listener);
56
+ }
57
+ __name(subscribeOnline, "subscribeOnline");
58
+
59
+ // src/mutation-client.ts
26
60
  function useMutation(target, options = {}) {
61
+ return useMutationLifecycle(target, options).mutation;
62
+ }
63
+ __name(useMutation, "useMutation");
64
+ function useMutationLifecycle(target, options = {}) {
27
65
  const initialData = options.initialData ?? null;
28
66
  const optionsRef = useRef(options);
29
67
  const targetRef = useRef(target);
30
68
  const requestIdRef = useRef(0);
69
+ const lastResetIdRef = useRef(0);
31
70
  const initialState = {
32
71
  pendingCount: 0,
72
+ pausedCount: 0,
33
73
  status: "idle",
34
74
  data: initialData,
35
75
  error: null,
36
76
  variables: void 0
37
77
  };
38
78
  const stateRef = useRef(initialState);
79
+ const resetWakersRef = useRef(/* @__PURE__ */ new Set());
39
80
  const [state, setState] = useState(initialState);
40
81
  optionsRef.current = options;
41
82
  targetRef.current = target;
42
83
  const setMutationState = useCallback(
43
84
  (value) => {
44
- setState((current) => {
45
- const next = typeof value === "function" ? value(current) : value;
46
- stateRef.current = next;
47
- return next;
48
- });
85
+ const next = typeof value === "function" ? value(stateRef.current) : value;
86
+ stateRef.current = next;
87
+ setState(next);
49
88
  },
50
89
  []
51
90
  );
52
- const mutateAsync = useCallback(
53
- async (variables) => {
91
+ const waitForReconnect = useCallback(
92
+ async (requestId) => {
93
+ while (!isNavigatorOnline()) {
94
+ if (requestId < lastResetIdRef.current) return;
95
+ setMutationState((current) => ({ ...current, pausedCount: current.pausedCount + 1 }));
96
+ try {
97
+ await new Promise((resolve) => {
98
+ const wake = /* @__PURE__ */ __name(() => {
99
+ unsubscribe();
100
+ resetWakersRef.current.delete(wake);
101
+ resolve();
102
+ }, "wake");
103
+ const unsubscribe = subscribeOnline(wake);
104
+ resetWakersRef.current.add(wake);
105
+ });
106
+ } finally {
107
+ setMutationState((current) => ({
108
+ ...current,
109
+ pausedCount: Math.max(0, current.pausedCount - 1)
110
+ }));
111
+ }
112
+ }
113
+ },
114
+ [setMutationState]
115
+ );
116
+ const mutatePreparedAsync = useCallback(
117
+ async (prepare) => {
54
118
  const requestId = ++requestIdRef.current;
55
119
  const currentOptions = optionsRef.current;
56
120
  const previousData = stateRef.current.data;
57
- const optimisticData = currentOptions.optimistic?.({
58
- variables,
59
- current: previousData
60
- });
121
+ let variables;
122
+ let preparationFailed = false;
123
+ let preparationError;
124
+ try {
125
+ variables = prepare();
126
+ } catch (error) {
127
+ preparationFailed = true;
128
+ preparationError = error;
129
+ }
130
+ const optimisticData = preparationFailed ? void 0 : currentOptions.optimistic?.({ variables, current: previousData });
61
131
  const hasOptimisticData = optimisticData !== void 0;
62
- setMutationState((current) => ({
63
- pendingCount: current.pendingCount + 1,
64
- status: "pending",
65
- data: hasOptimisticData ? optimisticData : currentOptions.resetOnMutate === false ? current.data : null,
66
- error: null,
67
- variables
68
- }));
132
+ setMutationState((current) => {
133
+ if (requestId < lastResetIdRef.current) return current;
134
+ const pendingCount = current.pendingCount + 1;
135
+ if (requestId !== requestIdRef.current) return { ...current, pendingCount };
136
+ return {
137
+ pendingCount,
138
+ pausedCount: current.pausedCount,
139
+ status: "pending",
140
+ data: hasOptimisticData ? optimisticData : currentOptions.resetOnMutate === false ? current.data : null,
141
+ error: null,
142
+ variables
143
+ };
144
+ });
145
+ const mutationTarget = targetRef.current;
146
+ const isAPITarget = isAPIRouteRef(mutationTarget);
147
+ const sharedOptimistic = !preparationFailed && !isAPITarget ? currentOptions.request?.optimistic : void 0;
148
+ const sharedSnapshots = sharedOptimistic?.update?.length ? applyServerFnOptimisticUpdates(sharedOptimistic.update) : [];
69
149
  try {
70
- const mutationTarget = targetRef.current;
71
- const rawResult = isAPIRouteRef(mutationTarget) ? await mutationTarget(variables, currentOptions.request) : await mutationTarget(variables);
72
- const data = unwrapMutationResult(rawResult, isAPIRouteRef(mutationTarget));
150
+ if (preparationFailed) throw preparationError;
151
+ let data;
152
+ while (true) {
153
+ if (currentOptions.networkMode === "online") {
154
+ await waitForReconnect(requestId);
155
+ if (requestId < lastResetIdRef.current) {
156
+ throw new Error("Mutation reset while waiting for reconnection");
157
+ }
158
+ }
159
+ try {
160
+ const rawResult = isAPITarget ? await mutationTarget(variables, currentOptions.request) : await invokeMutationWithRetry(
161
+ () => targetRef.current(variables),
162
+ currentOptions.request?.retry,
163
+ // A reset disowns this submission; stop scheduling retries then.
164
+ () => requestId >= lastResetIdRef.current
165
+ );
166
+ data = unwrapMutationResult(rawResult, isAPITarget);
167
+ break;
168
+ } catch (cause) {
169
+ if (currentOptions.networkMode === "online" && !isNavigatorOnline() && requestId >= lastResetIdRef.current) {
170
+ continue;
171
+ }
172
+ throw cause;
173
+ }
174
+ }
175
+ settleServerFnOptimisticUpdates(sharedSnapshots, "commit");
176
+ if (!isAPITarget && currentOptions.request?.invalidate) {
177
+ for (const key of resolveServerFnInvalidateTargets(currentOptions.request.invalidate)) {
178
+ notifyFarmCacheInvalidation(key);
179
+ }
180
+ }
73
181
  const isLatestRequest = requestId === requestIdRef.current;
74
182
  setMutationState((current) => {
183
+ if (requestId < lastResetIdRef.current) return current;
75
184
  const pendingCount = Math.max(0, current.pendingCount - 1);
76
185
  if (!isLatestRequest) {
77
186
  return {
78
187
  ...current,
79
- pendingCount,
80
- status: pendingCount > 0 ? "pending" : current.status
188
+ pendingCount
81
189
  };
82
190
  }
83
191
  return {
84
192
  pendingCount,
193
+ pausedCount: current.pausedCount,
85
194
  status: "success",
86
195
  data,
87
196
  error: null,
@@ -89,24 +198,35 @@ function useMutation(target, options = {}) {
89
198
  };
90
199
  });
91
200
  if (isLatestRequest) {
92
- currentOptions.onSuccess?.(data, variables);
93
- currentOptions.onSettled?.(data, null, variables);
201
+ notifyClientObserver(currentOptions.onSuccess, [data, variables], "Mutation onSuccess");
202
+ if (requestId === requestIdRef.current) {
203
+ notifyClientObserver(
204
+ currentOptions.onSettled,
205
+ [data, null, variables],
206
+ "Mutation onSettled"
207
+ );
208
+ }
94
209
  }
95
210
  return data;
96
211
  } catch (cause) {
212
+ settleServerFnOptimisticUpdates(
213
+ sharedSnapshots,
214
+ sharedOptimistic?.rollbackOnError ? "rollback" : "invalidate"
215
+ );
97
216
  const error = normalizeMutationError(cause);
98
217
  const isLatestRequest = requestId === requestIdRef.current;
99
218
  setMutationState((current) => {
219
+ if (requestId < lastResetIdRef.current) return current;
100
220
  const pendingCount = Math.max(0, current.pendingCount - 1);
101
221
  if (!isLatestRequest) {
102
222
  return {
103
223
  ...current,
104
- pendingCount,
105
- status: pendingCount > 0 ? "pending" : current.status
224
+ pendingCount
106
225
  };
107
226
  }
108
227
  return {
109
228
  pendingCount,
229
+ pausedCount: current.pausedCount,
110
230
  status: "error",
111
231
  data: hasOptimisticData && currentOptions.rollbackOnError ? previousData : currentOptions.resetOnMutate === false ? current.data : null,
112
232
  error,
@@ -114,13 +234,23 @@ function useMutation(target, options = {}) {
114
234
  };
115
235
  });
116
236
  if (isLatestRequest) {
117
- currentOptions.onError?.(error, variables);
118
- currentOptions.onSettled?.(null, error, variables);
237
+ notifyClientObserver(currentOptions.onError, [error, variables], "Mutation onError");
238
+ if (requestId === requestIdRef.current) {
239
+ notifyClientObserver(
240
+ currentOptions.onSettled,
241
+ [null, error, variables],
242
+ "Mutation onSettled"
243
+ );
244
+ }
119
245
  }
120
246
  throw error;
121
247
  }
122
248
  },
123
- [setMutationState]
249
+ [setMutationState, waitForReconnect]
250
+ );
251
+ const mutateAsync = useCallback(
252
+ (variables) => mutatePreparedAsync(() => variables),
253
+ [mutatePreparedAsync]
124
254
  );
125
255
  const mutate = useCallback(
126
256
  (variables) => {
@@ -130,18 +260,23 @@ function useMutation(target, options = {}) {
130
260
  [mutateAsync]
131
261
  );
132
262
  const reset = useCallback(() => {
133
- requestIdRef.current += 1;
263
+ lastResetIdRef.current = ++requestIdRef.current;
134
264
  setMutationState({
135
265
  pendingCount: 0,
266
+ pausedCount: 0,
136
267
  status: "idle",
137
268
  data: optionsRef.current.initialData ?? null,
138
269
  error: null,
139
270
  variables: void 0
140
271
  });
272
+ const wakers = Array.from(resetWakersRef.current);
273
+ resetWakersRef.current.clear();
274
+ for (const wake of wakers) wake();
141
275
  }, [setMutationState]);
142
- return useMemo(
276
+ const mutation = useMemo(
143
277
  () => ({
144
278
  pending: state.pendingCount > 0,
279
+ paused: state.pausedCount > 0,
145
280
  status: state.status,
146
281
  data: state.data,
147
282
  error: state.error,
@@ -156,13 +291,15 @@ function useMutation(target, options = {}) {
156
291
  reset,
157
292
  state.data,
158
293
  state.error,
294
+ state.pausedCount,
159
295
  state.pendingCount,
160
296
  state.status,
161
297
  state.variables
162
298
  ]
163
299
  );
300
+ return { mutation, mutatePreparedAsync };
164
301
  }
165
- __name(useMutation, "useMutation");
302
+ __name(useMutationLifecycle, "useMutationLifecycle");
166
303
  function unwrapMutationResult(result, apiRoute) {
167
304
  if (!apiRoute) return result;
168
305
  const apiResult = result;
@@ -188,13 +325,27 @@ import {
188
325
  useRef as useRef2,
189
326
  useState as useState2
190
327
  } from "react";
328
+ var _FetcherInputError = class _FetcherInputError extends Error {
329
+ constructor(cause) {
330
+ super(
331
+ cause instanceof Error ? cause.message : typeof cause === "string" ? cause : "Could not prepare form input"
332
+ );
333
+ this.name = "FetcherInputError";
334
+ this.code = "input_error";
335
+ this.status = 0;
336
+ this.data = void 0;
337
+ this.cause = cause;
338
+ }
339
+ };
340
+ __name(_FetcherInputError, "FetcherInputError");
341
+ var FetcherInputError = _FetcherInputError;
191
342
  var formDataContexts = /* @__PURE__ */ new WeakMap();
192
343
  function useFetcher(target, options = {}) {
193
344
  const targetRef = useRef2(target);
194
345
  const optionsRef = useRef2(options);
195
346
  const submissionIdRef = useRef2(0);
196
347
  const [formData, setFormData] = useState2(null);
197
- const mutation = useMutation(target, options);
348
+ const { mutation, mutatePreparedAsync } = useMutationLifecycle(target, options);
198
349
  targetRef.current = target;
199
350
  optionsRef.current = options;
200
351
  const submitAsync = useCallback2(
@@ -203,15 +354,20 @@ function useFetcher(target, options = {}) {
203
354
  const submittedFormData = isFormData(input) ? input : null;
204
355
  setFormData(submittedFormData);
205
356
  try {
206
- const variables = submittedFormData ? mapFetcherFormData(targetRef.current, submittedFormData, optionsRef.current) : input;
207
- return await mutation.mutateAsync(variables);
357
+ return await mutatePreparedAsync(() => {
358
+ try {
359
+ return submittedFormData ? mapFetcherFormData(targetRef.current, submittedFormData, optionsRef.current) : input;
360
+ } catch (error) {
361
+ throw new FetcherInputError(error);
362
+ }
363
+ });
208
364
  } finally {
209
365
  if (submissionId === submissionIdRef.current) {
210
366
  setFormData(null);
211
367
  }
212
368
  }
213
369
  },
214
- [mutation.mutateAsync]
370
+ [mutatePreparedAsync]
215
371
  );
216
372
  const submit = useCallback2(
217
373
  (input) => {
@@ -261,6 +417,7 @@ function useFetcher(target, options = {}) {
261
417
  state: mutation.pending ? "submitting" : "idle",
262
418
  status: mutation.status,
263
419
  pending: mutation.pending,
420
+ paused: mutation.paused,
264
421
  data: mutation.data,
265
422
  error: mutation.error,
266
423
  variables: mutation.variables,
@@ -275,6 +432,7 @@ function useFetcher(target, options = {}) {
275
432
  formData,
276
433
  mutation.data,
277
434
  mutation.error,
435
+ mutation.paused,
278
436
  mutation.pending,
279
437
  mutation.status,
280
438
  mutation.variables,
@@ -293,9 +451,18 @@ function mapFetcherFormData(target, formData, options) {
293
451
  if (!isAPIRouteRef(target)) {
294
452
  return formData;
295
453
  }
296
- const values = formDataToObject(formData);
297
454
  const method = getAPIRouteRefMetadata(target)?.method;
298
- return method === "GET" || method === "HEAD" ? { query: values } : { body: values };
455
+ const query = method === "GET" || method === "HEAD";
456
+ const encoding = context.submitter?.getAttribute("formenctype") ?? context.form?.enctype;
457
+ if (!query && (encoding?.toLowerCase() === "multipart/form-data" || Array.from(formData.values()).some((value) => typeof value !== "string"))) {
458
+ const body = new FormData();
459
+ for (const [key, value] of formData) {
460
+ if (!isUnsafeFormKey(key)) body.append(key, value);
461
+ }
462
+ return { body };
463
+ }
464
+ const values = formDataToObject(formData);
465
+ return query ? { query: values } : { body: values };
299
466
  }
300
467
  __name(mapFetcherFormData, "mapFetcherFormData");
301
468
  function resolveFetcherFormAction(target, metadata) {
@@ -307,7 +474,7 @@ __name(resolveFetcherFormAction, "resolveFetcherFormAction");
307
474
  function formDataToObject(formData) {
308
475
  const output = /* @__PURE__ */ Object.create(null);
309
476
  for (const [key, value] of formData.entries()) {
310
- if (key === "__proto__" || key === "constructor" || key === "prototype") continue;
477
+ if (isUnsafeFormKey(key)) continue;
311
478
  const current = output[key];
312
479
  if (current === void 0) {
313
480
  output[key] = value;
@@ -320,6 +487,10 @@ function formDataToObject(formData) {
320
487
  return output;
321
488
  }
322
489
  __name(formDataToObject, "formDataToObject");
490
+ function isUnsafeFormKey(key) {
491
+ return key === "__proto__" || key === "constructor" || key === "prototype";
492
+ }
493
+ __name(isUnsafeFormKey, "isUnsafeFormKey");
323
494
  function createSubmitterFormData(form, submitter) {
324
495
  try {
325
496
  return new FormData(form, submitter);
@@ -349,6 +520,296 @@ function isFormData(value) {
349
520
  }
350
521
  __name(isFormData, "isFormData");
351
522
 
523
+ // src/cache-invalidation-broadcast.ts
524
+ var FARM_CACHE_INVALIDATION_CHANNEL = "farm:cache-invalidation";
525
+ var activeBridge;
526
+ function enableCrossTabCacheInvalidation(options = {}) {
527
+ if (typeof BroadcastChannel !== "function") return () => {
528
+ };
529
+ const channelName = options.channelName ?? FARM_CACHE_INVALIDATION_CHANNEL;
530
+ if (activeBridge) {
531
+ if (activeBridge.channelName !== channelName) {
532
+ throw new Error(
533
+ `Cross-tab cache invalidation is already enabled on channel "${activeBridge.channelName}".`
534
+ );
535
+ }
536
+ activeBridge.refCount += 1;
537
+ } else {
538
+ activeBridge = createBridge(channelName);
539
+ }
540
+ let disposed = false;
541
+ return () => {
542
+ if (disposed || !activeBridge) return;
543
+ disposed = true;
544
+ activeBridge.refCount -= 1;
545
+ if (activeBridge.refCount === 0) {
546
+ activeBridge.teardown();
547
+ activeBridge = void 0;
548
+ }
549
+ };
550
+ }
551
+ __name(enableCrossTabCacheInvalidation, "enableCrossTabCacheInvalidation");
552
+ function createBridge(channelName) {
553
+ const channel = new BroadcastChannel(channelName);
554
+ let applyingRemote = false;
555
+ let pending = [];
556
+ let flushScheduled = false;
557
+ let closed = false;
558
+ const flush = /* @__PURE__ */ __name(() => {
559
+ flushScheduled = false;
560
+ if (closed || pending.length === 0) return;
561
+ const encoded = encodeFarmCacheInvalidations(pending);
562
+ pending = [];
563
+ if (encoded !== null) channel.postMessage(encoded);
564
+ }, "flush");
565
+ const unsubscribe = subscribeFarmCacheInvalidation((key) => {
566
+ if (applyingRemote || closed) return;
567
+ pending.push(key);
568
+ if (!flushScheduled) {
569
+ flushScheduled = true;
570
+ queueMicrotask(flush);
571
+ }
572
+ });
573
+ channel.onmessage = (event) => {
574
+ const keys = decodeFarmCacheInvalidations(
575
+ typeof event.data === "string" ? event.data : void 0
576
+ );
577
+ if (keys.length === 0) return;
578
+ applyingRemote = true;
579
+ try {
580
+ for (const key of keys) notifyFarmCacheInvalidation(key);
581
+ } finally {
582
+ applyingRemote = false;
583
+ }
584
+ };
585
+ return {
586
+ channelName,
587
+ refCount: 1,
588
+ teardown() {
589
+ closed = true;
590
+ pending = [];
591
+ unsubscribe();
592
+ channel.onmessage = null;
593
+ channel.close();
594
+ }
595
+ };
596
+ }
597
+ __name(createBridge, "createBridge");
598
+
599
+ // src/client-cache-persistence.ts
600
+ var FARM_CLIENT_CACHE_PERSIST_VERSION = "1";
601
+ function defineClientCacheAdapter(adapter) {
602
+ for (const method of ["keys", "get", "set", "delete", "clear"]) {
603
+ if (typeof adapter?.[method] !== "function") {
604
+ throw new TypeError(
605
+ `defineClientCacheAdapter expects a "${method}" method. Implement keys/get/set/delete/clear over your storage.`
606
+ );
607
+ }
608
+ }
609
+ return adapter;
610
+ }
611
+ __name(defineClientCacheAdapter, "defineClientCacheAdapter");
612
+ function storageClientCacheAdapter(storage, options = {}) {
613
+ if (!storage || typeof storage.getItem !== "function" || typeof storage.setItem !== "function" || typeof storage.removeItem !== "function") {
614
+ throw new TypeError("storageClientCacheAdapter expects a compatible key-value client.");
615
+ }
616
+ const base = options.base ?? "farm-client-cache";
617
+ const entryKey = /* @__PURE__ */ __name((key) => `${base}:${key}`, "entryKey");
618
+ const enumerate = storage.getKeys?.bind(storage) ?? storage.keys?.bind(storage);
619
+ return {
620
+ async keys() {
621
+ if (!enumerate) return [];
622
+ const keys = await enumerate(base);
623
+ const prefix = `${base}:`;
624
+ return keys.filter((key) => key.startsWith(prefix)).map((key) => key.slice(prefix.length));
625
+ },
626
+ async get(key) {
627
+ return await storage.getItem(entryKey(key)) ?? null;
628
+ },
629
+ async set(key, entry) {
630
+ await storage.setItem(entryKey(key), entry);
631
+ },
632
+ async delete(key) {
633
+ await storage.removeItem(entryKey(key));
634
+ },
635
+ async clear() {
636
+ if (storage.clear) {
637
+ await storage.clear(base);
638
+ return;
639
+ }
640
+ if (!enumerate) return;
641
+ const prefix = `${base}:`;
642
+ for (const key of await enumerate(base)) {
643
+ if (key.startsWith(prefix)) await storage.removeItem(key);
644
+ }
645
+ }
646
+ };
647
+ }
648
+ __name(storageClientCacheAdapter, "storageClientCacheAdapter");
649
+ var activeEngine;
650
+ function reportPersistenceFailure(error) {
651
+ const report = typeof reportError === "function" ? reportError : console.error;
652
+ if (error instanceof Error) {
653
+ report(error);
654
+ return;
655
+ }
656
+ const normalized = new Error("Client cache persistence failed");
657
+ normalized.cause = error;
658
+ report(normalized);
659
+ }
660
+ __name(reportPersistenceFailure, "reportPersistenceFailure");
661
+ function disableEngine(engine, error) {
662
+ if (engine.disabled) return;
663
+ engine.disabled = true;
664
+ engine.pendingSets.clear();
665
+ engine.pendingDeletes.clear();
666
+ if (engine.flushTimer !== void 0) {
667
+ clearTimeout(engine.flushTimer);
668
+ engine.flushTimer = void 0;
669
+ }
670
+ reportPersistenceFailure(error);
671
+ }
672
+ __name(disableEngine, "disableEngine");
673
+ function scheduleFlush(engine) {
674
+ if (engine.disabled || engine.flushTimer !== void 0) return;
675
+ const timer = setTimeout(() => {
676
+ engine.flushTimer = void 0;
677
+ void flushEngine(engine);
678
+ }, engine.flushDelayMs);
679
+ timer.unref?.();
680
+ engine.flushTimer = timer;
681
+ }
682
+ __name(scheduleFlush, "scheduleFlush");
683
+ async function flushEngine(engine) {
684
+ if (engine.disabled) return;
685
+ const sets = Array.from(engine.pendingSets.entries());
686
+ const deletes = Array.from(engine.pendingDeletes);
687
+ engine.pendingSets.clear();
688
+ engine.pendingDeletes.clear();
689
+ try {
690
+ if (sets.length > 0) {
691
+ if (engine.adapter.setMany) await engine.adapter.setMany(sets);
692
+ else for (const [key, entry] of sets) await engine.adapter.set(key, entry);
693
+ }
694
+ for (const key of deletes) await engine.adapter.delete(key);
695
+ } catch (error) {
696
+ disableEngine(engine, error);
697
+ }
698
+ }
699
+ __name(flushEngine, "flushEngine");
700
+ async function hydrateEngine(engine) {
701
+ const now = Date.now();
702
+ const keys = await engine.adapter.keys();
703
+ if (keys.length === 0) return;
704
+ const persisted = engine.adapter.getMany ? await engine.adapter.getMany(keys) : await Promise.all(keys.map((key) => engine.adapter.get(key)));
705
+ engine.hydrating = true;
706
+ try {
707
+ for (let index = 0; index < keys.length; index += 1) {
708
+ const key = keys[index];
709
+ const entry = persisted[index];
710
+ if (engine.disabled) return;
711
+ if (!entry || entry.version !== engine.version || entry.gcAt !== void 0 && now >= entry.gcAt) {
712
+ engine.pendingDeletes.add(key);
713
+ continue;
714
+ }
715
+ if (engine.cache.get(key, now)) continue;
716
+ engine.cache.set(key, {
717
+ data: entry.data,
718
+ updatedAt: entry.updatedAt,
719
+ staleAt: 0,
720
+ gcAt: entry.gcAt,
721
+ status: "success",
722
+ error: null,
723
+ persist: true
724
+ });
725
+ }
726
+ } finally {
727
+ engine.hydrating = false;
728
+ }
729
+ if (engine.pendingDeletes.size > 0) scheduleFlush(engine);
730
+ }
731
+ __name(hydrateEngine, "hydrateEngine");
732
+ function createSink(engine) {
733
+ return {
734
+ onSet(key, entry) {
735
+ if (engine.disabled || engine.hydrating) return;
736
+ if (!entry.persist || entry.fetching || entry.error || entry.status === "pending") return;
737
+ if (engine.persistKey && !engine.persistKey(key)) return;
738
+ engine.pendingDeletes.delete(key);
739
+ engine.pendingSets.set(key, {
740
+ data: entry.data,
741
+ updatedAt: entry.updatedAt,
742
+ staleAt: entry.staleAt,
743
+ gcAt: entry.gcAt,
744
+ version: engine.version
745
+ });
746
+ scheduleFlush(engine);
747
+ },
748
+ onDelete(key) {
749
+ if (engine.disabled) return;
750
+ engine.pendingSets.delete(key);
751
+ engine.pendingDeletes.add(key);
752
+ scheduleFlush(engine);
753
+ },
754
+ onClear() {
755
+ if (engine.disabled) return;
756
+ engine.pendingSets.clear();
757
+ engine.pendingDeletes.clear();
758
+ void engine.adapter.clear().catch((error) => disableEngine(engine, error));
759
+ }
760
+ };
761
+ }
762
+ __name(createSink, "createSink");
763
+ function initPersistedClientCache(adapter, options = {}) {
764
+ defineClientCacheAdapter(adapter);
765
+ disposePersistedClientCache();
766
+ const engine = {
767
+ adapter,
768
+ cache: getFarmClientDataCache(),
769
+ version: options.version ? `${FARM_CLIENT_CACHE_PERSIST_VERSION}:${options.version}` : FARM_CLIENT_CACHE_PERSIST_VERSION,
770
+ persistKey: options.persistKey,
771
+ flushDelayMs: options.flushDelayMs ?? 300,
772
+ pendingSets: /* @__PURE__ */ new Map(),
773
+ pendingDeletes: /* @__PURE__ */ new Set(),
774
+ flushTimer: void 0,
775
+ hydrating: false,
776
+ disabled: false
777
+ };
778
+ activeEngine = engine;
779
+ engine.cache.attachPersistence(createSink(engine));
780
+ void hydrateEngine(engine).catch((error) => disableEngine(engine, error));
781
+ return () => {
782
+ if (activeEngine !== engine) return;
783
+ disposePersistedClientCache();
784
+ };
785
+ }
786
+ __name(initPersistedClientCache, "initPersistedClientCache");
787
+ function disposePersistedClientCache() {
788
+ const engine = activeEngine;
789
+ if (!engine) return;
790
+ activeEngine = void 0;
791
+ engine.cache.attachPersistence(void 0);
792
+ if (engine.flushTimer !== void 0) {
793
+ clearTimeout(engine.flushTimer);
794
+ engine.flushTimer = void 0;
795
+ }
796
+ engine.pendingSets.clear();
797
+ engine.pendingDeletes.clear();
798
+ }
799
+ __name(disposePersistedClientCache, "disposePersistedClientCache");
800
+ async function clearPersistedCache() {
801
+ const engine = activeEngine;
802
+ if (!engine) return;
803
+ engine.pendingSets.clear();
804
+ engine.pendingDeletes.clear();
805
+ try {
806
+ await engine.adapter.clear();
807
+ } catch (error) {
808
+ disableEngine(engine, error);
809
+ }
810
+ }
811
+ __name(clearPersistedCache, "clearPersistedCache");
812
+
352
813
  // src/store.ts
353
814
  import { useSyncExternalStore } from "react";
354
815
  var RESERVED_STORE_KEYS = /* @__PURE__ */ new Set([
@@ -371,11 +832,14 @@ function pickState(state, keys) {
371
832
  return slice;
372
833
  }
373
834
  __name(pickState, "pickState");
835
+ function getEnumerableKeys(state) {
836
+ return Reflect.ownKeys(state).filter(
837
+ (key) => Object.prototype.propertyIsEnumerable.call(state, key)
838
+ );
839
+ }
840
+ __name(getEnumerableKeys, "getEnumerableKeys");
374
841
  function getChangedKeys(state, previousState) {
375
- const keys = /* @__PURE__ */ new Set([
376
- ...Object.keys(state),
377
- ...Object.keys(previousState)
378
- ]);
842
+ const keys = /* @__PURE__ */ new Set([...getEnumerableKeys(state), ...getEnumerableKeys(previousState)]);
379
843
  return [...keys].filter((key) => !Object.is(state[key], previousState[key]));
380
844
  }
381
845
  __name(getChangedKeys, "getChangedKeys");
@@ -396,7 +860,11 @@ function createStore(initialState, extend) {
396
860
  let state = cloneState(initialState);
397
861
  const subscriptions = /* @__PURE__ */ new Set();
398
862
  const addSubscription = /* @__PURE__ */ __name((keys, notify) => {
399
- const subscription = { keys, notify };
863
+ const subscription = {
864
+ // Object property enumeration returns numeric keys as strings.
865
+ keys: keys?.map((key) => typeof key === "number" ? String(key) : key) ?? null,
866
+ notify
867
+ };
400
868
  subscriptions.add(subscription);
401
869
  return () => {
402
870
  subscriptions.delete(subscription);
@@ -488,7 +956,7 @@ function createStore(initialState, extend) {
488
956
  getSnapshot
489
957
  );
490
958
  }
491
- if (typeof keyOrKeys === "string") {
959
+ if (isStoreKey(keyOrKeys)) {
492
960
  return useSyncExternalStore(
493
961
  (notify) => addSubscription([keyOrKeys], () => notify()),
494
962
  () => state[keyOrKeys],
@@ -509,7 +977,7 @@ function createStore(initialState, extend) {
509
977
  reset: /* @__PURE__ */ __name(() => replaceState2(cloneState(initialSnapshot)), "reset"),
510
978
  subscribe: subscribeState
511
979
  };
512
- for (const key of Object.keys(initialSnapshot)) {
980
+ for (const key of getEnumerableKeys(initialSnapshot)) {
513
981
  if (RESERVED_STORE_KEYS.has(key)) {
514
982
  throw new Error(
515
983
  `createStore does not allow the reserved key "${String(key)}" in the initial state.`
@@ -903,8 +1371,16 @@ __name(matchManifestRoute, "matchManifestRoute");
903
1371
  export {
904
1372
  FarmProvider,
905
1373
  useMutation,
1374
+ FetcherInputError,
906
1375
  useFetcher,
1376
+ FARM_CACHE_INVALIDATION_CHANNEL,
1377
+ enableCrossTabCacheInvalidation,
1378
+ FARM_CLIENT_CACHE_PERSIST_VERSION,
1379
+ defineClientCacheAdapter,
1380
+ storageClientCacheAdapter,
1381
+ initPersistedClientCache,
1382
+ clearPersistedCache,
907
1383
  createStore,
908
1384
  Link
909
1385
  };
910
- //# sourceMappingURL=chunk-KWCNQUH5.mjs.map
1386
+ //# sourceMappingURL=chunk-EPDIF432.mjs.map