@farm.js/core 0.1.0-beta.0

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 (549) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +11 -0
  3. package/dist/after.cjs +227 -0
  4. package/dist/after.cjs.map +1 -0
  5. package/dist/after.d.mts +25 -0
  6. package/dist/after.d.ts +25 -0
  7. package/dist/after.mjs +14 -0
  8. package/dist/after.mjs.map +1 -0
  9. package/dist/agent-runtime.cjs +2379 -0
  10. package/dist/agent-runtime.cjs.map +1 -0
  11. package/dist/agent-runtime.d.mts +93 -0
  12. package/dist/agent-runtime.d.ts +93 -0
  13. package/dist/agent-runtime.mjs +479 -0
  14. package/dist/agent-runtime.mjs.map +1 -0
  15. package/dist/api/route-manager.cjs +1196 -0
  16. package/dist/api/route-manager.cjs.map +1 -0
  17. package/dist/api/route-manager.d.mts +64 -0
  18. package/dist/api/route-manager.d.ts +64 -0
  19. package/dist/api/route-manager.mjs +34 -0
  20. package/dist/api/route-manager.mjs.map +1 -0
  21. package/dist/api/runtime.cjs +272 -0
  22. package/dist/api/runtime.cjs.map +1 -0
  23. package/dist/api/runtime.d.mts +16 -0
  24. package/dist/api/runtime.d.ts +16 -0
  25. package/dist/api/runtime.mjs +16 -0
  26. package/dist/api/runtime.mjs.map +1 -0
  27. package/dist/api.cjs +3199 -0
  28. package/dist/api.cjs.map +1 -0
  29. package/dist/api.d.mts +190 -0
  30. package/dist/api.d.ts +190 -0
  31. package/dist/api.mjs +63 -0
  32. package/dist/api.mjs.map +1 -0
  33. package/dist/app-BiX4qb-d.d.mts +265 -0
  34. package/dist/app-CFRNJXP1.d.ts +265 -0
  35. package/dist/app-markdown.cjs +220 -0
  36. package/dist/app-markdown.cjs.map +1 -0
  37. package/dist/app-markdown.d.mts +21 -0
  38. package/dist/app-markdown.d.ts +21 -0
  39. package/dist/app-markdown.mjs +26 -0
  40. package/dist/app-markdown.mjs.map +1 -0
  41. package/dist/cache.cjs +543 -0
  42. package/dist/cache.cjs.map +1 -0
  43. package/dist/cache.d.mts +78 -0
  44. package/dist/cache.d.ts +78 -0
  45. package/dist/cache.mjs +38 -0
  46. package/dist/cache.mjs.map +1 -0
  47. package/dist/chunk-25D7G34K.mjs +142 -0
  48. package/dist/chunk-25D7G34K.mjs.map +1 -0
  49. package/dist/chunk-3QJO55ZF.mjs +3548 -0
  50. package/dist/chunk-3QJO55ZF.mjs.map +1 -0
  51. package/dist/chunk-3XNTL3FQ.mjs +452 -0
  52. package/dist/chunk-3XNTL3FQ.mjs.map +1 -0
  53. package/dist/chunk-44ZCFSKE.mjs +84 -0
  54. package/dist/chunk-44ZCFSKE.mjs.map +1 -0
  55. package/dist/chunk-4PTK6KT4.mjs +364 -0
  56. package/dist/chunk-4PTK6KT4.mjs.map +1 -0
  57. package/dist/chunk-4S3ORGFA.mjs +44 -0
  58. package/dist/chunk-4S3ORGFA.mjs.map +1 -0
  59. package/dist/chunk-5BY76U2M.mjs +1 -0
  60. package/dist/chunk-5BY76U2M.mjs.map +1 -0
  61. package/dist/chunk-5ZGPRGWV.mjs +136 -0
  62. package/dist/chunk-5ZGPRGWV.mjs.map +1 -0
  63. package/dist/chunk-6XDUHOEM.mjs +157 -0
  64. package/dist/chunk-6XDUHOEM.mjs.map +1 -0
  65. package/dist/chunk-74YTBPTY.mjs +450 -0
  66. package/dist/chunk-74YTBPTY.mjs.map +1 -0
  67. package/dist/chunk-7HO6AEOP.mjs +74 -0
  68. package/dist/chunk-7HO6AEOP.mjs.map +1 -0
  69. package/dist/chunk-7MABZJIM.mjs +29 -0
  70. package/dist/chunk-7MABZJIM.mjs.map +1 -0
  71. package/dist/chunk-7ZY5AIJO.mjs +161 -0
  72. package/dist/chunk-7ZY5AIJO.mjs.map +1 -0
  73. package/dist/chunk-AGS7UJ52.mjs +446 -0
  74. package/dist/chunk-AGS7UJ52.mjs.map +1 -0
  75. package/dist/chunk-AZ7YUVNR.mjs +65 -0
  76. package/dist/chunk-AZ7YUVNR.mjs.map +1 -0
  77. package/dist/chunk-B232I2GP.mjs +163 -0
  78. package/dist/chunk-B232I2GP.mjs.map +1 -0
  79. package/dist/chunk-B6N4ZB2H.mjs +718 -0
  80. package/dist/chunk-B6N4ZB2H.mjs.map +1 -0
  81. package/dist/chunk-BHG3LVHH.mjs +176 -0
  82. package/dist/chunk-BHG3LVHH.mjs.map +1 -0
  83. package/dist/chunk-C3DLZMBU.mjs +597 -0
  84. package/dist/chunk-C3DLZMBU.mjs.map +1 -0
  85. package/dist/chunk-CGILA3WO.mjs +14 -0
  86. package/dist/chunk-CGILA3WO.mjs.map +1 -0
  87. package/dist/chunk-CHFHNEMO.mjs +7088 -0
  88. package/dist/chunk-CHFHNEMO.mjs.map +1 -0
  89. package/dist/chunk-E2MPIBRE.mjs +149 -0
  90. package/dist/chunk-E2MPIBRE.mjs.map +1 -0
  91. package/dist/chunk-E6EPN5BT.mjs +203 -0
  92. package/dist/chunk-E6EPN5BT.mjs.map +1 -0
  93. package/dist/chunk-EVGBEZDF.mjs +215 -0
  94. package/dist/chunk-EVGBEZDF.mjs.map +1 -0
  95. package/dist/chunk-FQYDHKKU.mjs +128 -0
  96. package/dist/chunk-FQYDHKKU.mjs.map +1 -0
  97. package/dist/chunk-G3B5BRDY.mjs +5763 -0
  98. package/dist/chunk-G3B5BRDY.mjs.map +1 -0
  99. package/dist/chunk-GN72QAIH.mjs +146 -0
  100. package/dist/chunk-GN72QAIH.mjs.map +1 -0
  101. package/dist/chunk-GS6K5OCM.mjs +407 -0
  102. package/dist/chunk-GS6K5OCM.mjs.map +1 -0
  103. package/dist/chunk-GY2STC2S.mjs +180 -0
  104. package/dist/chunk-GY2STC2S.mjs.map +1 -0
  105. package/dist/chunk-GZP5W4K3.mjs +158 -0
  106. package/dist/chunk-GZP5W4K3.mjs.map +1 -0
  107. package/dist/chunk-H2FA2SBS.mjs +51 -0
  108. package/dist/chunk-H2FA2SBS.mjs.map +1 -0
  109. package/dist/chunk-HXP3ZSPC.mjs +211 -0
  110. package/dist/chunk-HXP3ZSPC.mjs.map +1 -0
  111. package/dist/chunk-ITN462YM.mjs +98 -0
  112. package/dist/chunk-ITN462YM.mjs.map +1 -0
  113. package/dist/chunk-J23HNLFY.mjs +72 -0
  114. package/dist/chunk-J23HNLFY.mjs.map +1 -0
  115. package/dist/chunk-J4FNJ5IU.mjs +179 -0
  116. package/dist/chunk-J4FNJ5IU.mjs.map +1 -0
  117. package/dist/chunk-JK25YEN6.mjs +219 -0
  118. package/dist/chunk-JK25YEN6.mjs.map +1 -0
  119. package/dist/chunk-JLWMCADZ.mjs +204 -0
  120. package/dist/chunk-JLWMCADZ.mjs.map +1 -0
  121. package/dist/chunk-JN3UU635.mjs +622 -0
  122. package/dist/chunk-JN3UU635.mjs.map +1 -0
  123. package/dist/chunk-K4667E2Q.mjs +1916 -0
  124. package/dist/chunk-K4667E2Q.mjs.map +1 -0
  125. package/dist/chunk-LGHEOHBU.mjs +218 -0
  126. package/dist/chunk-LGHEOHBU.mjs.map +1 -0
  127. package/dist/chunk-LLC7BNXW.mjs +275 -0
  128. package/dist/chunk-LLC7BNXW.mjs.map +1 -0
  129. package/dist/chunk-LM2YNO4U.mjs +24 -0
  130. package/dist/chunk-LM2YNO4U.mjs.map +1 -0
  131. package/dist/chunk-NNLCAVB6.mjs +391 -0
  132. package/dist/chunk-NNLCAVB6.mjs.map +1 -0
  133. package/dist/chunk-O3HADRW6.mjs +639 -0
  134. package/dist/chunk-O3HADRW6.mjs.map +1 -0
  135. package/dist/chunk-OYXO65LI.mjs +119 -0
  136. package/dist/chunk-OYXO65LI.mjs.map +1 -0
  137. package/dist/chunk-P7QDS5AT.mjs +191 -0
  138. package/dist/chunk-P7QDS5AT.mjs.map +1 -0
  139. package/dist/chunk-PRNYWD7K.mjs +599 -0
  140. package/dist/chunk-PRNYWD7K.mjs.map +1 -0
  141. package/dist/chunk-QF4PHCMA.mjs +422 -0
  142. package/dist/chunk-QF4PHCMA.mjs.map +1 -0
  143. package/dist/chunk-QFQRHRZS.mjs +1224 -0
  144. package/dist/chunk-QFQRHRZS.mjs.map +1 -0
  145. package/dist/chunk-QGOHVJ6J.mjs +63 -0
  146. package/dist/chunk-QGOHVJ6J.mjs.map +1 -0
  147. package/dist/chunk-QKVUNGAH.mjs +39 -0
  148. package/dist/chunk-QKVUNGAH.mjs.map +1 -0
  149. package/dist/chunk-QM6VV26B.mjs +149 -0
  150. package/dist/chunk-QM6VV26B.mjs.map +1 -0
  151. package/dist/chunk-RHIFZZUI.mjs +69 -0
  152. package/dist/chunk-RHIFZZUI.mjs.map +1 -0
  153. package/dist/chunk-RKI6TN3A.mjs +49 -0
  154. package/dist/chunk-RKI6TN3A.mjs.map +1 -0
  155. package/dist/chunk-RSKVYESE.mjs +187 -0
  156. package/dist/chunk-RSKVYESE.mjs.map +1 -0
  157. package/dist/chunk-S2XHZS7W.mjs +180 -0
  158. package/dist/chunk-S2XHZS7W.mjs.map +1 -0
  159. package/dist/chunk-SCFX4UTD.mjs +28 -0
  160. package/dist/chunk-SCFX4UTD.mjs.map +1 -0
  161. package/dist/chunk-SL6HTIOK.mjs +66 -0
  162. package/dist/chunk-SL6HTIOK.mjs.map +1 -0
  163. package/dist/chunk-SOU3Q3ZA.mjs +173 -0
  164. package/dist/chunk-SOU3Q3ZA.mjs.map +1 -0
  165. package/dist/chunk-SPBBQLXI.mjs +207 -0
  166. package/dist/chunk-SPBBQLXI.mjs.map +1 -0
  167. package/dist/chunk-SXZTEK3V.mjs +396 -0
  168. package/dist/chunk-SXZTEK3V.mjs.map +1 -0
  169. package/dist/chunk-T4QJQK76.mjs +459 -0
  170. package/dist/chunk-T4QJQK76.mjs.map +1 -0
  171. package/dist/chunk-TRORP7E4.mjs +41 -0
  172. package/dist/chunk-TRORP7E4.mjs.map +1 -0
  173. package/dist/chunk-TU4YJICB.mjs +728 -0
  174. package/dist/chunk-TU4YJICB.mjs.map +1 -0
  175. package/dist/chunk-TXCFGOHW.mjs +42 -0
  176. package/dist/chunk-TXCFGOHW.mjs.map +1 -0
  177. package/dist/chunk-UHE2TTLK.mjs +466 -0
  178. package/dist/chunk-UHE2TTLK.mjs.map +1 -0
  179. package/dist/chunk-UREJA4GZ.mjs +364 -0
  180. package/dist/chunk-UREJA4GZ.mjs.map +1 -0
  181. package/dist/chunk-USWZZUEH.mjs +25 -0
  182. package/dist/chunk-USWZZUEH.mjs.map +1 -0
  183. package/dist/chunk-UVCIEUJC.mjs +16 -0
  184. package/dist/chunk-UVCIEUJC.mjs.map +1 -0
  185. package/dist/chunk-V6WE6JSZ.mjs +352 -0
  186. package/dist/chunk-V6WE6JSZ.mjs.map +1 -0
  187. package/dist/chunk-V7RBCSDJ.mjs +170 -0
  188. package/dist/chunk-V7RBCSDJ.mjs.map +1 -0
  189. package/dist/chunk-VCANOYFI.mjs +588 -0
  190. package/dist/chunk-VCANOYFI.mjs.map +1 -0
  191. package/dist/chunk-WZ5QFROO.mjs +23 -0
  192. package/dist/chunk-WZ5QFROO.mjs.map +1 -0
  193. package/dist/chunk-Y2OJJD7R.mjs +543 -0
  194. package/dist/chunk-Y2OJJD7R.mjs.map +1 -0
  195. package/dist/chunk-Y7A27276.mjs +538 -0
  196. package/dist/chunk-Y7A27276.mjs.map +1 -0
  197. package/dist/chunk-YHU7SS6L.mjs +365 -0
  198. package/dist/chunk-YHU7SS6L.mjs.map +1 -0
  199. package/dist/chunk-ZBE6MLHL.mjs +230 -0
  200. package/dist/chunk-ZBE6MLHL.mjs.map +1 -0
  201. package/dist/chunk-ZJQNATYV.mjs +299 -0
  202. package/dist/chunk-ZJQNATYV.mjs.map +1 -0
  203. package/dist/client-D_yUjVhe.d.mts +402 -0
  204. package/dist/client-Dkc03WP8.d.ts +402 -0
  205. package/dist/client-cache-CIlyBlmx.d.ts +6 -0
  206. package/dist/client-cache-D-EZ7XVW.d.mts +6 -0
  207. package/dist/client-plugins-BZnpeTGA.d.ts +1848 -0
  208. package/dist/client-plugins-g4bzuCmo.d.mts +1848 -0
  209. package/dist/client-plugins.cjs +415 -0
  210. package/dist/client-plugins.cjs.map +1 -0
  211. package/dist/client-plugins.d.mts +21 -0
  212. package/dist/client-plugins.d.ts +21 -0
  213. package/dist/client-plugins.mjs +10 -0
  214. package/dist/client-plugins.mjs.map +1 -0
  215. package/dist/client.cjs +4571 -0
  216. package/dist/client.cjs.map +1 -0
  217. package/dist/client.d.mts +329 -0
  218. package/dist/client.d.ts +329 -0
  219. package/dist/client.mjs +103 -0
  220. package/dist/client.mjs.map +1 -0
  221. package/dist/config.cjs +38 -0
  222. package/dist/config.cjs.map +1 -0
  223. package/dist/config.d.mts +28 -0
  224. package/dist/config.d.ts +28 -0
  225. package/dist/config.mjs +10 -0
  226. package/dist/config.mjs.map +1 -0
  227. package/dist/cron.cjs +406 -0
  228. package/dist/cron.cjs.map +1 -0
  229. package/dist/cron.d.mts +78 -0
  230. package/dist/cron.d.ts +78 -0
  231. package/dist/cron.mjs +30 -0
  232. package/dist/cron.mjs.map +1 -0
  233. package/dist/deferred.cjs +438 -0
  234. package/dist/deferred.cjs.map +1 -0
  235. package/dist/deferred.d.mts +42 -0
  236. package/dist/deferred.d.ts +42 -0
  237. package/dist/deferred.mjs +28 -0
  238. package/dist/deferred.mjs.map +1 -0
  239. package/dist/deployment.cjs +199 -0
  240. package/dist/deployment.cjs.map +1 -0
  241. package/dist/deployment.d.mts +34 -0
  242. package/dist/deployment.d.ts +34 -0
  243. package/dist/deployment.mjs +38 -0
  244. package/dist/deployment.mjs.map +1 -0
  245. package/dist/devtools-AE4RVXCM.mjs +370 -0
  246. package/dist/devtools-AE4RVXCM.mjs.map +1 -0
  247. package/dist/devtools-client-6WPY2AQU.mjs +225 -0
  248. package/dist/devtools-client-6WPY2AQU.mjs.map +1 -0
  249. package/dist/devtools-ui-NJKFORTG.mjs +1349 -0
  250. package/dist/devtools-ui-NJKFORTG.mjs.map +1 -0
  251. package/dist/docs.cjs +5541 -0
  252. package/dist/docs.cjs.map +1 -0
  253. package/dist/docs.d.mts +69 -0
  254. package/dist/docs.d.ts +69 -0
  255. package/dist/docs.mjs +46 -0
  256. package/dist/docs.mjs.map +1 -0
  257. package/dist/env-types.cjs +223 -0
  258. package/dist/env-types.cjs.map +1 -0
  259. package/dist/env-types.d.mts +11 -0
  260. package/dist/env-types.d.ts +11 -0
  261. package/dist/env-types.mjs +9 -0
  262. package/dist/env-types.mjs.map +1 -0
  263. package/dist/env.cjs +215 -0
  264. package/dist/env.cjs.map +1 -0
  265. package/dist/env.d.mts +45 -0
  266. package/dist/env.d.ts +45 -0
  267. package/dist/env.mjs +22 -0
  268. package/dist/env.mjs.map +1 -0
  269. package/dist/environment/vite.cjs +374 -0
  270. package/dist/environment/vite.cjs.map +1 -0
  271. package/dist/environment/vite.d.mts +22 -0
  272. package/dist/environment/vite.d.ts +22 -0
  273. package/dist/environment/vite.mjs +10 -0
  274. package/dist/environment/vite.mjs.map +1 -0
  275. package/dist/environment.cjs +96 -0
  276. package/dist/environment.cjs.map +1 -0
  277. package/dist/environment.d.mts +18 -0
  278. package/dist/environment.d.ts +18 -0
  279. package/dist/environment.mjs +14 -0
  280. package/dist/environment.mjs.map +1 -0
  281. package/dist/headers.cjs +126 -0
  282. package/dist/headers.cjs.map +1 -0
  283. package/dist/headers.d.mts +22 -0
  284. package/dist/headers.d.ts +22 -0
  285. package/dist/headers.mjs +12 -0
  286. package/dist/headers.mjs.map +1 -0
  287. package/dist/i18n/client.cjs +283 -0
  288. package/dist/i18n/client.cjs.map +1 -0
  289. package/dist/i18n/client.d.mts +32 -0
  290. package/dist/i18n/client.d.ts +32 -0
  291. package/dist/i18n/client.mjs +121 -0
  292. package/dist/i18n/client.mjs.map +1 -0
  293. package/dist/i18n/index.cjs +130 -0
  294. package/dist/i18n/index.cjs.map +1 -0
  295. package/dist/i18n/index.d.mts +20 -0
  296. package/dist/i18n/index.d.ts +20 -0
  297. package/dist/i18n/index.mjs +22 -0
  298. package/dist/i18n/index.mjs.map +1 -0
  299. package/dist/i18n/server.cjs +637 -0
  300. package/dist/i18n/server.cjs.map +1 -0
  301. package/dist/i18n/server.d.mts +30 -0
  302. package/dist/i18n/server.d.ts +30 -0
  303. package/dist/i18n/server.mjs +32 -0
  304. package/dist/i18n/server.mjs.map +1 -0
  305. package/dist/image/server.cjs +477 -0
  306. package/dist/image/server.cjs.map +1 -0
  307. package/dist/image/server.d.mts +37 -0
  308. package/dist/image/server.d.ts +37 -0
  309. package/dist/image/server.mjs +16 -0
  310. package/dist/image/server.mjs.map +1 -0
  311. package/dist/image/sharp.cjs +135 -0
  312. package/dist/image/sharp.cjs.map +1 -0
  313. package/dist/image/sharp.d.mts +7 -0
  314. package/dist/image/sharp.d.ts +7 -0
  315. package/dist/image/sharp.mjs +75 -0
  316. package/dist/image/sharp.mjs.map +1 -0
  317. package/dist/image-config-Duob7wER.d.mts +50 -0
  318. package/dist/image-config-Duob7wER.d.ts +50 -0
  319. package/dist/image.cjs +209 -0
  320. package/dist/image.cjs.map +1 -0
  321. package/dist/image.d.mts +39 -0
  322. package/dist/image.d.ts +39 -0
  323. package/dist/image.mjs +165 -0
  324. package/dist/image.mjs.map +1 -0
  325. package/dist/index.cjs +39433 -0
  326. package/dist/index.cjs.map +1 -0
  327. package/dist/index.d.mts +451 -0
  328. package/dist/index.d.ts +451 -0
  329. package/dist/index.mjs +930 -0
  330. package/dist/index.mjs.map +1 -0
  331. package/dist/integration-api-CHT2OKAf.d.mts +93 -0
  332. package/dist/integration-api-CHT2OKAf.d.ts +93 -0
  333. package/dist/integration-orm-GQLGU66X.mjs +13 -0
  334. package/dist/integration-orm-GQLGU66X.mjs.map +1 -0
  335. package/dist/integrations.cjs +2820 -0
  336. package/dist/integrations.cjs.map +1 -0
  337. package/dist/integrations.d.mts +21 -0
  338. package/dist/integrations.d.ts +21 -0
  339. package/dist/integrations.mjs +51 -0
  340. package/dist/integrations.mjs.map +1 -0
  341. package/dist/internal/build-runtime.cjs +31340 -0
  342. package/dist/internal/build-runtime.cjs.map +1 -0
  343. package/dist/internal/build-runtime.d.mts +38 -0
  344. package/dist/internal/build-runtime.d.ts +38 -0
  345. package/dist/internal/build-runtime.mjs +73 -0
  346. package/dist/internal/build-runtime.mjs.map +1 -0
  347. package/dist/internal/client-runtime.cjs +579 -0
  348. package/dist/internal/client-runtime.cjs.map +1 -0
  349. package/dist/internal/client-runtime.d.mts +2 -0
  350. package/dist/internal/client-runtime.d.ts +2 -0
  351. package/dist/internal/client-runtime.mjs +12 -0
  352. package/dist/internal/client-runtime.mjs.map +1 -0
  353. package/dist/internal/config-runtime.cjs +4172 -0
  354. package/dist/internal/config-runtime.cjs.map +1 -0
  355. package/dist/internal/config-runtime.d.mts +38 -0
  356. package/dist/internal/config-runtime.d.ts +38 -0
  357. package/dist/internal/config-runtime.mjs +38 -0
  358. package/dist/internal/config-runtime.mjs.map +1 -0
  359. package/dist/internal/production-node-env.cjs +65 -0
  360. package/dist/internal/production-node-env.cjs.map +1 -0
  361. package/dist/internal/production-node-env.d.mts +12 -0
  362. package/dist/internal/production-node-env.d.ts +12 -0
  363. package/dist/internal/production-node-env.mjs +8 -0
  364. package/dist/internal/production-node-env.mjs.map +1 -0
  365. package/dist/internal/production-runtime.cjs +1896 -0
  366. package/dist/internal/production-runtime.cjs.map +1 -0
  367. package/dist/internal/production-runtime.d.mts +39 -0
  368. package/dist/internal/production-runtime.d.ts +39 -0
  369. package/dist/internal/production-runtime.mjs +79 -0
  370. package/dist/internal/production-runtime.mjs.map +1 -0
  371. package/dist/layers-VWVDTPUZ.mjs +16 -0
  372. package/dist/layers-VWVDTPUZ.mjs.map +1 -0
  373. package/dist/manager-THKFTOFE.mjs +10 -0
  374. package/dist/manager-THKFTOFE.mjs.map +1 -0
  375. package/dist/markdown.cjs +299 -0
  376. package/dist/markdown.cjs.map +1 -0
  377. package/dist/markdown.d.mts +43 -0
  378. package/dist/markdown.d.ts +43 -0
  379. package/dist/markdown.mjs +14 -0
  380. package/dist/markdown.mjs.map +1 -0
  381. package/dist/metadata-C9NZxMDW.d.mts +22 -0
  382. package/dist/metadata-DAXRaOHx.d.ts +22 -0
  383. package/dist/middleware.cjs +2148 -0
  384. package/dist/middleware.cjs.map +1 -0
  385. package/dist/middleware.d.mts +163 -0
  386. package/dist/middleware.d.ts +163 -0
  387. package/dist/middleware.mjs +49 -0
  388. package/dist/middleware.mjs.map +1 -0
  389. package/dist/navigation-errors-Dvwpzaer.d.mts +13 -0
  390. package/dist/navigation-errors-Dvwpzaer.d.ts +13 -0
  391. package/dist/navigation.cjs +1304 -0
  392. package/dist/navigation.cjs.map +1 -0
  393. package/dist/navigation.d.mts +14 -0
  394. package/dist/navigation.d.ts +14 -0
  395. package/dist/navigation.mjs +33 -0
  396. package/dist/navigation.mjs.map +1 -0
  397. package/dist/nitro-KME62MWG.mjs +691 -0
  398. package/dist/nitro-KME62MWG.mjs.map +1 -0
  399. package/dist/observability.cjs +186 -0
  400. package/dist/observability.cjs.map +1 -0
  401. package/dist/observability.d.mts +335 -0
  402. package/dist/observability.d.ts +335 -0
  403. package/dist/observability.mjs +16 -0
  404. package/dist/observability.mjs.map +1 -0
  405. package/dist/params-BALtrRim.d.ts +15 -0
  406. package/dist/params-ry-lxqmy.d.mts +15 -0
  407. package/dist/plugin-BJDf43dc.d.mts +165 -0
  408. package/dist/plugin-BJDf43dc.d.ts +165 -0
  409. package/dist/plugin.cjs +22285 -0
  410. package/dist/plugin.cjs.map +1 -0
  411. package/dist/plugin.d.mts +21 -0
  412. package/dist/plugin.d.ts +21 -0
  413. package/dist/plugin.mjs +60 -0
  414. package/dist/plugin.mjs.map +1 -0
  415. package/dist/production-runtime-C_B79w2P.d.mts +28 -0
  416. package/dist/production-runtime-DDEM1D2q.d.ts +28 -0
  417. package/dist/production-runtime-DRkCHUvJ.d.ts +79 -0
  418. package/dist/production-runtime-flrjp_nC.d.mts +79 -0
  419. package/dist/query/client.cjs +560 -0
  420. package/dist/query/client.cjs.map +1 -0
  421. package/dist/query/client.d.mts +61 -0
  422. package/dist/query/client.d.ts +61 -0
  423. package/dist/query/client.mjs +364 -0
  424. package/dist/query/client.mjs.map +1 -0
  425. package/dist/query/index.cjs +226 -0
  426. package/dist/query/index.cjs.map +1 -0
  427. package/dist/query/index.d.mts +90 -0
  428. package/dist/query/index.d.ts +90 -0
  429. package/dist/query/index.mjs +31 -0
  430. package/dist/query/index.mjs.map +1 -0
  431. package/dist/query/parsers.cjs +178 -0
  432. package/dist/query/parsers.cjs.map +1 -0
  433. package/dist/query/parsers.d.mts +25 -0
  434. package/dist/query/parsers.d.ts +25 -0
  435. package/dist/query/parsers.mjs +24 -0
  436. package/dist/query/parsers.mjs.map +1 -0
  437. package/dist/query/server.cjs +301 -0
  438. package/dist/query/server.cjs.map +1 -0
  439. package/dist/query/server.d.mts +55 -0
  440. package/dist/query/server.d.ts +55 -0
  441. package/dist/query/server.mjs +105 -0
  442. package/dist/query/server.mjs.map +1 -0
  443. package/dist/request-BrFBuc8G.d.mts +6 -0
  444. package/dist/request-BslSZIRz.d.ts +6 -0
  445. package/dist/request.cjs +71 -0
  446. package/dist/request.cjs.map +1 -0
  447. package/dist/request.d.mts +2 -0
  448. package/dist/request.d.ts +2 -0
  449. package/dist/request.mjs +9 -0
  450. package/dist/request.mjs.map +1 -0
  451. package/dist/resolver-C6iecsDV.d.ts +14 -0
  452. package/dist/resolver-DlOPpjkB.d.mts +14 -0
  453. package/dist/route-runtime-DoOHzCAD.d.mts +38 -0
  454. package/dist/route-runtime-DoOHzCAD.d.ts +38 -0
  455. package/dist/router.cjs +254 -0
  456. package/dist/router.cjs.map +1 -0
  457. package/dist/router.d.mts +36 -0
  458. package/dist/router.d.ts +36 -0
  459. package/dist/router.mjs +14 -0
  460. package/dist/router.mjs.map +1 -0
  461. package/dist/routes.cjs +1213 -0
  462. package/dist/routes.cjs.map +1 -0
  463. package/dist/routes.d.mts +224 -0
  464. package/dist/routes.d.ts +224 -0
  465. package/dist/routes.mjs +52 -0
  466. package/dist/routes.mjs.map +1 -0
  467. package/dist/runtime-B6GvwDS1.d.ts +27 -0
  468. package/dist/runtime-DeAAZ6gO.d.mts +27 -0
  469. package/dist/search-client-6OXIBNYQ.mjs +14 -0
  470. package/dist/search-client-6OXIBNYQ.mjs.map +1 -0
  471. package/dist/server-action-security.cjs +492 -0
  472. package/dist/server-action-security.cjs.map +1 -0
  473. package/dist/server-action-security.d.mts +42 -0
  474. package/dist/server-action-security.d.ts +42 -0
  475. package/dist/server-action-security.mjs +29 -0
  476. package/dist/server-action-security.mjs.map +1 -0
  477. package/dist/server-fn-client.cjs +180 -0
  478. package/dist/server-fn-client.cjs.map +1 -0
  479. package/dist/server-fn-client.d.mts +31 -0
  480. package/dist/server-fn-client.d.ts +31 -0
  481. package/dist/server-fn-client.mjs +9 -0
  482. package/dist/server-fn-client.mjs.map +1 -0
  483. package/dist/server-fn.cjs +284 -0
  484. package/dist/server-fn.cjs.map +1 -0
  485. package/dist/server-fn.d.mts +84 -0
  486. package/dist/server-fn.d.ts +84 -0
  487. package/dist/server-fn.mjs +17 -0
  488. package/dist/server-fn.mjs.map +1 -0
  489. package/dist/server-plugins.cjs +235 -0
  490. package/dist/server-plugins.cjs.map +1 -0
  491. package/dist/server-plugins.d.mts +54 -0
  492. package/dist/server-plugins.d.ts +54 -0
  493. package/dist/server-plugins.mjs +18 -0
  494. package/dist/server-plugins.mjs.map +1 -0
  495. package/dist/server-query-client.cjs +792 -0
  496. package/dist/server-query-client.cjs.map +1 -0
  497. package/dist/server-query-client.d.mts +50 -0
  498. package/dist/server-query-client.d.ts +50 -0
  499. package/dist/server-query-client.mjs +23 -0
  500. package/dist/server-query-client.mjs.map +1 -0
  501. package/dist/server-query.cjs +804 -0
  502. package/dist/server-query.cjs.map +1 -0
  503. package/dist/server-query.d.mts +36 -0
  504. package/dist/server-query.d.ts +36 -0
  505. package/dist/server-query.mjs +18 -0
  506. package/dist/server-query.mjs.map +1 -0
  507. package/dist/server.cjs +25739 -0
  508. package/dist/server.cjs.map +1 -0
  509. package/dist/server.d.mts +47 -0
  510. package/dist/server.d.ts +47 -0
  511. package/dist/server.mjs +511 -0
  512. package/dist/server.mjs.map +1 -0
  513. package/dist/storage.cjs +515 -0
  514. package/dist/storage.cjs.map +1 -0
  515. package/dist/storage.d.mts +52 -0
  516. package/dist/storage.d.ts +52 -0
  517. package/dist/storage.mjs +58 -0
  518. package/dist/storage.mjs.map +1 -0
  519. package/dist/testing.cjs +1882 -0
  520. package/dist/testing.cjs.map +1 -0
  521. package/dist/testing.d.mts +100 -0
  522. package/dist/testing.d.ts +100 -0
  523. package/dist/testing.mjs +324 -0
  524. package/dist/testing.mjs.map +1 -0
  525. package/dist/types-BH1lhg5G.d.mts +81 -0
  526. package/dist/types-BH1lhg5G.d.ts +81 -0
  527. package/dist/types-C9N-nk5R.d.mts +53 -0
  528. package/dist/types-C9N-nk5R.d.ts +53 -0
  529. package/dist/types-D1A6-XvH.d.mts +73 -0
  530. package/dist/types-D1A6-XvH.d.ts +73 -0
  531. package/dist/utils-DA1yo54_.d.ts +23 -0
  532. package/dist/utils-DOXXivjL.d.mts +23 -0
  533. package/dist/vite.cjs +22684 -0
  534. package/dist/vite.cjs.map +1 -0
  535. package/dist/vite.d.mts +21 -0
  536. package/dist/vite.d.ts +21 -0
  537. package/dist/vite.mjs +59 -0
  538. package/dist/vite.mjs.map +1 -0
  539. package/dist/workflows.cjs +586 -0
  540. package/dist/workflows.cjs.map +1 -0
  541. package/dist/workflows.d.mts +110 -0
  542. package/dist/workflows.d.ts +110 -0
  543. package/dist/workflows.mjs +32 -0
  544. package/dist/workflows.mjs.map +1 -0
  545. package/package.json +523 -0
  546. package/types/api.d.ts +88 -0
  547. package/types/client.d.ts +1171 -0
  548. package/types/index.d.ts +17 -0
  549. package/types/middleware.d.ts +266 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cron.ts"],"sourcesContent":["export type FarmCronSchedule = string | string[];\n\nexport interface FarmCronJobConfig {\n /** Portable five-field cron expression, or a list of expressions. */\n schedule: FarmCronSchedule;\n /** Farm API route invoked with GET when the schedule fires. */\n path: string;\n /** Human-readable purpose shown by local tooling and deployment manifests. */\n description?: string;\n /** Disable this schedule without removing its configuration. */\n enabled?: boolean;\n}\n\nexport type FarmCronUserConfig = Record<string, FarmCronJobConfig>;\n\nexport interface FarmCronJob {\n name: string;\n schedule: string[];\n path: string;\n description?: string;\n}\n\nexport interface FarmCronResolvedConfig {\n enabled: boolean;\n secretEnv: typeof DEFAULT_FARM_CRON_SECRET_ENV;\n jobs: FarmCronJob[];\n}\n\nexport interface PreparedFarmCron {\n jobs: FarmCronJob[];\n tasks: Record<string, { handler: string; description: string }>;\n scheduledTasks: Record<string, string | string[]>;\n manifestPath?: string;\n}\n\nexport interface FarmCronRouteOptions {\n /** Environment variable containing the bearer token. */\n secretEnv?: string;\n /** Inline token, primarily useful in tests. Environment variables are preferred. */\n secret?: string;\n /** Allow a production route without a secret. Defaults to false. */\n allowUnsecured?: boolean;\n}\n\nexport interface FarmCronCloudflareConfig {\n deployConfig: true;\n wrangler: {\n triggers: {\n crons: string[];\n };\n };\n}\n\nexport const DEFAULT_FARM_CRON_SECRET_ENV = \"CRON_SECRET\";\nexport const FARM_CRON_MANIFEST = \"cron-manifest.json\";\n\nconst CRON_FIELD_RANGES = [\n [0, 59, \"minute\"],\n [0, 23, \"hour\"],\n [1, 31, \"day of month\"],\n [1, 12, \"month\"],\n [0, 6, \"day of week\"],\n] as const;\n\nexport function resolveCronConfig(\n cron: FarmCronResolvedConfig | FarmCronUserConfig | false | undefined,\n): FarmCronResolvedConfig {\n if (isResolvedCronConfig(cron)) return cron;\n if (!cron) {\n return {\n enabled: false,\n secretEnv: DEFAULT_FARM_CRON_SECRET_ENV,\n jobs: [],\n };\n }\n\n const jobs: FarmCronJob[] = [];\n for (const [name, job] of Object.entries(cron)) {\n if (!job || typeof job !== \"object\" || Array.isArray(job)) {\n throw new TypeError(`Farm cron ${JSON.stringify(name)} must be a configuration object.`);\n }\n if (job.enabled === false) continue;\n jobs.push(normalizeCronJob(name, job));\n }\n\n return {\n enabled: jobs.length > 0,\n secretEnv: DEFAULT_FARM_CRON_SECRET_ENV,\n jobs,\n };\n}\n\nexport async function prepareFarmCronForNitro(config: {\n root?: string;\n distDir?: string;\n cron?: FarmCronResolvedConfig | FarmCronUserConfig | false;\n}): Promise<PreparedFarmCron> {\n const cron = isResolvedCronConfig(config.cron) ? config.cron : resolveCronConfig(config.cron);\n const root = config.root || process.cwd();\n const distDir = config.distDir || \".farm\";\n const fs = await import(\"node:fs/promises\");\n const path = await import(\"node:path\");\n const manifestPath = path.join(root, distDir, FARM_CRON_MANIFEST);\n const generatedDir = path.join(root, distDir, \".nitro\", \"farm-cron\");\n\n if (!cron.enabled) {\n await Promise.all([\n fs.rm(manifestPath, { force: true }),\n fs.rm(generatedDir, { recursive: true, force: true }),\n ]);\n return {\n jobs: [],\n tasks: {},\n scheduledTasks: {},\n };\n }\n\n await fs.rm(generatedDir, { recursive: true, force: true });\n await fs.mkdir(generatedDir, { recursive: true });\n\n const tasks: PreparedFarmCron[\"tasks\"] = {};\n for (const job of cron.jobs) {\n const taskName = getFarmCronTaskName(job.name);\n const wrapperPath = path.join(generatedDir, `${safeFileName(job.name)}.mjs`);\n await fs.writeFile(wrapperPath, createNitroCronTaskWrapper(job, cron.secretEnv), \"utf8\");\n tasks[taskName] = {\n handler: wrapperPath,\n description: job.description || `Farm cron ${job.name}`,\n };\n }\n\n const manifest = createFarmCronManifest(cron);\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, \"utf8\");\n\n return {\n jobs: cron.jobs,\n tasks,\n scheduledTasks: createCronScheduledTasks(cron.jobs),\n manifestPath,\n };\n}\n\nexport function createFarmCronManifest(cron: FarmCronResolvedConfig) {\n return {\n schemaVersion: 1,\n secretEnv: cron.secretEnv,\n jobs: cron.jobs.map((job) => ({\n name: job.name,\n schedule: job.schedule,\n path: job.path,\n description: job.description || null,\n })),\n };\n}\n\nexport function createFarmCronVercelCrons(\n jobs: FarmCronJob[],\n): Array<{ path: string; schedule: string }> {\n return jobs.flatMap((job) =>\n job.schedule.map((schedule) => ({\n path: job.path,\n schedule,\n })),\n );\n}\n\nexport function applyFarmCronVercelCrons(\n vercelConfig: Record<string, any>,\n jobs: FarmCronJob[],\n): Record<string, any> {\n const existingCrons = Array.isArray(vercelConfig.crons) ? vercelConfig.crons : [];\n const seen = new Set(existingCrons.map((cron) => `${cron.path}:${cron.schedule}`));\n const crons = [...existingCrons];\n\n for (const cron of createFarmCronVercelCrons(jobs)) {\n const key = `${cron.path}:${cron.schedule}`;\n if (seen.has(key)) continue;\n seen.add(key);\n crons.push(cron);\n }\n\n return crons.length > 0 ? { ...vercelConfig, crons } : vercelConfig;\n}\n\nexport function createFarmCronCloudflareTriggers(jobs: FarmCronJob[]): string[] {\n return [...new Set(jobs.flatMap((job) => job.schedule))];\n}\n\nexport function createFarmCronCloudflareConfig(\n jobs: FarmCronJob[],\n): FarmCronCloudflareConfig | undefined {\n const crons = createFarmCronCloudflareTriggers(jobs);\n if (crons.length === 0) return undefined;\n\n return {\n deployConfig: true,\n wrangler: {\n triggers: { crons },\n },\n };\n}\n\nexport function mergeScheduledTasks(\n ...maps: Array<Record<string, string | string[]> | undefined>\n): Record<string, string | string[]> {\n const merged = new Map<string, string[]>();\n\n for (const map of maps) {\n for (const [schedule, taskNames] of Object.entries(map || {})) {\n const current = merged.get(schedule) || [];\n for (const taskName of Array.isArray(taskNames) ? taskNames : [taskNames]) {\n if (!current.includes(taskName)) current.push(taskName);\n }\n merged.set(schedule, current);\n }\n }\n\n return Object.fromEntries(\n [...merged].map(([schedule, taskNames]) => [\n schedule,\n taskNames.length === 1 ? taskNames[0] : taskNames,\n ]),\n );\n}\n\nexport function isCronRequestAuthorized(\n request: Request,\n options: FarmCronRouteOptions = {},\n): boolean {\n const secretEnv = options.secretEnv || DEFAULT_FARM_CRON_SECRET_ENV;\n const secret = options.secret || readEnvironmentValue(secretEnv);\n if (!secret) {\n return (\n options.allowUnsecured === true ||\n (!getFarmRuntimeBindings() && readEnvironmentValue(\"NODE_ENV\") !== \"production\")\n );\n }\n\n const authorization = request.headers.get(\"authorization\") || \"\";\n const bearer = authorization.startsWith(\"Bearer \") ? authorization.slice(7) : \"\";\n return bearer === secret || request.headers.get(\"x-farm-cron-secret\") === secret;\n}\n\nexport function cronRoute<TArgs extends unknown[], TResult>(\n handler: (request: Request, ...args: TArgs) => TResult,\n options: FarmCronRouteOptions = {},\n): (request: Request, ...args: TArgs) => TResult | Promise<Response> {\n return (request, ...args) => {\n if (!isCronRequestAuthorized(request, options)) {\n return Promise.resolve(\n Response.json({ error: \"Unauthorized cron request.\" }, { status: 401 }),\n );\n }\n return handler(request, ...args);\n };\n}\n\nfunction normalizeCronJob(name: string, job: FarmCronJobConfig): FarmCronJob {\n if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(name)) {\n throw new TypeError(\n `Farm cron name ${JSON.stringify(name)} must start with a letter or number and contain only letters, numbers, dots, underscores, or hyphens.`,\n );\n }\n if (!job || typeof job !== \"object\" || Array.isArray(job)) {\n throw new TypeError(`Farm cron ${JSON.stringify(name)} must be a configuration object.`);\n }\n\n const path = normalizeCronPath(name, job.path);\n const rawSchedule = Array.isArray(job.schedule) ? job.schedule : [job.schedule];\n const schedule = [...new Set(rawSchedule.map((value) => normalizeCronExpression(name, value)))];\n if (schedule.length === 0) {\n throw new TypeError(`Farm cron ${JSON.stringify(name)} must define at least one schedule.`);\n }\n\n return {\n name,\n schedule,\n path,\n description: job.description?.trim() || undefined,\n };\n}\n\nfunction normalizeCronPath(name: string, value: unknown): string {\n if (typeof value !== \"string\" || !value.trim().startsWith(\"/\")) {\n throw new TypeError(`Farm cron ${JSON.stringify(name)} path must start with \"/\".`);\n }\n\n const path = value.trim();\n if (path.startsWith(\"//\") || path.includes(\"?\") || path.includes(\"#\")) {\n throw new TypeError(\n `Farm cron ${JSON.stringify(name)} path must be an application pathname without a host, query, or hash.`,\n );\n }\n return path.length > 1 ? path.replace(/\\/+$/, \"\") : path;\n}\n\nfunction normalizeCronExpression(name: string, value: unknown): string {\n if (typeof value !== \"string\") {\n throw new TypeError(`Farm cron ${JSON.stringify(name)} schedule must be a string.`);\n }\n\n const expression = value.trim().replace(/\\s+/g, \" \");\n const fields = expression.split(\" \");\n if (fields.length !== CRON_FIELD_RANGES.length) {\n throw new TypeError(\n `Farm cron ${JSON.stringify(name)} schedule ${JSON.stringify(expression)} must use five fields: minute hour day-of-month month day-of-week.`,\n );\n }\n\n fields.forEach((field, index) => {\n const [minimum, maximum, label] = CRON_FIELD_RANGES[index];\n validateCronField(name, expression, field, minimum, maximum, label);\n });\n if (fields[2] !== \"*\" && fields[4] !== \"*\") {\n throw new TypeError(\n `Farm cron ${JSON.stringify(name)} schedule ${JSON.stringify(expression)} cannot constrain both day-of-month and day-of-week.`,\n );\n }\n return expression;\n}\n\nfunction validateCronField(\n name: string,\n expression: string,\n field: string,\n minimum: number,\n maximum: number,\n label: string,\n): void {\n for (const segment of field.split(\",\")) {\n const [range, stepText, ...extra] = segment.split(\"/\");\n if (!range || extra.length > 0 || (stepText !== undefined && !isIntegerInRange(stepText, 1))) {\n throwInvalidCronField(name, expression, label);\n }\n\n if (range === \"*\") continue;\n const bounds = range.split(\"-\");\n if (bounds.length > 2 || !bounds.every((value) => isIntegerInRange(value, minimum, maximum))) {\n throwInvalidCronField(name, expression, label);\n }\n if (bounds.length === 2 && Number(bounds[0]) > Number(bounds[1])) {\n throwInvalidCronField(name, expression, label);\n }\n }\n}\n\nfunction isIntegerInRange(value: string, minimum: number, maximum = Number.MAX_SAFE_INTEGER) {\n if (!/^\\d+$/.test(value)) return false;\n const parsed = Number(value);\n return parsed >= minimum && parsed <= maximum;\n}\n\nfunction throwInvalidCronField(name: string, expression: string, label: string): never {\n throw new TypeError(\n `Farm cron ${JSON.stringify(name)} schedule ${JSON.stringify(expression)} has an invalid ${label} field.`,\n );\n}\n\nfunction isResolvedCronConfig(value: unknown): value is FarmCronResolvedConfig {\n return (\n !!value &&\n typeof value === \"object\" &&\n \"enabled\" in value &&\n typeof (value as FarmCronResolvedConfig).enabled === \"boolean\" &&\n \"jobs\" in value &&\n Array.isArray((value as FarmCronResolvedConfig).jobs) &&\n \"secretEnv\" in value\n );\n}\n\nfunction createCronScheduledTasks(jobs: FarmCronJob[]): Record<string, string | string[]> {\n const scheduledTasks: Record<string, string | string[]> = {};\n for (const job of jobs) {\n const taskName = getFarmCronTaskName(job.name);\n for (const schedule of job.schedule) {\n scheduledTasks[schedule] = mergeTaskNames(scheduledTasks[schedule], taskName);\n }\n }\n return scheduledTasks;\n}\n\nfunction mergeTaskNames(\n current: string | string[] | undefined,\n taskName: string,\n): string | string[] {\n if (!current) return taskName;\n const names = Array.isArray(current) ? current : [current];\n return names.includes(taskName) ? names : [...names, taskName];\n}\n\nfunction getFarmCronTaskName(name: string): string {\n return `farm:cron:${name}`;\n}\n\nfunction createNitroCronTaskWrapper(job: FarmCronJob, secretEnv: string): string {\n return `\nimport { defineTask, useNitroApp } from \"nitro/runtime\";\n\nconst name = ${JSON.stringify(job.name)};\nconst path = ${JSON.stringify(job.path)};\nconst secretEnv = ${JSON.stringify(secretEnv)};\n\nfunction readSecret(event) {\n const runtimeEnv = event?.context?.cloudflare?.env || event?.context?.env || {};\n return runtimeEnv[secretEnv] || (typeof process !== \"undefined\" ? process.env?.[secretEnv] : \"\") || \"\";\n}\n\nexport default defineTask({\n meta: {\n name: ${JSON.stringify(getFarmCronTaskName(job.name))},\n description: ${JSON.stringify(job.description || `Farm cron ${job.name}`)}\n },\n async run(event) {\n const headers = new Headers({\n \"x-farm-cron-name\": name,\n \"x-farm-cron-scheduled-at\": String(event?.payload?.scheduledTime || Date.now())\n });\n const secret = readSecret(event);\n if (secret) headers.set(\"authorization\", \"Bearer \" + secret);\n\n const response = await useNitroApp().fetch(path, { method: \"GET\", headers });\n const contentType = response.headers.get(\"content-type\") || \"\";\n const body = response.status === 204\n ? null\n : contentType.includes(\"application/json\")\n ? await response.json().catch(() => null)\n : await response.text();\n\n if (!response.ok) {\n const detail = typeof body === \"string\" ? body : JSON.stringify(body);\n throw new Error(\n \"Farm cron \" + JSON.stringify(name) + \" received \" + response.status +\n \" from \" + path + (detail ? \": \" + detail : \"\")\n );\n }\n\n return { result: body };\n }\n});\n`.trim();\n}\n\nfunction readEnvironmentValue(name: string): string | undefined {\n const runtimeValue = getFarmRuntimeBindings()?.[name];\n if (typeof runtimeValue === \"string\") return runtimeValue;\n return typeof process !== \"undefined\" ? process.env?.[name] : undefined;\n}\n\nfunction getFarmRuntimeBindings(): Record<string, unknown> | undefined {\n const runtimeBindings = (globalThis as typeof globalThis & {\n __env__?: Record<string, unknown>;\n }).__env__;\n return runtimeBindings && typeof runtimeBindings === \"object\" ? runtimeBindings : undefined;\n}\n\nfunction safeFileName(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"-\") || \"cron\";\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,78 @@
1
+ type FarmCronSchedule = string | string[];
2
+ interface FarmCronJobConfig {
3
+ /** Portable five-field cron expression, or a list of expressions. */
4
+ schedule: FarmCronSchedule;
5
+ /** Farm API route invoked with GET when the schedule fires. */
6
+ path: string;
7
+ /** Human-readable purpose shown by local tooling and deployment manifests. */
8
+ description?: string;
9
+ /** Disable this schedule without removing its configuration. */
10
+ enabled?: boolean;
11
+ }
12
+ type FarmCronUserConfig = Record<string, FarmCronJobConfig>;
13
+ interface FarmCronJob {
14
+ name: string;
15
+ schedule: string[];
16
+ path: string;
17
+ description?: string;
18
+ }
19
+ interface FarmCronResolvedConfig {
20
+ enabled: boolean;
21
+ secretEnv: typeof DEFAULT_FARM_CRON_SECRET_ENV;
22
+ jobs: FarmCronJob[];
23
+ }
24
+ interface PreparedFarmCron {
25
+ jobs: FarmCronJob[];
26
+ tasks: Record<string, {
27
+ handler: string;
28
+ description: string;
29
+ }>;
30
+ scheduledTasks: Record<string, string | string[]>;
31
+ manifestPath?: string;
32
+ }
33
+ interface FarmCronRouteOptions {
34
+ /** Environment variable containing the bearer token. */
35
+ secretEnv?: string;
36
+ /** Inline token, primarily useful in tests. Environment variables are preferred. */
37
+ secret?: string;
38
+ /** Allow a production route without a secret. Defaults to false. */
39
+ allowUnsecured?: boolean;
40
+ }
41
+ interface FarmCronCloudflareConfig {
42
+ deployConfig: true;
43
+ wrangler: {
44
+ triggers: {
45
+ crons: string[];
46
+ };
47
+ };
48
+ }
49
+ declare const DEFAULT_FARM_CRON_SECRET_ENV = "CRON_SECRET";
50
+ declare const FARM_CRON_MANIFEST = "cron-manifest.json";
51
+ declare function resolveCronConfig(cron: FarmCronResolvedConfig | FarmCronUserConfig | false | undefined): FarmCronResolvedConfig;
52
+ declare function prepareFarmCronForNitro(config: {
53
+ root?: string;
54
+ distDir?: string;
55
+ cron?: FarmCronResolvedConfig | FarmCronUserConfig | false;
56
+ }): Promise<PreparedFarmCron>;
57
+ declare function createFarmCronManifest(cron: FarmCronResolvedConfig): {
58
+ schemaVersion: number;
59
+ secretEnv: "CRON_SECRET";
60
+ jobs: {
61
+ name: string;
62
+ schedule: string[];
63
+ path: string;
64
+ description: string | null;
65
+ }[];
66
+ };
67
+ declare function createFarmCronVercelCrons(jobs: FarmCronJob[]): Array<{
68
+ path: string;
69
+ schedule: string;
70
+ }>;
71
+ declare function applyFarmCronVercelCrons(vercelConfig: Record<string, any>, jobs: FarmCronJob[]): Record<string, any>;
72
+ declare function createFarmCronCloudflareTriggers(jobs: FarmCronJob[]): string[];
73
+ declare function createFarmCronCloudflareConfig(jobs: FarmCronJob[]): FarmCronCloudflareConfig | undefined;
74
+ declare function mergeScheduledTasks(...maps: Array<Record<string, string | string[]> | undefined>): Record<string, string | string[]>;
75
+ declare function isCronRequestAuthorized(request: Request, options?: FarmCronRouteOptions): boolean;
76
+ declare function cronRoute<TArgs extends unknown[], TResult>(handler: (request: Request, ...args: TArgs) => TResult, options?: FarmCronRouteOptions): (request: Request, ...args: TArgs) => TResult | Promise<Response>;
77
+
78
+ export { DEFAULT_FARM_CRON_SECRET_ENV, FARM_CRON_MANIFEST, type FarmCronCloudflareConfig, type FarmCronJob, type FarmCronJobConfig, type FarmCronResolvedConfig, type FarmCronRouteOptions, type FarmCronSchedule, type FarmCronUserConfig, type PreparedFarmCron, applyFarmCronVercelCrons, createFarmCronCloudflareConfig, createFarmCronCloudflareTriggers, createFarmCronManifest, createFarmCronVercelCrons, cronRoute, isCronRequestAuthorized, mergeScheduledTasks, prepareFarmCronForNitro, resolveCronConfig };
package/dist/cron.d.ts ADDED
@@ -0,0 +1,78 @@
1
+ type FarmCronSchedule = string | string[];
2
+ interface FarmCronJobConfig {
3
+ /** Portable five-field cron expression, or a list of expressions. */
4
+ schedule: FarmCronSchedule;
5
+ /** Farm API route invoked with GET when the schedule fires. */
6
+ path: string;
7
+ /** Human-readable purpose shown by local tooling and deployment manifests. */
8
+ description?: string;
9
+ /** Disable this schedule without removing its configuration. */
10
+ enabled?: boolean;
11
+ }
12
+ type FarmCronUserConfig = Record<string, FarmCronJobConfig>;
13
+ interface FarmCronJob {
14
+ name: string;
15
+ schedule: string[];
16
+ path: string;
17
+ description?: string;
18
+ }
19
+ interface FarmCronResolvedConfig {
20
+ enabled: boolean;
21
+ secretEnv: typeof DEFAULT_FARM_CRON_SECRET_ENV;
22
+ jobs: FarmCronJob[];
23
+ }
24
+ interface PreparedFarmCron {
25
+ jobs: FarmCronJob[];
26
+ tasks: Record<string, {
27
+ handler: string;
28
+ description: string;
29
+ }>;
30
+ scheduledTasks: Record<string, string | string[]>;
31
+ manifestPath?: string;
32
+ }
33
+ interface FarmCronRouteOptions {
34
+ /** Environment variable containing the bearer token. */
35
+ secretEnv?: string;
36
+ /** Inline token, primarily useful in tests. Environment variables are preferred. */
37
+ secret?: string;
38
+ /** Allow a production route without a secret. Defaults to false. */
39
+ allowUnsecured?: boolean;
40
+ }
41
+ interface FarmCronCloudflareConfig {
42
+ deployConfig: true;
43
+ wrangler: {
44
+ triggers: {
45
+ crons: string[];
46
+ };
47
+ };
48
+ }
49
+ declare const DEFAULT_FARM_CRON_SECRET_ENV = "CRON_SECRET";
50
+ declare const FARM_CRON_MANIFEST = "cron-manifest.json";
51
+ declare function resolveCronConfig(cron: FarmCronResolvedConfig | FarmCronUserConfig | false | undefined): FarmCronResolvedConfig;
52
+ declare function prepareFarmCronForNitro(config: {
53
+ root?: string;
54
+ distDir?: string;
55
+ cron?: FarmCronResolvedConfig | FarmCronUserConfig | false;
56
+ }): Promise<PreparedFarmCron>;
57
+ declare function createFarmCronManifest(cron: FarmCronResolvedConfig): {
58
+ schemaVersion: number;
59
+ secretEnv: "CRON_SECRET";
60
+ jobs: {
61
+ name: string;
62
+ schedule: string[];
63
+ path: string;
64
+ description: string | null;
65
+ }[];
66
+ };
67
+ declare function createFarmCronVercelCrons(jobs: FarmCronJob[]): Array<{
68
+ path: string;
69
+ schedule: string;
70
+ }>;
71
+ declare function applyFarmCronVercelCrons(vercelConfig: Record<string, any>, jobs: FarmCronJob[]): Record<string, any>;
72
+ declare function createFarmCronCloudflareTriggers(jobs: FarmCronJob[]): string[];
73
+ declare function createFarmCronCloudflareConfig(jobs: FarmCronJob[]): FarmCronCloudflareConfig | undefined;
74
+ declare function mergeScheduledTasks(...maps: Array<Record<string, string | string[]> | undefined>): Record<string, string | string[]>;
75
+ declare function isCronRequestAuthorized(request: Request, options?: FarmCronRouteOptions): boolean;
76
+ declare function cronRoute<TArgs extends unknown[], TResult>(handler: (request: Request, ...args: TArgs) => TResult, options?: FarmCronRouteOptions): (request: Request, ...args: TArgs) => TResult | Promise<Response>;
77
+
78
+ export { DEFAULT_FARM_CRON_SECRET_ENV, FARM_CRON_MANIFEST, type FarmCronCloudflareConfig, type FarmCronJob, type FarmCronJobConfig, type FarmCronResolvedConfig, type FarmCronRouteOptions, type FarmCronSchedule, type FarmCronUserConfig, type PreparedFarmCron, applyFarmCronVercelCrons, createFarmCronCloudflareConfig, createFarmCronCloudflareTriggers, createFarmCronManifest, createFarmCronVercelCrons, cronRoute, isCronRequestAuthorized, mergeScheduledTasks, prepareFarmCronForNitro, resolveCronConfig };
package/dist/cron.mjs ADDED
@@ -0,0 +1,30 @@
1
+ import {
2
+ DEFAULT_FARM_CRON_SECRET_ENV,
3
+ FARM_CRON_MANIFEST,
4
+ applyFarmCronVercelCrons,
5
+ createFarmCronCloudflareConfig,
6
+ createFarmCronCloudflareTriggers,
7
+ createFarmCronManifest,
8
+ createFarmCronVercelCrons,
9
+ cronRoute,
10
+ isCronRequestAuthorized,
11
+ mergeScheduledTasks,
12
+ prepareFarmCronForNitro,
13
+ resolveCronConfig
14
+ } from "./chunk-UREJA4GZ.mjs";
15
+ import "./chunk-CGILA3WO.mjs";
16
+ export {
17
+ DEFAULT_FARM_CRON_SECRET_ENV,
18
+ FARM_CRON_MANIFEST,
19
+ applyFarmCronVercelCrons,
20
+ createFarmCronCloudflareConfig,
21
+ createFarmCronCloudflareTriggers,
22
+ createFarmCronManifest,
23
+ createFarmCronVercelCrons,
24
+ cronRoute,
25
+ isCronRequestAuthorized,
26
+ mergeScheduledTasks,
27
+ prepareFarmCronForNitro,
28
+ resolveCronConfig
29
+ };
30
+ //# sourceMappingURL=cron.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,438 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/deferred.ts
22
+ var deferred_exports = {};
23
+ __export(deferred_exports, {
24
+ DeferredDataError: () => DeferredDataError,
25
+ FARM_DEFERRED_BRAND: () => FARM_DEFERRED_BRAND,
26
+ FARM_DEFERRED_CONTENT_TYPE: () => FARM_DEFERRED_CONTENT_TYPE,
27
+ FARM_DEFERRED_ERROR_CODE: () => FARM_DEFERRED_ERROR_CODE,
28
+ createDeferredDataResponse: () => createDeferredDataResponse,
29
+ defer: () => defer,
30
+ isDeferred: () => isDeferred,
31
+ prepareDeferredData: () => prepareDeferredData,
32
+ readDeferredDataResponse: () => readDeferredDataResponse,
33
+ reviveDeferredData: () => reviveDeferredData,
34
+ snapshotDeferredData: () => snapshotDeferredData
35
+ });
36
+ module.exports = __toCommonJS(deferred_exports);
37
+ var FARM_DEFERRED_CONTENT_TYPE = "application/x-farm-deferred+json";
38
+ var FARM_DEFERRED_ERROR_CODE = "FARM_DEFERRED_DATA_ERROR";
39
+ var FARM_DEFERRED_BRAND = /* @__PURE__ */ Symbol.for(
40
+ "farm.deferred"
41
+ );
42
+ var FARM_DEFERRED_MARKER = "$farmDeferred";
43
+ var _DeferredDataError = class _DeferredDataError extends Error {
44
+ constructor(message = "Deferred route data failed to load") {
45
+ super(message);
46
+ this.name = "DeferredDataError";
47
+ this.code = FARM_DEFERRED_ERROR_CODE;
48
+ }
49
+ };
50
+ __name(_DeferredDataError, "DeferredDataError");
51
+ var DeferredDataError = _DeferredDataError;
52
+ var deferredStates = /* @__PURE__ */ new WeakMap();
53
+ function defer(value) {
54
+ if (isDeferred(value)) {
55
+ return value;
56
+ }
57
+ const promise = Promise.resolve(value);
58
+ Object.defineProperty(promise, FARM_DEFERRED_BRAND, {
59
+ configurable: false,
60
+ enumerable: false,
61
+ value: true,
62
+ writable: false
63
+ });
64
+ deferredStates.set(promise, { status: "pending" });
65
+ promise.then(
66
+ (resolved) => deferredStates.set(promise, { status: "fulfilled", value: resolved }),
67
+ (reason) => deferredStates.set(promise, { status: "rejected", reason })
68
+ );
69
+ return promise;
70
+ }
71
+ __name(defer, "defer");
72
+ function isDeferred(value) {
73
+ return Boolean(
74
+ value && (typeof value === "object" || typeof value === "function") && value[FARM_DEFERRED_BRAND] === true
75
+ );
76
+ }
77
+ __name(isDeferred, "isDeferred");
78
+ function prepareDeferredData(value) {
79
+ const context = createEncodingContext();
80
+ return {
81
+ data: encodeDeferredValue(value, context, /* @__PURE__ */ new WeakSet()),
82
+ records: context.records
83
+ };
84
+ }
85
+ __name(prepareDeferredData, "prepareDeferredData");
86
+ function snapshotDeferredData(records) {
87
+ const context = createEncodingContext(records);
88
+ const settlements = {};
89
+ for (let index = 0; index < context.records.length; index++) {
90
+ const record = context.records[index];
91
+ const state = readDeferredState(record.promise);
92
+ if (state.status === "fulfilled") {
93
+ try {
94
+ settlements[record.id] = {
95
+ status: "fulfilled",
96
+ value: encodeDeferredValue(state.value, context, /* @__PURE__ */ new WeakSet())
97
+ };
98
+ } catch {
99
+ settlements[record.id] = createRejectedSettlement();
100
+ }
101
+ } else {
102
+ settlements[record.id] = createRejectedSettlement();
103
+ }
104
+ }
105
+ return settlements;
106
+ }
107
+ __name(snapshotDeferredData, "snapshotDeferredData");
108
+ function reviveDeferredData(value, settlements) {
109
+ return reviveDeferredValue(value, /* @__PURE__ */ new Map(), settlements);
110
+ }
111
+ __name(reviveDeferredData, "reviveDeferredData");
112
+ function createDeferredDataResponse(value, init = {}, options = {}) {
113
+ const context = createEncodingContext();
114
+ const data = encodeDeferredValue(value, context, /* @__PURE__ */ new WeakSet());
115
+ const headers = new Headers(init.headers);
116
+ if (context.records.length === 0) {
117
+ headers.set("Content-Type", "application/json; charset=utf-8");
118
+ return new Response(JSON.stringify(data), { ...init, headers });
119
+ }
120
+ headers.set("Content-Type", `${FARM_DEFERRED_CONTENT_TYPE}; charset=utf-8`);
121
+ headers.set("Cache-Control", headers.get("Cache-Control") || "private, max-age=0");
122
+ const initialLine = encodeDeferredMessage({ type: "data", data });
123
+ const encoder = new TextEncoder();
124
+ let cancelled = false;
125
+ const stream = new ReadableStream({
126
+ start(controller) {
127
+ controller.enqueue(encoder.encode(initialLine));
128
+ let pending = context.records.length;
129
+ const finishRecord = /* @__PURE__ */ __name(() => {
130
+ pending--;
131
+ if (!cancelled && pending === 0) controller.close();
132
+ }, "finishRecord");
133
+ const schedule = /* @__PURE__ */ __name((record) => {
134
+ record.promise.then(
135
+ (resolved) => {
136
+ if (cancelled) return;
137
+ try {
138
+ const previousLength = context.records.length;
139
+ const encoded = encodeDeferredValue(resolved, context, /* @__PURE__ */ new WeakSet());
140
+ const nestedRecords = context.records.slice(previousLength);
141
+ pending += nestedRecords.length;
142
+ controller.enqueue(
143
+ encoder.encode(
144
+ encodeDeferredMessage({ type: "resolve", id: record.id, data: encoded })
145
+ )
146
+ );
147
+ for (const nestedRecord of nestedRecords) schedule(nestedRecord);
148
+ } catch (error) {
149
+ reportDeferredError(options, error, record.id);
150
+ controller.enqueue(
151
+ encoder.encode(
152
+ encodeDeferredMessage({
153
+ type: "reject",
154
+ id: record.id,
155
+ error: createDeferredPublicError()
156
+ })
157
+ )
158
+ );
159
+ }
160
+ },
161
+ (error) => {
162
+ if (cancelled) return;
163
+ reportDeferredError(options, error, record.id);
164
+ controller.enqueue(
165
+ encoder.encode(
166
+ encodeDeferredMessage({
167
+ type: "reject",
168
+ id: record.id,
169
+ error: createDeferredPublicError()
170
+ })
171
+ )
172
+ );
173
+ }
174
+ ).finally(finishRecord);
175
+ }, "schedule");
176
+ const initialRecords = context.records.slice();
177
+ for (const record of initialRecords) schedule(record);
178
+ },
179
+ cancel() {
180
+ cancelled = true;
181
+ }
182
+ });
183
+ return new Response(stream, { ...init, headers });
184
+ }
185
+ __name(createDeferredDataResponse, "createDeferredDataResponse");
186
+ async function readDeferredDataResponse(response) {
187
+ const contentType = response.headers.get("Content-Type") || "";
188
+ if (!contentType.toLowerCase().startsWith(FARM_DEFERRED_CONTENT_TYPE)) {
189
+ return await response.json();
190
+ }
191
+ if (!response.body) {
192
+ throw new DeferredDataError("Deferred route data response has no body");
193
+ }
194
+ const reader = response.body.getReader();
195
+ const decoder = new TextDecoder();
196
+ const controllers = /* @__PURE__ */ new Map();
197
+ let buffer = "";
198
+ let complete = false;
199
+ const readLine = /* @__PURE__ */ __name(async () => {
200
+ while (true) {
201
+ const newline = buffer.indexOf("\n");
202
+ if (newline >= 0) {
203
+ const line = buffer.slice(0, newline);
204
+ buffer = buffer.slice(newline + 1);
205
+ return line;
206
+ }
207
+ if (complete) {
208
+ if (!buffer) return void 0;
209
+ const line = buffer;
210
+ buffer = "";
211
+ return line;
212
+ }
213
+ const chunk = await reader.read();
214
+ complete = chunk.done;
215
+ if (chunk.value) buffer += decoder.decode(chunk.value, { stream: !chunk.done });
216
+ if (chunk.done) buffer += decoder.decode();
217
+ }
218
+ }, "readLine");
219
+ const firstLine = await readLine();
220
+ if (!firstLine) {
221
+ reader.releaseLock();
222
+ throw new DeferredDataError("Deferred route data response is empty");
223
+ }
224
+ const initial = parseDeferredMessage(firstLine);
225
+ if (initial.type !== "data") {
226
+ reader.releaseLock();
227
+ throw new DeferredDataError("Deferred route data response is invalid");
228
+ }
229
+ const data = reviveDeferredValue(initial.data, controllers);
230
+ void (async () => {
231
+ try {
232
+ for (let line = await readLine(); line !== void 0; line = await readLine()) {
233
+ if (!line) continue;
234
+ const message = parseDeferredMessage(line);
235
+ if (message.type === "resolve") {
236
+ const controller = getControlledDeferred(message.id, controllers);
237
+ controller.resolve(reviveDeferredValue(message.data, controllers));
238
+ } else if (message.type === "reject") {
239
+ getControlledDeferred(message.id, controllers).reject(
240
+ new DeferredDataError(message.error?.message)
241
+ );
242
+ }
243
+ }
244
+ rejectPendingDeferred(controllers, "Deferred route data stream ended before completion");
245
+ } catch {
246
+ rejectPendingDeferred(controllers, "Deferred route data stream could not be read");
247
+ } finally {
248
+ reader.releaseLock();
249
+ }
250
+ })();
251
+ return data;
252
+ }
253
+ __name(readDeferredDataResponse, "readDeferredDataResponse");
254
+ function createEncodingContext(records = []) {
255
+ return {
256
+ records: [...records],
257
+ ids: new Map(records.map((record) => [record.promise, record.id])),
258
+ nextId: records.reduce((highest, record) => {
259
+ const value = Number(record.id.replace(/^d/, ""));
260
+ return Number.isFinite(value) ? Math.max(highest, value + 1) : highest;
261
+ }, records.length)
262
+ };
263
+ }
264
+ __name(createEncodingContext, "createEncodingContext");
265
+ function encodeDeferredValue(value, context, ancestors) {
266
+ if (isDeferred(value)) {
267
+ let id = context.ids.get(value);
268
+ if (!id) {
269
+ id = `d${context.nextId++}`;
270
+ context.ids.set(value, id);
271
+ context.records.push({ id, promise: value });
272
+ }
273
+ return { [FARM_DEFERRED_MARKER]: id };
274
+ }
275
+ if (!value || typeof value !== "object") return value;
276
+ if (Array.isArray(value)) {
277
+ assertNotCircular(value, ancestors);
278
+ const output2 = value.map((item) => encodeDeferredValue(item, context, ancestors));
279
+ ancestors.delete(value);
280
+ return output2;
281
+ }
282
+ const prototype = Object.getPrototypeOf(value);
283
+ if (prototype !== Object.prototype && prototype !== null) return value;
284
+ assertNotCircular(value, ancestors);
285
+ const output = {};
286
+ for (const [key, item] of Object.entries(value)) {
287
+ output[key] = encodeDeferredValue(item, context, ancestors);
288
+ }
289
+ ancestors.delete(value);
290
+ return output;
291
+ }
292
+ __name(encodeDeferredValue, "encodeDeferredValue");
293
+ function reviveDeferredValue(value, controllers, settlements, applyingSettlements = /* @__PURE__ */ new Set()) {
294
+ if (isDeferredMarker(value)) {
295
+ const id = value[FARM_DEFERRED_MARKER];
296
+ const controller = getControlledDeferred(id, controllers);
297
+ const settlement = settlements?.[id];
298
+ if (settlement && controller.promise.status === "pending") {
299
+ if (applyingSettlements.has(id)) return controller.promise;
300
+ applyingSettlements.add(id);
301
+ if (settlement.status === "fulfilled") {
302
+ controller.resolve(
303
+ reviveDeferredValue(settlement.value, controllers, settlements, applyingSettlements)
304
+ );
305
+ } else {
306
+ controller.reject(new DeferredDataError(settlement.error.message));
307
+ }
308
+ applyingSettlements.delete(id);
309
+ } else if (settlements && controller.promise.status === "pending") {
310
+ controller.reject(new DeferredDataError("Deferred route data was not resolved"));
311
+ }
312
+ return controller.promise;
313
+ }
314
+ if (Array.isArray(value)) {
315
+ return value.map(
316
+ (item) => reviveDeferredValue(item, controllers, settlements, applyingSettlements)
317
+ );
318
+ }
319
+ if (!value || typeof value !== "object") return value;
320
+ const prototype = Object.getPrototypeOf(value);
321
+ if (prototype !== Object.prototype && prototype !== null) return value;
322
+ const output = {};
323
+ for (const [key, item] of Object.entries(value)) {
324
+ output[key] = reviveDeferredValue(item, controllers, settlements, applyingSettlements);
325
+ }
326
+ return output;
327
+ }
328
+ __name(reviveDeferredValue, "reviveDeferredValue");
329
+ function getControlledDeferred(id, controllers) {
330
+ const existing = controllers.get(id);
331
+ if (existing) return existing;
332
+ let nativeResolve;
333
+ let nativeReject;
334
+ const promise = new Promise((resolve, reject) => {
335
+ nativeResolve = resolve;
336
+ nativeReject = reject;
337
+ });
338
+ promise.status = "pending";
339
+ promise.catch(() => void 0);
340
+ const controlled = {
341
+ promise,
342
+ resolve(value) {
343
+ if (promise.status !== "pending") return;
344
+ promise.status = "fulfilled";
345
+ promise.value = value;
346
+ nativeResolve(value);
347
+ },
348
+ reject(error) {
349
+ if (promise.status !== "pending") return;
350
+ promise.status = "rejected";
351
+ promise.reason = error;
352
+ nativeReject(error);
353
+ }
354
+ };
355
+ controllers.set(id, controlled);
356
+ return controlled;
357
+ }
358
+ __name(getControlledDeferred, "getControlledDeferred");
359
+ function readDeferredState(promise) {
360
+ const tracked = deferredStates.get(promise);
361
+ if (tracked && tracked.status !== "pending") return tracked;
362
+ const reactState = promise;
363
+ if (reactState.status === "fulfilled") {
364
+ return { status: "fulfilled", value: reactState.value };
365
+ }
366
+ if (reactState.status === "rejected") {
367
+ return { status: "rejected", reason: reactState.reason };
368
+ }
369
+ return tracked || { status: "pending" };
370
+ }
371
+ __name(readDeferredState, "readDeferredState");
372
+ function isDeferredMarker(value) {
373
+ return Boolean(
374
+ value && typeof value === "object" && Object.keys(value).length === 1 && typeof value[FARM_DEFERRED_MARKER] === "string"
375
+ );
376
+ }
377
+ __name(isDeferredMarker, "isDeferredMarker");
378
+ function assertNotCircular(value, ancestors) {
379
+ if (ancestors.has(value)) {
380
+ throw new TypeError("Deferred route data must be JSON-serializable and cannot be circular");
381
+ }
382
+ ancestors.add(value);
383
+ }
384
+ __name(assertNotCircular, "assertNotCircular");
385
+ function createDeferredPublicError() {
386
+ return {
387
+ code: FARM_DEFERRED_ERROR_CODE,
388
+ message: "Deferred route data failed to load"
389
+ };
390
+ }
391
+ __name(createDeferredPublicError, "createDeferredPublicError");
392
+ function createRejectedSettlement() {
393
+ return { status: "rejected", error: createDeferredPublicError() };
394
+ }
395
+ __name(createRejectedSettlement, "createRejectedSettlement");
396
+ function reportDeferredError(options, error, id) {
397
+ try {
398
+ options.onError?.(error, id);
399
+ } catch {
400
+ }
401
+ }
402
+ __name(reportDeferredError, "reportDeferredError");
403
+ function encodeDeferredMessage(message) {
404
+ return `${JSON.stringify(message)}
405
+ `;
406
+ }
407
+ __name(encodeDeferredMessage, "encodeDeferredMessage");
408
+ function parseDeferredMessage(line) {
409
+ try {
410
+ return JSON.parse(line);
411
+ } catch {
412
+ throw new DeferredDataError("Deferred route data response contains invalid JSON");
413
+ }
414
+ }
415
+ __name(parseDeferredMessage, "parseDeferredMessage");
416
+ function rejectPendingDeferred(controllers, message) {
417
+ for (const controller of controllers.values()) {
418
+ if (controller.promise.status === "pending") {
419
+ controller.reject(new DeferredDataError(message));
420
+ }
421
+ }
422
+ }
423
+ __name(rejectPendingDeferred, "rejectPendingDeferred");
424
+ // Annotate the CommonJS export names for ESM import in node:
425
+ 0 && (module.exports = {
426
+ DeferredDataError,
427
+ FARM_DEFERRED_BRAND,
428
+ FARM_DEFERRED_CONTENT_TYPE,
429
+ FARM_DEFERRED_ERROR_CODE,
430
+ createDeferredDataResponse,
431
+ defer,
432
+ isDeferred,
433
+ prepareDeferredData,
434
+ readDeferredDataResponse,
435
+ reviveDeferredData,
436
+ snapshotDeferredData
437
+ });
438
+ //# sourceMappingURL=deferred.cjs.map