@farm.js/core 0.1.0-beta.1 → 0.1.0-beta.4

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 (254) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-runtime.d.mts +2 -1
  3. package/dist/agent-runtime.d.ts +2 -1
  4. package/dist/api/route-manager.cjs +410 -15
  5. package/dist/api/route-manager.cjs.map +1 -1
  6. package/dist/api/route-manager.d.mts +4 -2
  7. package/dist/api/route-manager.d.ts +4 -2
  8. package/dist/api/route-manager.mjs +9 -8
  9. package/dist/api/runtime.cjs +748 -9
  10. package/dist/api/runtime.cjs.map +1 -1
  11. package/dist/api/runtime.d.mts +3 -16
  12. package/dist/api/runtime.d.ts +3 -16
  13. package/dist/api/runtime.mjs +8 -1
  14. package/dist/api.cjs +1243 -342
  15. package/dist/api.cjs.map +1 -1
  16. package/dist/api.d.mts +5 -147
  17. package/dist/api.d.ts +5 -147
  18. package/dist/api.mjs +51 -21
  19. package/dist/{app-CFRNJXP1.d.ts → app-BjN-da13.d.ts} +38 -3
  20. package/dist/{app-BiX4qb-d.d.mts → app-CakAr8Be.d.mts} +38 -3
  21. package/dist/app-markdown.cjs +1 -1
  22. package/dist/app-markdown.cjs.map +1 -1
  23. package/dist/app-markdown.d.mts +2 -1
  24. package/dist/app-markdown.d.ts +2 -1
  25. package/dist/app-markdown.mjs +1 -1
  26. package/dist/cache.cjs +414 -12
  27. package/dist/cache.cjs.map +1 -1
  28. package/dist/cache.d.mts +120 -6
  29. package/dist/cache.d.ts +120 -6
  30. package/dist/cache.mjs +11 -3
  31. package/dist/{chunk-Y7A27276.mjs → chunk-2CUKEMVR.mjs} +349 -15
  32. package/dist/chunk-2CUKEMVR.mjs.map +1 -0
  33. package/dist/{chunk-QF4PHCMA.mjs → chunk-2ED5Q2GH.mjs} +3 -3
  34. package/dist/chunk-2ED5Q2GH.mjs.map +1 -0
  35. package/dist/{chunk-GZP5W4K3.mjs → chunk-32W4QEJP.mjs} +1 -1
  36. package/dist/chunk-32W4QEJP.mjs.map +1 -0
  37. package/dist/{chunk-TRORP7E4.mjs → chunk-3U3ZUQAQ.mjs} +2 -2
  38. package/dist/{chunk-25D7G34K.mjs → chunk-65A7QIKI.mjs} +5 -5
  39. package/dist/{chunk-25D7G34K.mjs.map → chunk-65A7QIKI.mjs.map} +1 -1
  40. package/dist/{chunk-G3B5BRDY.mjs → chunk-AJWRO5WE.mjs} +539 -61
  41. package/dist/chunk-AJWRO5WE.mjs.map +1 -0
  42. package/dist/chunk-ALCLXXTY.mjs +187 -0
  43. package/dist/chunk-ALCLXXTY.mjs.map +1 -0
  44. package/dist/{chunk-CHFHNEMO.mjs → chunk-AOBXKNS5.mjs} +627 -84
  45. package/dist/chunk-AOBXKNS5.mjs.map +1 -0
  46. package/dist/{chunk-B6N4ZB2H.mjs → chunk-C2ROET2V.mjs} +3 -3
  47. package/dist/{chunk-JN3UU635.mjs → chunk-EJ7T4TPB.mjs} +2 -2
  48. package/dist/chunk-EJ7T4TPB.mjs.map +1 -0
  49. package/dist/{chunk-ZJQNATYV.mjs → chunk-FRPWCMMG.mjs} +3 -3
  50. package/dist/chunk-FRPWCMMG.mjs.map +1 -0
  51. package/dist/{chunk-QM6VV26B.mjs → chunk-GQVGIUSN.mjs} +3 -3
  52. package/dist/{chunk-QM6VV26B.mjs.map → chunk-GQVGIUSN.mjs.map} +1 -1
  53. package/dist/{chunk-UREJA4GZ.mjs → chunk-GXASWWJU.mjs} +1 -1
  54. package/dist/{chunk-UREJA4GZ.mjs.map → chunk-GXASWWJU.mjs.map} +1 -1
  55. package/dist/{chunk-3QJO55ZF.mjs → chunk-HNIQFZKB.mjs} +5 -3
  56. package/dist/{chunk-3QJO55ZF.mjs.map → chunk-HNIQFZKB.mjs.map} +1 -1
  57. package/dist/{chunk-PRNYWD7K.mjs → chunk-JDEOUK5V.mjs} +67 -239
  58. package/dist/chunk-JDEOUK5V.mjs.map +1 -0
  59. package/dist/{chunk-O3HADRW6.mjs → chunk-MIUW47JX.mjs} +2 -2
  60. package/dist/{chunk-O3HADRW6.mjs.map → chunk-MIUW47JX.mjs.map} +1 -1
  61. package/dist/{chunk-UHE2TTLK.mjs → chunk-NM3CRAAL.mjs} +9 -8
  62. package/dist/chunk-NM3CRAAL.mjs.map +1 -0
  63. package/dist/chunk-PFE6GMNE.mjs +603 -0
  64. package/dist/chunk-PFE6GMNE.mjs.map +1 -0
  65. package/dist/{chunk-S2XHZS7W.mjs → chunk-QGQX7SFC.mjs} +2 -2
  66. package/dist/chunk-QGQX7SFC.mjs.map +1 -0
  67. package/dist/{chunk-RKI6TN3A.mjs → chunk-QM746KUO.mjs} +9 -2
  68. package/dist/chunk-QM746KUO.mjs.map +1 -0
  69. package/dist/chunk-RBRLLZL5.mjs +81 -0
  70. package/dist/chunk-RBRLLZL5.mjs.map +1 -0
  71. package/dist/{chunk-HXP3ZSPC.mjs → chunk-SADGIRS2.mjs} +3 -3
  72. package/dist/{chunk-6XDUHOEM.mjs → chunk-TQAEEJB4.mjs} +3 -3
  73. package/dist/{chunk-AGS7UJ52.mjs → chunk-UB5UOSHB.mjs} +24 -12
  74. package/dist/chunk-UB5UOSHB.mjs.map +1 -0
  75. package/dist/{chunk-SXZTEK3V.mjs → chunk-UXUAWNO5.mjs} +2 -2
  76. package/dist/chunk-V3XURYJO.mjs +756 -0
  77. package/dist/chunk-V3XURYJO.mjs.map +1 -0
  78. package/dist/{chunk-TU4YJICB.mjs → chunk-VVKWFZAH.mjs} +41 -16
  79. package/dist/chunk-VVKWFZAH.mjs.map +1 -0
  80. package/dist/{chunk-JLWMCADZ.mjs → chunk-VY2UYN5R.mjs} +24 -4
  81. package/dist/chunk-VY2UYN5R.mjs.map +1 -0
  82. package/dist/{chunk-QFQRHRZS.mjs → chunk-W2CRQFF6.mjs} +151 -23
  83. package/dist/chunk-W2CRQFF6.mjs.map +1 -0
  84. package/dist/chunk-W4UIVMVI.mjs +10 -0
  85. package/dist/chunk-W4UIVMVI.mjs.map +1 -0
  86. package/dist/{chunk-Y2OJJD7R.mjs → chunk-XIVV5IWN.mjs} +7 -9
  87. package/dist/chunk-XIVV5IWN.mjs.map +1 -0
  88. package/dist/{chunk-OYXO65LI.mjs → chunk-YW7OBE6Q.mjs} +4 -4
  89. package/dist/chunk-YW7OBE6Q.mjs.map +1 -0
  90. package/dist/{chunk-YHU7SS6L.mjs → chunk-Z5CQMP54.mjs} +11 -11
  91. package/dist/{chunk-SOU3Q3ZA.mjs → chunk-ZZ57EH5Z.mjs} +1 -1
  92. package/dist/chunk-ZZ57EH5Z.mjs.map +1 -0
  93. package/dist/{client-D_yUjVhe.d.mts → client-BT1mFQas.d.mts} +55 -10
  94. package/dist/{client-Dkc03WP8.d.ts → client-Nn0q4eO4.d.ts} +55 -10
  95. package/dist/{client-plugins-BZnpeTGA.d.ts → client-plugins-Cw4qUGsw.d.ts} +7 -0
  96. package/dist/{client-plugins-g4bzuCmo.d.mts → client-plugins-DQQ1adXM.d.mts} +7 -0
  97. package/dist/client-plugins.d.mts +2 -1
  98. package/dist/client-plugins.d.ts +2 -1
  99. package/dist/client.cjs +922 -91
  100. package/dist/client.cjs.map +1 -1
  101. package/dist/client.d.mts +121 -3
  102. package/dist/client.d.ts +121 -3
  103. package/dist/client.mjs +23 -16
  104. package/dist/config.d.mts +2 -1
  105. package/dist/config.d.ts +2 -1
  106. package/dist/cron.cjs.map +1 -1
  107. package/dist/cron.mjs +1 -1
  108. package/dist/{devtools-AE4RVXCM.mjs → devtools-LVC3VB5P.mjs} +10 -10
  109. package/dist/{devtools-client-6WPY2AQU.mjs → devtools-client-3XRTBND5.mjs} +2 -11
  110. package/dist/devtools-client-3XRTBND5.mjs.map +1 -0
  111. package/dist/docs.cjs +14 -2
  112. package/dist/docs.cjs.map +1 -1
  113. package/dist/docs.mjs +10 -10
  114. package/dist/i18n/server.cjs +2 -2
  115. package/dist/i18n/server.cjs.map +1 -1
  116. package/dist/i18n/server.mjs +1 -1
  117. package/dist/index.cjs +2852 -463
  118. package/dist/index.cjs.map +1 -1
  119. package/dist/index.d.mts +13 -12
  120. package/dist/index.d.ts +13 -12
  121. package/dist/index.mjs +152 -109
  122. package/dist/index.mjs.map +1 -1
  123. package/dist/integrations.d.mts +2 -1
  124. package/dist/integrations.d.ts +2 -1
  125. package/dist/internal/build-runtime.cjs +1616 -149
  126. package/dist/internal/build-runtime.cjs.map +1 -1
  127. package/dist/internal/build-runtime.d.mts +4 -3
  128. package/dist/internal/build-runtime.d.ts +4 -3
  129. package/dist/internal/build-runtime.mjs +27 -25
  130. package/dist/internal/client-runtime.cjs.map +1 -1
  131. package/dist/internal/client-runtime.mjs +1 -1
  132. package/dist/internal/config-runtime.cjs +13 -2
  133. package/dist/internal/config-runtime.cjs.map +1 -1
  134. package/dist/internal/config-runtime.d.mts +3 -2
  135. package/dist/internal/config-runtime.d.ts +3 -2
  136. package/dist/internal/config-runtime.mjs +9 -9
  137. package/dist/internal/production-runtime.cjs +285 -9
  138. package/dist/internal/production-runtime.cjs.map +1 -1
  139. package/dist/internal/production-runtime.d.mts +4 -4
  140. package/dist/internal/production-runtime.d.ts +4 -4
  141. package/dist/internal/production-runtime.mjs +10 -8
  142. package/dist/{metadata-DAXRaOHx.d.ts → metadata-BAPg_Nmo.d.ts} +1 -1
  143. package/dist/{metadata-C9NZxMDW.d.mts → metadata-_6i9oFG3.d.mts} +1 -1
  144. package/dist/middleware.cjs +2 -2
  145. package/dist/middleware.cjs.map +1 -1
  146. package/dist/middleware.d.mts +4 -3
  147. package/dist/middleware.d.ts +4 -3
  148. package/dist/middleware.mjs +3 -3
  149. package/dist/navigation.cjs +40 -15
  150. package/dist/navigation.cjs.map +1 -1
  151. package/dist/navigation.mjs +3 -3
  152. package/dist/{nitro-KME62MWG.mjs → nitro-QO5LV6QK.mjs} +11 -13
  153. package/dist/{nitro-KME62MWG.mjs.map → nitro-QO5LV6QK.mjs.map} +1 -1
  154. package/dist/plugin.cjs +1032 -92
  155. package/dist/plugin.cjs.map +1 -1
  156. package/dist/plugin.d.mts +2 -1
  157. package/dist/plugin.d.ts +2 -1
  158. package/dist/plugin.mjs +23 -21
  159. package/dist/{production-runtime-DRkCHUvJ.d.ts → production-runtime-BoJDc5mc.d.ts} +1 -1
  160. package/dist/{production-runtime-flrjp_nC.d.mts → production-runtime-DPfgMV9Y.d.mts} +1 -1
  161. package/dist/routes.cjs +276 -6
  162. package/dist/routes.cjs.map +1 -1
  163. package/dist/routes.d.mts +1 -1
  164. package/dist/routes.d.ts +1 -1
  165. package/dist/routes.mjs +4 -4
  166. package/dist/runtime-9nQjVM7X.d.mts +206 -0
  167. package/dist/runtime-DgeS2skB.d.ts +206 -0
  168. package/dist/server-action-security.cjs +28 -10
  169. package/dist/server-action-security.cjs.map +1 -1
  170. package/dist/server-action-security.d.mts +2 -1
  171. package/dist/server-action-security.d.ts +2 -1
  172. package/dist/server-action-security.mjs +2 -2
  173. package/dist/server-fn-client.cjs.map +1 -1
  174. package/dist/server-fn-client.d.mts +1 -0
  175. package/dist/server-fn-client.d.ts +1 -0
  176. package/dist/server-fn-client.mjs +1 -1
  177. package/dist/server-fn.cjs +785 -3
  178. package/dist/server-fn.cjs.map +1 -1
  179. package/dist/server-fn.d.mts +10 -1
  180. package/dist/server-fn.d.ts +10 -1
  181. package/dist/server-fn.mjs +6 -3
  182. package/dist/server-plugins.d.mts +3 -2
  183. package/dist/server-plugins.d.ts +3 -2
  184. package/dist/server-query-client.cjs +278 -7
  185. package/dist/server-query-client.cjs.map +1 -1
  186. package/dist/server-query-client.mjs +4 -4
  187. package/dist/server-query.cjs +381 -10
  188. package/dist/server-query.cjs.map +1 -1
  189. package/dist/server-query.mjs +5 -5
  190. package/dist/server.cjs +1233 -118
  191. package/dist/server.cjs.map +1 -1
  192. package/dist/server.d.mts +8 -7
  193. package/dist/server.d.ts +8 -7
  194. package/dist/server.mjs +53 -33
  195. package/dist/server.mjs.map +1 -1
  196. package/dist/testing.cjs +436 -25
  197. package/dist/testing.cjs.map +1 -1
  198. package/dist/testing.d.mts +4 -3
  199. package/dist/testing.d.ts +4 -3
  200. package/dist/testing.mjs +19 -18
  201. package/dist/testing.mjs.map +1 -1
  202. package/dist/transport-BmbGTXA5.d.mts +49 -0
  203. package/dist/transport-BmbGTXA5.d.ts +49 -0
  204. package/dist/{utils-DOXXivjL.d.mts → utils-CHXlMDkg.d.mts} +1 -1
  205. package/dist/{utils-DA1yo54_.d.ts → utils-Drsyz1Vj.d.ts} +1 -1
  206. package/dist/version.cjs +36 -0
  207. package/dist/version.cjs.map +1 -0
  208. package/dist/version.d.mts +3 -0
  209. package/dist/version.d.ts +3 -0
  210. package/dist/version.mjs +8 -0
  211. package/dist/version.mjs.map +1 -0
  212. package/dist/vite.cjs +1039 -93
  213. package/dist/vite.cjs.map +1 -1
  214. package/dist/vite.d.mts +2 -1
  215. package/dist/vite.d.ts +2 -1
  216. package/dist/vite.mjs +23 -21
  217. package/dist/workflows.cjs +6 -8
  218. package/dist/workflows.cjs.map +1 -1
  219. package/dist/workflows.mjs +1 -1
  220. package/package.json +12 -5
  221. package/types/api.d.ts +44 -0
  222. package/types/client.d.ts +220 -16
  223. package/dist/chunk-4PTK6KT4.mjs +0 -364
  224. package/dist/chunk-4PTK6KT4.mjs.map +0 -1
  225. package/dist/chunk-AGS7UJ52.mjs.map +0 -1
  226. package/dist/chunk-CHFHNEMO.mjs.map +0 -1
  227. package/dist/chunk-EVGBEZDF.mjs +0 -215
  228. package/dist/chunk-EVGBEZDF.mjs.map +0 -1
  229. package/dist/chunk-G3B5BRDY.mjs.map +0 -1
  230. package/dist/chunk-GZP5W4K3.mjs.map +0 -1
  231. package/dist/chunk-JLWMCADZ.mjs.map +0 -1
  232. package/dist/chunk-JN3UU635.mjs.map +0 -1
  233. package/dist/chunk-OYXO65LI.mjs.map +0 -1
  234. package/dist/chunk-PRNYWD7K.mjs.map +0 -1
  235. package/dist/chunk-QF4PHCMA.mjs.map +0 -1
  236. package/dist/chunk-QFQRHRZS.mjs.map +0 -1
  237. package/dist/chunk-RKI6TN3A.mjs.map +0 -1
  238. package/dist/chunk-S2XHZS7W.mjs.map +0 -1
  239. package/dist/chunk-SOU3Q3ZA.mjs.map +0 -1
  240. package/dist/chunk-TU4YJICB.mjs.map +0 -1
  241. package/dist/chunk-TXCFGOHW.mjs +0 -42
  242. package/dist/chunk-TXCFGOHW.mjs.map +0 -1
  243. package/dist/chunk-UHE2TTLK.mjs.map +0 -1
  244. package/dist/chunk-Y2OJJD7R.mjs.map +0 -1
  245. package/dist/chunk-Y7A27276.mjs.map +0 -1
  246. package/dist/chunk-ZJQNATYV.mjs.map +0 -1
  247. package/dist/devtools-client-6WPY2AQU.mjs.map +0 -1
  248. /package/dist/{chunk-TRORP7E4.mjs.map → chunk-3U3ZUQAQ.mjs.map} +0 -0
  249. /package/dist/{chunk-B6N4ZB2H.mjs.map → chunk-C2ROET2V.mjs.map} +0 -0
  250. /package/dist/{chunk-HXP3ZSPC.mjs.map → chunk-SADGIRS2.mjs.map} +0 -0
  251. /package/dist/{chunk-6XDUHOEM.mjs.map → chunk-TQAEEJB4.mjs.map} +0 -0
  252. /package/dist/{chunk-SXZTEK3V.mjs.map → chunk-UXUAWNO5.mjs.map} +0 -0
  253. /package/dist/{chunk-YHU7SS6L.mjs.map → chunk-Z5CQMP54.mjs.map} +0 -0
  254. /package/dist/{devtools-AE4RVXCM.mjs.map → devtools-LVC3VB5P.mjs.map} +0 -0
@@ -1,7 +1,7 @@
1
- import { aO as ResolvedFarmConfig } from '../client-plugins-g4bzuCmo.mjs';
2
- export { a4 as loadConfig, a3 as resolveConfig, a5 as resolveDeployConfig } from '../client-plugins-g4bzuCmo.mjs';
1
+ import { aO as ResolvedFarmConfig } from '../client-plugins-DQQ1adXM.mjs';
2
+ export { a4 as loadConfig, a3 as resolveConfig, a5 as resolveDeployConfig } from '../client-plugins-DQQ1adXM.mjs';
3
3
  import { FarmProductionViteRuntime } from './config-runtime.mjs';
4
- export { l as logger } from '../utils-DOXXivjL.mjs';
4
+ export { l as logger } from '../utils-CHXlMDkg.mjs';
5
5
  import '../plugin-BJDf43dc.mjs';
6
6
  import 'react';
7
7
  import 'http';
@@ -21,6 +21,7 @@ import '../env.mjs';
21
21
  import '../server-action-security.mjs';
22
22
  import '../image-config-Duob7wER.mjs';
23
23
  import '../types-BH1lhg5G.mjs';
24
+ import '../cache.mjs';
24
25
  import '../route-runtime-DoOHzCAD.mjs';
25
26
 
26
27
  interface BuildOptions {
@@ -1,7 +1,7 @@
1
- import { aO as ResolvedFarmConfig } from '../client-plugins-BZnpeTGA.js';
2
- export { a4 as loadConfig, a3 as resolveConfig, a5 as resolveDeployConfig } from '../client-plugins-BZnpeTGA.js';
1
+ import { aO as ResolvedFarmConfig } from '../client-plugins-Cw4qUGsw.js';
2
+ export { a4 as loadConfig, a3 as resolveConfig, a5 as resolveDeployConfig } from '../client-plugins-Cw4qUGsw.js';
3
3
  import { FarmProductionViteRuntime } from './config-runtime.js';
4
- export { l as logger } from '../utils-DA1yo54_.js';
4
+ export { l as logger } from '../utils-Drsyz1Vj.js';
5
5
  import '../plugin-BJDf43dc.js';
6
6
  import 'react';
7
7
  import 'http';
@@ -21,6 +21,7 @@ import '../env.js';
21
21
  import '../server-action-security.js';
22
22
  import '../image-config-Duob7wER.js';
23
23
  import '../types-BH1lhg5G.js';
24
+ import '../cache.js';
24
25
  import '../route-runtime-DoOHzCAD.js';
25
26
 
26
27
  interface BuildOptions {
@@ -1,67 +1,69 @@
1
1
  import {
2
2
  build
3
- } from "../chunk-G3B5BRDY.mjs";
3
+ } from "../chunk-AJWRO5WE.mjs";
4
4
  import "../chunk-SL6HTIOK.mjs";
5
5
  import "../chunk-4S3ORGFA.mjs";
6
- import "../chunk-3QJO55ZF.mjs";
6
+ import "../chunk-HNIQFZKB.mjs";
7
7
  import "../chunk-V7RBCSDJ.mjs";
8
- import "../chunk-RKI6TN3A.mjs";
8
+ import "../chunk-QM746KUO.mjs";
9
9
  import {
10
10
  loadConfig,
11
11
  resolveConfig,
12
12
  resolveDeployConfig
13
- } from "../chunk-UHE2TTLK.mjs";
13
+ } from "../chunk-NM3CRAAL.mjs";
14
14
  import "../chunk-UVCIEUJC.mjs";
15
15
  import "../chunk-C3DLZMBU.mjs";
16
16
  import "../chunk-RSKVYESE.mjs";
17
- import "../chunk-CHFHNEMO.mjs";
17
+ import "../chunk-AOBXKNS5.mjs";
18
18
  import "../chunk-LGHEOHBU.mjs";
19
- import "../chunk-ZJQNATYV.mjs";
19
+ import "../chunk-FRPWCMMG.mjs";
20
20
  import "../chunk-V6WE6JSZ.mjs";
21
21
  import "../chunk-3XNTL3FQ.mjs";
22
22
  import "../chunk-BHG3LVHH.mjs";
23
23
  import "../chunk-USWZZUEH.mjs";
24
+ import "../chunk-3U3ZUQAQ.mjs";
25
+ import "../chunk-7HO6AEOP.mjs";
24
26
  import "../chunk-74YTBPTY.mjs";
25
27
  import "../chunk-7MABZJIM.mjs";
26
- import "../chunk-OYXO65LI.mjs";
28
+ import "../chunk-YW7OBE6Q.mjs";
27
29
  import "../chunk-GY2STC2S.mjs";
30
+ import "../chunk-UB5UOSHB.mjs";
28
31
  import "../chunk-LLC7BNXW.mjs";
29
- import "../chunk-S2XHZS7W.mjs";
30
- import "../chunk-Y2OJJD7R.mjs";
31
- import "../chunk-UREJA4GZ.mjs";
32
- import "../chunk-AGS7UJ52.mjs";
32
+ import "../chunk-QGQX7SFC.mjs";
33
+ import "../chunk-XIVV5IWN.mjs";
34
+ import "../chunk-GXASWWJU.mjs";
33
35
  import "../chunk-K4667E2Q.mjs";
34
- import "../chunk-TRORP7E4.mjs";
35
- import "../chunk-7HO6AEOP.mjs";
36
- import "../chunk-O3HADRW6.mjs";
36
+ import "../chunk-MIUW47JX.mjs";
37
37
  import "../chunk-P7QDS5AT.mjs";
38
38
  import "../chunk-T4QJQK76.mjs";
39
39
  import "../chunk-E6EPN5BT.mjs";
40
40
  import "../chunk-QGOHVJ6J.mjs";
41
- import "../chunk-YHU7SS6L.mjs";
42
- import "../chunk-QF4PHCMA.mjs";
41
+ import "../chunk-Z5CQMP54.mjs";
42
+ import "../chunk-2ED5Q2GH.mjs";
43
43
  import "../chunk-GN72QAIH.mjs";
44
44
  import "../chunk-FQYDHKKU.mjs";
45
+ import "../chunk-C2ROET2V.mjs";
46
+ import "../chunk-QKVUNGAH.mjs";
47
+ import "../chunk-GQVGIUSN.mjs";
45
48
  import {
46
49
  logger
47
50
  } from "../chunk-J4FNJ5IU.mjs";
48
- import "../chunk-EVGBEZDF.mjs";
51
+ import "../chunk-PFE6GMNE.mjs";
49
52
  import "../chunk-RHIFZZUI.mjs";
50
53
  import "../chunk-LM2YNO4U.mjs";
51
- import "../chunk-B6N4ZB2H.mjs";
52
- import "../chunk-QKVUNGAH.mjs";
53
- import "../chunk-QM6VV26B.mjs";
54
- import "../chunk-JK25YEN6.mjs";
55
- import "../chunk-TU4YJICB.mjs";
54
+ import "../chunk-W4UIVMVI.mjs";
55
+ import "../chunk-VVKWFZAH.mjs";
56
56
  import "../chunk-ITN462YM.mjs";
57
57
  import "../chunk-B232I2GP.mjs";
58
+ import "../chunk-JK25YEN6.mjs";
58
59
  import "../chunk-GS6K5OCM.mjs";
59
60
  import "../chunk-44ZCFSKE.mjs";
60
- import "../chunk-ZBE6MLHL.mjs";
61
- import "../chunk-4PTK6KT4.mjs";
62
- import "../chunk-TXCFGOHW.mjs";
61
+ import "../chunk-ALCLXXTY.mjs";
62
+ import "../chunk-V3XURYJO.mjs";
63
63
  import "../chunk-WZ5QFROO.mjs";
64
+ import "../chunk-RBRLLZL5.mjs";
64
65
  import "../chunk-7ZY5AIJO.mjs";
66
+ import "../chunk-ZBE6MLHL.mjs";
65
67
  import "../chunk-CGILA3WO.mjs";
66
68
  export {
67
69
  build,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/client/production-runtime.ts","../../src/client/chunk-recovery.ts","../../src/client/plugin.ts"],"sourcesContent":["export { installChunkErrorRecovery } from \"./chunk-recovery\";\nexport { createClientPluginManager } from \"./plugin\";\n","\"use client\";\n\nexport interface FarmChunkRecoveryOptions {\n /**\n * How long a page is considered already recovered before another chunk\n * failure may trigger a reload. Defaults to 30 seconds.\n */\n maxAgeMs?: number;\n /**\n * Override the storage key. Mostly useful for tests and embedded runtimes.\n */\n storageKey?: string;\n /**\n * Called right before Farm reloads the page.\n */\n onRecover?: (error: unknown) => void;\n /**\n * Test hooks for browser globals.\n */\n reload?: () => void;\n storage?: Pick<Storage, \"getItem\" | \"setItem\" | \"removeItem\"> | null;\n location?: Pick<Location, \"pathname\" | \"search\" | \"reload\">;\n now?: () => number;\n}\n\nconst DEFAULT_MAX_AGE_MS = 30_000;\nconst STORAGE_KEY_PREFIX = \"farm:chunk-recovery:\";\nconst CHUNK_ERROR_PATTERNS = [\n /ChunkLoadError/i,\n /Loading chunk [\\w-]+ failed/i,\n /Loading CSS chunk [\\w-]+ failed/i,\n /CSS_CHUNK_LOAD_FAILED/i,\n /failed to fetch dynamically imported module/i,\n /error loading dynamically imported module/i,\n /importing a module script failed/i,\n /unable to preload CSS/i,\n /module script failed/i,\n];\n\nexport function isChunkLoadError(errorLike: unknown): boolean {\n const values = collectErrorText(errorLike);\n if (values.some((value) => CHUNK_ERROR_PATTERNS.some((pattern) => pattern.test(value)))) {\n return true;\n }\n\n const targetUrl = getEventTargetAssetUrl(errorLike);\n return Boolean(targetUrl && /\\.(?:m?js|css)(?:[?#].*)?$/i.test(targetUrl));\n}\n\nexport function installChunkErrorRecovery(\n options: FarmChunkRecoveryOptions = {},\n): () => void {\n if (typeof window === \"undefined\") {\n return () => {};\n }\n\n const recover = (errorLike: unknown) => {\n if (!isChunkLoadError(errorLike)) {\n return;\n }\n if (!markRecovered(options)) {\n return;\n }\n\n options.onRecover?.(errorLike);\n getReload(options)();\n };\n\n const onError = (event: Event | ErrorEvent) => {\n recover(getErrorEventPayload(event));\n };\n const onUnhandledRejection = (event: PromiseRejectionEvent) => {\n recover(event.reason);\n };\n\n window.addEventListener(\"error\", onError, true);\n window.addEventListener(\"unhandledrejection\", onUnhandledRejection);\n\n return () => {\n window.removeEventListener(\"error\", onError, true);\n window.removeEventListener(\"unhandledrejection\", onUnhandledRejection);\n };\n}\n\nfunction markRecovered(options: FarmChunkRecoveryOptions): boolean {\n const now = getNow(options);\n const maxAgeMs = options.maxAgeMs ?? DEFAULT_MAX_AGE_MS;\n const storage = getStorage(options);\n const key = getStorageKey(options);\n\n if (!storage) {\n return true;\n }\n\n try {\n const previous = Number(storage.getItem(key));\n if (Number.isFinite(previous) && previous > 0 && now - previous < maxAgeMs) {\n return false;\n }\n storage.setItem(key, String(now));\n return true;\n } catch {\n return true;\n }\n}\n\nfunction getErrorEventPayload(event: Event | ErrorEvent): unknown {\n if (\"error\" in event && event.error) {\n return event.error;\n }\n if (\"message\" in event && event.message) {\n return event.message;\n }\n return event;\n}\n\nfunction collectErrorText(value: unknown, seen = new Set<unknown>()): string[] {\n if (value == null || seen.has(value)) {\n return [];\n }\n seen.add(value);\n\n if (typeof value === \"string\") {\n return [value];\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return [String(value)];\n }\n if (typeof value !== \"object\") {\n return [];\n }\n\n const record = value as Record<string, unknown>;\n const output: string[] = [];\n\n for (const key of [\"name\", \"message\", \"code\", \"type\", \"request\", \"src\", \"href\"]) {\n const candidate = record[key];\n if (typeof candidate === \"string\") {\n output.push(candidate);\n }\n }\n\n if (\"reason\" in record) {\n output.push(...collectErrorText(record.reason, seen));\n }\n if (\"error\" in record) {\n output.push(...collectErrorText(record.error, seen));\n }\n\n return output;\n}\n\nfunction getEventTargetAssetUrl(value: unknown): string | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const target = (value as Event).target as\n | (EventTarget & { src?: string; href?: string; tagName?: string })\n | null\n | undefined;\n if (!target || typeof target !== \"object\") {\n return undefined;\n }\n\n const tagName = typeof target.tagName === \"string\" ? target.tagName.toLowerCase() : \"\";\n if (tagName !== \"script\" && tagName !== \"link\") {\n return undefined;\n }\n\n return typeof target.src === \"string\" && target.src\n ? target.src\n : typeof target.href === \"string\" && target.href\n ? target.href\n : undefined;\n}\n\nfunction getStorage(options: FarmChunkRecoveryOptions) {\n if (\"storage\" in options) {\n return options.storage;\n }\n\n try {\n return window.sessionStorage;\n } catch {\n return null;\n }\n}\n\nfunction getStorageKey(options: FarmChunkRecoveryOptions): string {\n if (options.storageKey) {\n return options.storageKey;\n }\n\n const location = getLocation(options);\n return `${STORAGE_KEY_PREFIX}${location.pathname}${location.search}`;\n}\n\nfunction getLocation(options: FarmChunkRecoveryOptions) {\n return options.location ?? window.location;\n}\n\nfunction getReload(options: FarmChunkRecoveryOptions): () => void {\n if (options.reload) {\n return options.reload;\n }\n\n const location = getLocation(options);\n return () => location.reload();\n}\n\nfunction getNow(options: FarmChunkRecoveryOptions): number {\n return options.now ? options.now() : Date.now();\n}\n","\"use client\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type FarmClientPluginEnforce = \"pre\" | \"post\";\nexport type FarmClientNavigationAction = \"push\" | \"replace\" | \"pop\";\nexport type FarmClientHydrationMode = \"hydrate\" | \"render\";\n\nexport interface FarmClientLocation {\n href: string;\n pathname: string;\n search: string;\n hash: string;\n}\n\nexport interface FarmClientPluginRouter {\n navigate(href: string, options?: Record<string, unknown>): MaybePromise<void>;\n prefetch?(href: string): MaybePromise<void>;\n getNavigationState?(): unknown;\n}\n\nexport interface FarmClientPluginMetadata {\n name: string;\n version?: string;\n}\n\nexport interface FarmClientPluginSetupEvent<TPublic = undefined> {\n plugin: FarmClientPluginMetadata;\n public: Readonly<TPublic>;\n router: FarmClientPluginRouter;\n isDev: boolean;\n isProd: boolean;\n deploymentId?: string;\n}\n\nexport interface FarmClientPluginStateEvent<\n TState = unknown,\n TPublic = undefined,\n> extends FarmClientPluginSetupEvent<TPublic> {\n state: TState;\n}\n\nexport interface FarmClientHydrationSession {\n container: Element;\n location: FarmClientLocation;\n mode: FarmClientHydrationMode;\n startedAt: number;\n}\n\nexport interface FarmClientHydrationEvent<TState = unknown, TPublic = undefined>\n extends FarmClientPluginStateEvent<TState, TPublic>, FarmClientHydrationSession {}\n\nexport interface FarmClientHydrationCompleteEvent<\n TState = unknown,\n TPublic = undefined,\n> extends FarmClientHydrationEvent<TState, TPublic> {\n durationMs: number;\n recovered: boolean;\n}\n\nexport interface FarmClientNavigationSession {\n id: string;\n from: FarmClientLocation | null;\n to: FarmClientLocation;\n action: FarmClientNavigationAction;\n signal: AbortSignal;\n startedAt: number;\n route?: {\n pattern?: string | null;\n params?: Record<string, string>;\n };\n}\n\nexport interface FarmClientNavigationEvent<TState = unknown, TPublic = undefined>\n extends FarmClientPluginStateEvent<TState, TPublic>, FarmClientNavigationSession {}\n\nexport interface FarmClientNavigationLoadedEvent<\n TState = unknown,\n TPublic = undefined,\n> extends FarmClientNavigationEvent<TState, TPublic> {\n durationMs: number;\n data?: unknown;\n}\n\nexport interface FarmClientNavigationResolvedEvent<\n TState = unknown,\n TPublic = undefined,\n> extends FarmClientNavigationEvent<TState, TPublic> {\n durationMs: number;\n}\n\nexport interface FarmClientNavigationErrorEvent<\n TState = unknown,\n TPublic = undefined,\n> extends FarmClientNavigationResolvedEvent<TState, TPublic> {\n error: unknown;\n}\n\nexport type FarmClientPluginErrorPhase =\n | \"setup\"\n | \"hydration\"\n | \"navigation\"\n | \"window\"\n | \"unhandled-rejection\"\n | \"performance\"\n | `plugin:${string}`\n | (string & {});\n\nexport interface FarmClientPluginErrorEvent<\n TState = unknown,\n TPublic = undefined,\n> extends FarmClientPluginStateEvent<TState, TPublic> {\n error: unknown;\n phase: FarmClientPluginErrorPhase;\n location: FarmClientLocation;\n navigation?: FarmClientNavigationSession;\n}\n\nexport interface FarmClientPerformanceEvent<\n TState = unknown,\n TPublic = undefined,\n> extends FarmClientPluginStateEvent<TState, TPublic> {\n entry: PerformanceEntry;\n location: FarmClientLocation;\n}\n\nexport interface FarmClientPluginCloseEvent<\n TState = unknown,\n TPublic = undefined,\n> extends FarmClientPluginStateEvent<TState, TPublic> {\n reason: \"pagehide\" | \"hmr\" | \"manual\" | (string & {});\n}\n\nexport interface FarmClientPlugin<TState = unknown, TPublic = undefined> {\n setup?(event: FarmClientPluginSetupEvent<TPublic>): MaybePromise<TState>;\n hydration?: {\n before?(event: FarmClientHydrationEvent<TState, TPublic>): MaybePromise<void>;\n after?(event: FarmClientHydrationCompleteEvent<TState, TPublic>): MaybePromise<void>;\n };\n navigation?: {\n before?(event: FarmClientNavigationEvent<TState, TPublic>): MaybePromise<void>;\n loaded?(event: FarmClientNavigationLoadedEvent<TState, TPublic>): MaybePromise<void>;\n resolved?(event: FarmClientNavigationResolvedEvent<TState, TPublic>): MaybePromise<void>;\n rendered?(event: FarmClientNavigationResolvedEvent<TState, TPublic>): MaybePromise<void>;\n error?(event: FarmClientNavigationErrorEvent<TState, TPublic>): MaybePromise<void>;\n };\n error?(event: FarmClientPluginErrorEvent<TState, TPublic>): MaybePromise<void>;\n performance?(event: FarmClientPerformanceEvent<TState, TPublic>): MaybePromise<void>;\n close?(event: FarmClientPluginCloseEvent<TState, TPublic>): MaybePromise<void>;\n}\n\nexport interface FarmClientPluginRegistration<TPublic = undefined> {\n name: string;\n version?: string;\n enforce?: FarmClientPluginEnforce;\n definition: FarmClientPlugin<any, TPublic>;\n public?: TPublic;\n}\n\nexport interface FarmClientPluginManagerOptions {\n router: FarmClientPluginRouter;\n isDev?: boolean;\n isProd?: boolean;\n deploymentId?: string;\n window?: Window;\n}\n\ninterface FarmClientPluginInstance {\n registration: FarmClientPluginRegistration<any>;\n plugin: FarmClientPlugin<any, any>;\n state: unknown;\n}\n\nconst PERFORMANCE_ENTRY_TYPES = [\n \"navigation\",\n \"paint\",\n \"largest-contentful-paint\",\n \"layout-shift\",\n \"event\",\n];\n\nexport class FarmClientPluginManager {\n private readonly registrations: FarmClientPluginRegistration[];\n private readonly options: FarmClientPluginManagerOptions;\n private readonly instances: FarmClientPluginInstance[] = [];\n private readonly performanceObservers: PerformanceObserver[] = [];\n private startPromise?: Promise<void>;\n private closePromise?: Promise<void>;\n private currentNavigation?: {\n controller: AbortController;\n session: FarmClientNavigationSession;\n };\n private navigationSequence = 0;\n private starting = false;\n private started = false;\n private closed = false;\n private readonly reportedErrors = new WeakSet<object>();\n\n private readonly handleWindowError = (event: ErrorEvent) => {\n const error = event.error ?? new Error(event.message || \"Unknown browser error\");\n void this.reportError(error, \"window\");\n };\n\n private readonly handleUnhandledRejection = (event: PromiseRejectionEvent) => {\n void this.reportError(event.reason, \"unhandled-rejection\");\n };\n\n private readonly handlePageHide = () => {\n void this.close(\"pagehide\");\n };\n\n constructor(\n registrations: readonly FarmClientPluginRegistration[],\n options: FarmClientPluginManagerOptions,\n ) {\n this.registrations = sortRegistrations(registrations);\n this.options = {\n ...options,\n isDev: options.isDev ?? false,\n isProd: options.isProd ?? !options.isDev,\n window: options.window ?? (typeof window !== \"undefined\" ? window : undefined),\n };\n }\n\n start(): Promise<void> {\n if (this.startPromise) return this.startPromise;\n\n this.startPromise = Promise.resolve().then(() => this.startInternal());\n return this.startPromise;\n }\n\n async beginHydration(input: {\n container: Element;\n mode: FarmClientHydrationMode;\n }): Promise<FarmClientHydrationSession> {\n await this.start();\n const session: FarmClientHydrationSession = {\n ...input,\n location: this.getLocation(),\n startedAt: now(),\n };\n\n await this.runHook(\"hydration.before\", (instance) =>\n instance.plugin.hydration?.before?.({\n ...this.createStateEvent(instance),\n ...session,\n }),\n );\n\n return session;\n }\n\n async completeHydration(\n session: FarmClientHydrationSession,\n options: { recovered?: boolean } = {},\n ): Promise<void> {\n await this.runHook(\"hydration.after\", (instance) =>\n instance.plugin.hydration?.after?.({\n ...this.createStateEvent(instance),\n ...session,\n durationMs: now() - session.startedAt,\n recovered: options.recovered ?? false,\n }),\n );\n }\n\n async failHydration(session: FarmClientHydrationSession, error: unknown): Promise<void> {\n await this.reportError(error, \"hydration\", undefined, session.location);\n }\n\n async beginNavigation(input: {\n from?: string | URL | FarmClientLocation | null;\n to: string | URL | FarmClientLocation;\n action: FarmClientNavigationAction;\n route?: FarmClientNavigationSession[\"route\"];\n }): Promise<FarmClientNavigationSession> {\n await this.start();\n this.currentNavigation?.controller.abort(\"superseded\");\n\n const controller = new AbortController();\n const session: FarmClientNavigationSession = {\n id: `navigation:${++this.navigationSequence}`,\n from:\n input.from === null\n ? null\n : toClientLocation(input.from ?? this.getLocation().href, this.getBaseUrl()),\n to: toClientLocation(input.to, this.getBaseUrl()),\n action: input.action,\n signal: controller.signal,\n startedAt: now(),\n route: input.route,\n };\n\n this.currentNavigation = { controller, session };\n await this.runHook(\"navigation.before\", (instance) =>\n instance.plugin.navigation?.before?.({\n ...this.createStateEvent(instance),\n ...session,\n }),\n );\n\n return session;\n }\n\n async markNavigationLoaded(session: FarmClientNavigationSession, data?: unknown): Promise<void> {\n if (session.signal.aborted) return;\n await this.runHook(\"navigation.loaded\", (instance) =>\n instance.plugin.navigation?.loaded?.({\n ...this.createStateEvent(instance),\n ...session,\n data,\n durationMs: now() - session.startedAt,\n }),\n );\n }\n\n async resolveNavigation(session: FarmClientNavigationSession): Promise<void> {\n if (session.signal.aborted) return;\n await this.runHook(\"navigation.resolved\", (instance) =>\n instance.plugin.navigation?.resolved?.({\n ...this.createStateEvent(instance),\n ...session,\n durationMs: now() - session.startedAt,\n }),\n );\n }\n\n scheduleNavigationRendered(session: FarmClientNavigationSession): Promise<void> {\n if (session.signal.aborted) return Promise.resolve();\n const clientWindow = this.options.window;\n const schedule = clientWindow?.requestAnimationFrame\n ? (callback: () => void) =>\n clientWindow.requestAnimationFrame(() => clientWindow.requestAnimationFrame(callback))\n : (callback: () => void) => setTimeout(callback, 0);\n\n return new Promise((resolve) => {\n schedule(() => {\n if (session.signal.aborted || this.closed) {\n resolve();\n return;\n }\n void this.runHook(\"navigation.rendered\", (instance) =>\n instance.plugin.navigation?.rendered?.({\n ...this.createStateEvent(instance),\n ...session,\n durationMs: now() - session.startedAt,\n }),\n ).finally(() => {\n if (this.currentNavigation?.session === session) {\n this.currentNavigation = undefined;\n }\n resolve();\n });\n });\n });\n }\n\n async failNavigation(session: FarmClientNavigationSession, error: unknown): Promise<void> {\n if (!session.signal.aborted) {\n await this.runHook(\"navigation.error\", (instance) =>\n instance.plugin.navigation?.error?.({\n ...this.createStateEvent(instance),\n ...session,\n durationMs: now() - session.startedAt,\n error,\n }),\n );\n await this.reportError(error, \"navigation\", session, session.to);\n }\n\n if (this.currentNavigation?.session === session) {\n this.currentNavigation = undefined;\n }\n }\n\n async reportError(\n error: unknown,\n phase: FarmClientPluginErrorPhase,\n navigation?: FarmClientNavigationSession,\n location = this.getLocation(),\n ): Promise<void> {\n if (this.closed) return;\n if (isObject(error)) {\n if (this.reportedErrors.has(error)) return;\n this.reportedErrors.add(error);\n }\n\n if (!this.started && !this.starting) await this.start();\n await this.runErrorHooks({ error, phase, navigation, location });\n }\n\n close(reason: FarmClientPluginCloseEvent[\"reason\"] = \"manual\"): Promise<void> {\n if (this.closePromise) return this.closePromise;\n this.closePromise = this.closeInternal(reason);\n return this.closePromise;\n }\n\n getPlugins(): readonly FarmClientPluginMetadata[] {\n return this.instances.map(({ registration }) => ({\n name: registration.name,\n version: registration.version,\n }));\n }\n\n private async startInternal(): Promise<void> {\n if (this.started || this.closed) return;\n this.starting = true;\n\n try {\n for (const registration of this.registrations) {\n try {\n const definition = registration.definition;\n if (!definition || typeof definition !== \"object\") {\n throw new TypeError(\n `Client plugin \"${registration.name}\" does not define a lifecycle object`,\n );\n }\n\n const instance: FarmClientPluginInstance = {\n registration,\n plugin: definition,\n state: undefined,\n };\n instance.state = await definition.setup?.(this.createSetupEvent(instance));\n this.instances.push(instance);\n } catch (error) {\n this.logHookError(registration.name, \"setup\", error);\n await this.runErrorHooks({\n error,\n phase: \"setup\",\n location: this.getLocation(),\n });\n }\n }\n\n this.started = true;\n this.installBrowserListeners();\n this.installPerformanceObservers();\n } finally {\n this.starting = false;\n }\n }\n\n private installBrowserListeners(): void {\n const clientWindow = this.options.window;\n if (!clientWindow) return;\n\n if (this.instances.some(({ plugin }) => plugin.error)) {\n clientWindow.addEventListener(\"error\", this.handleWindowError);\n clientWindow.addEventListener(\"unhandledrejection\", this.handleUnhandledRejection);\n }\n clientWindow.addEventListener(\"pagehide\", this.handlePageHide, {\n once: true,\n });\n }\n\n private installPerformanceObservers(): void {\n if (!this.instances.some(({ plugin }) => plugin.performance)) return;\n const Observer = typeof PerformanceObserver !== \"undefined\" ? PerformanceObserver : undefined;\n if (!Observer) return;\n\n const supported = new Set(Observer.supportedEntryTypes || []);\n for (const type of PERFORMANCE_ENTRY_TYPES) {\n if (!supported.has(type)) continue;\n try {\n const observer = new Observer((list: PerformanceObserverEntryList) => {\n for (const entry of list.getEntries()) {\n void this.runHook(\"performance\", (instance) =>\n instance.plugin.performance?.({\n ...this.createStateEvent(instance),\n entry,\n location: this.getLocation(),\n }),\n );\n }\n });\n observer.observe({ type, buffered: true });\n this.performanceObservers.push(observer);\n } catch (error) {\n void this.reportError(error, \"performance\");\n }\n }\n }\n\n private async closeInternal(reason: FarmClientPluginCloseEvent[\"reason\"]): Promise<void> {\n if (this.closed) return;\n if (this.startPromise) await this.startPromise;\n this.closed = true;\n this.currentNavigation?.controller.abort(reason);\n this.currentNavigation = undefined;\n\n const clientWindow = this.options.window;\n clientWindow?.removeEventListener(\"error\", this.handleWindowError);\n clientWindow?.removeEventListener(\"unhandledrejection\", this.handleUnhandledRejection);\n clientWindow?.removeEventListener(\"pagehide\", this.handlePageHide);\n for (const observer of this.performanceObservers) observer.disconnect();\n this.performanceObservers.length = 0;\n\n for (const instance of [...this.instances].reverse()) {\n try {\n await instance.plugin.close?.({\n ...this.createStateEvent(instance),\n reason,\n });\n } catch (error) {\n this.logHookError(instance.registration.name, \"close\", error);\n }\n }\n }\n\n private async runHook(\n hook: string,\n invoke: (instance: FarmClientPluginInstance) => MaybePromise<void> | undefined,\n ): Promise<void> {\n for (const instance of this.instances) {\n try {\n await invoke(instance);\n } catch (error) {\n this.logHookError(instance.registration.name, hook, error);\n await this.runErrorHooks(\n {\n error,\n phase: `plugin:${hook}`,\n location: this.getLocation(),\n },\n instance,\n );\n }\n }\n }\n\n private async runErrorHooks(\n event: Pick<FarmClientPluginErrorEvent, \"error\" | \"phase\" | \"location\" | \"navigation\">,\n excluded?: FarmClientPluginInstance,\n ): Promise<void> {\n for (const instance of this.instances) {\n if (instance === excluded || !instance.plugin.error) continue;\n try {\n await instance.plugin.error({\n ...this.createStateEvent(instance),\n ...event,\n });\n } catch (error) {\n this.logHookError(instance.registration.name, \"error\", error);\n }\n }\n }\n\n private createSetupEvent(\n instance: Pick<FarmClientPluginInstance, \"registration\">,\n ): FarmClientPluginSetupEvent<any> {\n return {\n plugin: {\n name: instance.registration.name,\n version: instance.registration.version,\n },\n public: readonlyPublicData(instance.registration.public),\n router: this.options.router,\n isDev: Boolean(this.options.isDev),\n isProd: Boolean(this.options.isProd),\n deploymentId: this.options.deploymentId,\n };\n }\n\n private createStateEvent(\n instance: FarmClientPluginInstance,\n ): FarmClientPluginStateEvent<any, any> {\n return {\n ...this.createSetupEvent(instance),\n state: instance.state,\n };\n }\n\n private getLocation(): FarmClientLocation {\n const href = this.options.window?.location.href ?? \"http://localhost/\";\n return toClientLocation(href, href);\n }\n\n private getBaseUrl(): string {\n return this.options.window?.location.href ?? \"http://localhost/\";\n }\n\n private logHookError(name: string, hook: string, error: unknown): void {\n console.error(`[Farm.js] Client plugin \"${name}\" failed in ${hook}:`, error);\n }\n}\n\nexport function createClientPluginManager(\n registrations: readonly FarmClientPluginRegistration[],\n options: FarmClientPluginManagerOptions,\n): FarmClientPluginManager {\n return new FarmClientPluginManager(registrations, options);\n}\n\nfunction sortRegistrations(\n registrations: readonly FarmClientPluginRegistration[],\n): FarmClientPluginRegistration[] {\n const rank = (enforce?: FarmClientPluginEnforce) =>\n enforce === \"pre\" ? 0 : enforce === \"post\" ? 2 : 1;\n return registrations\n .map((registration, index) => ({ registration, index }))\n .sort(\n (left, right) =>\n rank(left.registration.enforce) - rank(right.registration.enforce) ||\n left.index - right.index,\n )\n .map(({ registration }) => registration);\n}\n\nfunction toClientLocation(\n input: string | URL | FarmClientLocation,\n base: string,\n): FarmClientLocation {\n if (typeof input === \"object\" && \"href\" in input && \"pathname\" in input) {\n return {\n href: input.href,\n pathname: input.pathname,\n search: input.search,\n hash: input.hash,\n };\n }\n\n const url = new URL(input, base);\n return {\n href: url.href,\n pathname: url.pathname,\n search: url.search,\n hash: url.hash,\n };\n}\n\nfunction readonlyPublicData<T>(value: T | undefined): Readonly<T> {\n if (value && typeof value === \"object\") {\n return Object.freeze(value);\n }\n return value as Readonly<T>;\n}\n\nfunction now(): number {\n return typeof performance !== \"undefined\" ? performance.now() : Date.now();\n}\n\nfunction isObject(value: unknown): value is object {\n return (typeof value === \"object\" && value !== null) || typeof value === \"function\";\n}\n"],"mappings":"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","names":["now"]}
1
+ {"version":3,"sources":["../../src/client/production-runtime.ts","../../src/client/chunk-recovery.ts","../../src/client/plugin.ts"],"sourcesContent":["export { installChunkErrorRecovery } from \"./chunk-recovery\";\nexport { createClientPluginManager } from \"./plugin\";\n","\"use client\";\n\nexport interface FarmChunkRecoveryOptions {\n /**\n * How long a page is considered already recovered before another chunk\n * failure may trigger a reload. Defaults to 30 seconds.\n */\n maxAgeMs?: number;\n /**\n * Override the storage key. Mostly useful for tests and embedded runtimes.\n */\n storageKey?: string;\n /**\n * Called right before Farm reloads the page.\n */\n onRecover?: (error: unknown) => void;\n /**\n * Test hooks for browser globals.\n */\n reload?: () => void;\n storage?: Pick<Storage, \"getItem\" | \"setItem\" | \"removeItem\"> | null;\n location?: Pick<Location, \"pathname\" | \"search\" | \"reload\">;\n now?: () => number;\n}\n\nconst DEFAULT_MAX_AGE_MS = 30_000;\nconst STORAGE_KEY_PREFIX = \"farm:chunk-recovery:\";\nconst CHUNK_ERROR_PATTERNS = [\n /ChunkLoadError/i,\n /Loading chunk [\\w-]+ failed/i,\n /Loading CSS chunk [\\w-]+ failed/i,\n /CSS_CHUNK_LOAD_FAILED/i,\n /failed to fetch dynamically imported module/i,\n /error loading dynamically imported module/i,\n /importing a module script failed/i,\n /unable to preload CSS/i,\n /module script failed/i,\n];\n\nexport function isChunkLoadError(errorLike: unknown): boolean {\n const values = collectErrorText(errorLike);\n if (values.some((value) => CHUNK_ERROR_PATTERNS.some((pattern) => pattern.test(value)))) {\n return true;\n }\n\n const targetUrl = getEventTargetAssetUrl(errorLike);\n return Boolean(targetUrl && /\\.(?:m?js|css)(?:[?#].*)?$/i.test(targetUrl));\n}\n\nexport function installChunkErrorRecovery(options: FarmChunkRecoveryOptions = {}): () => void {\n if (typeof window === \"undefined\") {\n return () => {};\n }\n\n const recover = (errorLike: unknown) => {\n if (!isChunkLoadError(errorLike)) {\n return;\n }\n if (!markRecovered(options)) {\n return;\n }\n\n options.onRecover?.(errorLike);\n getReload(options)();\n };\n\n const onError = (event: Event | ErrorEvent) => {\n recover(getErrorEventPayload(event));\n };\n const onUnhandledRejection = (event: PromiseRejectionEvent) => {\n recover(event.reason);\n };\n\n window.addEventListener(\"error\", onError, true);\n window.addEventListener(\"unhandledrejection\", onUnhandledRejection);\n\n return () => {\n window.removeEventListener(\"error\", onError, true);\n window.removeEventListener(\"unhandledrejection\", onUnhandledRejection);\n };\n}\n\nfunction markRecovered(options: FarmChunkRecoveryOptions): boolean {\n const now = getNow(options);\n const maxAgeMs = options.maxAgeMs ?? DEFAULT_MAX_AGE_MS;\n const storage = getStorage(options);\n const key = getStorageKey(options);\n\n if (!storage) {\n return true;\n }\n\n try {\n const previous = Number(storage.getItem(key));\n if (Number.isFinite(previous) && previous > 0 && now - previous < maxAgeMs) {\n return false;\n }\n storage.setItem(key, String(now));\n return true;\n } catch {\n return true;\n }\n}\n\nfunction getErrorEventPayload(event: Event | ErrorEvent): unknown {\n if (\"error\" in event && event.error) {\n return event.error;\n }\n if (\"message\" in event && event.message) {\n return event.message;\n }\n return event;\n}\n\nfunction collectErrorText(value: unknown, seen = new Set<unknown>()): string[] {\n if (value == null || seen.has(value)) {\n return [];\n }\n seen.add(value);\n\n if (typeof value === \"string\") {\n return [value];\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return [String(value)];\n }\n if (typeof value !== \"object\") {\n return [];\n }\n\n const record = value as Record<string, unknown>;\n const output: string[] = [];\n\n for (const key of [\"name\", \"message\", \"code\", \"type\", \"request\", \"src\", \"href\"]) {\n const candidate = record[key];\n if (typeof candidate === \"string\") {\n output.push(candidate);\n }\n }\n\n if (\"reason\" in record) {\n output.push(...collectErrorText(record.reason, seen));\n }\n if (\"error\" in record) {\n output.push(...collectErrorText(record.error, seen));\n }\n\n return output;\n}\n\nfunction getEventTargetAssetUrl(value: unknown): string | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const target = (value as Event).target as\n | (EventTarget & { src?: string; href?: string; tagName?: string })\n | null\n | undefined;\n if (!target || typeof target !== \"object\") {\n return undefined;\n }\n\n const tagName = typeof target.tagName === \"string\" ? target.tagName.toLowerCase() : \"\";\n if (tagName !== \"script\" && tagName !== \"link\") {\n return undefined;\n }\n\n return typeof target.src === \"string\" && target.src\n ? target.src\n : typeof target.href === \"string\" && target.href\n ? target.href\n : undefined;\n}\n\nfunction getStorage(options: FarmChunkRecoveryOptions) {\n if (\"storage\" in options) {\n return options.storage;\n }\n\n try {\n return window.sessionStorage;\n } catch {\n return null;\n }\n}\n\nfunction getStorageKey(options: FarmChunkRecoveryOptions): string {\n if (options.storageKey) {\n return options.storageKey;\n }\n\n const location = getLocation(options);\n return `${STORAGE_KEY_PREFIX}${location.pathname}${location.search}`;\n}\n\nfunction getLocation(options: FarmChunkRecoveryOptions) {\n return options.location ?? window.location;\n}\n\nfunction getReload(options: FarmChunkRecoveryOptions): () => void {\n if (options.reload) {\n return options.reload;\n }\n\n const location = getLocation(options);\n return () => location.reload();\n}\n\nfunction getNow(options: FarmChunkRecoveryOptions): number {\n return options.now ? options.now() : Date.now();\n}\n","\"use client\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type FarmClientPluginEnforce = \"pre\" | \"post\";\nexport type FarmClientNavigationAction = \"push\" | \"replace\" | \"pop\";\nexport type FarmClientHydrationMode = \"hydrate\" | \"render\";\n\nexport interface FarmClientLocation {\n href: string;\n pathname: string;\n search: string;\n hash: string;\n}\n\nexport interface FarmClientPluginRouter {\n navigate(href: string, options?: Record<string, unknown>): MaybePromise<void>;\n prefetch?(href: string): MaybePromise<void>;\n getNavigationState?(): unknown;\n}\n\nexport interface FarmClientPluginMetadata {\n name: string;\n version?: string;\n}\n\nexport interface FarmClientPluginSetupEvent<TPublic = undefined> {\n plugin: FarmClientPluginMetadata;\n public: Readonly<TPublic>;\n router: FarmClientPluginRouter;\n isDev: boolean;\n isProd: boolean;\n deploymentId?: string;\n}\n\nexport interface FarmClientPluginStateEvent<\n TState = unknown,\n TPublic = undefined,\n> extends FarmClientPluginSetupEvent<TPublic> {\n state: TState;\n}\n\nexport interface FarmClientHydrationSession {\n container: Element;\n location: FarmClientLocation;\n mode: FarmClientHydrationMode;\n startedAt: number;\n}\n\nexport interface FarmClientHydrationEvent<TState = unknown, TPublic = undefined>\n extends FarmClientPluginStateEvent<TState, TPublic>, FarmClientHydrationSession {}\n\nexport interface FarmClientHydrationCompleteEvent<\n TState = unknown,\n TPublic = undefined,\n> extends FarmClientHydrationEvent<TState, TPublic> {\n durationMs: number;\n recovered: boolean;\n}\n\nexport interface FarmClientNavigationSession {\n id: string;\n from: FarmClientLocation | null;\n to: FarmClientLocation;\n action: FarmClientNavigationAction;\n signal: AbortSignal;\n startedAt: number;\n route?: {\n pattern?: string | null;\n params?: Record<string, string>;\n };\n}\n\nexport interface FarmClientNavigationEvent<TState = unknown, TPublic = undefined>\n extends FarmClientPluginStateEvent<TState, TPublic>, FarmClientNavigationSession {}\n\nexport interface FarmClientNavigationLoadedEvent<\n TState = unknown,\n TPublic = undefined,\n> extends FarmClientNavigationEvent<TState, TPublic> {\n durationMs: number;\n data?: unknown;\n}\n\nexport interface FarmClientNavigationResolvedEvent<\n TState = unknown,\n TPublic = undefined,\n> extends FarmClientNavigationEvent<TState, TPublic> {\n durationMs: number;\n}\n\nexport interface FarmClientNavigationErrorEvent<\n TState = unknown,\n TPublic = undefined,\n> extends FarmClientNavigationResolvedEvent<TState, TPublic> {\n error: unknown;\n}\n\nexport type FarmClientPluginErrorPhase =\n | \"setup\"\n | \"hydration\"\n | \"navigation\"\n | \"window\"\n | \"unhandled-rejection\"\n | \"performance\"\n | `plugin:${string}`\n | (string & {});\n\nexport interface FarmClientPluginErrorEvent<\n TState = unknown,\n TPublic = undefined,\n> extends FarmClientPluginStateEvent<TState, TPublic> {\n error: unknown;\n phase: FarmClientPluginErrorPhase;\n location: FarmClientLocation;\n navigation?: FarmClientNavigationSession;\n}\n\nexport interface FarmClientPerformanceEvent<\n TState = unknown,\n TPublic = undefined,\n> extends FarmClientPluginStateEvent<TState, TPublic> {\n entry: PerformanceEntry;\n location: FarmClientLocation;\n}\n\nexport interface FarmClientPluginCloseEvent<\n TState = unknown,\n TPublic = undefined,\n> extends FarmClientPluginStateEvent<TState, TPublic> {\n reason: \"pagehide\" | \"hmr\" | \"manual\" | (string & {});\n}\n\nexport interface FarmClientPlugin<TState = unknown, TPublic = undefined> {\n setup?(event: FarmClientPluginSetupEvent<TPublic>): MaybePromise<TState>;\n hydration?: {\n before?(event: FarmClientHydrationEvent<TState, TPublic>): MaybePromise<void>;\n after?(event: FarmClientHydrationCompleteEvent<TState, TPublic>): MaybePromise<void>;\n };\n navigation?: {\n before?(event: FarmClientNavigationEvent<TState, TPublic>): MaybePromise<void>;\n loaded?(event: FarmClientNavigationLoadedEvent<TState, TPublic>): MaybePromise<void>;\n resolved?(event: FarmClientNavigationResolvedEvent<TState, TPublic>): MaybePromise<void>;\n rendered?(event: FarmClientNavigationResolvedEvent<TState, TPublic>): MaybePromise<void>;\n error?(event: FarmClientNavigationErrorEvent<TState, TPublic>): MaybePromise<void>;\n };\n error?(event: FarmClientPluginErrorEvent<TState, TPublic>): MaybePromise<void>;\n performance?(event: FarmClientPerformanceEvent<TState, TPublic>): MaybePromise<void>;\n close?(event: FarmClientPluginCloseEvent<TState, TPublic>): MaybePromise<void>;\n}\n\nexport interface FarmClientPluginRegistration<TPublic = undefined> {\n name: string;\n version?: string;\n enforce?: FarmClientPluginEnforce;\n definition: FarmClientPlugin<any, TPublic>;\n public?: TPublic;\n}\n\nexport interface FarmClientPluginManagerOptions {\n router: FarmClientPluginRouter;\n isDev?: boolean;\n isProd?: boolean;\n deploymentId?: string;\n window?: Window;\n}\n\ninterface FarmClientPluginInstance {\n registration: FarmClientPluginRegistration<any>;\n plugin: FarmClientPlugin<any, any>;\n state: unknown;\n}\n\nconst PERFORMANCE_ENTRY_TYPES = [\n \"navigation\",\n \"paint\",\n \"largest-contentful-paint\",\n \"layout-shift\",\n \"event\",\n];\n\nexport class FarmClientPluginManager {\n private readonly registrations: FarmClientPluginRegistration[];\n private readonly options: FarmClientPluginManagerOptions;\n private readonly instances: FarmClientPluginInstance[] = [];\n private readonly performanceObservers: PerformanceObserver[] = [];\n private startPromise?: Promise<void>;\n private closePromise?: Promise<void>;\n private currentNavigation?: {\n controller: AbortController;\n session: FarmClientNavigationSession;\n };\n private navigationSequence = 0;\n private starting = false;\n private started = false;\n private closed = false;\n private readonly reportedErrors = new WeakSet<object>();\n\n private readonly handleWindowError = (event: ErrorEvent) => {\n const error = event.error ?? new Error(event.message || \"Unknown browser error\");\n void this.reportError(error, \"window\");\n };\n\n private readonly handleUnhandledRejection = (event: PromiseRejectionEvent) => {\n void this.reportError(event.reason, \"unhandled-rejection\");\n };\n\n private readonly handlePageHide = () => {\n void this.close(\"pagehide\");\n };\n\n constructor(\n registrations: readonly FarmClientPluginRegistration[],\n options: FarmClientPluginManagerOptions,\n ) {\n this.registrations = sortRegistrations(registrations);\n this.options = {\n ...options,\n isDev: options.isDev ?? false,\n isProd: options.isProd ?? !options.isDev,\n window: options.window ?? (typeof window !== \"undefined\" ? window : undefined),\n };\n }\n\n start(): Promise<void> {\n if (this.startPromise) return this.startPromise;\n\n this.startPromise = Promise.resolve().then(() => this.startInternal());\n return this.startPromise;\n }\n\n async beginHydration(input: {\n container: Element;\n mode: FarmClientHydrationMode;\n }): Promise<FarmClientHydrationSession> {\n await this.start();\n const session: FarmClientHydrationSession = {\n ...input,\n location: this.getLocation(),\n startedAt: now(),\n };\n\n await this.runHook(\"hydration.before\", (instance) =>\n instance.plugin.hydration?.before?.({\n ...this.createStateEvent(instance),\n ...session,\n }),\n );\n\n return session;\n }\n\n async completeHydration(\n session: FarmClientHydrationSession,\n options: { recovered?: boolean } = {},\n ): Promise<void> {\n await this.runHook(\"hydration.after\", (instance) =>\n instance.plugin.hydration?.after?.({\n ...this.createStateEvent(instance),\n ...session,\n durationMs: now() - session.startedAt,\n recovered: options.recovered ?? false,\n }),\n );\n }\n\n async failHydration(session: FarmClientHydrationSession, error: unknown): Promise<void> {\n await this.reportError(error, \"hydration\", undefined, session.location);\n }\n\n async beginNavigation(input: {\n from?: string | URL | FarmClientLocation | null;\n to: string | URL | FarmClientLocation;\n action: FarmClientNavigationAction;\n route?: FarmClientNavigationSession[\"route\"];\n }): Promise<FarmClientNavigationSession> {\n await this.start();\n this.currentNavigation?.controller.abort(\"superseded\");\n\n const controller = new AbortController();\n const session: FarmClientNavigationSession = {\n id: `navigation:${++this.navigationSequence}`,\n from:\n input.from === null\n ? null\n : toClientLocation(input.from ?? this.getLocation().href, this.getBaseUrl()),\n to: toClientLocation(input.to, this.getBaseUrl()),\n action: input.action,\n signal: controller.signal,\n startedAt: now(),\n route: input.route,\n };\n\n this.currentNavigation = { controller, session };\n await this.runHook(\"navigation.before\", (instance) =>\n instance.plugin.navigation?.before?.({\n ...this.createStateEvent(instance),\n ...session,\n }),\n );\n\n return session;\n }\n\n async markNavigationLoaded(session: FarmClientNavigationSession, data?: unknown): Promise<void> {\n if (session.signal.aborted) return;\n await this.runHook(\"navigation.loaded\", (instance) =>\n instance.plugin.navigation?.loaded?.({\n ...this.createStateEvent(instance),\n ...session,\n data,\n durationMs: now() - session.startedAt,\n }),\n );\n }\n\n async resolveNavigation(session: FarmClientNavigationSession): Promise<void> {\n if (session.signal.aborted) return;\n await this.runHook(\"navigation.resolved\", (instance) =>\n instance.plugin.navigation?.resolved?.({\n ...this.createStateEvent(instance),\n ...session,\n durationMs: now() - session.startedAt,\n }),\n );\n }\n\n scheduleNavigationRendered(session: FarmClientNavigationSession): Promise<void> {\n if (session.signal.aborted) return Promise.resolve();\n const clientWindow = this.options.window;\n const schedule = clientWindow?.requestAnimationFrame\n ? (callback: () => void) =>\n clientWindow.requestAnimationFrame(() => clientWindow.requestAnimationFrame(callback))\n : (callback: () => void) => setTimeout(callback, 0);\n\n return new Promise((resolve) => {\n schedule(() => {\n if (session.signal.aborted || this.closed) {\n resolve();\n return;\n }\n void this.runHook(\"navigation.rendered\", (instance) =>\n instance.plugin.navigation?.rendered?.({\n ...this.createStateEvent(instance),\n ...session,\n durationMs: now() - session.startedAt,\n }),\n ).finally(() => {\n if (this.currentNavigation?.session === session) {\n this.currentNavigation = undefined;\n }\n resolve();\n });\n });\n });\n }\n\n async failNavigation(session: FarmClientNavigationSession, error: unknown): Promise<void> {\n if (!session.signal.aborted) {\n await this.runHook(\"navigation.error\", (instance) =>\n instance.plugin.navigation?.error?.({\n ...this.createStateEvent(instance),\n ...session,\n durationMs: now() - session.startedAt,\n error,\n }),\n );\n await this.reportError(error, \"navigation\", session, session.to);\n }\n\n if (this.currentNavigation?.session === session) {\n this.currentNavigation = undefined;\n }\n }\n\n async reportError(\n error: unknown,\n phase: FarmClientPluginErrorPhase,\n navigation?: FarmClientNavigationSession,\n location = this.getLocation(),\n ): Promise<void> {\n if (this.closed) return;\n if (isObject(error)) {\n if (this.reportedErrors.has(error)) return;\n this.reportedErrors.add(error);\n }\n\n if (!this.started && !this.starting) await this.start();\n await this.runErrorHooks({ error, phase, navigation, location });\n }\n\n close(reason: FarmClientPluginCloseEvent[\"reason\"] = \"manual\"): Promise<void> {\n if (this.closePromise) return this.closePromise;\n this.closePromise = this.closeInternal(reason);\n return this.closePromise;\n }\n\n getPlugins(): readonly FarmClientPluginMetadata[] {\n return this.instances.map(({ registration }) => ({\n name: registration.name,\n version: registration.version,\n }));\n }\n\n private async startInternal(): Promise<void> {\n if (this.started || this.closed) return;\n this.starting = true;\n\n try {\n for (const registration of this.registrations) {\n try {\n const definition = registration.definition;\n if (!definition || typeof definition !== \"object\") {\n throw new TypeError(\n `Client plugin \"${registration.name}\" does not define a lifecycle object`,\n );\n }\n\n const instance: FarmClientPluginInstance = {\n registration,\n plugin: definition,\n state: undefined,\n };\n instance.state = await definition.setup?.(this.createSetupEvent(instance));\n this.instances.push(instance);\n } catch (error) {\n this.logHookError(registration.name, \"setup\", error);\n await this.runErrorHooks({\n error,\n phase: \"setup\",\n location: this.getLocation(),\n });\n }\n }\n\n this.started = true;\n this.installBrowserListeners();\n this.installPerformanceObservers();\n } finally {\n this.starting = false;\n }\n }\n\n private installBrowserListeners(): void {\n const clientWindow = this.options.window;\n if (!clientWindow) return;\n\n if (this.instances.some(({ plugin }) => plugin.error)) {\n clientWindow.addEventListener(\"error\", this.handleWindowError);\n clientWindow.addEventListener(\"unhandledrejection\", this.handleUnhandledRejection);\n }\n clientWindow.addEventListener(\"pagehide\", this.handlePageHide, {\n once: true,\n });\n }\n\n private installPerformanceObservers(): void {\n if (!this.instances.some(({ plugin }) => plugin.performance)) return;\n const Observer = typeof PerformanceObserver !== \"undefined\" ? PerformanceObserver : undefined;\n if (!Observer) return;\n\n const supported = new Set(Observer.supportedEntryTypes || []);\n for (const type of PERFORMANCE_ENTRY_TYPES) {\n if (!supported.has(type)) continue;\n try {\n const observer = new Observer((list: PerformanceObserverEntryList) => {\n for (const entry of list.getEntries()) {\n void this.runHook(\"performance\", (instance) =>\n instance.plugin.performance?.({\n ...this.createStateEvent(instance),\n entry,\n location: this.getLocation(),\n }),\n );\n }\n });\n observer.observe({ type, buffered: true });\n this.performanceObservers.push(observer);\n } catch (error) {\n void this.reportError(error, \"performance\");\n }\n }\n }\n\n private async closeInternal(reason: FarmClientPluginCloseEvent[\"reason\"]): Promise<void> {\n if (this.closed) return;\n if (this.startPromise) await this.startPromise;\n this.closed = true;\n this.currentNavigation?.controller.abort(reason);\n this.currentNavigation = undefined;\n\n const clientWindow = this.options.window;\n clientWindow?.removeEventListener(\"error\", this.handleWindowError);\n clientWindow?.removeEventListener(\"unhandledrejection\", this.handleUnhandledRejection);\n clientWindow?.removeEventListener(\"pagehide\", this.handlePageHide);\n for (const observer of this.performanceObservers) observer.disconnect();\n this.performanceObservers.length = 0;\n\n for (const instance of [...this.instances].reverse()) {\n try {\n await instance.plugin.close?.({\n ...this.createStateEvent(instance),\n reason,\n });\n } catch (error) {\n this.logHookError(instance.registration.name, \"close\", error);\n }\n }\n }\n\n private async runHook(\n hook: string,\n invoke: (instance: FarmClientPluginInstance) => MaybePromise<void> | undefined,\n ): Promise<void> {\n for (const instance of this.instances) {\n try {\n await invoke(instance);\n } catch (error) {\n this.logHookError(instance.registration.name, hook, error);\n await this.runErrorHooks(\n {\n error,\n phase: `plugin:${hook}`,\n location: this.getLocation(),\n },\n instance,\n );\n }\n }\n }\n\n private async runErrorHooks(\n event: Pick<FarmClientPluginErrorEvent, \"error\" | \"phase\" | \"location\" | \"navigation\">,\n excluded?: FarmClientPluginInstance,\n ): Promise<void> {\n for (const instance of this.instances) {\n if (instance === excluded || !instance.plugin.error) continue;\n try {\n await instance.plugin.error({\n ...this.createStateEvent(instance),\n ...event,\n });\n } catch (error) {\n this.logHookError(instance.registration.name, \"error\", error);\n }\n }\n }\n\n private createSetupEvent(\n instance: Pick<FarmClientPluginInstance, \"registration\">,\n ): FarmClientPluginSetupEvent<any> {\n return {\n plugin: {\n name: instance.registration.name,\n version: instance.registration.version,\n },\n public: readonlyPublicData(instance.registration.public),\n router: this.options.router,\n isDev: Boolean(this.options.isDev),\n isProd: Boolean(this.options.isProd),\n deploymentId: this.options.deploymentId,\n };\n }\n\n private createStateEvent(\n instance: FarmClientPluginInstance,\n ): FarmClientPluginStateEvent<any, any> {\n return {\n ...this.createSetupEvent(instance),\n state: instance.state,\n };\n }\n\n private getLocation(): FarmClientLocation {\n const href = this.options.window?.location.href ?? \"http://localhost/\";\n return toClientLocation(href, href);\n }\n\n private getBaseUrl(): string {\n return this.options.window?.location.href ?? \"http://localhost/\";\n }\n\n private logHookError(name: string, hook: string, error: unknown): void {\n console.error(`[Farm.js] Client plugin \"${name}\" failed in ${hook}:`, error);\n }\n}\n\nexport function createClientPluginManager(\n registrations: readonly FarmClientPluginRegistration[],\n options: FarmClientPluginManagerOptions,\n): FarmClientPluginManager {\n return new FarmClientPluginManager(registrations, options);\n}\n\nfunction sortRegistrations(\n registrations: readonly FarmClientPluginRegistration[],\n): FarmClientPluginRegistration[] {\n const rank = (enforce?: FarmClientPluginEnforce) =>\n enforce === \"pre\" ? 0 : enforce === \"post\" ? 2 : 1;\n return registrations\n .map((registration, index) => ({ registration, index }))\n .sort(\n (left, right) =>\n rank(left.registration.enforce) - rank(right.registration.enforce) ||\n left.index - right.index,\n )\n .map(({ registration }) => registration);\n}\n\nfunction toClientLocation(\n input: string | URL | FarmClientLocation,\n base: string,\n): FarmClientLocation {\n if (typeof input === \"object\" && \"href\" in input && \"pathname\" in input) {\n return {\n href: input.href,\n pathname: input.pathname,\n search: input.search,\n hash: input.hash,\n };\n }\n\n const url = new URL(input, base);\n return {\n href: url.href,\n pathname: url.pathname,\n search: url.search,\n hash: url.hash,\n };\n}\n\nfunction readonlyPublicData<T>(value: T | undefined): Readonly<T> {\n if (value && typeof value === \"object\") {\n return Object.freeze(value);\n }\n return value as Readonly<T>;\n}\n\nfunction now(): number {\n return typeof performance !== \"undefined\" ? performance.now() : Date.now();\n}\n\nfunction isObject(value: unknown): value is object {\n return (typeof value === \"object\" && value !== null) || typeof value === \"function\";\n}\n"],"mappings":"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","names":["now"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  installChunkErrorRecovery
3
- } from "../chunk-SOU3Q3ZA.mjs";
3
+ } from "../chunk-ZZ57EH5Z.mjs";
4
4
  import {
5
5
  createClientPluginManager
6
6
  } from "../chunk-NNLCAVB6.mjs";
@@ -2831,7 +2831,7 @@ function routeRulesToHeaders(routeRules) {
2831
2831
  for (const [source, rule] of Object.entries(routeRules)) {
2832
2832
  const headers = {
2833
2833
  ...normalizeCorsHeaders(rule.cors),
2834
- ...rule.headers || {}
2834
+ ...rule.headers
2835
2835
  };
2836
2836
  const entries = Object.entries(headers);
2837
2837
  if (entries.length === 0) continue;
@@ -2879,7 +2879,8 @@ var FARM_CACHE_INVALIDATION_STATE = /* @__PURE__ */ Symbol.for("farm.cacheInvali
2879
2879
  var globalState = globalThis;
2880
2880
  function getFarmCacheInvalidationState() {
2881
2881
  return globalState[FARM_CACHE_INVALIDATION_STATE] ?? (globalState[FARM_CACHE_INVALIDATION_STATE] = {
2882
- listeners: /* @__PURE__ */ new Set()
2882
+ listeners: /* @__PURE__ */ new Set(),
2883
+ taskListeners: /* @__PURE__ */ new Set()
2883
2884
  });
2884
2885
  }
2885
2886
  __name(getFarmCacheInvalidationState, "getFarmCacheInvalidationState");
@@ -2889,6 +2890,12 @@ function subscribeFarmCacheInvalidation(listener) {
2889
2890
  return () => state.listeners.delete(listener);
2890
2891
  }
2891
2892
  __name(subscribeFarmCacheInvalidation, "subscribeFarmCacheInvalidation");
2893
+ function subscribeFarmCacheTask(listener) {
2894
+ const state = getFarmCacheInvalidationState();
2895
+ state.taskListeners.add(listener);
2896
+ return () => state.taskListeners.delete(listener);
2897
+ }
2898
+ __name(subscribeFarmCacheTask, "subscribeFarmCacheTask");
2892
2899
 
2893
2900
  // src/server-action-security.ts
2894
2901
  var DEFAULT_SERVER_ACTION_BODY_SIZE_LIMIT = 1e6;
@@ -2911,6 +2918,9 @@ __name(getServerActionExecutionContext, "getServerActionExecutionContext");
2911
2918
  subscribeFarmCacheInvalidation((key) => {
2912
2919
  getServerActionExecutionContext()?.invalidations.add(key);
2913
2920
  });
2921
+ subscribeFarmCacheTask((task) => {
2922
+ getServerActionExecutionContext()?.cacheTasks.add(task);
2923
+ });
2914
2924
  function getServerActionStorage() {
2915
2925
  const globalState2 = globalThis;
2916
2926
  if (!globalState2[SERVER_ACTION_STORAGE_KEY]) {
@@ -4008,6 +4018,7 @@ async function resolveConfig(userConfig, mode) {
4008
4018
  observability: userConfig.observability ?? false,
4009
4019
  devtools: resolveFarmDevtoolsConfig(userConfig.devtools, mode),
4010
4020
  storage: userConfig.storage || {},
4021
+ cache: userConfig.cache || {},
4011
4022
  suppressLintOnLink: userConfig.suppressLintOnLink ?? false,
4012
4023
  experimental: {
4013
4024
  serverComponents: false,