@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
package/dist/vite.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  import 'vite';
2
- export { d as defineConfig, cZ as farmI18nClientBridgePlugin, f as farmPlugin, c_ as rewriteEarlySsrRelativeImports } from './client-plugins-g4bzuCmo.mjs';
2
+ export { d as defineConfig, cZ as farmI18nClientBridgePlugin, f as farmPlugin, c_ as rewriteEarlySsrRelativeImports } from './client-plugins-Cnr0D3kk.mjs';
3
3
  import './plugin-BJDf43dc.mjs';
4
4
  import 'react';
5
5
  import 'http';
package/dist/vite.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import 'vite';
2
- export { d as defineConfig, cZ as farmI18nClientBridgePlugin, f as farmPlugin, c_ as rewriteEarlySsrRelativeImports } from './client-plugins-BZnpeTGA.js';
2
+ export { d as defineConfig, cZ as farmI18nClientBridgePlugin, f as farmPlugin, c_ as rewriteEarlySsrRelativeImports } from './client-plugins-CTnsZz_A.js';
3
3
  import './plugin-BJDf43dc.js';
4
4
  import 'react';
5
5
  import 'http';
package/dist/vite.mjs CHANGED
@@ -3,52 +3,53 @@ import {
3
3
  farmI18nClientBridgePlugin,
4
4
  farmPlugin,
5
5
  rewriteEarlySsrRelativeImports
6
- } from "./chunk-CHFHNEMO.mjs";
6
+ } from "./chunk-XJSHJN4M.mjs";
7
7
  import "./chunk-LGHEOHBU.mjs";
8
- import "./chunk-ZJQNATYV.mjs";
8
+ import "./chunk-FRPWCMMG.mjs";
9
9
  import "./chunk-V6WE6JSZ.mjs";
10
10
  import "./chunk-3XNTL3FQ.mjs";
11
11
  import "./chunk-BHG3LVHH.mjs";
12
12
  import "./chunk-USWZZUEH.mjs";
13
+ import "./chunk-5QH4IKY3.mjs";
14
+ import "./chunk-7HO6AEOP.mjs";
13
15
  import "./chunk-74YTBPTY.mjs";
14
16
  import "./chunk-7MABZJIM.mjs";
15
- import "./chunk-OYXO65LI.mjs";
17
+ import "./chunk-YW7OBE6Q.mjs";
16
18
  import "./chunk-GY2STC2S.mjs";
19
+ import "./chunk-45LKHSHJ.mjs";
17
20
  import "./chunk-LLC7BNXW.mjs";
18
- import "./chunk-S2XHZS7W.mjs";
19
- import "./chunk-Y2OJJD7R.mjs";
20
- import "./chunk-UREJA4GZ.mjs";
21
- import "./chunk-AGS7UJ52.mjs";
21
+ import "./chunk-QGQX7SFC.mjs";
22
+ import "./chunk-XIVV5IWN.mjs";
23
+ import "./chunk-GXASWWJU.mjs";
22
24
  import "./chunk-K4667E2Q.mjs";
23
- import "./chunk-TRORP7E4.mjs";
24
- import "./chunk-7HO6AEOP.mjs";
25
- import "./chunk-O3HADRW6.mjs";
25
+ import "./chunk-MIUW47JX.mjs";
26
26
  import "./chunk-P7QDS5AT.mjs";
27
27
  import "./chunk-T4QJQK76.mjs";
28
28
  import "./chunk-E6EPN5BT.mjs";
29
29
  import "./chunk-QGOHVJ6J.mjs";
30
- import "./chunk-YHU7SS6L.mjs";
31
- import "./chunk-QF4PHCMA.mjs";
30
+ import "./chunk-LG3YINQN.mjs";
31
+ import "./chunk-2ED5Q2GH.mjs";
32
32
  import "./chunk-GN72QAIH.mjs";
33
33
  import "./chunk-FQYDHKKU.mjs";
34
+ import "./chunk-CSU4KJJF.mjs";
35
+ import "./chunk-QKVUNGAH.mjs";
36
+ import "./chunk-GQVGIUSN.mjs";
34
37
  import "./chunk-J4FNJ5IU.mjs";
35
- import "./chunk-EVGBEZDF.mjs";
38
+ import "./chunk-LWMGIEJA.mjs";
36
39
  import "./chunk-RHIFZZUI.mjs";
37
40
  import "./chunk-LM2YNO4U.mjs";
38
- import "./chunk-B6N4ZB2H.mjs";
39
- import "./chunk-QKVUNGAH.mjs";
40
- import "./chunk-QM6VV26B.mjs";
41
- import "./chunk-JK25YEN6.mjs";
42
- import "./chunk-TU4YJICB.mjs";
41
+ import "./chunk-JNYVN7YP.mjs";
42
+ import "./chunk-5FW6PQ3J.mjs";
43
43
  import "./chunk-ITN462YM.mjs";
44
44
  import "./chunk-B232I2GP.mjs";
45
+ import "./chunk-JK25YEN6.mjs";
45
46
  import "./chunk-GS6K5OCM.mjs";
46
47
  import "./chunk-44ZCFSKE.mjs";
47
- import "./chunk-ZBE6MLHL.mjs";
48
- import "./chunk-4PTK6KT4.mjs";
49
- import "./chunk-TXCFGOHW.mjs";
48
+ import "./chunk-GZWT6VI5.mjs";
50
49
  import "./chunk-WZ5QFROO.mjs";
50
+ import "./chunk-SHRJG6OG.mjs";
51
51
  import "./chunk-7ZY5AIJO.mjs";
52
+ import "./chunk-ZBE6MLHL.mjs";
52
53
  import "./chunk-CGILA3WO.mjs";
53
54
  export {
54
55
  defineConfig,
@@ -205,7 +205,11 @@ async function prepareFarmWorkflowsForNitro(config) {
205
205
  };
206
206
  }
207
207
  const handlerPath = path.join(generatedDir, "http-handler.mjs");
208
- await fs.writeFile(handlerPath, createNitroWorkflowHTTPHandler(workflowConfig, workflows), "utf8");
208
+ await fs.writeFile(
209
+ handlerPath,
210
+ createNitroWorkflowHTTPHandler(workflowConfig, workflows),
211
+ "utf8"
212
+ );
209
213
  const manifestPath = path.join(generatedDir, "manifest.json");
210
214
  await fs.writeFile(
211
215
  manifestPath,
@@ -287,13 +291,7 @@ function normalizeSchedule(schedule) {
287
291
  }
288
292
  __name(normalizeSchedule, "normalizeSchedule");
289
293
  function resolveWorkflowDefinition(module2) {
290
- const candidates = [
291
- module2.default,
292
- module2.workflow,
293
- module2.cron,
294
- module2.task,
295
- module2.job
296
- ];
294
+ const candidates = [module2.default, module2.workflow, module2.cron, module2.task, module2.job];
297
295
  for (const candidate of candidates) {
298
296
  if (candidate && typeof candidate === "object" && typeof candidate.run === "function") {
299
297
  return candidate;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/workflows.ts"],"sourcesContent":["export type FarmWorkflowSchedule = string | string[];\n\nexport interface FarmWorkflowsUserConfig {\n /** Enable or disable Farm workflow discovery. Enabled by default. */\n enabled?: boolean;\n /** Directory or directories to scan for workflow modules. */\n dir?: string | string[];\n /** Alias for dir. */\n dirs?: string[];\n /** HTTP route used for manual and URL-based cron invocation. */\n route?: string;\n /** Environment variable that stores the optional runner secret. */\n secretEnv?: string;\n /** Inline runner secret. Prefer secretEnv for deployed apps. */\n secret?: string;\n}\n\nexport interface FarmWorkflowsResolvedConfig {\n enabled: boolean;\n dirs: string[];\n route: string;\n secretEnv: string;\n secret?: string;\n}\n\nexport interface FarmWorkflowLogger {\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n}\n\nexport interface FarmWorkflowRunContext<TPayload = unknown> {\n id: string;\n name: string;\n payload: TPayload;\n scheduledTime?: number | string;\n request?: Request;\n event?: unknown;\n env: Record<string, string | undefined>;\n data: Map<string, unknown>;\n log: FarmWorkflowLogger;\n}\n\nexport interface FarmWorkflowDefinition<TPayload = unknown, TResult = unknown> {\n kind?: \"farm-workflow\";\n id?: string;\n description?: string;\n schedule?: FarmWorkflowSchedule;\n timezone?: string;\n run: (ctx: FarmWorkflowRunContext<TPayload>) => TResult | Promise<TResult>;\n}\n\nexport interface FarmCronDefinition<TPayload = unknown, TResult = unknown>\n extends FarmWorkflowDefinition<TPayload, TResult> {\n schedule: FarmWorkflowSchedule;\n}\n\nexport interface FarmDiscoveredWorkflow {\n id: string;\n filePath: string;\n description?: string;\n schedule: string[];\n timezone?: string;\n routePath: string;\n}\n\nexport interface PreparedFarmWorkflows {\n workflows: FarmDiscoveredWorkflow[];\n tasks: Record<string, { handler: string; description: string }>;\n scheduledTasks: Record<string, string | string[]>;\n handlerPath?: string;\n manifestPath?: string;\n}\n\nexport interface FarmWorkflowHTTPHandlerOptions {\n workflows: FarmDiscoveredWorkflow[];\n config: FarmWorkflowsResolvedConfig;\n loadModule: (workflow: FarmDiscoveredWorkflow) => Promise<Record<string, any>>;\n}\n\nexport const DEFAULT_FARM_WORKFLOW_DIRS = [\"src/jobs\", \"src/workflows\", \"src/cron\"];\nexport const DEFAULT_FARM_WORKFLOW_ROUTE = \"/api/_farm/workflows\";\nexport const DEFAULT_FARM_WORKFLOW_SECRET_ENV = \"CRON_SECRET\";\n\nexport function defineWorkflow<const TPayload = unknown, TResult = unknown>(\n definition: FarmWorkflowDefinition<TPayload, TResult>,\n): FarmWorkflowDefinition<TPayload, TResult> {\n return {\n ...definition,\n kind: \"farm-workflow\",\n };\n}\n\nexport function defineTask<const TPayload = unknown, TResult = unknown>(\n definition: FarmWorkflowDefinition<TPayload, TResult>,\n): FarmWorkflowDefinition<TPayload, TResult> {\n return defineWorkflow(definition);\n}\n\n/**\n * @deprecated Configure `cron` in `farm.config.ts` and point it at an API route.\n */\nexport function defineCron<const TPayload = unknown, TResult = unknown>(\n definition: FarmCronDefinition<TPayload, TResult>,\n): FarmCronDefinition<TPayload, TResult> {\n return {\n ...definition,\n kind: \"farm-workflow\",\n };\n}\n\nexport function resolveWorkflowsConfig(\n workflows: FarmWorkflowsUserConfig | boolean | undefined,\n): FarmWorkflowsResolvedConfig {\n if (workflows === false) {\n return {\n enabled: false,\n dirs: [...DEFAULT_FARM_WORKFLOW_DIRS],\n route: DEFAULT_FARM_WORKFLOW_ROUTE,\n secretEnv: DEFAULT_FARM_WORKFLOW_SECRET_ENV,\n };\n }\n\n const options = workflows && typeof workflows === \"object\" ? workflows : {};\n const dirs = normalizeWorkflowDirs(options);\n\n return {\n enabled: options.enabled ?? true,\n dirs,\n route: normalizeWorkflowRoute(options.route || DEFAULT_FARM_WORKFLOW_ROUTE),\n secretEnv: options.secretEnv || DEFAULT_FARM_WORKFLOW_SECRET_ENV,\n secret: options.secret,\n };\n}\n\nexport async function discoverFarmWorkflows(\n config: { root?: string; workflows?: FarmWorkflowsResolvedConfig | FarmWorkflowsUserConfig | boolean },\n options: {\n loadModule?: (filePath: string) => Promise<Record<string, any>>;\n } = {},\n): Promise<FarmDiscoveredWorkflow[]> {\n const workflowConfig = isResolvedWorkflowConfig(config.workflows)\n ? config.workflows\n : resolveWorkflowsConfig(config.workflows);\n if (!workflowConfig.enabled) return [];\n\n const root = config.root || process.cwd();\n const files = await findWorkflowFiles(root, workflowConfig.dirs);\n const workflows: FarmDiscoveredWorkflow[] = [];\n const seenIds = new Map<string, string>();\n\n for (const filePath of files) {\n const module = options.loadModule\n ? await options.loadModule(filePath)\n : await loadWorkflowModule(filePath, root);\n const definition = resolveWorkflowDefinition(module);\n if (!definition) continue;\n\n const id = normalizeWorkflowId(definition.id || workflowIdFromFile(root, filePath));\n const previousPath = seenIds.get(id);\n if (previousPath) {\n throw new Error(\n `Duplicate Farm workflow id \"${id}\" found in ${relativePath(root, previousPath)} and ${relativePath(root, filePath)}.`,\n );\n }\n seenIds.set(id, filePath);\n\n workflows.push({\n id,\n filePath,\n description: definition.description,\n schedule: normalizeSchedule(definition.schedule),\n timezone: definition.timezone,\n routePath: joinRoute(workflowConfig.route, encodeURIComponent(id)),\n });\n }\n\n return workflows;\n}\n\nexport function createFarmWorkflowRequestHandler(options: FarmWorkflowHTTPHandlerOptions) {\n const workflowsById = new Map(options.workflows.map((workflow) => [workflow.id, workflow]));\n\n return async function handleFarmWorkflowRequest(request: Request): Promise<Response | null> {\n const url = new URL(request.url);\n const route = normalizeWorkflowRoute(options.config.route);\n if (url.pathname !== route && !url.pathname.startsWith(`${route}/`)) {\n return null;\n }\n\n if (url.pathname === route) {\n const secretError = verifyWorkflowSecret(request, options.config);\n if (secretError) return secretError;\n\n return Response.json({\n workflows: options.workflows.map(toWorkflowMetadata),\n });\n }\n\n const id = decodeURIComponent(url.pathname.slice(route.length + 1));\n const workflow = workflowsById.get(id);\n if (!workflow) {\n return Response.json({ error: `Workflow \"${id}\" was not found.` }, { status: 404 });\n }\n\n const secretError = verifyWorkflowSecret(request, options.config);\n if (secretError) return secretError;\n\n const payload = await readWorkflowPayload(request);\n const module = await options.loadModule(workflow);\n const result = await runFarmWorkflowModule(module, {\n id: workflow.id,\n name: workflow.id,\n payload,\n request,\n scheduledTime: readScheduledTime(payload),\n });\n\n return Response.json({\n id: workflow.id,\n ok: true,\n result: result ?? null,\n });\n };\n}\n\nexport async function runFarmWorkflowModule(\n module: Record<string, any>,\n context: {\n id: string;\n name?: string;\n payload?: unknown;\n scheduledTime?: number | string;\n request?: Request;\n event?: unknown;\n env?: Record<string, string | undefined>;\n },\n): Promise<unknown> {\n const definition = resolveWorkflowDefinition(module);\n if (!definition) {\n throw new Error(`Farm workflow \"${context.id}\" does not export a workflow definition.`);\n }\n\n return await definition.run({\n id: context.id,\n name: context.name || context.id,\n payload: context.payload,\n scheduledTime: context.scheduledTime,\n request: context.request,\n event: context.event,\n env: context.env || process.env,\n data: new Map<string, unknown>(),\n log: console,\n });\n}\n\nexport async function prepareFarmWorkflowsForNitro(\n config: { root?: string; distDir?: string; workflows?: FarmWorkflowsResolvedConfig | FarmWorkflowsUserConfig | boolean },\n): Promise<PreparedFarmWorkflows> {\n const workflowConfig = isResolvedWorkflowConfig(config.workflows)\n ? config.workflows\n : resolveWorkflowsConfig(config.workflows);\n const workflows = await discoverFarmWorkflows({\n root: config.root,\n workflows: workflowConfig,\n });\n\n if (workflows.length === 0) {\n return {\n workflows,\n tasks: {},\n scheduledTasks: {},\n };\n }\n\n const root = config.root || process.cwd();\n const distDir = config.distDir || \".farm\";\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const generatedDir = path.join(root, distDir, \".nitro\", \"farm-workflows\");\n await fs.mkdir(generatedDir, { recursive: true });\n\n const tasks: PreparedFarmWorkflows[\"tasks\"] = {};\n const scheduledTasks = createScheduledTasks(workflows);\n\n for (const workflow of workflows) {\n const wrapperPath = path.join(generatedDir, `${safeFileName(workflow.id)}.mjs`);\n await fs.writeFile(wrapperPath, createNitroTaskWrapper(workflow), \"utf8\");\n tasks[workflow.id] = {\n handler: wrapperPath,\n description: workflow.description || `Farm workflow ${workflow.id}`,\n };\n }\n\n const handlerPath = path.join(generatedDir, \"http-handler.mjs\");\n await fs.writeFile(handlerPath, createNitroWorkflowHTTPHandler(workflowConfig, workflows), \"utf8\");\n\n const manifestPath = path.join(generatedDir, \"manifest.json\");\n await fs.writeFile(\n manifestPath,\n JSON.stringify(\n {\n route: workflowConfig.route,\n secretEnv: workflowConfig.secretEnv,\n trigger: {\n method: \"GET\",\n authorization: `Bearer $${workflowConfig.secretEnv}`,\n },\n workflows: workflows.map(toWorkflowMetadata),\n },\n null,\n 2,\n ),\n \"utf8\",\n );\n\n return {\n workflows,\n tasks,\n scheduledTasks,\n handlerPath,\n manifestPath,\n };\n}\n\nexport function createFarmWorkflowVercelCrons(\n workflows: FarmDiscoveredWorkflow[],\n): Array<{ path: string; schedule: string }> {\n return workflows.flatMap((workflow) =>\n workflow.schedule.map((schedule) => ({\n path: workflow.routePath,\n schedule,\n })),\n );\n}\n\nexport function applyFarmWorkflowVercelCrons(\n vercelConfig: Record<string, any>,\n workflows: FarmDiscoveredWorkflow[],\n): Record<string, any> {\n const crons = createFarmWorkflowVercelCrons(workflows);\n if (crons.length === 0) return vercelConfig;\n\n const existingCrons = Array.isArray(vercelConfig.crons) ? vercelConfig.crons : [];\n const seen = new Set(existingCrons.map((cron) => `${cron.path}:${cron.schedule}`));\n const nextCrons = [...existingCrons];\n for (const cron of crons) {\n const key = `${cron.path}:${cron.schedule}`;\n if (seen.has(key)) continue;\n seen.add(key);\n nextCrons.push(cron);\n }\n return {\n ...vercelConfig,\n crons: nextCrons,\n };\n}\n\nfunction isResolvedWorkflowConfig(value: unknown): value is FarmWorkflowsResolvedConfig {\n return (\n !!value &&\n typeof value === \"object\" &&\n \"dirs\" in value &&\n Array.isArray((value as FarmWorkflowsResolvedConfig).dirs) &&\n typeof (value as FarmWorkflowsResolvedConfig).route === \"string\"\n );\n}\n\nfunction normalizeWorkflowDirs(options: FarmWorkflowsUserConfig): string[] {\n const rawDirs = options.dirs || (Array.isArray(options.dir) ? options.dir : options.dir ? [options.dir] : undefined);\n const dirs = rawDirs && rawDirs.length > 0 ? rawDirs : DEFAULT_FARM_WORKFLOW_DIRS;\n return [...new Set(dirs.map((dir) => trimSlashes(dir)).filter(Boolean))];\n}\n\nfunction normalizeWorkflowRoute(route: string): string {\n const trimmed = route.trim();\n if (!trimmed || trimmed === \"/\") return DEFAULT_FARM_WORKFLOW_ROUTE;\n return `/${trimSlashes(trimmed)}`;\n}\n\nfunction normalizeWorkflowId(id: string): string {\n const normalized = id\n .replace(/\\\\/g, \"/\")\n .replace(/\\.(tsx?|jsx?|mjs|cjs)$/, \"\")\n .replace(/\\/index$/, \"\")\n .replace(/[^a-zA-Z0-9._/-]+/g, \"-\")\n .replace(/^\\/+|\\/+$/g, \"\")\n .replace(/\\/+/g, \"/\");\n return normalized || \"workflow\";\n}\n\nfunction normalizeSchedule(schedule: FarmWorkflowSchedule | undefined): string[] {\n if (!schedule) return [];\n return (Array.isArray(schedule) ? schedule : [schedule]).map((value) => value.trim()).filter(Boolean);\n}\n\nfunction resolveWorkflowDefinition(\n module: Record<string, any>,\n): FarmWorkflowDefinition | FarmCronDefinition | null {\n const candidates = [\n module.default,\n module.workflow,\n module.cron,\n module.task,\n module.job,\n ];\n for (const candidate of candidates) {\n if (candidate && typeof candidate === \"object\" && typeof candidate.run === \"function\") {\n return candidate as FarmWorkflowDefinition;\n }\n }\n return null;\n}\n\nasync function findWorkflowFiles(root: string, dirs: string[]): Promise<string[]> {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const files: string[] = [];\n\n for (const dir of dirs) {\n const absoluteDir = path.isAbsolute(dir) ? dir : path.join(root, dir);\n if (!(await pathExists(absoluteDir))) continue;\n await walkWorkflowDir(absoluteDir, files);\n }\n\n return files.sort();\n}\n\nasync function walkWorkflowDir(dir: string, files: string[]): Promise<void> {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const filePath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (entry.name === \"node_modules\" || entry.name.startsWith(\".\")) continue;\n await walkWorkflowDir(filePath, files);\n continue;\n }\n if (isWorkflowFile(entry.name)) {\n files.push(filePath);\n }\n }\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n const fs = await import(\"fs/promises\");\n return fs\n .access(filePath)\n .then(() => true)\n .catch(() => false);\n}\n\nfunction isWorkflowFile(fileName: string): boolean {\n return /\\.(?:ts|tsx|js|jsx|mjs|cjs)$/.test(fileName) && !/\\.d\\.[cm]?ts$/.test(fileName);\n}\n\nasync function loadWorkflowModule(filePath: string, root: string): Promise<Record<string, any>> {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const { pathToFileURL } = await import(\"url\");\n const { build } = await import(\"esbuild\");\n const outDir = path.join(root, \".farm\", \".workflow-loader\");\n await fs.mkdir(outDir, { recursive: true });\n const outfile = path.join(\n outDir,\n `workflow-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`,\n );\n\n await build({\n absWorkingDir: root,\n entryPoints: [filePath],\n outfile,\n bundle: true,\n format: \"esm\",\n platform: \"node\",\n target: `node${process.versions.node.split(\".\")[0]}`,\n packages: \"external\",\n external: [\"@farm.js/core\", \"@farm.js/core/*\", \"nitro\", \"nitro/*\"],\n jsx: \"automatic\",\n logLevel: \"silent\",\n sourcemap: \"inline\",\n });\n\n try {\n return await import(/* @vite-ignore */ `${pathToFileURL(outfile).href}?t=${Date.now()}`);\n } finally {\n await fs.unlink(outfile).catch(() => undefined);\n }\n}\n\nfunction workflowIdFromFile(root: string, filePath: string): string {\n const normalizedRoot = root.replace(/\\\\/g, \"/\");\n const normalizedFile = filePath.replace(/\\\\/g, \"/\");\n const relative = normalizedFile.startsWith(`${normalizedRoot}/`)\n ? normalizedFile.slice(normalizedRoot.length + 1)\n : normalizedFile;\n return normalizeWorkflowId(\n relative\n .replace(/^src\\/(?:jobs|workflows|cron)\\//, \"\")\n .replace(/\\.(tsx?|jsx?|mjs|cjs)$/, \"\"),\n );\n}\n\nfunction createScheduledTasks(workflows: FarmDiscoveredWorkflow[]): Record<string, string | string[]> {\n const scheduleMap = new Map<string, string[]>();\n for (const workflow of workflows) {\n for (const schedule of workflow.schedule) {\n const taskIds = scheduleMap.get(schedule) || [];\n taskIds.push(workflow.id);\n scheduleMap.set(schedule, taskIds);\n }\n }\n\n return Object.fromEntries(\n [...scheduleMap.entries()].map(([schedule, taskIds]) => [\n schedule,\n taskIds.length === 1 ? taskIds[0] : taskIds,\n ]),\n );\n}\n\nfunction createNitroTaskWrapper(workflow: FarmDiscoveredWorkflow): string {\n const normalizedPath = workflow.filePath.replace(/\\\\/g, \"/\");\n return `\nimport { defineTask } from \"nitro/runtime\";\nimport { runFarmWorkflowModule } from \"@farm.js/core/workflows\";\nimport * as workflowModule from ${JSON.stringify(normalizedPath)};\n\nexport default defineTask({\n meta: {\n description: ${JSON.stringify(workflow.description || `Farm workflow ${workflow.id}`)}\n },\n async run(event) {\n const payload = event?.payload || {};\n const env = event?.context?.cloudflare?.env || event?.context?.env || process.env;\n return await runFarmWorkflowModule(workflowModule, {\n id: ${JSON.stringify(workflow.id)},\n name: event?.name || ${JSON.stringify(workflow.id)},\n payload,\n scheduledTime: payload.scheduledTime,\n request: event?.context?.request,\n event,\n env\n });\n }\n});\n`.trim();\n}\n\nfunction createNitroWorkflowHTTPHandler(\n config: FarmWorkflowsResolvedConfig,\n workflows: FarmDiscoveredWorkflow[],\n): string {\n return `\nimport { H3 } from \"h3\";\nimport { runTask } from \"nitro/runtime\";\n\nconst route = ${JSON.stringify(config.route)};\nconst secretEnv = ${JSON.stringify(config.secretEnv)};\nconst inlineSecret = ${JSON.stringify(config.secret || \"\")};\nconst workflows = ${JSON.stringify(workflows.map(toWorkflowMetadata))};\nconst workflowIds = new Set(workflows.map((workflow) => workflow.id));\n\nfunction json(value, status = 200) {\n return new Response(JSON.stringify(value), {\n status,\n headers: { \"content-type\": \"application/json\" }\n });\n}\n\nfunction getHeader(event, name) {\n return event.req.headers.get(name);\n}\n\nfunction getSecret() {\n return inlineSecret || process.env[secretEnv] || \"\";\n}\n\nfunction verifySecret(event) {\n const secret = getSecret();\n if (!secret) return null;\n const authorization = getHeader(event, \"authorization\") || \"\";\n const headerSecret = getHeader(event, \"x-farm-workflow-secret\") || \"\";\n const querySecret = event.url.searchParams.get(\"secret\") || \"\";\n const bearer = authorization.startsWith(\"Bearer \") ? authorization.slice(7) : \"\";\n if (headerSecret === secret || querySecret === secret || bearer === secret) return null;\n return json({ error: \"Unauthorized workflow request.\" }, 401);\n}\n\nasync function readPayload(event) {\n if (event.req.method === \"GET\" || event.req.method === \"HEAD\") {\n const payload = Object.fromEntries(event.url.searchParams.entries());\n delete payload.secret;\n return payload;\n }\n return await event.req.json().catch(() => ({}));\n}\n\nexport default new H3()\n .get(route, (event) => {\n const unauthorized = verifySecret(event);\n if (unauthorized) return unauthorized;\n return { workflows };\n })\n .all(route + \"/:id\", async (event) => {\n const id = decodeURIComponent(event.context.params?.id || \"\");\n if (!workflowIds.has(id)) {\n return json({ error: \"Workflow \" + id + \" was not found.\" }, 404);\n }\n\n const unauthorized = verifySecret(event);\n if (unauthorized) return unauthorized;\n\n const payload = await readPayload(event);\n const result = await runTask(id, {\n payload,\n context: {\n source: \"http\",\n request: event.req,\n route,\n url: event.url.href,\n method: event.req.method\n }\n });\n return {\n id,\n ok: true,\n result: result ?? null\n };\n });\n`.trim();\n}\n\nfunction toWorkflowMetadata(workflow: FarmDiscoveredWorkflow) {\n return {\n id: workflow.id,\n description: workflow.description || null,\n schedule: workflow.schedule,\n timezone: workflow.timezone || null,\n path: workflow.routePath,\n };\n}\n\nasync function readWorkflowPayload(request: Request): Promise<unknown> {\n const url = new URL(request.url);\n if (request.method === \"GET\" || request.method === \"HEAD\") {\n const payload = Object.fromEntries(url.searchParams.entries());\n delete payload.secret;\n return payload;\n }\n\n const contentType = request.headers.get(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\")) {\n return await request.json().catch(() => ({}));\n }\n\n const text = await request.text().catch(() => \"\");\n return text ? { text } : {};\n}\n\nfunction readScheduledTime(payload: unknown): number | string | undefined {\n return payload && typeof payload === \"object\" && \"scheduledTime\" in payload\n ? (payload as { scheduledTime?: number | string }).scheduledTime\n : undefined;\n}\n\nfunction verifyWorkflowSecret(\n request: Request,\n config: FarmWorkflowsResolvedConfig,\n): Response | null {\n const secret = config.secret || process.env[config.secretEnv] || \"\";\n if (!secret) return null;\n\n const url = new URL(request.url);\n const authorization = request.headers.get(\"authorization\") || \"\";\n const bearer = authorization.startsWith(\"Bearer \") ? authorization.slice(7) : \"\";\n const headerSecret = request.headers.get(\"x-farm-workflow-secret\") || \"\";\n const querySecret = url.searchParams.get(\"secret\") || \"\";\n if (bearer === secret || headerSecret === secret || querySecret === secret) return null;\n\n return Response.json({ error: \"Unauthorized workflow request.\" }, { status: 401 });\n}\n\nfunction joinRoute(...parts: string[]): string {\n return `/${parts.map((part) => trimSlashes(part)).filter(Boolean).join(\"/\")}`;\n}\n\nfunction trimSlashes(value: string): string {\n return value.replace(/^\\/+|\\/+$/g, \"\");\n}\n\nfunction safeFileName(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"-\") || \"workflow\";\n}\n\nfunction relativePath(root: string, filePath: string): string {\n return filePath.replace(/\\\\/g, \"/\").replace(`${root.replace(/\\\\/g, \"/\")}/`, \"\");\n}\n"],"mappings":"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","names":["module","secretError"]}
1
+ {"version":3,"sources":["../src/workflows.ts"],"sourcesContent":["export type FarmWorkflowSchedule = string | string[];\n\nexport interface FarmWorkflowsUserConfig {\n /** Enable or disable Farm workflow discovery. Enabled by default. */\n enabled?: boolean;\n /** Directory or directories to scan for workflow modules. */\n dir?: string | string[];\n /** Alias for dir. */\n dirs?: string[];\n /** HTTP route used for manual and URL-based cron invocation. */\n route?: string;\n /** Environment variable that stores the optional runner secret. */\n secretEnv?: string;\n /** Inline runner secret. Prefer secretEnv for deployed apps. */\n secret?: string;\n}\n\nexport interface FarmWorkflowsResolvedConfig {\n enabled: boolean;\n dirs: string[];\n route: string;\n secretEnv: string;\n secret?: string;\n}\n\nexport interface FarmWorkflowLogger {\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n}\n\nexport interface FarmWorkflowRunContext<TPayload = unknown> {\n id: string;\n name: string;\n payload: TPayload;\n scheduledTime?: number | string;\n request?: Request;\n event?: unknown;\n env: Record<string, string | undefined>;\n data: Map<string, unknown>;\n log: FarmWorkflowLogger;\n}\n\nexport interface FarmWorkflowDefinition<TPayload = unknown, TResult = unknown> {\n kind?: \"farm-workflow\";\n id?: string;\n description?: string;\n schedule?: FarmWorkflowSchedule;\n timezone?: string;\n run: (ctx: FarmWorkflowRunContext<TPayload>) => TResult | Promise<TResult>;\n}\n\nexport interface FarmCronDefinition<\n TPayload = unknown,\n TResult = unknown,\n> extends FarmWorkflowDefinition<TPayload, TResult> {\n schedule: FarmWorkflowSchedule;\n}\n\nexport interface FarmDiscoveredWorkflow {\n id: string;\n filePath: string;\n description?: string;\n schedule: string[];\n timezone?: string;\n routePath: string;\n}\n\nexport interface PreparedFarmWorkflows {\n workflows: FarmDiscoveredWorkflow[];\n tasks: Record<string, { handler: string; description: string }>;\n scheduledTasks: Record<string, string | string[]>;\n handlerPath?: string;\n manifestPath?: string;\n}\n\nexport interface FarmWorkflowHTTPHandlerOptions {\n workflows: FarmDiscoveredWorkflow[];\n config: FarmWorkflowsResolvedConfig;\n loadModule: (workflow: FarmDiscoveredWorkflow) => Promise<Record<string, any>>;\n}\n\nexport const DEFAULT_FARM_WORKFLOW_DIRS = [\"src/jobs\", \"src/workflows\", \"src/cron\"];\nexport const DEFAULT_FARM_WORKFLOW_ROUTE = \"/api/_farm/workflows\";\nexport const DEFAULT_FARM_WORKFLOW_SECRET_ENV = \"CRON_SECRET\";\n\nexport function defineWorkflow<const TPayload = unknown, TResult = unknown>(\n definition: FarmWorkflowDefinition<TPayload, TResult>,\n): FarmWorkflowDefinition<TPayload, TResult> {\n return {\n ...definition,\n kind: \"farm-workflow\",\n };\n}\n\nexport function defineTask<const TPayload = unknown, TResult = unknown>(\n definition: FarmWorkflowDefinition<TPayload, TResult>,\n): FarmWorkflowDefinition<TPayload, TResult> {\n return defineWorkflow(definition);\n}\n\n/**\n * @deprecated Configure `cron` in `farm.config.ts` and point it at an API route.\n */\nexport function defineCron<const TPayload = unknown, TResult = unknown>(\n definition: FarmCronDefinition<TPayload, TResult>,\n): FarmCronDefinition<TPayload, TResult> {\n return {\n ...definition,\n kind: \"farm-workflow\",\n };\n}\n\nexport function resolveWorkflowsConfig(\n workflows: FarmWorkflowsUserConfig | boolean | undefined,\n): FarmWorkflowsResolvedConfig {\n if (workflows === false) {\n return {\n enabled: false,\n dirs: [...DEFAULT_FARM_WORKFLOW_DIRS],\n route: DEFAULT_FARM_WORKFLOW_ROUTE,\n secretEnv: DEFAULT_FARM_WORKFLOW_SECRET_ENV,\n };\n }\n\n const options = workflows && typeof workflows === \"object\" ? workflows : {};\n const dirs = normalizeWorkflowDirs(options);\n\n return {\n enabled: options.enabled ?? true,\n dirs,\n route: normalizeWorkflowRoute(options.route || DEFAULT_FARM_WORKFLOW_ROUTE),\n secretEnv: options.secretEnv || DEFAULT_FARM_WORKFLOW_SECRET_ENV,\n secret: options.secret,\n };\n}\n\nexport async function discoverFarmWorkflows(\n config: {\n root?: string;\n workflows?: FarmWorkflowsResolvedConfig | FarmWorkflowsUserConfig | boolean;\n },\n options: {\n loadModule?: (filePath: string) => Promise<Record<string, any>>;\n } = {},\n): Promise<FarmDiscoveredWorkflow[]> {\n const workflowConfig = isResolvedWorkflowConfig(config.workflows)\n ? config.workflows\n : resolveWorkflowsConfig(config.workflows);\n if (!workflowConfig.enabled) return [];\n\n const root = config.root || process.cwd();\n const files = await findWorkflowFiles(root, workflowConfig.dirs);\n const workflows: FarmDiscoveredWorkflow[] = [];\n const seenIds = new Map<string, string>();\n\n for (const filePath of files) {\n const module = options.loadModule\n ? await options.loadModule(filePath)\n : await loadWorkflowModule(filePath, root);\n const definition = resolveWorkflowDefinition(module);\n if (!definition) continue;\n\n const id = normalizeWorkflowId(definition.id || workflowIdFromFile(root, filePath));\n const previousPath = seenIds.get(id);\n if (previousPath) {\n throw new Error(\n `Duplicate Farm workflow id \"${id}\" found in ${relativePath(root, previousPath)} and ${relativePath(root, filePath)}.`,\n );\n }\n seenIds.set(id, filePath);\n\n workflows.push({\n id,\n filePath,\n description: definition.description,\n schedule: normalizeSchedule(definition.schedule),\n timezone: definition.timezone,\n routePath: joinRoute(workflowConfig.route, encodeURIComponent(id)),\n });\n }\n\n return workflows;\n}\n\nexport function createFarmWorkflowRequestHandler(options: FarmWorkflowHTTPHandlerOptions) {\n const workflowsById = new Map(options.workflows.map((workflow) => [workflow.id, workflow]));\n\n return async function handleFarmWorkflowRequest(request: Request): Promise<Response | null> {\n const url = new URL(request.url);\n const route = normalizeWorkflowRoute(options.config.route);\n if (url.pathname !== route && !url.pathname.startsWith(`${route}/`)) {\n return null;\n }\n\n if (url.pathname === route) {\n const secretError = verifyWorkflowSecret(request, options.config);\n if (secretError) return secretError;\n\n return Response.json({\n workflows: options.workflows.map(toWorkflowMetadata),\n });\n }\n\n const id = decodeURIComponent(url.pathname.slice(route.length + 1));\n const workflow = workflowsById.get(id);\n if (!workflow) {\n return Response.json({ error: `Workflow \"${id}\" was not found.` }, { status: 404 });\n }\n\n const secretError = verifyWorkflowSecret(request, options.config);\n if (secretError) return secretError;\n\n const payload = await readWorkflowPayload(request);\n const module = await options.loadModule(workflow);\n const result = await runFarmWorkflowModule(module, {\n id: workflow.id,\n name: workflow.id,\n payload,\n request,\n scheduledTime: readScheduledTime(payload),\n });\n\n return Response.json({\n id: workflow.id,\n ok: true,\n result: result ?? null,\n });\n };\n}\n\nexport async function runFarmWorkflowModule(\n module: Record<string, any>,\n context: {\n id: string;\n name?: string;\n payload?: unknown;\n scheduledTime?: number | string;\n request?: Request;\n event?: unknown;\n env?: Record<string, string | undefined>;\n },\n): Promise<unknown> {\n const definition = resolveWorkflowDefinition(module);\n if (!definition) {\n throw new Error(`Farm workflow \"${context.id}\" does not export a workflow definition.`);\n }\n\n return await definition.run({\n id: context.id,\n name: context.name || context.id,\n payload: context.payload,\n scheduledTime: context.scheduledTime,\n request: context.request,\n event: context.event,\n env: context.env || process.env,\n data: new Map<string, unknown>(),\n log: console,\n });\n}\n\nexport async function prepareFarmWorkflowsForNitro(config: {\n root?: string;\n distDir?: string;\n workflows?: FarmWorkflowsResolvedConfig | FarmWorkflowsUserConfig | boolean;\n}): Promise<PreparedFarmWorkflows> {\n const workflowConfig = isResolvedWorkflowConfig(config.workflows)\n ? config.workflows\n : resolveWorkflowsConfig(config.workflows);\n const workflows = await discoverFarmWorkflows({\n root: config.root,\n workflows: workflowConfig,\n });\n\n if (workflows.length === 0) {\n return {\n workflows,\n tasks: {},\n scheduledTasks: {},\n };\n }\n\n const root = config.root || process.cwd();\n const distDir = config.distDir || \".farm\";\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const generatedDir = path.join(root, distDir, \".nitro\", \"farm-workflows\");\n await fs.mkdir(generatedDir, { recursive: true });\n\n const tasks: PreparedFarmWorkflows[\"tasks\"] = {};\n const scheduledTasks = createScheduledTasks(workflows);\n\n for (const workflow of workflows) {\n const wrapperPath = path.join(generatedDir, `${safeFileName(workflow.id)}.mjs`);\n await fs.writeFile(wrapperPath, createNitroTaskWrapper(workflow), \"utf8\");\n tasks[workflow.id] = {\n handler: wrapperPath,\n description: workflow.description || `Farm workflow ${workflow.id}`,\n };\n }\n\n const handlerPath = path.join(generatedDir, \"http-handler.mjs\");\n await fs.writeFile(\n handlerPath,\n createNitroWorkflowHTTPHandler(workflowConfig, workflows),\n \"utf8\",\n );\n\n const manifestPath = path.join(generatedDir, \"manifest.json\");\n await fs.writeFile(\n manifestPath,\n JSON.stringify(\n {\n route: workflowConfig.route,\n secretEnv: workflowConfig.secretEnv,\n trigger: {\n method: \"GET\",\n authorization: `Bearer $${workflowConfig.secretEnv}`,\n },\n workflows: workflows.map(toWorkflowMetadata),\n },\n null,\n 2,\n ),\n \"utf8\",\n );\n\n return {\n workflows,\n tasks,\n scheduledTasks,\n handlerPath,\n manifestPath,\n };\n}\n\nexport function createFarmWorkflowVercelCrons(\n workflows: FarmDiscoveredWorkflow[],\n): Array<{ path: string; schedule: string }> {\n return workflows.flatMap((workflow) =>\n workflow.schedule.map((schedule) => ({\n path: workflow.routePath,\n schedule,\n })),\n );\n}\n\nexport function applyFarmWorkflowVercelCrons(\n vercelConfig: Record<string, any>,\n workflows: FarmDiscoveredWorkflow[],\n): Record<string, any> {\n const crons = createFarmWorkflowVercelCrons(workflows);\n if (crons.length === 0) return vercelConfig;\n\n const existingCrons = Array.isArray(vercelConfig.crons) ? vercelConfig.crons : [];\n const seen = new Set(existingCrons.map((cron) => `${cron.path}:${cron.schedule}`));\n const nextCrons = [...existingCrons];\n for (const cron of crons) {\n const key = `${cron.path}:${cron.schedule}`;\n if (seen.has(key)) continue;\n seen.add(key);\n nextCrons.push(cron);\n }\n return {\n ...vercelConfig,\n crons: nextCrons,\n };\n}\n\nfunction isResolvedWorkflowConfig(value: unknown): value is FarmWorkflowsResolvedConfig {\n return (\n !!value &&\n typeof value === \"object\" &&\n \"dirs\" in value &&\n Array.isArray((value as FarmWorkflowsResolvedConfig).dirs) &&\n typeof (value as FarmWorkflowsResolvedConfig).route === \"string\"\n );\n}\n\nfunction normalizeWorkflowDirs(options: FarmWorkflowsUserConfig): string[] {\n const rawDirs =\n options.dirs ||\n (Array.isArray(options.dir) ? options.dir : options.dir ? [options.dir] : undefined);\n const dirs = rawDirs && rawDirs.length > 0 ? rawDirs : DEFAULT_FARM_WORKFLOW_DIRS;\n return [...new Set(dirs.map((dir) => trimSlashes(dir)).filter(Boolean))];\n}\n\nfunction normalizeWorkflowRoute(route: string): string {\n const trimmed = route.trim();\n if (!trimmed || trimmed === \"/\") return DEFAULT_FARM_WORKFLOW_ROUTE;\n return `/${trimSlashes(trimmed)}`;\n}\n\nfunction normalizeWorkflowId(id: string): string {\n const normalized = id\n .replace(/\\\\/g, \"/\")\n .replace(/\\.(tsx?|jsx?|mjs|cjs)$/, \"\")\n .replace(/\\/index$/, \"\")\n .replace(/[^a-zA-Z0-9._/-]+/g, \"-\")\n .replace(/^\\/+|\\/+$/g, \"\")\n .replace(/\\/+/g, \"/\");\n return normalized || \"workflow\";\n}\n\nfunction normalizeSchedule(schedule: FarmWorkflowSchedule | undefined): string[] {\n if (!schedule) return [];\n return (Array.isArray(schedule) ? schedule : [schedule])\n .map((value) => value.trim())\n .filter(Boolean);\n}\n\nfunction resolveWorkflowDefinition(\n module: Record<string, any>,\n): FarmWorkflowDefinition | FarmCronDefinition | null {\n const candidates = [module.default, module.workflow, module.cron, module.task, module.job];\n for (const candidate of candidates) {\n if (candidate && typeof candidate === \"object\" && typeof candidate.run === \"function\") {\n return candidate as FarmWorkflowDefinition;\n }\n }\n return null;\n}\n\nasync function findWorkflowFiles(root: string, dirs: string[]): Promise<string[]> {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const files: string[] = [];\n\n for (const dir of dirs) {\n const absoluteDir = path.isAbsolute(dir) ? dir : path.join(root, dir);\n if (!(await pathExists(absoluteDir))) continue;\n await walkWorkflowDir(absoluteDir, files);\n }\n\n return files.sort();\n}\n\nasync function walkWorkflowDir(dir: string, files: string[]): Promise<void> {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const filePath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (entry.name === \"node_modules\" || entry.name.startsWith(\".\")) continue;\n await walkWorkflowDir(filePath, files);\n continue;\n }\n if (isWorkflowFile(entry.name)) {\n files.push(filePath);\n }\n }\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n const fs = await import(\"fs/promises\");\n return fs\n .access(filePath)\n .then(() => true)\n .catch(() => false);\n}\n\nfunction isWorkflowFile(fileName: string): boolean {\n return /\\.(?:ts|tsx|js|jsx|mjs|cjs)$/.test(fileName) && !/\\.d\\.[cm]?ts$/.test(fileName);\n}\n\nasync function loadWorkflowModule(filePath: string, root: string): Promise<Record<string, any>> {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const { pathToFileURL } = await import(\"url\");\n const { build } = await import(\"esbuild\");\n const outDir = path.join(root, \".farm\", \".workflow-loader\");\n await fs.mkdir(outDir, { recursive: true });\n const outfile = path.join(\n outDir,\n `workflow-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`,\n );\n\n await build({\n absWorkingDir: root,\n entryPoints: [filePath],\n outfile,\n bundle: true,\n format: \"esm\",\n platform: \"node\",\n target: `node${process.versions.node.split(\".\")[0]}`,\n packages: \"external\",\n external: [\"@farm.js/core\", \"@farm.js/core/*\", \"nitro\", \"nitro/*\"],\n jsx: \"automatic\",\n logLevel: \"silent\",\n sourcemap: \"inline\",\n });\n\n try {\n return await import(/* @vite-ignore */ `${pathToFileURL(outfile).href}?t=${Date.now()}`);\n } finally {\n await fs.unlink(outfile).catch(() => undefined);\n }\n}\n\nfunction workflowIdFromFile(root: string, filePath: string): string {\n const normalizedRoot = root.replace(/\\\\/g, \"/\");\n const normalizedFile = filePath.replace(/\\\\/g, \"/\");\n const relative = normalizedFile.startsWith(`${normalizedRoot}/`)\n ? normalizedFile.slice(normalizedRoot.length + 1)\n : normalizedFile;\n return normalizeWorkflowId(\n relative.replace(/^src\\/(?:jobs|workflows|cron)\\//, \"\").replace(/\\.(tsx?|jsx?|mjs|cjs)$/, \"\"),\n );\n}\n\nfunction createScheduledTasks(\n workflows: FarmDiscoveredWorkflow[],\n): Record<string, string | string[]> {\n const scheduleMap = new Map<string, string[]>();\n for (const workflow of workflows) {\n for (const schedule of workflow.schedule) {\n const taskIds = scheduleMap.get(schedule) || [];\n taskIds.push(workflow.id);\n scheduleMap.set(schedule, taskIds);\n }\n }\n\n return Object.fromEntries(\n [...scheduleMap.entries()].map(([schedule, taskIds]) => [\n schedule,\n taskIds.length === 1 ? taskIds[0] : taskIds,\n ]),\n );\n}\n\nfunction createNitroTaskWrapper(workflow: FarmDiscoveredWorkflow): string {\n const normalizedPath = workflow.filePath.replace(/\\\\/g, \"/\");\n return `\nimport { defineTask } from \"nitro/runtime\";\nimport { runFarmWorkflowModule } from \"@farm.js/core/workflows\";\nimport * as workflowModule from ${JSON.stringify(normalizedPath)};\n\nexport default defineTask({\n meta: {\n description: ${JSON.stringify(workflow.description || `Farm workflow ${workflow.id}`)}\n },\n async run(event) {\n const payload = event?.payload || {};\n const env = event?.context?.cloudflare?.env || event?.context?.env || process.env;\n return await runFarmWorkflowModule(workflowModule, {\n id: ${JSON.stringify(workflow.id)},\n name: event?.name || ${JSON.stringify(workflow.id)},\n payload,\n scheduledTime: payload.scheduledTime,\n request: event?.context?.request,\n event,\n env\n });\n }\n});\n`.trim();\n}\n\nfunction createNitroWorkflowHTTPHandler(\n config: FarmWorkflowsResolvedConfig,\n workflows: FarmDiscoveredWorkflow[],\n): string {\n return `\nimport { H3 } from \"h3\";\nimport { runTask } from \"nitro/runtime\";\n\nconst route = ${JSON.stringify(config.route)};\nconst secretEnv = ${JSON.stringify(config.secretEnv)};\nconst inlineSecret = ${JSON.stringify(config.secret || \"\")};\nconst workflows = ${JSON.stringify(workflows.map(toWorkflowMetadata))};\nconst workflowIds = new Set(workflows.map((workflow) => workflow.id));\n\nfunction json(value, status = 200) {\n return new Response(JSON.stringify(value), {\n status,\n headers: { \"content-type\": \"application/json\" }\n });\n}\n\nfunction getHeader(event, name) {\n return event.req.headers.get(name);\n}\n\nfunction getSecret() {\n return inlineSecret || process.env[secretEnv] || \"\";\n}\n\nfunction verifySecret(event) {\n const secret = getSecret();\n if (!secret) return null;\n const authorization = getHeader(event, \"authorization\") || \"\";\n const headerSecret = getHeader(event, \"x-farm-workflow-secret\") || \"\";\n const querySecret = event.url.searchParams.get(\"secret\") || \"\";\n const bearer = authorization.startsWith(\"Bearer \") ? authorization.slice(7) : \"\";\n if (headerSecret === secret || querySecret === secret || bearer === secret) return null;\n return json({ error: \"Unauthorized workflow request.\" }, 401);\n}\n\nasync function readPayload(event) {\n if (event.req.method === \"GET\" || event.req.method === \"HEAD\") {\n const payload = Object.fromEntries(event.url.searchParams.entries());\n delete payload.secret;\n return payload;\n }\n return await event.req.json().catch(() => ({}));\n}\n\nexport default new H3()\n .get(route, (event) => {\n const unauthorized = verifySecret(event);\n if (unauthorized) return unauthorized;\n return { workflows };\n })\n .all(route + \"/:id\", async (event) => {\n const id = decodeURIComponent(event.context.params?.id || \"\");\n if (!workflowIds.has(id)) {\n return json({ error: \"Workflow \" + id + \" was not found.\" }, 404);\n }\n\n const unauthorized = verifySecret(event);\n if (unauthorized) return unauthorized;\n\n const payload = await readPayload(event);\n const result = await runTask(id, {\n payload,\n context: {\n source: \"http\",\n request: event.req,\n route,\n url: event.url.href,\n method: event.req.method\n }\n });\n return {\n id,\n ok: true,\n result: result ?? null\n };\n });\n`.trim();\n}\n\nfunction toWorkflowMetadata(workflow: FarmDiscoveredWorkflow) {\n return {\n id: workflow.id,\n description: workflow.description || null,\n schedule: workflow.schedule,\n timezone: workflow.timezone || null,\n path: workflow.routePath,\n };\n}\n\nasync function readWorkflowPayload(request: Request): Promise<unknown> {\n const url = new URL(request.url);\n if (request.method === \"GET\" || request.method === \"HEAD\") {\n const payload = Object.fromEntries(url.searchParams.entries());\n delete payload.secret;\n return payload;\n }\n\n const contentType = request.headers.get(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\")) {\n return await request.json().catch(() => ({}));\n }\n\n const text = await request.text().catch(() => \"\");\n return text ? { text } : {};\n}\n\nfunction readScheduledTime(payload: unknown): number | string | undefined {\n return payload && typeof payload === \"object\" && \"scheduledTime\" in payload\n ? (payload as { scheduledTime?: number | string }).scheduledTime\n : undefined;\n}\n\nfunction verifyWorkflowSecret(\n request: Request,\n config: FarmWorkflowsResolvedConfig,\n): Response | null {\n const secret = config.secret || process.env[config.secretEnv] || \"\";\n if (!secret) return null;\n\n const url = new URL(request.url);\n const authorization = request.headers.get(\"authorization\") || \"\";\n const bearer = authorization.startsWith(\"Bearer \") ? authorization.slice(7) : \"\";\n const headerSecret = request.headers.get(\"x-farm-workflow-secret\") || \"\";\n const querySecret = url.searchParams.get(\"secret\") || \"\";\n if (bearer === secret || headerSecret === secret || querySecret === secret) return null;\n\n return Response.json({ error: \"Unauthorized workflow request.\" }, { status: 401 });\n}\n\nfunction joinRoute(...parts: string[]): string {\n return `/${parts\n .map((part) => trimSlashes(part))\n .filter(Boolean)\n .join(\"/\")}`;\n}\n\nfunction trimSlashes(value: string): string {\n return value.replace(/^\\/+|\\/+$/g, \"\");\n}\n\nfunction safeFileName(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"-\") || \"workflow\";\n}\n\nfunction relativePath(root: string, filePath: string): string {\n return filePath.replace(/\\\\/g, \"/\").replace(`${root.replace(/\\\\/g, \"/\")}/`, \"\");\n}\n"],"mappings":"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","names":["module","secretError"]}
@@ -12,7 +12,7 @@ import {
12
12
  prepareFarmWorkflowsForNitro,
13
13
  resolveWorkflowsConfig,
14
14
  runFarmWorkflowModule
15
- } from "./chunk-Y2OJJD7R.mjs";
15
+ } from "./chunk-XIVV5IWN.mjs";
16
16
  import "./chunk-CGILA3WO.mjs";
17
17
  export {
18
18
  DEFAULT_FARM_WORKFLOW_DIRS,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@farm.js/core",
3
- "version": "0.1.0-beta.0",
4
- "description": "Core Farm.js framework - A modern React meta-framework",
3
+ "version": "0.1.0-beta.3",
4
+ "description": "Core Farm.js framework for modern integrated apps",
5
5
  "keywords": [
6
6
  "@farm.js/core",
7
7
  "framework",
@@ -30,6 +30,9 @@
30
30
  "./types/middleware.d.ts",
31
31
  "./dist/middleware.d.ts"
32
32
  ],
33
+ "version": [
34
+ "./dist/version.d.ts"
35
+ ],
33
36
  "router": [
34
37
  "./dist/router.d.ts"
35
38
  ],
@@ -182,6 +185,11 @@
182
185
  "require": "./dist/index.cjs",
183
186
  "default": "./dist/index.mjs"
184
187
  },
188
+ "./version": {
189
+ "types": "./dist/version.d.ts",
190
+ "import": "./dist/version.mjs",
191
+ "require": "./dist/version.cjs"
192
+ },
185
193
  "./config": {
186
194
  "types": "./dist/config.d.ts",
187
195
  "import": "./dist/config.mjs",
@@ -477,9 +485,6 @@
477
485
  "nitro": "3.0.1-alpha.0",
478
486
  "pg": "^8.20.0",
479
487
  "picocolors": "^1.0.0",
480
- "react": "^19.0.0",
481
- "react-dom": "^19.0.0",
482
- "react-server-dom-webpack": "^18.3.0-canary-670c8dfb8-20231204",
483
488
  "remark-gfm": "^4.0.1",
484
489
  "sirv": "^2.0.4",
485
490
  "sugar-high": "^0.9.5",
@@ -495,6 +500,8 @@
495
500
  "@types/react-dom": "^18.2.18",
496
501
  "@vitest/coverage-v8": "^1.1.0",
497
502
  "jsdom": "^25.0.0",
503
+ "react": "19.2.8",
504
+ "react-dom": "19.2.8",
498
505
  "tsup": "^8.3.5",
499
506
  "typescript": "^5.3.3",
500
507
  "vitest": "^1.1.0"
package/types/client.d.ts CHANGED
@@ -13,6 +13,7 @@ import type {
13
13
  RefObject,
14
14
  RefAttributes,
15
15
  } from "react";
16
+ import type { DefinedCacheKey, InferCacheKeyData, RouteDataCacheKey } from "@farm.js/core/cache";
16
17
 
17
18
  declare module "@farm.js/core/client" {
18
19
  export interface MiddlewareProps {
@@ -378,6 +379,31 @@ declare module "@farm.js/core/client" {
378
379
  key: CacheKey<TData>;
379
380
  };
380
381
 
382
+ export class APIClientError<
383
+ TCode extends string = string,
384
+ TData = unknown,
385
+ TStatus extends number = number,
386
+ > extends Error {
387
+ readonly code: TCode;
388
+ readonly data: TData;
389
+ readonly status: TStatus;
390
+ readonly response?: Response;
391
+
392
+ constructor(
393
+ code: TCode,
394
+ data: TData,
395
+ options: {
396
+ status: TStatus;
397
+ message: string;
398
+ response?: Response;
399
+ },
400
+ );
401
+ }
402
+
403
+ export type APIClientSystemError =
404
+ | APIClientError<"http_error", unknown, number>
405
+ | APIClientError<"network_error", unknown, 0>;
406
+
381
407
  export type RequestEvent = {
382
408
  requestId: string;
383
409
  method: StatusEvent["method"];
@@ -406,7 +432,7 @@ declare module "@farm.js/core/client" {
406
432
  export type CachePolicy = "cache-first" | "network-only" | "stale-while-revalidate";
407
433
 
408
434
  export type CacheOptions = {
409
- key?: string;
435
+ key?: RouteDataCacheKey;
410
436
  policy?: CachePolicy;
411
437
  staleTime?: number;
412
438
  gcTime?: number;
@@ -419,9 +445,9 @@ declare module "@farm.js/core/client" {
419
445
  };
420
446
 
421
447
  export type InvalidateTarget =
422
- | string
448
+ | RouteDataCacheKey
423
449
  | {
424
- key: string;
450
+ key: RouteDataCacheKey;
425
451
  }
426
452
  | {
427
453
  path: string;
@@ -439,7 +465,7 @@ declare module "@farm.js/core/client" {
439
465
 
440
466
  export type OptimisticUpdate =
441
467
  | [CallableRouteRef<any>, unknown, (prev: any) => any]
442
- | [CacheKey<any> | string, (prev: any) => any];
468
+ | [CacheKey<any> | DefinedCacheKey<any> | string, (prev: any) => any];
443
469
 
444
470
  export type OptimisticOptions<TUpdates extends readonly unknown[] = readonly OptimisticUpdate[]> =
445
471
  {
@@ -452,7 +478,7 @@ declare module "@farm.js/core/client" {
452
478
  TError = unknown,
453
479
  TUpdates extends readonly unknown[] = readonly OptimisticUpdate[],
454
480
  > = {
455
- key?: CacheKey<TData> | string;
481
+ key?: CacheKey<TData> | RouteDataCacheKey;
456
482
  cache?: CacheOptions;
457
483
  retry?: RetryOptions;
458
484
  invalidate?: InvalidateOptions;
@@ -496,11 +522,13 @@ declare module "@farm.js/core/client" {
496
522
  ]
497
523
  : never
498
524
  : TUpdate extends readonly [infer TKey, (prev: any) => any]
499
- ? TKey extends CacheKey<infer TData>
500
- ? [TKey, (prev: TData | undefined) => TData]
501
- : TKey extends string
502
- ? [TKey, (prev: unknown) => unknown]
503
- : never
525
+ ? TKey extends DefinedCacheKey<any, RouteDataCacheKey>
526
+ ? [TKey, (prev: InferCacheKeyData<TKey> | undefined) => InferCacheKeyData<TKey>]
527
+ : TKey extends CacheKey<infer TData>
528
+ ? [TKey, (prev: TData | undefined) => TData]
529
+ : TKey extends string
530
+ ? [TKey, (prev: unknown) => unknown]
531
+ : never
504
532
  : never;
505
533
 
506
534
  type NormalizeOptimisticUpdates<TUpdates extends readonly unknown[]> = {
@@ -516,6 +544,7 @@ declare module "@farm.js/core/client" {
516
544
  body: any;
517
545
  query: any;
518
546
  response: any;
547
+ errors?: any;
519
548
  };
520
549
  };
521
550
 
@@ -571,21 +600,115 @@ declare module "@farm.js/core/client" {
571
600
  ? R
572
601
  : any;
573
602
 
603
+ type InferEndpointError<T> = T extends {
604
+ __types: {
605
+ errors: infer TErrors;
606
+ };
607
+ }
608
+ ? keyof TErrors extends never
609
+ ? Error
610
+ :
611
+ | {
612
+ [TCode in keyof TErrors]: TErrors[TCode] extends {
613
+ data: infer TData;
614
+ status: infer TStatus extends number;
615
+ }
616
+ ? APIClientError<TCode & string, TData, TStatus>
617
+ : never;
618
+ }[keyof TErrors]
619
+ | APIClientSystemError
620
+ : Error;
621
+
574
622
  type EndpointMethod<T = any> = (<
575
623
  TUpdates extends readonly unknown[] = readonly OptimisticUpdate[],
576
624
  >(
577
625
  ...args: HasRequiredKeys<InferEndpointInput<T>> extends true
578
626
  ? [
579
627
  options: InferEndpointInput<T>,
580
- clientOptions?: ClientOptions<InferEndpointOutput<T>, Error, TUpdates>,
628
+ clientOptions?: ClientOptions<InferEndpointOutput<T>, InferEndpointError<T>, TUpdates>,
581
629
  ]
582
630
  : [
583
631
  options?: InferEndpointInput<T>,
584
- clientOptions?: ClientOptions<InferEndpointOutput<T>, Error, TUpdates>,
632
+ clientOptions?: ClientOptions<InferEndpointOutput<T>, InferEndpointError<T>, TUpdates>,
585
633
  ]
586
- ) => Promise<APIResult<InferEndpointOutput<T>, Error>>) &
634
+ ) => Promise<APIResult<InferEndpointOutput<T>, InferEndpointError<T>>>) &
587
635
  RouteRef<InferEndpointOutput<T>, InferEndpointInput<T>>;
588
636
 
637
+ export type MutationStatus = "idle" | "pending" | "success" | "error";
638
+
639
+ type AnyMutationTarget = (...args: any[]) => Promise<any>;
640
+
641
+ export type InferMutationVariables<TTarget extends AnyMutationTarget> =
642
+ Parameters<TTarget> extends [] ? undefined : Parameters<TTarget>[0];
643
+
644
+ export type InferMutationData<TTarget extends AnyMutationTarget> = TTarget extends {
645
+ readonly __farmRouteData: infer TData;
646
+ }
647
+ ? TData
648
+ : Awaited<ReturnType<TTarget>>;
649
+
650
+ export type InferMutationError<TTarget extends AnyMutationTarget> = TTarget extends (
651
+ ...args: any[]
652
+ ) => Promise<APIResult<any, infer TError>>
653
+ ? TError
654
+ : Error;
655
+
656
+ export type MutationOptimisticContext<TVariables, TData> = {
657
+ variables: TVariables | undefined;
658
+ current: TData | null;
659
+ };
660
+
661
+ export type UseMutationOptions<TVariables, TData, TError = Error> = {
662
+ initialData?: TData | null;
663
+ resetOnMutate?: boolean;
664
+ optimistic?: (
665
+ context: MutationOptimisticContext<TVariables, TData>,
666
+ ) => TData | null | undefined;
667
+ rollbackOnError?: boolean;
668
+ request?: ClientOptions<TData, TError>;
669
+ onSuccess?: (data: TData, variables: TVariables | undefined) => void;
670
+ onError?: (error: TError, variables: TVariables | undefined) => void;
671
+ onSettled?: (
672
+ data: TData | null,
673
+ error: TError | null,
674
+ variables: TVariables | undefined,
675
+ ) => void;
676
+ };
677
+
678
+ export type MutationAsync<TTarget extends AnyMutationTarget, TData = InferMutationData<TTarget>> =
679
+ [] extends Parameters<TTarget>
680
+ ? (variables?: InferMutationVariables<TTarget>) => Promise<TData>
681
+ : (variables: InferMutationVariables<TTarget>) => Promise<TData>;
682
+
683
+ export type MutationTrigger<TTarget extends AnyMutationTarget> =
684
+ [] extends Parameters<TTarget>
685
+ ? (variables?: InferMutationVariables<TTarget>) => void
686
+ : (variables: InferMutationVariables<TTarget>) => void;
687
+
688
+ export type UseMutationReturn<
689
+ TTarget extends AnyMutationTarget,
690
+ TData = InferMutationData<TTarget>,
691
+ TError = InferMutationError<TTarget>,
692
+ > = {
693
+ pending: boolean;
694
+ status: MutationStatus;
695
+ data: TData | null;
696
+ error: TError | null;
697
+ variables: InferMutationVariables<TTarget> | undefined;
698
+ mutate: MutationTrigger<TTarget>;
699
+ mutateAsync: MutationAsync<TTarget, TData>;
700
+ reset: () => void;
701
+ };
702
+
703
+ export function useMutation<TTarget extends AnyMutationTarget>(
704
+ target: TTarget,
705
+ options?: UseMutationOptions<
706
+ InferMutationVariables<TTarget>,
707
+ InferMutationData<TTarget>,
708
+ InferMutationError<TTarget>
709
+ >,
710
+ ): UseMutationReturn<TTarget>;
711
+
589
712
  type RouterToClient<T> = {
590
713
  [K in keyof T]: T[K] extends TypedEndpointLike
591
714
  ? EndpointMethod<T[K]>
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cache.ts"],"sourcesContent":["import { emitFarmEvent } from \"./observability\";\nimport { notifyFarmCacheInvalidation } from \"./cache-invalidation\";\nimport { getActiveFarmI18nSnapshot } from \"./i18n/bridge\";\n\nexport { applyFarmCacheInvalidations } from \"./cache-invalidation\";\n\nexport type RevalidateTagProfile =\n | \"max\"\n | \"default\"\n | \"seconds\"\n | \"minutes\"\n | \"hours\"\n | \"days\"\n | \"weeks\"\n | \"months\"\n | { expire?: number };\n\nexport interface FarmCacheOptions {\n /**\n * Tag cached data so it can be invalidated with revalidateTag/updateTag.\n */\n tags?: readonly string[];\n /**\n * Path tags let revalidatePath invalidate data tied to a route.\n */\n paths?: readonly string[];\n /**\n * Time in seconds before the entry becomes stale. False means no TTL.\n */\n revalidate?: number | false;\n}\n\nexport interface FarmCacheSetOptions extends FarmCacheOptions {\n createdAt?: number;\n}\n\nexport type RouteDataCacheKey = string | readonly unknown[];\n\nexport interface FarmCacheEntry<T = unknown> {\n key: string;\n value: T;\n tags: readonly string[];\n createdAt: number;\n createdVersion?: number;\n revalidate?: number | false;\n}\n\ninterface InternalFarmCacheEntry<T = unknown> {\n key: string;\n value: T;\n tags: Set<string>;\n createdAt: number;\n createdVersion: number;\n revalidate?: number | false;\n}\n\nexport interface GetFarmCacheEntryOptions {\n allowStale?: boolean;\n now?: number;\n}\n\ninterface FarmCacheStaleEntry {\n tags: Iterable<string>;\n createdAt: number;\n createdVersion?: number;\n revalidate?: number | false;\n}\n\nexport class FarmDataCache {\n private entries = new Map<string, InternalFarmCacheEntry>();\n private inflight = new Map<string, Promise<unknown>>();\n private invalidatedTagVersions = new Map<string, number>();\n private version = 0;\n\n get size(): number {\n return this.entries.size;\n }\n\n get<T>(key: string, options: GetFarmCacheEntryOptions = {}): T | undefined {\n return this.getEntry<T>(key, options)?.value;\n }\n\n getEntry<T = unknown>(\n key: string,\n options: GetFarmCacheEntryOptions = {},\n ): FarmCacheEntry<T> | undefined {\n const entry = this.entries.get(key) as InternalFarmCacheEntry<T> | undefined;\n if (!entry) {\n emitFarmEvent({ type: \"cache.miss\", key });\n return undefined;\n }\n\n const stale = this.isStale(entry, options.now);\n if (stale) {\n emitFarmEvent({\n type: \"cache.stale\",\n key,\n tags: Array.from(entry.tags),\n revalidate: entry.revalidate,\n });\n }\n\n if (!options.allowStale && stale) {\n emitFarmEvent({ type: \"cache.miss\", key, reason: \"stale\" });\n return undefined;\n }\n\n emitFarmEvent({\n type: \"cache.hit\",\n key,\n tags: Array.from(entry.tags),\n revalidate: entry.revalidate,\n stale,\n });\n\n return this.toPublicEntry(entry);\n }\n\n set<T>(key: string, value: T, options: FarmCacheSetOptions = {}): FarmCacheEntry<T> {\n const tags = new Set<string>();\n for (const tag of options.tags ?? []) {\n tags.add(normalizeCacheTag(tag));\n }\n for (const routePath of options.paths ?? []) {\n tags.add(createPathCacheTag(routePath));\n }\n\n const entry: InternalFarmCacheEntry<T> = {\n key,\n value,\n tags,\n createdAt: options.createdAt ?? Date.now(),\n createdVersion: ++this.version,\n revalidate: normalizeRevalidate(options.revalidate),\n };\n\n this.entries.set(key, entry);\n emitFarmEvent({\n type: \"cache.set\",\n key,\n tags: Array.from(tags),\n revalidate: entry.revalidate,\n });\n return this.toPublicEntry(entry);\n }\n\n delete(key: string): boolean {\n const deleted = this.entries.delete(key);\n emitFarmEvent({ type: \"cache.delete\", key, deleted });\n return deleted;\n }\n\n clear(): void {\n const count = this.entries.size;\n this.entries.clear();\n this.inflight.clear();\n this.invalidatedTagVersions.clear();\n this.version = 0;\n emitFarmEvent({ type: \"cache.clear\", count });\n }\n\n isStale(entry: FarmCacheStaleEntry, now = Date.now()): boolean {\n if (\n typeof entry.revalidate === \"number\" &&\n entry.revalidate > 0 &&\n now - entry.createdAt >= entry.revalidate * 1000\n ) {\n return true;\n }\n\n for (const tag of entry.tags) {\n const invalidatedVersion = this.invalidatedTagVersions.get(normalizeCacheTag(tag));\n if (\n typeof invalidatedVersion === \"number\" &&\n typeof entry.createdVersion === \"number\" &&\n invalidatedVersion > entry.createdVersion\n ) {\n return true;\n }\n }\n\n return false;\n }\n\n revalidateTag(\n tag: string,\n options: { source?: \"revalidateTag\" | \"updateTag\"; profile?: RevalidateTagProfile } = {},\n ): number {\n const normalized = normalizeCacheTag(tag);\n const count = this.invalidateTag(normalized);\n emitFarmEvent(\n options.source === \"updateTag\"\n ? { type: \"cache.updateTag\", tag: normalized, count }\n : { type: \"cache.revalidateTag\", tag: normalized, profile: options.profile, count },\n );\n return count;\n }\n\n revalidatePath(routePath: string): number {\n const normalizedPath = normalizeRevalidatePath(routePath);\n const pathTag = createPathCacheTag(normalizedPath);\n const pprCount = this.countEntriesForTags([pathTag, \"ppr\"]);\n const count = this.invalidateTag(pathTag);\n emitFarmEvent({ type: \"cache.revalidatePath\", path: normalizedPath, count });\n\n if (pprCount > 0) {\n emitFarmEvent({\n type: \"ppr.shell.invalidated\",\n route: normalizedPath,\n reason: \"revalidatePath\",\n count: pprCount,\n });\n }\n\n return count;\n }\n\n async getOrSet<T>(\n key: string,\n producer: () => Promise<T> | T,\n options: FarmCacheOptions = {},\n ): Promise<T> {\n const cached = this.getEntry<T>(key);\n if (cached) {\n return cached.value;\n }\n\n const inflight = this.inflight.get(key) as Promise<T> | undefined;\n if (inflight) {\n emitFarmEvent({ type: \"cache.dedupe\", key });\n return inflight;\n }\n\n const promise = Promise.resolve()\n .then(producer)\n .then((value) => {\n this.set(key, value, options);\n return value;\n })\n .catch((error) => {\n emitFarmEvent({ type: \"cache.error\", key, operation: \"set\", error });\n throw error;\n })\n .finally(() => {\n this.inflight.delete(key);\n });\n\n this.inflight.set(key, promise);\n return promise;\n }\n\n private countEntriesForTag(tag: string): number {\n let count = 0;\n for (const entry of this.entries.values()) {\n if (entry.tags.has(tag)) {\n count++;\n }\n }\n return count;\n }\n\n private countEntriesForTags(tags: readonly string[]): number {\n let count = 0;\n for (const entry of this.entries.values()) {\n if (tags.every((tag) => entry.tags.has(tag))) {\n count++;\n }\n }\n return count;\n }\n\n private invalidateTag(normalizedTag: string): number {\n this.invalidatedTagVersions.set(normalizedTag, ++this.version);\n return this.countEntriesForTag(normalizedTag);\n }\n\n private toPublicEntry<T>(entry: InternalFarmCacheEntry<T>): FarmCacheEntry<T> {\n return {\n key: entry.key,\n value: entry.value,\n tags: Array.from(entry.tags),\n createdAt: entry.createdAt,\n createdVersion: entry.createdVersion,\n revalidate: entry.revalidate,\n };\n }\n}\n\nconst FARM_DATA_CACHE_SYMBOL = Symbol.for(\"farm.dataCache\");\nconst farmDataCacheGlobal = globalThis as typeof globalThis & {\n [FARM_DATA_CACHE_SYMBOL]?: FarmDataCache;\n};\nconst sharedFarmDataCache = (farmDataCacheGlobal[FARM_DATA_CACHE_SYMBOL] ??= new FarmDataCache());\nconst functionIds = new WeakMap<Function, number>();\nlet nextFunctionId = 0;\n\nexport function getFarmDataCache(): FarmDataCache {\n return sharedFarmDataCache;\n}\n\nexport function unstable_cache<Args extends unknown[], Result>(\n fn: (...args: Args) => Result | Promise<Result>,\n keyParts: readonly unknown[] = [],\n options: FarmCacheOptions = {},\n): (...args: Args) => Promise<Result> {\n return async (...args: Args): Promise<Result> => {\n const locale = getActiveFarmI18nSnapshot()?.locale;\n const key = createFarmCacheKey([\n \"unstable_cache\",\n getFunctionCacheIdentity(fn),\n locale ? [\"locale\", locale] : null,\n keyParts,\n args,\n ]);\n return getFarmDataCache().getOrSet<Result>(key, () => fn(...args), options);\n };\n}\n\nexport function revalidateTag(_tag: string, _profile?: RevalidateTagProfile): void {\n getFarmDataCache().revalidateTag(_tag, {\n source: \"revalidateTag\",\n profile: _profile,\n });\n}\n\nexport function updateTag(tag: string): void {\n getFarmDataCache().revalidateTag(tag, { source: \"updateTag\" });\n}\n\nexport function revalidatePath(routePath: string): void {\n getFarmDataCache().revalidatePath(routePath);\n}\n\nexport function invalidate(key: RouteDataCacheKey): void {\n const clientKey = createRouteDataCacheKey(key);\n getFarmDataCache().revalidateTag(createRouteDataCacheTag(key), { source: \"updateTag\" });\n notifyFarmCacheInvalidation(clientKey);\n}\n\nexport function invalidateRouteData(key: RouteDataCacheKey): void {\n invalidate(key);\n}\n\nexport function createPathCacheTag(routePath: string): string {\n return `path:${normalizeRevalidatePath(routePath)}`;\n}\n\nexport function createRouteDataCacheTag(key: RouteDataCacheKey): string {\n return `route-data:${createRouteDataCacheKey(key)}`;\n}\n\nexport function createRouteDataCacheKey(key: RouteDataCacheKey): string {\n return createFarmCacheKey(Array.isArray(key) ? key : [key]);\n}\n\nexport function normalizeRevalidatePath(routePath: string): string {\n if (typeof routePath !== \"string\") {\n throw new TypeError(\"revalidatePath expects a path string.\");\n }\n\n let normalized = routePath.trim();\n if (!normalized) {\n throw new Error(\"revalidatePath expects a non-empty path.\");\n }\n\n try {\n if (/^https?:\\/\\//.test(normalized)) {\n normalized = new URL(normalized).pathname;\n }\n } catch {\n // Keep the original path if URL parsing fails.\n }\n\n normalized = normalized.split(\"?\")[0] ?? normalized;\n normalized = normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n normalized = normalized.replace(/\\/{2,}/g, \"/\");\n if (normalized.length > 1) {\n normalized = normalized.replace(/\\/+$/, \"\");\n }\n return normalized || \"/\";\n}\n\nexport function createFarmCacheKey(parts: readonly unknown[]): string {\n return stableSerialize(parts);\n}\n\nfunction normalizeRevalidate(revalidate: number | false | undefined): number | false | undefined {\n if (revalidate === false || revalidate === undefined) {\n return revalidate;\n }\n if (!Number.isFinite(revalidate) || revalidate <= 0) {\n return undefined;\n }\n return revalidate;\n}\n\nfunction normalizeCacheTag(tag: string): string {\n if (typeof tag !== \"string\") {\n throw new TypeError(\"Cache tags must be strings.\");\n }\n const normalized = tag.trim();\n if (!normalized) {\n throw new Error(\"Cache tags cannot be empty.\");\n }\n return normalized;\n}\n\nfunction getFunctionCacheIdentity(fn: Function): string {\n if (fn.name) {\n return `name:${fn.name}`;\n }\n\n let id = functionIds.get(fn);\n if (!id) {\n id = ++nextFunctionId;\n functionIds.set(fn, id);\n }\n return `anonymous:${id}`;\n}\n\nfunction stableSerialize(value: unknown, seen = new WeakSet<object>()): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n\n const valueType = typeof value;\n if (valueType === \"string\") return JSON.stringify(value);\n if (valueType === \"number\" || valueType === \"boolean\" || valueType === \"bigint\") {\n return `${valueType}:${String(value)}`;\n }\n if (valueType === \"symbol\") {\n return `symbol:${String(value)}`;\n }\n if (valueType === \"function\") {\n return `function:${getFunctionCacheIdentity(value as Function)}`;\n }\n\n if (value instanceof Date) {\n return `date:${value.toISOString()}`;\n }\n if (value instanceof URL) {\n return `url:${value.toString()}`;\n }\n if (value instanceof RegExp) {\n return `regexp:${value.toString()}`;\n }\n\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableSerialize(item, seen)).join(\",\")}]`;\n }\n\n if (value && typeof value === \"object\") {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n\n const entries = Object.entries(value as Record<string, unknown>).sort(([a], [b]) =>\n a.localeCompare(b),\n );\n const serialized = entries\n .map(([key, item]) => `${JSON.stringify(key)}:${stableSerialize(item, seen)}`)\n .join(\",\");\n\n seen.delete(value);\n return `{${serialized}}`;\n }\n\n return String(value);\n}\n"],"mappings":"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","names":[]}