@farm.js/core 0.1.0-beta.0 → 0.1.0-beta.3

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 (230) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-runtime.d.mts +1 -1
  3. package/dist/agent-runtime.d.ts +1 -1
  4. package/dist/api/route-manager.cjs +97 -5
  5. package/dist/api/route-manager.cjs.map +1 -1
  6. package/dist/api/route-manager.d.mts +3 -2
  7. package/dist/api/route-manager.d.ts +3 -2
  8. package/dist/api/route-manager.mjs +8 -8
  9. package/dist/api/runtime.cjs +441 -5
  10. package/dist/api/runtime.cjs.map +1 -1
  11. package/dist/api/runtime.d.mts +2 -16
  12. package/dist/api/runtime.d.ts +2 -16
  13. package/dist/api/runtime.mjs +7 -1
  14. package/dist/api.cjs +579 -263
  15. package/dist/api.cjs.map +1 -1
  16. package/dist/api.d.mts +4 -147
  17. package/dist/api.d.ts +4 -147
  18. package/dist/api.mjs +30 -20
  19. package/dist/{app-BiX4qb-d.d.mts → app-BB3Iu3xh.d.mts} +2 -2
  20. package/dist/{app-CFRNJXP1.d.ts → app-DOKxo-LH.d.ts} +2 -2
  21. package/dist/app-markdown.cjs +1 -1
  22. package/dist/app-markdown.cjs.map +1 -1
  23. package/dist/app-markdown.d.mts +1 -1
  24. package/dist/app-markdown.d.ts +1 -1
  25. package/dist/app-markdown.mjs +1 -1
  26. package/dist/cache.cjs +19 -0
  27. package/dist/cache.cjs.map +1 -1
  28. package/dist/cache.d.mts +21 -1
  29. package/dist/cache.d.ts +21 -1
  30. package/dist/cache.mjs +5 -3
  31. package/dist/{chunk-QF4PHCMA.mjs → chunk-2ED5Q2GH.mjs} +3 -3
  32. package/dist/chunk-2ED5Q2GH.mjs.map +1 -0
  33. package/dist/{chunk-GZP5W4K3.mjs → chunk-32W4QEJP.mjs} +1 -1
  34. package/dist/chunk-32W4QEJP.mjs.map +1 -0
  35. package/dist/{chunk-AGS7UJ52.mjs → chunk-45LKHSHJ.mjs} +2 -2
  36. package/dist/{chunk-TU4YJICB.mjs → chunk-5FW6PQ3J.mjs} +1 -1
  37. package/dist/{chunk-TU4YJICB.mjs.map → chunk-5FW6PQ3J.mjs.map} +1 -1
  38. package/dist/{chunk-TRORP7E4.mjs → chunk-5QH4IKY3.mjs} +2 -2
  39. package/dist/{chunk-RKI6TN3A.mjs → chunk-6VS6CKAV.mjs} +2 -2
  40. package/dist/chunk-6VS6CKAV.mjs.map +1 -0
  41. package/dist/{chunk-25D7G34K.mjs → chunk-6WXJ54TC.mjs} +4 -4
  42. package/dist/{chunk-3QJO55ZF.mjs → chunk-BIOIOWXZ.mjs} +5 -3
  43. package/dist/{chunk-3QJO55ZF.mjs.map → chunk-BIOIOWXZ.mjs.map} +1 -1
  44. package/dist/{chunk-QFQRHRZS.mjs → chunk-C33RALN7.mjs} +75 -11
  45. package/dist/chunk-C33RALN7.mjs.map +1 -0
  46. package/dist/{chunk-B6N4ZB2H.mjs → chunk-CSU4KJJF.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-PRNYWD7K.mjs → chunk-G5I34UA6.mjs} +67 -239
  52. package/dist/chunk-G5I34UA6.mjs.map +1 -0
  53. package/dist/{chunk-QM6VV26B.mjs → chunk-GQVGIUSN.mjs} +3 -3
  54. package/dist/{chunk-QM6VV26B.mjs.map → chunk-GQVGIUSN.mjs.map} +1 -1
  55. package/dist/{chunk-UREJA4GZ.mjs → chunk-GXASWWJU.mjs} +1 -1
  56. package/dist/{chunk-UREJA4GZ.mjs.map → chunk-GXASWWJU.mjs.map} +1 -1
  57. package/dist/{chunk-4PTK6KT4.mjs → chunk-GZWT6VI5.mjs} +22 -4
  58. package/dist/chunk-GZWT6VI5.mjs.map +1 -0
  59. package/dist/{chunk-JLWMCADZ.mjs → chunk-HZYXGV4K.mjs} +2 -2
  60. package/dist/chunk-JNYVN7YP.mjs +10 -0
  61. package/dist/chunk-JNYVN7YP.mjs.map +1 -0
  62. package/dist/{chunk-YHU7SS6L.mjs → chunk-LG3YINQN.mjs} +11 -11
  63. package/dist/chunk-LWMGIEJA.mjs +593 -0
  64. package/dist/chunk-LWMGIEJA.mjs.map +1 -0
  65. package/dist/{chunk-HXP3ZSPC.mjs → chunk-MH6FKW2I.mjs} +3 -3
  66. package/dist/{chunk-O3HADRW6.mjs → chunk-MIUW47JX.mjs} +2 -2
  67. package/dist/{chunk-O3HADRW6.mjs.map → chunk-MIUW47JX.mjs.map} +1 -1
  68. package/dist/{chunk-6XDUHOEM.mjs → chunk-NRRFGX45.mjs} +3 -3
  69. package/dist/{chunk-G3B5BRDY.mjs → chunk-OHC6VCDI.mjs} +24 -25
  70. package/dist/{chunk-G3B5BRDY.mjs.map → chunk-OHC6VCDI.mjs.map} +1 -1
  71. package/dist/{chunk-S2XHZS7W.mjs → chunk-QGQX7SFC.mjs} +2 -2
  72. package/dist/chunk-QGQX7SFC.mjs.map +1 -0
  73. package/dist/{chunk-TXCFGOHW.mjs → chunk-SHRJG6OG.mjs} +25 -1
  74. package/dist/chunk-SHRJG6OG.mjs.map +1 -0
  75. package/dist/{chunk-UHE2TTLK.mjs → chunk-T543TMFY.mjs} +8 -8
  76. package/dist/chunk-T543TMFY.mjs.map +1 -0
  77. package/dist/{chunk-SXZTEK3V.mjs → chunk-UXUAWNO5.mjs} +2 -2
  78. package/dist/{chunk-Y2OJJD7R.mjs → chunk-XIVV5IWN.mjs} +7 -9
  79. package/dist/chunk-XIVV5IWN.mjs.map +1 -0
  80. package/dist/{chunk-CHFHNEMO.mjs → chunk-XJSHJN4M.mjs} +41 -42
  81. package/dist/chunk-XJSHJN4M.mjs.map +1 -0
  82. package/dist/{chunk-Y7A27276.mjs → chunk-XUBZ7JI4.mjs} +178 -15
  83. package/dist/chunk-XUBZ7JI4.mjs.map +1 -0
  84. package/dist/{chunk-OYXO65LI.mjs → chunk-YW7OBE6Q.mjs} +4 -4
  85. package/dist/chunk-YW7OBE6Q.mjs.map +1 -0
  86. package/dist/{chunk-SOU3Q3ZA.mjs → chunk-ZZ57EH5Z.mjs} +1 -1
  87. package/dist/chunk-ZZ57EH5Z.mjs.map +1 -0
  88. package/dist/{client-D_yUjVhe.d.mts → client-DiViK9yK.d.mts} +33 -7
  89. package/dist/{client-Dkc03WP8.d.ts → client-DpEBJbts.d.ts} +33 -7
  90. package/dist/{client-plugins-BZnpeTGA.d.ts → client-plugins-CTnsZz_A.d.ts} +1 -0
  91. package/dist/{client-plugins-g4bzuCmo.d.mts → client-plugins-Cnr0D3kk.d.mts} +1 -0
  92. package/dist/client-plugins.d.mts +1 -1
  93. package/dist/client-plugins.d.ts +1 -1
  94. package/dist/client.cjs +302 -54
  95. package/dist/client.cjs.map +1 -1
  96. package/dist/client.d.mts +54 -2
  97. package/dist/client.d.ts +54 -2
  98. package/dist/client.mjs +20 -16
  99. package/dist/config.d.mts +1 -1
  100. package/dist/config.d.ts +1 -1
  101. package/dist/cron.cjs.map +1 -1
  102. package/dist/cron.mjs +1 -1
  103. package/dist/{devtools-AE4RVXCM.mjs → devtools-HE4FTUDN.mjs} +10 -10
  104. package/dist/{devtools-client-6WPY2AQU.mjs → devtools-client-3XRTBND5.mjs} +2 -11
  105. package/dist/devtools-client-3XRTBND5.mjs.map +1 -0
  106. package/dist/docs.cjs +3 -1
  107. package/dist/docs.cjs.map +1 -1
  108. package/dist/docs.mjs +10 -10
  109. package/dist/i18n/server.cjs +2 -2
  110. package/dist/i18n/server.cjs.map +1 -1
  111. package/dist/i18n/server.mjs +1 -1
  112. package/dist/index.cjs +791 -317
  113. package/dist/index.cjs.map +1 -1
  114. package/dist/index.d.mts +11 -11
  115. package/dist/index.d.ts +11 -11
  116. package/dist/index.mjs +125 -110
  117. package/dist/index.mjs.map +1 -1
  118. package/dist/integrations.d.mts +1 -1
  119. package/dist/integrations.d.ts +1 -1
  120. package/dist/internal/build-runtime.cjs +162 -60
  121. package/dist/internal/build-runtime.cjs.map +1 -1
  122. package/dist/internal/build-runtime.d.mts +3 -3
  123. package/dist/internal/build-runtime.d.ts +3 -3
  124. package/dist/internal/build-runtime.mjs +26 -25
  125. package/dist/internal/client-runtime.cjs.map +1 -1
  126. package/dist/internal/client-runtime.mjs +1 -1
  127. package/dist/internal/config-runtime.cjs +1 -1
  128. package/dist/internal/config-runtime.cjs.map +1 -1
  129. package/dist/internal/config-runtime.d.mts +2 -2
  130. package/dist/internal/config-runtime.d.ts +2 -2
  131. package/dist/internal/config-runtime.mjs +9 -9
  132. package/dist/internal/production-runtime.cjs +3 -3
  133. package/dist/internal/production-runtime.cjs.map +1 -1
  134. package/dist/internal/production-runtime.d.mts +3 -3
  135. package/dist/internal/production-runtime.d.ts +3 -3
  136. package/dist/internal/production-runtime.mjs +8 -8
  137. package/dist/{metadata-C9NZxMDW.d.mts → metadata-Dp8AdvsB.d.mts} +1 -1
  138. package/dist/{metadata-DAXRaOHx.d.ts → metadata-eoVmHoyv.d.ts} +1 -1
  139. package/dist/middleware.cjs +2 -2
  140. package/dist/middleware.cjs.map +1 -1
  141. package/dist/middleware.d.mts +3 -3
  142. package/dist/middleware.d.ts +3 -3
  143. package/dist/middleware.mjs +3 -3
  144. package/dist/navigation.cjs.map +1 -1
  145. package/dist/navigation.mjs +3 -3
  146. package/dist/{nitro-KME62MWG.mjs → nitro-QO5LV6QK.mjs} +11 -13
  147. package/dist/{nitro-KME62MWG.mjs.map → nitro-QO5LV6QK.mjs.map} +1 -1
  148. package/dist/plugin.cjs +119 -39
  149. package/dist/plugin.cjs.map +1 -1
  150. package/dist/plugin.d.mts +1 -1
  151. package/dist/plugin.d.ts +1 -1
  152. package/dist/plugin.mjs +22 -21
  153. package/dist/{production-runtime-DRkCHUvJ.d.ts → production-runtime-BqTnUTai.d.ts} +1 -1
  154. package/dist/{production-runtime-flrjp_nC.d.mts → production-runtime-DtDdG9fc.d.mts} +1 -1
  155. package/dist/routes.cjs.map +1 -1
  156. package/dist/routes.d.mts +1 -1
  157. package/dist/routes.d.ts +1 -1
  158. package/dist/routes.mjs +4 -4
  159. package/dist/runtime-C1B7pSGT.d.mts +207 -0
  160. package/dist/runtime-CdPHt0bv.d.ts +207 -0
  161. package/dist/server-action-security.cjs.map +1 -1
  162. package/dist/server-action-security.mjs +2 -2
  163. package/dist/server-fn-client.cjs.map +1 -1
  164. package/dist/server-fn-client.mjs +1 -1
  165. package/dist/server-fn.cjs.map +1 -1
  166. package/dist/server-fn.mjs +3 -3
  167. package/dist/server-plugins.d.mts +2 -2
  168. package/dist/server-plugins.d.ts +2 -2
  169. package/dist/server-query-client.cjs.map +1 -1
  170. package/dist/server-query-client.mjs +4 -4
  171. package/dist/server-query.cjs.map +1 -1
  172. package/dist/server-query.mjs +5 -5
  173. package/dist/server.cjs +148 -43
  174. package/dist/server.cjs.map +1 -1
  175. package/dist/server.d.mts +6 -6
  176. package/dist/server.d.ts +6 -6
  177. package/dist/server.mjs +36 -31
  178. package/dist/server.mjs.map +1 -1
  179. package/dist/testing.cjs +95 -5
  180. package/dist/testing.cjs.map +1 -1
  181. package/dist/testing.d.mts +3 -3
  182. package/dist/testing.d.ts +3 -3
  183. package/dist/testing.mjs +18 -18
  184. package/dist/{utils-DOXXivjL.d.mts → utils-8USa5BiY.d.mts} +1 -1
  185. package/dist/{utils-DA1yo54_.d.ts → utils-DKJb6K6G.d.ts} +1 -1
  186. package/dist/version.cjs +36 -0
  187. package/dist/version.cjs.map +1 -0
  188. package/dist/version.d.mts +3 -0
  189. package/dist/version.d.ts +3 -0
  190. package/dist/version.mjs +8 -0
  191. package/dist/version.mjs.map +1 -0
  192. package/dist/vite.cjs +126 -40
  193. package/dist/vite.cjs.map +1 -1
  194. package/dist/vite.d.mts +1 -1
  195. package/dist/vite.d.ts +1 -1
  196. package/dist/vite.mjs +22 -21
  197. package/dist/workflows.cjs +6 -8
  198. package/dist/workflows.cjs.map +1 -1
  199. package/dist/workflows.mjs +1 -1
  200. package/package.json +12 -5
  201. package/types/client.d.ts +136 -13
  202. package/dist/chunk-4PTK6KT4.mjs.map +0 -1
  203. package/dist/chunk-CHFHNEMO.mjs.map +0 -1
  204. package/dist/chunk-EVGBEZDF.mjs +0 -215
  205. package/dist/chunk-EVGBEZDF.mjs.map +0 -1
  206. package/dist/chunk-GZP5W4K3.mjs.map +0 -1
  207. package/dist/chunk-JN3UU635.mjs.map +0 -1
  208. package/dist/chunk-OYXO65LI.mjs.map +0 -1
  209. package/dist/chunk-PRNYWD7K.mjs.map +0 -1
  210. package/dist/chunk-QF4PHCMA.mjs.map +0 -1
  211. package/dist/chunk-QFQRHRZS.mjs.map +0 -1
  212. package/dist/chunk-RKI6TN3A.mjs.map +0 -1
  213. package/dist/chunk-S2XHZS7W.mjs.map +0 -1
  214. package/dist/chunk-SOU3Q3ZA.mjs.map +0 -1
  215. package/dist/chunk-TXCFGOHW.mjs.map +0 -1
  216. package/dist/chunk-UHE2TTLK.mjs.map +0 -1
  217. package/dist/chunk-Y2OJJD7R.mjs.map +0 -1
  218. package/dist/chunk-Y7A27276.mjs.map +0 -1
  219. package/dist/chunk-ZJQNATYV.mjs.map +0 -1
  220. package/dist/devtools-client-6WPY2AQU.mjs.map +0 -1
  221. /package/dist/{chunk-AGS7UJ52.mjs.map → chunk-45LKHSHJ.mjs.map} +0 -0
  222. /package/dist/{chunk-TRORP7E4.mjs.map → chunk-5QH4IKY3.mjs.map} +0 -0
  223. /package/dist/{chunk-25D7G34K.mjs.map → chunk-6WXJ54TC.mjs.map} +0 -0
  224. /package/dist/{chunk-B6N4ZB2H.mjs.map → chunk-CSU4KJJF.mjs.map} +0 -0
  225. /package/dist/{chunk-JLWMCADZ.mjs.map → chunk-HZYXGV4K.mjs.map} +0 -0
  226. /package/dist/{chunk-YHU7SS6L.mjs.map → chunk-LG3YINQN.mjs.map} +0 -0
  227. /package/dist/{chunk-HXP3ZSPC.mjs.map → chunk-MH6FKW2I.mjs.map} +0 -0
  228. /package/dist/{chunk-6XDUHOEM.mjs.map → chunk-NRRFGX45.mjs.map} +0 -0
  229. /package/dist/{chunk-SXZTEK3V.mjs.map → chunk-UXUAWNO5.mjs.map} +0 -0
  230. /package/dist/{devtools-AE4RVXCM.mjs.map → devtools-HE4FTUDN.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-Cnr0D3kk.mjs';
2
+ export { a4 as loadConfig, a3 as resolveConfig, a5 as resolveDeployConfig } from '../client-plugins-Cnr0D3kk.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-8USa5BiY.mjs';
5
5
  import '../plugin-BJDf43dc.mjs';
6
6
  import 'react';
7
7
  import 'http';
@@ -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-CTnsZz_A.js';
2
+ export { a4 as loadConfig, a3 as resolveConfig, a5 as resolveDeployConfig } from '../client-plugins-CTnsZz_A.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-DKJb6K6G.js';
5
5
  import '../plugin-BJDf43dc.js';
6
6
  import 'react';
7
7
  import 'http';
@@ -1,67 +1,68 @@
1
1
  import {
2
2
  build
3
- } from "../chunk-G3B5BRDY.mjs";
3
+ } from "../chunk-OHC6VCDI.mjs";
4
4
  import "../chunk-SL6HTIOK.mjs";
5
5
  import "../chunk-4S3ORGFA.mjs";
6
- import "../chunk-3QJO55ZF.mjs";
6
+ import "../chunk-BIOIOWXZ.mjs";
7
7
  import "../chunk-V7RBCSDJ.mjs";
8
- import "../chunk-RKI6TN3A.mjs";
8
+ import "../chunk-6VS6CKAV.mjs";
9
9
  import {
10
10
  loadConfig,
11
11
  resolveConfig,
12
12
  resolveDeployConfig
13
- } from "../chunk-UHE2TTLK.mjs";
13
+ } from "../chunk-T543TMFY.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-XJSHJN4M.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-5QH4IKY3.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-45LKHSHJ.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-LG3YINQN.mjs";
42
+ import "../chunk-2ED5Q2GH.mjs";
43
43
  import "../chunk-GN72QAIH.mjs";
44
44
  import "../chunk-FQYDHKKU.mjs";
45
+ import "../chunk-CSU4KJJF.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-LWMGIEJA.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-JNYVN7YP.mjs";
55
+ import "../chunk-5FW6PQ3J.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-GZWT6VI5.mjs";
63
62
  import "../chunk-WZ5QFROO.mjs";
63
+ import "../chunk-SHRJG6OG.mjs";
64
64
  import "../chunk-7ZY5AIJO.mjs";
65
+ import "../chunk-ZBE6MLHL.mjs";
65
66
  import "../chunk-CGILA3WO.mjs";
66
67
  export {
67
68
  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;