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

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 (310) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-runtime.d.mts +3 -2
  3. package/dist/agent-runtime.d.ts +3 -2
  4. package/dist/api/route-manager.cjs +410 -15
  5. package/dist/api/route-manager.cjs.map +1 -1
  6. package/dist/api/route-manager.d.mts +7 -5
  7. package/dist/api/route-manager.d.ts +7 -5
  8. package/dist/api/route-manager.mjs +9 -8
  9. package/dist/api/runtime.cjs +748 -9
  10. package/dist/api/runtime.cjs.map +1 -1
  11. package/dist/api/runtime.d.mts +3 -16
  12. package/dist/api/runtime.d.ts +3 -16
  13. package/dist/api/runtime.mjs +8 -1
  14. package/dist/api.cjs +1243 -342
  15. package/dist/api.cjs.map +1 -1
  16. package/dist/api.d.mts +8 -150
  17. package/dist/api.d.ts +8 -150
  18. package/dist/api.mjs +51 -21
  19. package/dist/{app-BiX4qb-d.d.mts → app-BNE2FoZ4.d.mts} +42 -5
  20. package/dist/{app-CFRNJXP1.d.ts → app-DRGUmJ3s.d.ts} +42 -5
  21. package/dist/app-markdown.cjs +32 -8
  22. package/dist/app-markdown.cjs.map +1 -1
  23. package/dist/app-markdown.d.mts +3 -2
  24. package/dist/app-markdown.d.ts +3 -2
  25. package/dist/app-markdown.mjs +2 -1
  26. package/dist/cache.cjs +414 -12
  27. package/dist/cache.cjs.map +1 -1
  28. package/dist/cache.d.mts +120 -6
  29. package/dist/cache.d.ts +120 -6
  30. package/dist/cache.mjs +11 -3
  31. package/dist/{chunk-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-G3B5BRDY.mjs → chunk-4677KXB7.mjs} +646 -86
  36. package/dist/chunk-4677KXB7.mjs.map +1 -0
  37. package/dist/{chunk-3QJO55ZF.mjs → chunk-4LND3PXF.mjs} +30 -38
  38. package/dist/chunk-4LND3PXF.mjs.map +1 -0
  39. package/dist/chunk-5EVQFRL2.mjs +10 -0
  40. package/dist/chunk-5EVQFRL2.mjs.map +1 -0
  41. package/dist/{chunk-25D7G34K.mjs → chunk-65A7QIKI.mjs} +5 -5
  42. package/dist/{chunk-25D7G34K.mjs.map → chunk-65A7QIKI.mjs.map} +1 -1
  43. package/dist/{chunk-CHFHNEMO.mjs → chunk-77BOAQHI.mjs} +1972 -188
  44. package/dist/chunk-77BOAQHI.mjs.map +1 -0
  45. package/dist/{chunk-LLC7BNXW.mjs → chunk-7FBJLMQH.mjs} +73 -10
  46. package/dist/chunk-7FBJLMQH.mjs.map +1 -0
  47. package/dist/{chunk-TRORP7E4.mjs → chunk-7N62DNSO.mjs} +2 -2
  48. package/dist/chunk-ALCLXXTY.mjs +187 -0
  49. package/dist/chunk-ALCLXXTY.mjs.map +1 -0
  50. package/dist/chunk-AW6I64AP.mjs +25 -0
  51. package/dist/chunk-AW6I64AP.mjs.map +1 -0
  52. package/dist/{chunk-B6N4ZB2H.mjs → chunk-C2ROET2V.mjs} +3 -3
  53. package/dist/{chunk-BHG3LVHH.mjs → chunk-CGIXMLSY.mjs} +15 -7
  54. package/dist/chunk-CGIXMLSY.mjs.map +1 -0
  55. package/dist/{chunk-C3DLZMBU.mjs → chunk-DJSGLHCN.mjs} +2 -2
  56. package/dist/{chunk-JN3UU635.mjs → chunk-EJ7T4TPB.mjs} +2 -2
  57. package/dist/chunk-EJ7T4TPB.mjs.map +1 -0
  58. package/dist/{chunk-ZJQNATYV.mjs → chunk-FRPWCMMG.mjs} +3 -3
  59. package/dist/chunk-FRPWCMMG.mjs.map +1 -0
  60. package/dist/{chunk-QM6VV26B.mjs → chunk-GQVGIUSN.mjs} +3 -3
  61. package/dist/{chunk-QM6VV26B.mjs.map → chunk-GQVGIUSN.mjs.map} +1 -1
  62. package/dist/{chunk-UREJA4GZ.mjs → chunk-GXASWWJU.mjs} +1 -1
  63. package/dist/{chunk-UREJA4GZ.mjs.map → chunk-GXASWWJU.mjs.map} +1 -1
  64. package/dist/chunk-I4CUBGVF.mjs +93 -0
  65. package/dist/chunk-I4CUBGVF.mjs.map +1 -0
  66. package/dist/{chunk-HXP3ZSPC.mjs → chunk-J5YWQVI5.mjs} +4 -4
  67. package/dist/chunk-J5YWQVI5.mjs.map +1 -0
  68. package/dist/{chunk-PRNYWD7K.mjs → chunk-JDEOUK5V.mjs} +67 -239
  69. package/dist/chunk-JDEOUK5V.mjs.map +1 -0
  70. package/dist/{chunk-UHE2TTLK.mjs → chunk-K5ZTUF22.mjs} +34 -17
  71. package/dist/chunk-K5ZTUF22.mjs.map +1 -0
  72. package/dist/{chunk-O3HADRW6.mjs → chunk-MIUW47JX.mjs} +2 -2
  73. package/dist/{chunk-O3HADRW6.mjs.map → chunk-MIUW47JX.mjs.map} +1 -1
  74. package/dist/chunk-PFE6GMNE.mjs +603 -0
  75. package/dist/chunk-PFE6GMNE.mjs.map +1 -0
  76. package/dist/{chunk-RKI6TN3A.mjs → chunk-QM746KUO.mjs} +9 -2
  77. package/dist/chunk-QM746KUO.mjs.map +1 -0
  78. package/dist/{chunk-TU4YJICB.mjs → chunk-QTZZ2ISQ.mjs} +41 -16
  79. package/dist/chunk-QTZZ2ISQ.mjs.map +1 -0
  80. package/dist/chunk-RBRLLZL5.mjs +81 -0
  81. package/dist/chunk-RBRLLZL5.mjs.map +1 -0
  82. package/dist/{chunk-RSKVYESE.mjs → chunk-RQ633A5I.mjs} +1 -1
  83. package/dist/chunk-RQ633A5I.mjs.map +1 -0
  84. package/dist/{chunk-6XDUHOEM.mjs → chunk-TQAEEJB4.mjs} +3 -3
  85. package/dist/{chunk-AGS7UJ52.mjs → chunk-UB5UOSHB.mjs} +24 -12
  86. package/dist/chunk-UB5UOSHB.mjs.map +1 -0
  87. package/dist/{chunk-SXZTEK3V.mjs → chunk-UXUAWNO5.mjs} +2 -2
  88. package/dist/chunk-V3XURYJO.mjs +756 -0
  89. package/dist/chunk-V3XURYJO.mjs.map +1 -0
  90. package/dist/{chunk-JLWMCADZ.mjs → chunk-VY2UYN5R.mjs} +24 -4
  91. package/dist/chunk-VY2UYN5R.mjs.map +1 -0
  92. package/dist/{chunk-QFQRHRZS.mjs → chunk-W2CRQFF6.mjs} +151 -23
  93. package/dist/chunk-W2CRQFF6.mjs.map +1 -0
  94. package/dist/{chunk-Y7A27276.mjs → chunk-WDU6QXNK.mjs} +349 -15
  95. package/dist/chunk-WDU6QXNK.mjs.map +1 -0
  96. package/dist/{chunk-Y2OJJD7R.mjs → chunk-XIVV5IWN.mjs} +7 -9
  97. package/dist/chunk-XIVV5IWN.mjs.map +1 -0
  98. package/dist/{chunk-OYXO65LI.mjs → chunk-YW7OBE6Q.mjs} +4 -4
  99. package/dist/chunk-YW7OBE6Q.mjs.map +1 -0
  100. package/dist/{chunk-YHU7SS6L.mjs → chunk-Z5CQMP54.mjs} +11 -11
  101. package/dist/{chunk-S2XHZS7W.mjs → chunk-ZVWA4ZQ3.mjs} +18 -9
  102. package/dist/chunk-ZVWA4ZQ3.mjs.map +1 -0
  103. package/dist/{chunk-SOU3Q3ZA.mjs → chunk-ZZ57EH5Z.mjs} +1 -1
  104. package/dist/chunk-ZZ57EH5Z.mjs.map +1 -0
  105. package/dist/{client-D_yUjVhe.d.mts → client-BT1mFQas.d.mts} +55 -10
  106. package/dist/{client-Dkc03WP8.d.ts → client-Nn0q4eO4.d.ts} +55 -10
  107. package/dist/{client-plugins-BZnpeTGA.d.ts → client-plugins-Bc5jHcNr.d.ts} +85 -6
  108. package/dist/{client-plugins-g4bzuCmo.d.mts → client-plugins-jsk-ZLzJ.d.mts} +85 -6
  109. package/dist/client-plugins.d.mts +3 -2
  110. package/dist/client-plugins.d.ts +3 -2
  111. package/dist/client.cjs +922 -91
  112. package/dist/client.cjs.map +1 -1
  113. package/dist/client.d.mts +124 -6
  114. package/dist/client.d.ts +124 -6
  115. package/dist/client.mjs +23 -16
  116. package/dist/config.d.mts +3 -2
  117. package/dist/config.d.ts +3 -2
  118. package/dist/cron.cjs.map +1 -1
  119. package/dist/cron.mjs +1 -1
  120. package/dist/{devtools-AE4RVXCM.mjs → devtools-A22KUJZT.mjs} +13 -12
  121. package/dist/{devtools-AE4RVXCM.mjs.map → devtools-A22KUJZT.mjs.map} +1 -1
  122. package/dist/{devtools-client-6WPY2AQU.mjs → devtools-client-3XRTBND5.mjs} +2 -11
  123. package/dist/devtools-client-3XRTBND5.mjs.map +1 -0
  124. package/dist/docs.cjs +65 -58
  125. package/dist/docs.cjs.map +1 -1
  126. package/dist/docs.mjs +13 -12
  127. package/dist/env-types.cjs +14 -5
  128. package/dist/env-types.cjs.map +1 -1
  129. package/dist/env-types.d.mts +2 -1
  130. package/dist/env-types.d.ts +2 -1
  131. package/dist/env-types.mjs +3 -1
  132. package/dist/env.cjs.map +1 -1
  133. package/dist/env.d.mts +1 -1
  134. package/dist/env.d.ts +1 -1
  135. package/dist/env.mjs +1 -1
  136. package/dist/font.cjs +47 -0
  137. package/dist/font.cjs.map +1 -0
  138. package/dist/font.d.mts +70 -0
  139. package/dist/font.d.ts +70 -0
  140. package/dist/font.mjs +10 -0
  141. package/dist/font.mjs.map +1 -0
  142. package/dist/i18n/client.d.mts +2 -2
  143. package/dist/i18n/client.d.ts +2 -2
  144. package/dist/i18n/index.d.mts +3 -3
  145. package/dist/i18n/index.d.ts +3 -3
  146. package/dist/i18n/server.cjs +2 -2
  147. package/dist/i18n/server.cjs.map +1 -1
  148. package/dist/i18n/server.d.mts +5 -5
  149. package/dist/i18n/server.d.ts +5 -5
  150. package/dist/i18n/server.mjs +1 -1
  151. package/dist/index.cjs +5016 -1108
  152. package/dist/index.cjs.map +1 -1
  153. package/dist/index.d.mts +23 -19
  154. package/dist/index.d.ts +23 -19
  155. package/dist/index.mjs +177 -121
  156. package/dist/index.mjs.map +1 -1
  157. package/dist/integrations.d.mts +3 -2
  158. package/dist/integrations.d.ts +3 -2
  159. package/dist/internal/build-runtime.cjs +3504 -581
  160. package/dist/internal/build-runtime.cjs.map +1 -1
  161. package/dist/internal/build-runtime.d.mts +5 -4
  162. package/dist/internal/build-runtime.d.ts +5 -4
  163. package/dist/internal/build-runtime.mjs +32 -29
  164. package/dist/internal/client-runtime.cjs.map +1 -1
  165. package/dist/internal/client-runtime.mjs +1 -1
  166. package/dist/internal/config-runtime.cjs +148 -41
  167. package/dist/internal/config-runtime.cjs.map +1 -1
  168. package/dist/internal/config-runtime.d.mts +4 -3
  169. package/dist/internal/config-runtime.d.ts +4 -3
  170. package/dist/internal/config-runtime.mjs +12 -11
  171. package/dist/internal/production-runtime.cjs +300 -9
  172. package/dist/internal/production-runtime.cjs.map +1 -1
  173. package/dist/internal/production-runtime.d.mts +10 -8
  174. package/dist/internal/production-runtime.d.ts +10 -8
  175. package/dist/internal/production-runtime.mjs +27 -9
  176. package/dist/internal/production-runtime.mjs.map +1 -1
  177. package/dist/markdown.cjs +73 -8
  178. package/dist/markdown.cjs.map +1 -1
  179. package/dist/markdown.d.mts +19 -2
  180. package/dist/markdown.d.ts +19 -2
  181. package/dist/markdown.mjs +5 -1
  182. package/dist/{metadata-C9NZxMDW.d.mts → metadata-7ffpT3jr.d.mts} +1 -1
  183. package/dist/{metadata-DAXRaOHx.d.ts → metadata-JHn-8eht.d.ts} +1 -1
  184. package/dist/middleware.cjs +2 -2
  185. package/dist/middleware.cjs.map +1 -1
  186. package/dist/middleware.d.mts +5 -4
  187. package/dist/middleware.d.ts +5 -4
  188. package/dist/middleware.mjs +3 -3
  189. package/dist/navigation.cjs +40 -15
  190. package/dist/navigation.cjs.map +1 -1
  191. package/dist/navigation.mjs +3 -3
  192. package/dist/{nitro-KME62MWG.mjs → nitro-QO5LV6QK.mjs} +11 -13
  193. package/dist/{nitro-KME62MWG.mjs.map → nitro-QO5LV6QK.mjs.map} +1 -1
  194. package/dist/plugin.cjs +2854 -590
  195. package/dist/plugin.cjs.map +1 -1
  196. package/dist/plugin.d.mts +3 -2
  197. package/dist/plugin.d.ts +3 -2
  198. package/dist/plugin.mjs +28 -25
  199. package/dist/{production-runtime-DRkCHUvJ.d.ts → production-runtime-9KG7GuvW.d.ts} +2 -2
  200. package/dist/{production-runtime-flrjp_nC.d.mts → production-runtime-B-fweKts.d.mts} +2 -2
  201. package/dist/{request-BrFBuc8G.d.mts → request-Dsq4kGW0.d.mts} +1 -1
  202. package/dist/{request-BslSZIRz.d.ts → request-udtobOLv.d.ts} +1 -1
  203. package/dist/request.d.mts +2 -2
  204. package/dist/request.d.ts +2 -2
  205. package/dist/{resolver-DlOPpjkB.d.mts → resolver-DJqjLMg_.d.mts} +1 -1
  206. package/dist/{resolver-C6iecsDV.d.ts → resolver-IH4RmPEl.d.ts} +1 -1
  207. package/dist/routes.cjs +276 -6
  208. package/dist/routes.cjs.map +1 -1
  209. package/dist/routes.d.mts +2 -2
  210. package/dist/routes.d.ts +2 -2
  211. package/dist/routes.mjs +4 -4
  212. package/dist/runtime-9nQjVM7X.d.mts +206 -0
  213. package/dist/{runtime-DeAAZ6gO.d.mts → runtime-Cxpq6xZN.d.mts} +2 -2
  214. package/dist/runtime-DgeS2skB.d.ts +206 -0
  215. package/dist/{runtime-B6GvwDS1.d.ts → runtime-bv63eUiO.d.ts} +2 -2
  216. package/dist/server-action-security.cjs +28 -10
  217. package/dist/server-action-security.cjs.map +1 -1
  218. package/dist/server-action-security.d.mts +2 -1
  219. package/dist/server-action-security.d.ts +2 -1
  220. package/dist/server-action-security.mjs +2 -2
  221. package/dist/server-fn-client.cjs.map +1 -1
  222. package/dist/server-fn-client.d.mts +1 -0
  223. package/dist/server-fn-client.d.ts +1 -0
  224. package/dist/server-fn-client.mjs +1 -1
  225. package/dist/server-fn.cjs +785 -3
  226. package/dist/server-fn.cjs.map +1 -1
  227. package/dist/server-fn.d.mts +10 -1
  228. package/dist/server-fn.d.ts +10 -1
  229. package/dist/server-fn.mjs +6 -3
  230. package/dist/server-plugins.d.mts +4 -3
  231. package/dist/server-plugins.d.ts +4 -3
  232. package/dist/server-query-client.cjs +279 -8
  233. package/dist/server-query-client.cjs.map +1 -1
  234. package/dist/server-query-client.mjs +4 -4
  235. package/dist/server-query.cjs +381 -10
  236. package/dist/server-query.cjs.map +1 -1
  237. package/dist/server-query.mjs +5 -5
  238. package/dist/server.cjs +3319 -841
  239. package/dist/server.cjs.map +1 -1
  240. package/dist/server.d.mts +12 -11
  241. package/dist/server.d.ts +12 -11
  242. package/dist/server.mjs +57 -36
  243. package/dist/server.mjs.map +1 -1
  244. package/dist/testing.cjs +436 -25
  245. package/dist/testing.cjs.map +1 -1
  246. package/dist/testing.d.mts +5 -4
  247. package/dist/testing.d.ts +5 -4
  248. package/dist/testing.mjs +19 -18
  249. package/dist/testing.mjs.map +1 -1
  250. package/dist/transport-BmbGTXA5.d.mts +49 -0
  251. package/dist/transport-BmbGTXA5.d.ts +49 -0
  252. package/dist/{types-BH1lhg5G.d.ts → types-BMxWr97v.d.mts} +2 -2
  253. package/dist/{types-BH1lhg5G.d.mts → types-BMxWr97v.d.ts} +2 -2
  254. package/dist/{utils-DA1yo54_.d.ts → utils-CA0z0c-2.d.ts} +1 -1
  255. package/dist/{utils-DOXXivjL.d.mts → utils-mYVkSOt2.d.mts} +1 -1
  256. package/dist/version.cjs +36 -0
  257. package/dist/version.cjs.map +1 -0
  258. package/dist/version.d.mts +3 -0
  259. package/dist/version.d.ts +3 -0
  260. package/dist/version.mjs +8 -0
  261. package/dist/version.mjs.map +1 -0
  262. package/dist/vite.cjs +2938 -668
  263. package/dist/vite.cjs.map +1 -1
  264. package/dist/vite.d.mts +3 -2
  265. package/dist/vite.d.ts +3 -2
  266. package/dist/vite.mjs +26 -23
  267. package/dist/workflows.cjs +6 -8
  268. package/dist/workflows.cjs.map +1 -1
  269. package/dist/workflows.mjs +1 -1
  270. package/package.json +22 -6
  271. package/types/api.d.ts +44 -0
  272. package/types/client.d.ts +221 -17
  273. package/types/image.d.ts +4 -0
  274. package/types/images.d.ts +59 -0
  275. package/dist/chunk-3QJO55ZF.mjs.map +0 -1
  276. package/dist/chunk-4PTK6KT4.mjs +0 -364
  277. package/dist/chunk-4PTK6KT4.mjs.map +0 -1
  278. package/dist/chunk-AGS7UJ52.mjs.map +0 -1
  279. package/dist/chunk-BHG3LVHH.mjs.map +0 -1
  280. package/dist/chunk-CHFHNEMO.mjs.map +0 -1
  281. package/dist/chunk-EVGBEZDF.mjs +0 -215
  282. package/dist/chunk-EVGBEZDF.mjs.map +0 -1
  283. package/dist/chunk-G3B5BRDY.mjs.map +0 -1
  284. package/dist/chunk-GZP5W4K3.mjs.map +0 -1
  285. package/dist/chunk-HXP3ZSPC.mjs.map +0 -1
  286. package/dist/chunk-JLWMCADZ.mjs.map +0 -1
  287. package/dist/chunk-JN3UU635.mjs.map +0 -1
  288. package/dist/chunk-LLC7BNXW.mjs.map +0 -1
  289. package/dist/chunk-OYXO65LI.mjs.map +0 -1
  290. package/dist/chunk-PRNYWD7K.mjs.map +0 -1
  291. package/dist/chunk-QF4PHCMA.mjs.map +0 -1
  292. package/dist/chunk-QFQRHRZS.mjs.map +0 -1
  293. package/dist/chunk-RKI6TN3A.mjs.map +0 -1
  294. package/dist/chunk-RSKVYESE.mjs.map +0 -1
  295. package/dist/chunk-S2XHZS7W.mjs.map +0 -1
  296. package/dist/chunk-SOU3Q3ZA.mjs.map +0 -1
  297. package/dist/chunk-TU4YJICB.mjs.map +0 -1
  298. package/dist/chunk-TXCFGOHW.mjs +0 -42
  299. package/dist/chunk-TXCFGOHW.mjs.map +0 -1
  300. package/dist/chunk-UHE2TTLK.mjs.map +0 -1
  301. package/dist/chunk-Y2OJJD7R.mjs.map +0 -1
  302. package/dist/chunk-Y7A27276.mjs.map +0 -1
  303. package/dist/chunk-ZJQNATYV.mjs.map +0 -1
  304. package/dist/devtools-client-6WPY2AQU.mjs.map +0 -1
  305. /package/dist/{chunk-TRORP7E4.mjs.map → chunk-7N62DNSO.mjs.map} +0 -0
  306. /package/dist/{chunk-B6N4ZB2H.mjs.map → chunk-C2ROET2V.mjs.map} +0 -0
  307. /package/dist/{chunk-C3DLZMBU.mjs.map → chunk-DJSGLHCN.mjs.map} +0 -0
  308. /package/dist/{chunk-6XDUHOEM.mjs.map → chunk-TQAEEJB4.mjs.map} +0 -0
  309. /package/dist/{chunk-SXZTEK3V.mjs.map → chunk-UXUAWNO5.mjs.map} +0 -0
  310. /package/dist/{chunk-YHU7SS6L.mjs.map → chunk-Z5CQMP54.mjs.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/devtools.ts"],"sourcesContent":["import path from \"node:path\";\nimport { getDeployTargetForPreset } from \"./config\";\nimport { resolveCronConfig, type FarmCronJob } from \"./cron\";\nimport {\n mergeFarmRouteRuntimeConfigs,\n resolveFarmRouteRuleRuntimeConfig,\n resolveFarmRouteRuntimeConfig,\n type ResolvedFarmRouteRuntimeConfig,\n} from \"./route-runtime\";\nimport type { FarmConfig } from \"./types\";\nimport type { FarmDiscoveredWorkflow } from \"./workflows\";\n\ntype RouteMapEntry = {\n pattern: string;\n modulePath: string;\n};\n\ntype RouteManagerLike = {\n getRoutes(): Map<string, RouteMapEntry>;\n getLayouts(): Map<string, RouteMapEntry>;\n getLoadings(): Map<string, RouteMapEntry>;\n getErrors(): Map<string, RouteMapEntry>;\n resolveRouteRuntimeConfig?(\n pattern: string,\n ): Promise<ResolvedFarmRouteRuntimeConfig> | ResolvedFarmRouteRuntimeConfig;\n};\n\ntype APIRouteManagerLike = {\n getRoutes(): Map<\n string,\n {\n path: string;\n filePath: string;\n methods: string[];\n runtime?: \"auto\" | \"node\" | \"edge\";\n regions?: \"auto\" | readonly string[];\n maxDuration?: \"auto\" | number;\n }\n >;\n};\n\ntype MiddlewareManagerLike = {\n getMiddlewares(): Array<{\n path: string;\n filePath: string;\n handlers: unknown[];\n source?: \"config\" | \"file\";\n }>;\n};\n\ntype IntegrationLike = {\n kind?: string;\n type?: string;\n category?: string;\n serverRuntime?: boolean;\n routes?: ReadonlyArray<{\n path: string;\n method?: string;\n methods?: readonly string[];\n }>;\n middleware?: readonly unknown[];\n providers?: readonly unknown[];\n schema?: {\n models?: Record<string, unknown>;\n };\n};\n\nexport type FarmDevtoolsRuntime = {\n runtime: \"auto\" | \"node\" | \"edge\";\n regions?: string[];\n maxDuration?: number;\n};\n\nexport type FarmDevtoolsDiagnostic = {\n severity: \"error\" | \"warning\" | \"info\";\n code: string;\n title: string;\n message: string;\n action?: string;\n};\n\nexport type FarmDevtoolsSnapshot = {\n generatedAt: string;\n health: \"ready\" | \"attention\" | \"error\";\n project: {\n name: string;\n root: string;\n srcDir: string;\n basePath: string;\n deploymentId: string;\n };\n deployment: {\n target: string;\n preset: string;\n outputDir?: string;\n };\n counts: {\n pages: number;\n layouts: number;\n loadingBoundaries: number;\n errorBoundaries: number;\n apiRoutes: number;\n middleware: number;\n integrations: number;\n storageMounts: number;\n cronJobs: number;\n workflows: number;\n layers: number;\n diagnostics: number;\n };\n routes: Array<{\n kind: \"page\" | \"layout\" | \"loading\" | \"error\";\n pattern: string;\n filePath: string;\n runtime?: FarmDevtoolsRuntime;\n }>;\n apiRoutes: Array<{\n path: string;\n methods: string[];\n filePath: string;\n runtime: FarmDevtoolsRuntime;\n }>;\n middleware: Array<{\n path: string;\n source: \"config\" | \"file\";\n filePath: string;\n handlerCount: number;\n }>;\n integrations: Array<{\n key: string;\n type: string;\n category: string;\n serverRuntime: boolean;\n routes: Array<{ path: string; methods: string[] }>;\n middlewareCount: number;\n providerCount: number;\n schemaModelCount: number;\n }>;\n storage: Array<{\n mount: string;\n driver: string;\n default: boolean;\n }>;\n cron: FarmCronJob[];\n workflows: Array<{\n id: string;\n filePath: string;\n routePath: string;\n schedule: string[];\n timezone?: string;\n }>;\n layers: Array<{\n name: string;\n source: string;\n srcDir: string;\n }>;\n environment: {\n server: string[];\n public: string[];\n };\n docs: {\n enabled: boolean;\n entry?: string;\n };\n features: {\n openapi: boolean;\n markdown: boolean;\n serverComponents: boolean;\n serverActions: boolean;\n optimizedBoundary: boolean;\n observability: boolean;\n };\n diagnostics: FarmDevtoolsDiagnostic[];\n};\n\nexport interface CreateFarmDevtoolsSnapshotInput {\n root: string;\n srcDir: string;\n routeManager: RouteManagerLike;\n apiRouteManager: APIRouteManagerLike;\n middlewareManager: MiddlewareManagerLike;\n config?: FarmConfig & { openapi?: { enabled?: boolean } };\n workflows?: readonly FarmDiscoveredWorkflow[];\n now?: () => Date;\n env?: Record<string, string | undefined>;\n}\n\nfunction normalizePath(value: string): string {\n return value.replace(/\\\\/g, \"/\");\n}\n\nfunction toProjectPath(root: string, filePath: string): string {\n const normalizedRoot = normalizePath(root).replace(/\\/$/, \"\");\n const normalizedFile = normalizePath(filePath);\n if (normalizedFile.startsWith(normalizedRoot + \"/\")) {\n return normalizedFile.slice(normalizedRoot.length + 1);\n }\n return normalizedFile;\n}\n\nfunction sortByPath<T extends { path?: string; pattern?: string }>(items: T[]): T[] {\n return [...items].sort((a, b) =>\n (a.path || a.pattern || \"\").localeCompare(b.path || b.pattern || \"\"),\n );\n}\n\nfunction toRuntime(value: ResolvedFarmRouteRuntimeConfig): FarmDevtoolsRuntime {\n return {\n runtime: value.runtime,\n ...(value.regions ? { regions: [...value.regions] } : {}),\n ...(value.maxDuration ? { maxDuration: value.maxDuration } : {}),\n };\n}\n\nasync function collectRoutes(\n root: string,\n kind: FarmDevtoolsSnapshot[\"routes\"][number][\"kind\"],\n routes: Map<string, RouteMapEntry>,\n routeManager: RouteManagerLike,\n diagnostics: FarmDevtoolsDiagnostic[],\n): Promise<FarmDevtoolsSnapshot[\"routes\"]> {\n return Promise.all(\n Array.from(routes.values()).map(async (route) => {\n let runtime: FarmDevtoolsRuntime | undefined;\n if (kind === \"page\" && routeManager.resolveRouteRuntimeConfig) {\n try {\n runtime = toRuntime(await routeManager.resolveRouteRuntimeConfig(route.pattern));\n } catch (error) {\n diagnostics.push({\n severity: \"warning\",\n code: \"ROUTE_RUNTIME_UNRESOLVED\",\n title: `Could not inspect ${route.pattern}`,\n message: error instanceof Error ? error.message : String(error),\n action: \"Check the route and inherited layout runtime exports.\",\n });\n }\n }\n\n return {\n kind,\n pattern: route.pattern,\n filePath: toProjectPath(root, route.modulePath),\n ...(runtime ? { runtime } : {}),\n };\n }),\n );\n}\n\nfunction collectIntegrations(integrations: FarmConfig[\"integrations\"] | undefined) {\n if (!integrations || typeof integrations !== \"object\") return [];\n\n return Object.entries(integrations)\n .filter((entry): entry is [string, NonNullable<(typeof entry)[1]>] => Boolean(entry[1]))\n .map(([key, value]) => {\n const integration = value as IntegrationLike;\n const routes = (integration.routes || []).map((route) => ({\n path: route.path,\n methods: [...(route.methods || (route.method ? [route.method] : [\"ALL\"]))]\n .map((method) => method.toUpperCase())\n .sort(),\n }));\n\n return {\n key,\n type: integration.type || key,\n category: integration.category || \"custom\",\n serverRuntime: integration.serverRuntime !== false,\n routes: sortByPath(routes),\n middlewareCount: integration.middleware?.length || 0,\n providerCount: integration.providers?.length || 0,\n schemaModelCount: Object.keys(integration.schema?.models || {}).length,\n };\n })\n .sort((a, b) => a.key.localeCompare(b.key));\n}\n\nfunction collectStorage(storage: FarmConfig[\"storage\"] | undefined): {\n entries: FarmDevtoolsSnapshot[\"storage\"];\n configured: boolean;\n} {\n if (!storage || typeof storage !== \"object\") {\n return {\n entries: [{ mount: \"root\", driver: \"memory\", default: true }],\n configured: false,\n };\n }\n\n const value = storage as Record<string, any>;\n if (value.kind === \"farm-storage-client\") {\n return {\n entries: [{ mount: \"root\", driver: \"storage client\", default: false }],\n configured: true,\n };\n }\n\n const configured = Object.keys(value).length > 0;\n const rootDriver = value.client\n ? describeStorageDriver(value.client)\n : describeStorageDriver(value.driver);\n const entries: FarmDevtoolsSnapshot[\"storage\"] = [\n {\n mount: \"root\",\n driver: rootDriver,\n default: !configured,\n },\n ];\n\n if (value.mounts && typeof value.mounts === \"object\") {\n for (const [mount, mountConfig] of Object.entries(value.mounts)) {\n entries.push({\n mount,\n driver: describeStorageDriver(mountConfig),\n default: false,\n });\n }\n }\n\n return {\n entries: entries.sort((a, b) => {\n if (a.mount === \"root\") return -1;\n if (b.mount === \"root\") return 1;\n return a.mount.localeCompare(b.mount);\n }),\n configured,\n };\n}\n\nfunction describeStorageDriver(value: unknown): string {\n if (!value) return \"memory\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"function\") return \"custom\";\n if (typeof value !== \"object\") return \"custom\";\n\n const record = value as Record<string, unknown>;\n if (record.kind === \"farm-storage-client\") return \"storage client\";\n if (typeof record.driver === \"string\") return record.driver;\n if (typeof record.driver === \"function\") return \"custom\";\n return \"custom\";\n}\n\nfunction featureEnabled(value: unknown): boolean {\n if (!value) return false;\n if (typeof value === \"object\" && \"enabled\" in value) {\n return (value as { enabled?: boolean }).enabled !== false;\n }\n return value !== false;\n}\n\nfunction collectEnvironmentKeys(config: FarmConfig | undefined) {\n const env = config?.env as\n | { server?: Record<string, unknown>; public?: Record<string, unknown> }\n | undefined;\n return {\n server: Object.keys(env?.server || {}).sort(),\n public: Object.keys(env?.public || {}).sort(),\n };\n}\n\nfunction resolveHealth(diagnostics: FarmDevtoolsDiagnostic[]): FarmDevtoolsSnapshot[\"health\"] {\n if (diagnostics.some((diagnostic) => diagnostic.severity === \"error\")) return \"error\";\n if (diagnostics.some((diagnostic) => diagnostic.severity === \"warning\")) return \"attention\";\n return \"ready\";\n}\n\nexport async function createFarmDevtoolsSnapshot(\n input: CreateFarmDevtoolsSnapshotInput,\n): Promise<FarmDevtoolsSnapshot> {\n const config = input.config || {};\n const diagnostics: FarmDevtoolsDiagnostic[] = [];\n const pageRoutes = await collectRoutes(\n input.root,\n \"page\",\n input.routeManager.getRoutes(),\n input.routeManager,\n diagnostics,\n );\n const layoutRoutes = await collectRoutes(\n input.root,\n \"layout\",\n input.routeManager.getLayouts(),\n input.routeManager,\n diagnostics,\n );\n const loadingRoutes = await collectRoutes(\n input.root,\n \"loading\",\n input.routeManager.getLoadings(),\n input.routeManager,\n diagnostics,\n );\n const errorRoutes = await collectRoutes(\n input.root,\n \"error\",\n input.routeManager.getErrors(),\n input.routeManager,\n diagnostics,\n );\n const apiRoutes = sortByPath(\n Array.from(input.apiRouteManager.getRoutes().values()).map((route) => {\n const runtime = resolveFarmRouteRuntimeConfig(\n mergeFarmRouteRuntimeConfigs(\n resolveFarmRouteRuleRuntimeConfig(route.path, config.routeRules),\n route,\n ),\n `API route \"${route.path}\"`,\n );\n return {\n path: route.path,\n methods: [...route.methods].sort(),\n filePath: toProjectPath(input.root, route.filePath),\n runtime: toRuntime(runtime),\n };\n }),\n );\n const middleware = sortByPath(\n input.middlewareManager.getMiddlewares().map((entry) => ({\n path: entry.path,\n source: entry.source || \"file\",\n filePath: toProjectPath(input.root, entry.filePath),\n handlerCount: entry.handlers.length,\n })),\n );\n const integrations = collectIntegrations(config.integrations);\n const storage = collectStorage(config.storage);\n const cron = resolveCronConfig(config.cron);\n const workflows = (input.workflows || [])\n .map((workflow) => ({\n id: workflow.id,\n filePath: toProjectPath(input.root, workflow.filePath),\n routePath: workflow.routePath,\n schedule: [...workflow.schedule],\n ...(workflow.timezone ? { timezone: workflow.timezone } : {}),\n }))\n .sort((a, b) => a.id.localeCompare(b.id));\n const layers = (config.layers || []).map((layer) => ({\n name: layer.name,\n source: layer.source,\n srcDir: layer.srcDir,\n }));\n const deploymentPreset = String(config.deploy?.preset || config.preset || \"node-server\");\n const deploymentTarget = String(\n config.deploy?.target || getDeployTargetForPreset(deploymentPreset) || \"node\",\n );\n const env = input.env || process.env;\n\n if (pageRoutes.length === 0) {\n diagnostics.push({\n severity: \"warning\",\n code: \"NO_PAGE_ROUTES\",\n title: \"No page routes found\",\n message: `Farm did not discover a page under ${input.srcDir}/app.`,\n action: `Add ${input.srcDir}/app/page.tsx or a programmatic page route.`,\n });\n }\n if (layoutRoutes.length === 0) {\n diagnostics.push({\n severity: \"warning\",\n code: \"ROOT_LAYOUT_MISSING\",\n title: \"Root layout is missing\",\n message: \"The application has no shared root layout.\",\n action: `Add ${input.srcDir}/app/layout.tsx for shared metadata and application chrome.`,\n });\n }\n\n const apiPaths = new Set(apiRoutes.map((route) => route.path));\n for (const job of cron.jobs) {\n if (!apiPaths.has(job.path)) {\n diagnostics.push({\n severity: \"warning\",\n code: \"CRON_ROUTE_MISSING\",\n title: `Cron route ${job.path} was not found`,\n message: `${job.name} is scheduled, but its GET API route is not registered.`,\n action: \"Add the target API route or update the cron path in farm.config.ts.\",\n });\n }\n }\n if (cron.jobs.length > 0 && !env[cron.secretEnv]) {\n diagnostics.push({\n severity: \"info\",\n code: \"CRON_SECRET_NOT_SET\",\n title: `${cron.secretEnv} is not set`,\n message: \"Local manual runs remain available, but production cron routes fail closed.\",\n action: `Set ${cron.secretEnv} in the deployment environment before production.`,\n });\n }\n if (\n storage.configured &&\n storage.entries[0]?.driver === \"memory\" &&\n [\"vercel\", \"cloudflare\", \"netlify\"].includes(deploymentTarget)\n ) {\n diagnostics.push({\n severity: \"warning\",\n code: \"EPHEMERAL_PRODUCTION_STORAGE\",\n title: \"Production storage is in memory\",\n message: `${deploymentTarget} instances do not preserve in-memory data across executions.`,\n action: \"Configure a durable storage driver or mount for production state.\",\n });\n }\n\n const environment = collectEnvironmentKeys(config);\n const docs = config.docs;\n const docsEnabled = featureEnabled(docs);\n const allRoutes = sortByPath([...pageRoutes, ...layoutRoutes, ...loadingRoutes, ...errorRoutes]);\n\n return {\n generatedAt: (input.now?.() || new Date()).toISOString(),\n health: resolveHealth(diagnostics),\n project: {\n name: path.basename(path.resolve(input.root)),\n root: input.root,\n srcDir: input.srcDir,\n basePath: config.basePath || \"/\",\n deploymentId: config.deploymentId || \"development\",\n },\n deployment: {\n target: deploymentTarget,\n preset: deploymentPreset,\n ...(config.deploy?.outputDir ? { outputDir: config.deploy.outputDir } : {}),\n },\n counts: {\n pages: pageRoutes.length,\n layouts: layoutRoutes.length,\n loadingBoundaries: loadingRoutes.length,\n errorBoundaries: errorRoutes.length,\n apiRoutes: apiRoutes.length,\n middleware: middleware.length,\n integrations: integrations.length,\n storageMounts: storage.entries.length,\n cronJobs: cron.jobs.length,\n workflows: workflows.length,\n layers: layers.length,\n diagnostics: diagnostics.length,\n },\n routes: allRoutes,\n apiRoutes,\n middleware,\n integrations,\n storage: storage.entries,\n cron: cron.jobs,\n workflows,\n layers,\n environment,\n docs: {\n enabled: docsEnabled,\n entry:\n docsEnabled && docs && typeof docs === \"object\" && \"entry\" in docs\n ? String(docs.entry)\n : undefined,\n },\n features: {\n openapi: Boolean(config.openapi?.enabled),\n markdown: featureEnabled(config.md),\n serverComponents: Boolean(config.experimental?.serverComponents),\n serverActions: Boolean(config.experimental?.serverActions),\n optimizedBoundary: Boolean(config.experimental?.optimizedBoundary),\n observability: featureEnabled(config.observability),\n },\n diagnostics,\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/devtools.ts"],"sourcesContent":["import path from \"node:path\";\nimport { getDeployTargetForPreset } from \"./config\";\nimport { resolveCronConfig, type FarmCronJob } from \"./cron\";\nimport {\n mergeFarmRouteRuntimeConfigs,\n resolveFarmRouteRuleRuntimeConfig,\n resolveFarmRouteRuntimeConfig,\n type ResolvedFarmRouteRuntimeConfig,\n} from \"./route-runtime\";\nimport type { FarmConfig } from \"./types\";\nimport type { FarmDiscoveredWorkflow } from \"./workflows\";\n\ntype RouteMapEntry = {\n pattern: string;\n modulePath: string;\n};\n\ntype RouteManagerLike = {\n getRoutes(): Map<string, RouteMapEntry>;\n getLayouts(): Map<string, RouteMapEntry>;\n getLoadings(): Map<string, RouteMapEntry>;\n getErrors(): Map<string, RouteMapEntry>;\n resolveRouteRuntimeConfig?(\n pattern: string,\n ): Promise<ResolvedFarmRouteRuntimeConfig> | ResolvedFarmRouteRuntimeConfig;\n};\n\ntype APIRouteManagerLike = {\n getRoutes(): Map<\n string,\n {\n path: string;\n filePath: string;\n methods: string[];\n runtime?: \"auto\" | \"node\" | \"edge\";\n regions?: \"auto\" | readonly string[];\n maxDuration?: \"auto\" | number;\n }\n >;\n};\n\ntype MiddlewareManagerLike = {\n getMiddlewares(): Array<{\n path: string;\n filePath: string;\n handlers: unknown[];\n source?: \"config\" | \"file\";\n }>;\n};\n\ntype IntegrationLike = {\n kind?: string;\n type?: string;\n category?: string;\n serverRuntime?: boolean;\n routes?: ReadonlyArray<{\n path: string;\n method?: string;\n methods?: readonly string[];\n }>;\n middleware?: readonly unknown[];\n providers?: readonly unknown[];\n schema?: {\n models?: Record<string, unknown>;\n };\n};\n\nexport type FarmDevtoolsRuntime = {\n runtime: \"auto\" | \"node\" | \"edge\";\n regions?: string[];\n maxDuration?: number;\n};\n\nexport type FarmDevtoolsDiagnostic = {\n severity: \"error\" | \"warning\" | \"info\";\n code: string;\n title: string;\n message: string;\n action?: string;\n};\n\nexport type FarmDevtoolsSnapshot = {\n generatedAt: string;\n health: \"ready\" | \"attention\" | \"error\";\n project: {\n name: string;\n root: string;\n srcDir: string;\n basePath: string;\n deploymentId: string;\n };\n deployment: {\n target: string;\n preset: string;\n outputDir?: string;\n };\n counts: {\n pages: number;\n layouts: number;\n loadingBoundaries: number;\n errorBoundaries: number;\n apiRoutes: number;\n middleware: number;\n integrations: number;\n storageMounts: number;\n cronJobs: number;\n workflows: number;\n layers: number;\n diagnostics: number;\n };\n routes: Array<{\n kind: \"page\" | \"layout\" | \"loading\" | \"error\";\n pattern: string;\n filePath: string;\n runtime?: FarmDevtoolsRuntime;\n }>;\n apiRoutes: Array<{\n path: string;\n methods: string[];\n filePath: string;\n runtime: FarmDevtoolsRuntime;\n }>;\n middleware: Array<{\n path: string;\n source: \"config\" | \"file\";\n filePath: string;\n handlerCount: number;\n }>;\n integrations: Array<{\n key: string;\n type: string;\n category: string;\n serverRuntime: boolean;\n routes: Array<{ path: string; methods: string[] }>;\n middlewareCount: number;\n providerCount: number;\n schemaModelCount: number;\n }>;\n storage: Array<{\n mount: string;\n driver: string;\n default: boolean;\n }>;\n cron: FarmCronJob[];\n workflows: Array<{\n id: string;\n filePath: string;\n routePath: string;\n schedule: string[];\n timezone?: string;\n }>;\n layers: Array<{\n name: string;\n source: string;\n srcDir: string;\n }>;\n environment: {\n server: string[];\n public: string[];\n };\n docs: {\n enabled: boolean;\n entry?: string;\n };\n features: {\n openapi: boolean;\n markdown: boolean;\n serverComponents: boolean;\n serverActions: boolean;\n optimizedBoundary: boolean;\n observability: boolean;\n };\n diagnostics: FarmDevtoolsDiagnostic[];\n};\n\nexport interface CreateFarmDevtoolsSnapshotInput {\n root: string;\n srcDir: string;\n routeManager: RouteManagerLike;\n apiRouteManager: APIRouteManagerLike;\n middlewareManager: MiddlewareManagerLike;\n config?: FarmConfig & { openapi?: { enabled?: boolean } };\n workflows?: readonly FarmDiscoveredWorkflow[];\n now?: () => Date;\n env?: Record<string, string | undefined>;\n}\n\nfunction normalizePath(value: string): string {\n return value.replace(/\\\\/g, \"/\");\n}\n\nfunction toProjectPath(root: string, filePath: string): string {\n const normalizedRoot = normalizePath(root).replace(/\\/$/, \"\");\n const normalizedFile = normalizePath(filePath);\n if (normalizedFile.startsWith(normalizedRoot + \"/\")) {\n return normalizedFile.slice(normalizedRoot.length + 1);\n }\n return normalizedFile;\n}\n\nfunction sortByPath<T extends { path?: string; pattern?: string }>(items: T[]): T[] {\n return [...items].sort((a, b) =>\n (a.path || a.pattern || \"\").localeCompare(b.path || b.pattern || \"\"),\n );\n}\n\nfunction toRuntime(value: ResolvedFarmRouteRuntimeConfig): FarmDevtoolsRuntime {\n return {\n runtime: value.runtime,\n ...(value.regions ? { regions: [...value.regions] } : {}),\n ...(value.maxDuration ? { maxDuration: value.maxDuration } : {}),\n };\n}\n\nasync function collectRoutes(\n root: string,\n kind: FarmDevtoolsSnapshot[\"routes\"][number][\"kind\"],\n routes: Map<string, RouteMapEntry>,\n routeManager: RouteManagerLike,\n diagnostics: FarmDevtoolsDiagnostic[],\n): Promise<FarmDevtoolsSnapshot[\"routes\"]> {\n return Promise.all(\n Array.from(routes.values()).map(async (route) => {\n let runtime: FarmDevtoolsRuntime | undefined;\n if (kind === \"page\" && routeManager.resolveRouteRuntimeConfig) {\n try {\n runtime = toRuntime(await routeManager.resolveRouteRuntimeConfig(route.pattern));\n } catch (error) {\n diagnostics.push({\n severity: \"warning\",\n code: \"ROUTE_RUNTIME_UNRESOLVED\",\n title: `Could not inspect ${route.pattern}`,\n message: error instanceof Error ? error.message : String(error),\n action: \"Check the route and inherited layout runtime exports.\",\n });\n }\n }\n\n return {\n kind,\n pattern: route.pattern,\n filePath: toProjectPath(root, route.modulePath),\n ...(runtime ? { runtime } : {}),\n };\n }),\n );\n}\n\nfunction collectIntegrations(integrations: FarmConfig[\"integrations\"] | undefined) {\n if (!integrations || typeof integrations !== \"object\") return [];\n\n return Object.entries(integrations)\n .filter((entry): entry is [string, NonNullable<(typeof entry)[1]>] => Boolean(entry[1]))\n .map(([key, value]) => {\n const integration = value as IntegrationLike;\n const routes = (integration.routes || []).map((route) => ({\n path: route.path,\n methods: [...(route.methods || (route.method ? [route.method] : [\"ALL\"]))]\n .map((method) => method.toUpperCase())\n .sort(),\n }));\n\n return {\n key,\n type: integration.type || key,\n category: integration.category || \"custom\",\n serverRuntime: integration.serverRuntime !== false,\n routes: sortByPath(routes),\n middlewareCount: integration.middleware?.length || 0,\n providerCount: integration.providers?.length || 0,\n schemaModelCount: Object.keys(integration.schema?.models || {}).length,\n };\n })\n .sort((a, b) => a.key.localeCompare(b.key));\n}\n\nfunction collectStorage(storage: FarmConfig[\"storage\"] | undefined): {\n entries: FarmDevtoolsSnapshot[\"storage\"];\n configured: boolean;\n} {\n if (!storage || typeof storage !== \"object\") {\n return {\n entries: [{ mount: \"root\", driver: \"memory\", default: true }],\n configured: false,\n };\n }\n\n const value = storage as Record<string, any>;\n if (value.kind === \"farm-storage-client\") {\n return {\n entries: [{ mount: \"root\", driver: \"storage client\", default: false }],\n configured: true,\n };\n }\n\n const configured = Object.keys(value).length > 0;\n const rootDriver = value.client\n ? describeStorageDriver(value.client)\n : describeStorageDriver(value.driver);\n const entries: FarmDevtoolsSnapshot[\"storage\"] = [\n {\n mount: \"root\",\n driver: rootDriver,\n default: !configured,\n },\n ];\n\n if (value.mounts && typeof value.mounts === \"object\") {\n for (const [mount, mountConfig] of Object.entries(value.mounts)) {\n entries.push({\n mount,\n driver: describeStorageDriver(mountConfig),\n default: false,\n });\n }\n }\n\n return {\n entries: entries.sort((a, b) => {\n if (a.mount === \"root\") return -1;\n if (b.mount === \"root\") return 1;\n return a.mount.localeCompare(b.mount);\n }),\n configured,\n };\n}\n\nfunction describeStorageDriver(value: unknown): string {\n if (!value) return \"memory\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"function\") return \"custom\";\n if (typeof value !== \"object\") return \"custom\";\n\n const record = value as Record<string, unknown>;\n if (record.kind === \"farm-storage-client\") return \"storage client\";\n if (typeof record.driver === \"string\") return record.driver;\n if (typeof record.driver === \"function\") return \"custom\";\n return \"custom\";\n}\n\nfunction featureEnabled(value: unknown): boolean {\n if (!value) return false;\n if (typeof value === \"object\" && \"enabled\" in value) {\n return (value as { enabled?: boolean }).enabled !== false;\n }\n return value !== false;\n}\n\nfunction collectEnvironmentKeys(config: FarmConfig | undefined) {\n const env = config?.env as\n | { server?: Record<string, unknown>; public?: Record<string, unknown> }\n | undefined;\n return {\n server: Object.keys(env?.server || {}).sort(),\n public: Object.keys(env?.public || {}).sort(),\n };\n}\n\nfunction resolveHealth(diagnostics: FarmDevtoolsDiagnostic[]): FarmDevtoolsSnapshot[\"health\"] {\n if (diagnostics.some((diagnostic) => diagnostic.severity === \"error\")) return \"error\";\n if (diagnostics.some((diagnostic) => diagnostic.severity === \"warning\")) return \"attention\";\n return \"ready\";\n}\n\nexport async function createFarmDevtoolsSnapshot(\n input: CreateFarmDevtoolsSnapshotInput,\n): Promise<FarmDevtoolsSnapshot> {\n const config = input.config || {};\n const diagnostics: FarmDevtoolsDiagnostic[] = [];\n const pageRoutes = await collectRoutes(\n input.root,\n \"page\",\n input.routeManager.getRoutes(),\n input.routeManager,\n diagnostics,\n );\n const layoutRoutes = await collectRoutes(\n input.root,\n \"layout\",\n input.routeManager.getLayouts(),\n input.routeManager,\n diagnostics,\n );\n const loadingRoutes = await collectRoutes(\n input.root,\n \"loading\",\n input.routeManager.getLoadings(),\n input.routeManager,\n diagnostics,\n );\n const errorRoutes = await collectRoutes(\n input.root,\n \"error\",\n input.routeManager.getErrors(),\n input.routeManager,\n diagnostics,\n );\n const apiRoutes = sortByPath(\n Array.from(input.apiRouteManager.getRoutes().values()).map((route) => {\n const runtime = resolveFarmRouteRuntimeConfig(\n mergeFarmRouteRuntimeConfigs(\n resolveFarmRouteRuleRuntimeConfig(route.path, config.routeRules),\n route,\n ),\n `API route \"${route.path}\"`,\n );\n return {\n path: route.path,\n methods: [...route.methods].sort(),\n filePath: toProjectPath(input.root, route.filePath),\n runtime: toRuntime(runtime),\n };\n }),\n );\n const middleware = sortByPath(\n input.middlewareManager.getMiddlewares().map((entry) => ({\n path: entry.path,\n source: entry.source || \"file\",\n filePath: toProjectPath(input.root, entry.filePath),\n handlerCount: entry.handlers.length,\n })),\n );\n const integrations = collectIntegrations(config.integrations);\n const storage = collectStorage(config.storage);\n const cron = resolveCronConfig(config.cron);\n const workflows = (input.workflows || [])\n .map((workflow) => ({\n id: workflow.id,\n filePath: toProjectPath(input.root, workflow.filePath),\n routePath: workflow.routePath,\n schedule: [...workflow.schedule],\n ...(workflow.timezone ? { timezone: workflow.timezone } : {}),\n }))\n .sort((a, b) => a.id.localeCompare(b.id));\n const layers = (config.layers || []).map((layer) => ({\n name: layer.name,\n source: layer.source,\n srcDir: layer.srcDir,\n }));\n const deploymentPreset = String(config.deploy?.preset || config.preset || \"node-server\");\n const deploymentTarget = String(\n config.deploy?.target || getDeployTargetForPreset(deploymentPreset) || \"node\",\n );\n const env = input.env || process.env;\n\n if (pageRoutes.length === 0) {\n diagnostics.push({\n severity: \"warning\",\n code: \"NO_PAGE_ROUTES\",\n title: \"No page routes found\",\n message: `Farm did not discover a page under ${input.srcDir}/app.`,\n action: `Add ${input.srcDir}/app/page.tsx or a programmatic page route.`,\n });\n }\n if (layoutRoutes.length === 0) {\n diagnostics.push({\n severity: \"warning\",\n code: \"ROOT_LAYOUT_MISSING\",\n title: \"Root layout is missing\",\n message: \"The application has no shared root layout.\",\n action: `Add ${input.srcDir}/app/layout.tsx for shared metadata and application chrome.`,\n });\n }\n\n const apiPaths = new Set(apiRoutes.map((route) => route.path));\n for (const job of cron.jobs) {\n if (!apiPaths.has(job.path)) {\n diagnostics.push({\n severity: \"warning\",\n code: \"CRON_ROUTE_MISSING\",\n title: `Cron route ${job.path} was not found`,\n message: `${job.name} is scheduled, but its GET API route is not registered.`,\n action: \"Add the target API route or update the cron path in farm.config.ts.\",\n });\n }\n }\n if (cron.jobs.length > 0 && !env[cron.secretEnv]) {\n diagnostics.push({\n severity: \"info\",\n code: \"CRON_SECRET_NOT_SET\",\n title: `${cron.secretEnv} is not set`,\n message: \"Local manual runs remain available, but production cron routes fail closed.\",\n action: `Set ${cron.secretEnv} in the deployment environment before production.`,\n });\n }\n if (\n storage.configured &&\n storage.entries[0]?.driver === \"memory\" &&\n [\"vercel\", \"cloudflare\", \"netlify\"].includes(deploymentTarget)\n ) {\n diagnostics.push({\n severity: \"warning\",\n code: \"EPHEMERAL_PRODUCTION_STORAGE\",\n title: \"Production storage is in memory\",\n message: `${deploymentTarget} instances do not preserve in-memory data across executions.`,\n action: \"Configure a durable storage driver or mount for production state.\",\n });\n }\n\n const environment = collectEnvironmentKeys(config);\n const docs = config.docs;\n const docsEnabled = featureEnabled(docs);\n const allRoutes = sortByPath([...pageRoutes, ...layoutRoutes, ...loadingRoutes, ...errorRoutes]);\n\n return {\n generatedAt: (input.now?.() || new Date()).toISOString(),\n health: resolveHealth(diagnostics),\n project: {\n name: path.basename(path.resolve(input.root)),\n root: input.root,\n srcDir: input.srcDir,\n basePath: config.basePath || \"/\",\n deploymentId: config.deploymentId || \"development\",\n },\n deployment: {\n target: deploymentTarget,\n preset: deploymentPreset,\n ...(config.deploy?.outputDir ? { outputDir: config.deploy.outputDir } : {}),\n },\n counts: {\n pages: pageRoutes.length,\n layouts: layoutRoutes.length,\n loadingBoundaries: loadingRoutes.length,\n errorBoundaries: errorRoutes.length,\n apiRoutes: apiRoutes.length,\n middleware: middleware.length,\n integrations: integrations.length,\n storageMounts: storage.entries.length,\n cronJobs: cron.jobs.length,\n workflows: workflows.length,\n layers: layers.length,\n diagnostics: diagnostics.length,\n },\n routes: allRoutes,\n apiRoutes,\n middleware,\n integrations,\n storage: storage.entries,\n cron: cron.jobs,\n workflows,\n layers,\n environment,\n docs: {\n enabled: docsEnabled,\n entry:\n docsEnabled && docs && typeof docs === \"object\" && \"entry\" in docs\n ? String(docs.entry)\n : undefined,\n },\n features: {\n openapi: Boolean(config.openapi?.enabled),\n markdown: featureEnabled(config.md),\n serverComponents: Boolean(config.experimental?.serverComponents),\n serverActions: Boolean(config.experimental?.serverActions),\n optimizedBoundary: Boolean(config.experimental?.optimizedBoundary),\n observability: featureEnabled(config.observability),\n },\n diagnostics,\n };\n}\n"],"mappings":"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","names":[]}
@@ -10,16 +10,7 @@ import {
10
10
  function parseShortcut(shortcut) {
11
11
  const tokens = shortcut.toLowerCase().split("+").map((token) => token.trim()).filter(Boolean);
12
12
  const key = tokens.find(
13
- (token) => ![
14
- "alt",
15
- "ctrl",
16
- "control",
17
- "meta",
18
- "cmd",
19
- "command",
20
- "mod",
21
- "shift"
22
- ].includes(token)
13
+ (token) => !["alt", "ctrl", "control", "meta", "cmd", "command", "mod", "shift"].includes(token)
23
14
  );
24
15
  if (!key) {
25
16
  return null;
@@ -222,4 +213,4 @@ __name(generateFarmDevtoolsClientRuntime, "generateFarmDevtoolsClientRuntime");
222
213
  export {
223
214
  generateFarmDevtoolsClientRuntime
224
215
  };
225
- //# sourceMappingURL=devtools-client-6WPY2AQU.mjs.map
216
+ //# sourceMappingURL=devtools-client-3XRTBND5.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/devtools-client.ts"],"sourcesContent":["import {\n FARM_DEVTOOLS_LAUNCH_PARAM,\n FARM_DEVTOOLS_PATH,\n type ResolvedFarmDevtoolsConfig,\n} from \"./devtools-config\";\n\ntype ParsedShortcut = {\n key: string;\n alt: boolean;\n ctrl: boolean;\n meta: boolean;\n mod: boolean;\n shift: boolean;\n};\n\nfunction parseShortcut(shortcut: string): ParsedShortcut | null {\n const tokens = shortcut\n .toLowerCase()\n .split(\"+\")\n .map((token) => token.trim())\n .filter(Boolean);\n const key = tokens.find(\n (token) =>\n ![\"alt\", \"ctrl\", \"control\", \"meta\", \"cmd\", \"command\", \"mod\", \"shift\"].includes(token),\n );\n\n if (!key) {\n return null;\n }\n\n return {\n key,\n alt: tokens.includes(\"alt\"),\n ctrl: tokens.includes(\"ctrl\") || tokens.includes(\"control\"),\n meta: tokens.includes(\"meta\") || tokens.includes(\"cmd\") || tokens.includes(\"command\"),\n mod: tokens.includes(\"mod\"),\n shift: tokens.includes(\"shift\"),\n };\n}\n\nexport function generateFarmDevtoolsClientRuntime(config: ResolvedFarmDevtoolsConfig): string {\n if (!config.enabled) {\n return \"\";\n }\n\n const shortcut = config.shortcut ? parseShortcut(config.shortcut) : null;\n const overlayStyles = `\n #__farm_devtools_overlay__ {\n position: fixed;\n inset: 0;\n z-index: 2147483646;\n display: grid;\n place-items: center;\n padding: 20px;\n background: rgb(0 0 0 / 0);\n backdrop-filter: blur(0);\n opacity: 0;\n pointer-events: none;\n transition: background-color 150ms ease-out, backdrop-filter 150ms ease-out, opacity 150ms ease-out;\n }\n #__farm_devtools_overlay__[data-open=\"true\"] {\n background: rgb(0 0 0 / 0.12);\n backdrop-filter: blur(1px);\n opacity: 1;\n pointer-events: auto;\n }\n #__farm_devtools_overlay__ > iframe {\n display: block;\n width: min(960px, calc(100vw - 40px));\n height: min(560px, calc(100dvh - 40px));\n border: 0;\n border-radius: 12px;\n background: transparent;\n box-shadow: 0 24px 80px rgb(0 0 0 / 0.48), 0 4px 18px rgb(0 0 0 / 0.24);\n transform: scale(0.985) translateY(4px);\n transition: transform 150ms ease-out;\n }\n #__farm_devtools_overlay__[data-open=\"true\"] > iframe {\n transform: scale(1) translateY(0);\n }\n @media (max-width: 700px) {\n #__farm_devtools_overlay__ { padding: 8px; }\n #__farm_devtools_overlay__ > iframe {\n width: calc(100vw - 16px);\n height: calc(100dvh - 16px);\n border-radius: 10px;\n }\n }\n @media (prefers-reduced-motion: reduce) {\n #__farm_devtools_overlay__, #__farm_devtools_overlay__ > iframe { transition: none; }\n }\n `;\n\n return `\n(() => {\n const overlayId = \"__farm_devtools_overlay__\";\n const styleId = \"__farm_devtools_overlay_styles__\";\n const runtimeKey = \"__FARM_DEVTOOLS_RUNTIME__\";\n const launchParam = ${JSON.stringify(FARM_DEVTOOLS_LAUNCH_PARAM)};\n const devtoolsPath = ${JSON.stringify(FARM_DEVTOOLS_PATH)};\n const validViews = new Set([\"overview\", \"routes\", \"api\", \"systems\", \"runtime\", \"raw\"]);\n const shortcut = ${JSON.stringify(shortcut)};\n const isMac = /Mac|iPhone|iPad|iPod/.test(navigator.platform);\n let returnFocus = null;\n\n const matchesShortcut = (event) => {\n if (!shortcut || event.repeat) return false;\n const expectedCtrl = shortcut.ctrl || (shortcut.mod && !isMac);\n const expectedMeta = shortcut.meta || (shortcut.mod && isMac);\n if (\n Boolean(event.altKey) !== shortcut.alt ||\n Boolean(event.ctrlKey) !== expectedCtrl ||\n Boolean(event.metaKey) !== expectedMeta ||\n Boolean(event.shiftKey) !== shortcut.shift\n ) return false;\n\n if (shortcut.key === \".\" || shortcut.key === \"period\") return event.code === \"Period\";\n if (shortcut.key === \",\" || shortcut.key === \"comma\") return event.code === \"Comma\";\n if (shortcut.key === \"/\" || shortcut.key === \"slash\") return event.code === \"Slash\";\n return String(event.key || \"\").toLowerCase() === shortcut.key;\n };\n\n const ensureStyles = () => {\n if (document.getElementById(styleId)) return;\n const style = document.createElement(\"style\");\n style.id = styleId;\n style.textContent = ${JSON.stringify(overlayStyles)};\n document.head.appendChild(style);\n };\n\n const close = () => {\n const overlay = document.getElementById(overlayId);\n if (!overlay) return;\n const focusTarget = returnFocus;\n returnFocus = null;\n overlay.dataset.open = \"false\";\n window.setTimeout(() => {\n overlay.remove();\n focusTarget?.focus?.();\n }, 160);\n };\n\n const open = (view = \"overview\") => {\n if (document.getElementById(overlayId)) return;\n ensureStyles();\n returnFocus = document.activeElement;\n const overlay = document.createElement(\"div\");\n overlay.id = overlayId;\n overlay.setAttribute(\"aria-label\", \"Farm.js DevTools overlay\");\n const frame = document.createElement(\"iframe\");\n const resolvedView = validViews.has(view) ? view : \"overview\";\n frame.src = devtoolsPath + \"?embedded=1\" + (resolvedView === \"overview\" ? \"\" : \"#\" + resolvedView);\n frame.title = \"Farm.js DevTools\";\n frame.addEventListener(\"load\", () => frame.contentWindow?.focus(), { once: true });\n overlay.appendChild(frame);\n overlay.addEventListener(\"pointerdown\", (event) => {\n if (event.target === overlay) close();\n });\n document.body.appendChild(overlay);\n requestAnimationFrame(() => {\n overlay.dataset.open = \"true\";\n });\n };\n\n const toggle = () => {\n if (document.getElementById(overlayId)) close();\n else open();\n };\n\n const onKeydown = (event) => {\n if (event.key === \"Escape\" && document.getElementById(overlayId)) {\n event.preventDefault();\n close();\n return;\n }\n if (!matchesShortcut(event)) return;\n event.preventDefault();\n event.stopPropagation();\n toggle();\n };\n\n const onMessage = (event) => {\n if (event.origin !== location.origin) return;\n const frame = document.querySelector(\"#\" + overlayId + \" > iframe\");\n if (!frame || event.source !== frame.contentWindow) return;\n if (event.data?.type === \"farm:devtools:close\") close();\n if (event.data?.type === \"farm:devtools:keydown\" && matchesShortcut(event.data.event || {})) close();\n };\n\n window[runtimeKey]?.dispose?.();\n window.addEventListener(\"keydown\", onKeydown, true);\n window.addEventListener(\"message\", onMessage);\n window[runtimeKey] = {\n dispose() {\n window.removeEventListener(\"keydown\", onKeydown, true);\n window.removeEventListener(\"message\", onMessage);\n },\n };\n window.__FARM_DEVTOOLS__ = { open, close, toggle };\n\n const launchUrl = new URL(location.href);\n const launchRequest = launchUrl.searchParams.get(launchParam);\n if (launchRequest !== null) {\n const hashView = launchUrl.hash.slice(1);\n const launchView = validViews.has(launchRequest)\n ? launchRequest\n : validViews.has(hashView)\n ? hashView\n : \"overview\";\n launchUrl.searchParams.delete(launchParam);\n if (validViews.has(hashView)) launchUrl.hash = \"\";\n history.replaceState(\n history.state,\n \"\",\n launchUrl.pathname + launchUrl.search + launchUrl.hash,\n );\n const launch = () => requestAnimationFrame(() => open(launchView));\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", launch, { once: true });\n } else {\n launch();\n }\n }\n})();\n`;\n}\n"],"mappings":";;;;;;;;;AAeA,SAAS,cAAc,UAAyC;AAC9D,QAAM,SAAS,SACZ,YAAY,EACZ,MAAM,GAAG,EACT,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO;AACjB,QAAM,MAAM,OAAO;AAAA,IACjB,CAAC,UACC,CAAC,CAAC,OAAO,QAAQ,WAAW,QAAQ,OAAO,WAAW,OAAO,OAAO,EAAE,SAAS,KAAK;AAAA,EACxF;AAEA,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,KAAK,OAAO,SAAS,KAAK;AAAA,IAC1B,MAAM,OAAO,SAAS,MAAM,KAAK,OAAO,SAAS,SAAS;AAAA,IAC1D,MAAM,OAAO,SAAS,MAAM,KAAK,OAAO,SAAS,KAAK,KAAK,OAAO,SAAS,SAAS;AAAA,IACpF,KAAK,OAAO,SAAS,KAAK;AAAA,IAC1B,OAAO,OAAO,SAAS,OAAO;AAAA,EAChC;AACF;AAvBS;AAyBF,SAAS,kCAAkC,QAA4C;AAC5F,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,OAAO,WAAW,cAAc,OAAO,QAAQ,IAAI;AACpE,QAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+CtB,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,wBAKe,KAAK,UAAU,0BAA0B,CAAC;AAAA,yBACzC,KAAK,UAAU,kBAAkB,CAAC;AAAA;AAAA,qBAEtC,KAAK,UAAU,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAyBnB,KAAK,UAAU,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmGvD;AAzLgB;","names":[]}
package/dist/docs.cjs CHANGED
@@ -747,7 +747,9 @@ function readManifest(contentDir) {
747
747
  const manifestPath = import_node_path.default.join(contentDir, FARM_DOCS_LAST_MODIFIED_MANIFEST);
748
748
  if (!(0, import_node_fs.existsSync)(manifestPath)) return null;
749
749
  try {
750
- const parsed = JSON.parse((0, import_node_fs.readFileSync)(manifestPath, "utf8"));
750
+ const parsed = JSON.parse(
751
+ (0, import_node_fs.readFileSync)(manifestPath, "utf8")
752
+ );
751
753
  if (parsed.version !== 1 || !parsed.pages || typeof parsed.pages !== "object") return null;
752
754
  const pages = Object.fromEntries(
753
755
  Object.entries(parsed.pages).filter(
@@ -1216,8 +1218,8 @@ code:not(pre code) {
1216
1218
  }
1217
1219
 
1218
1220
  .code-block-header {
1219
- min-height: 28px;
1220
- padding: 3px 7px 3px 9px;
1221
+ min-height: 34px;
1222
+ padding: 4px 8px 4px 10px;
1221
1223
  }
1222
1224
 
1223
1225
  .code-block-title {
@@ -1431,8 +1433,8 @@ code:not(pre code) {
1431
1433
  }
1432
1434
 
1433
1435
  .code-block-header {
1434
- min-height: 26px;
1435
- padding: 2px 6px 2px 8px;
1436
+ min-height: 32px;
1437
+ padding: 3px 7px 3px 9px;
1436
1438
  }
1437
1439
 
1438
1440
  .code-copy-floating {
@@ -1472,38 +1474,30 @@ code:not(pre code) {
1472
1474
 
1473
1475
  @media (max-width: 640px) {
1474
1476
  .code-block-header {
1475
- min-height: 22px;
1476
- padding: 1px 4px 1px 7px;
1477
- }
1478
-
1479
- .code-block-title {
1480
- font-size: 9px;
1481
- }
1482
-
1483
- .code-copy {
1484
- width: 20px;
1485
- height: 20px;
1486
- }
1487
-
1488
- .code-copy svg {
1489
- width: 12px;
1490
- height: 12px;
1477
+ min-height: 30px;
1478
+ padding: 3px 6px 3px 8px;
1491
1479
  }
1492
1480
 
1493
1481
  .code-copy-floating {
1494
- top: 5px;
1495
- right: 5px;
1482
+ top: 7px;
1483
+ right: 7px;
1496
1484
  }
1497
1485
 
1498
1486
  #nd-docs-layout figure.shiki.code-block pre,
1499
1487
  .code-block pre {
1500
- padding: 10px !important;
1501
- font-size: 11px;
1502
- line-height: 1.55;
1488
+ padding: 12px !important;
1489
+ font-size: 12px;
1490
+ line-height: 1.6;
1491
+ }
1492
+
1493
+ #nd-docs-layout figure.shiki.code-block-plain pre,
1494
+ .code-block-plain pre {
1495
+ padding: 16px 44px 16px 14px !important;
1496
+ line-height: 1.65;
1503
1497
  }
1504
1498
 
1505
1499
  .sh__line {
1506
- min-height: 1.55em;
1500
+ min-height: 1.6em;
1507
1501
  }
1508
1502
  }
1509
1503
 
@@ -3445,7 +3439,7 @@ function renderFarmDocsBridgeCss(docs) {
3445
3439
  .sh-code { --sh-class: #e5c07b; --sh-identifier: #c8ccd4; --sh-string: #98c379; --sh-keyword: #c678dd; --sh-comment: #5c6370; --sh-property: #e06c75; --sh-sign: #c8ccd4; --sh-space: inherit; }
3446
3440
  .code-block { --fd-code-header-bg: color-mix(in srgb, var(--color-fd-foreground, #fff) 5%, var(--color-fd-background, #000)); --fd-code-body-bg: color-mix(in srgb, var(--color-fd-foreground, #fff) 8%, var(--color-fd-background, #000)); position: relative; width: 100%; min-width: 0; max-width: 100%; margin: 20px 0; overflow: hidden; border: 1px solid var(--color-fd-border, hsl(0 0% 15%)); background: var(--color-fd-background, hsl(0 0% 2%)); box-shadow: 3px 3px 0 0 var(--color-fd-border, hsl(0 0% 15%)); font-family: var(--fd-docs-font-mono); }
3447
3441
  #nd-docs-layout figure.shiki.code-block { box-shadow: 3px 3px 0 0 var(--color-fd-border, hsl(0 0% 15%)) !important; }
3448
- .code-block-header { display: flex; align-items: center; justify-content: space-between; gap: 10px; min-width: 0; min-height: 30px; border-bottom: 1px solid var(--color-fd-border, hsl(0 0% 15%)); background-color: var(--fd-code-header-bg); background-image: repeating-linear-gradient(-45deg, color-mix(in srgb, var(--color-fd-foreground, #fff) 7%, transparent), color-mix(in srgb, var(--color-fd-foreground, #fff) 7%, transparent) 1px, transparent 1px, transparent 6px); padding: 4px 8px 4px 10px; }
3442
+ .code-block-header { display: flex; align-items: center; justify-content: space-between; gap: 10px; min-width: 0; min-height: 34px; border-bottom: 1px solid var(--color-fd-border, hsl(0 0% 15%)); background-color: var(--fd-code-header-bg); background-image: repeating-linear-gradient(-45deg, color-mix(in srgb, var(--color-fd-foreground, #fff) 4%, transparent), color-mix(in srgb, var(--color-fd-foreground, #fff) 4%, transparent) 1px, transparent 1px, transparent 6px); padding: 4px 8px 4px 10px; }
3449
3443
  .code-block-title { overflow: hidden; color: color-mix(in srgb, var(--color-fd-foreground, #fff) 50%, transparent); font-size: 10px; line-height: 1.2; text-overflow: ellipsis; text-transform: lowercase; white-space: nowrap; }
3450
3444
  .code-copy { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; flex: 0 0 auto; border: 1px solid var(--color-fd-border, hsl(0 0% 15%)); background: color-mix(in srgb, var(--color-fd-background, #000) 80%, transparent); color: var(--color-fd-muted-foreground, hsl(0 0% 55%)); cursor: pointer; padding: 0; }
3451
3445
  .code-copy-floating { position: absolute; top: 8px; right: 8px; z-index: 2; opacity: 0.72; transition: opacity 150ms ease; }
@@ -3513,7 +3507,7 @@ function renderFarmDocsBridgeCss(docs) {
3513
3507
  .prose h2 { margin-top: 34px; padding-top: 22px; font-size: 23px; }
3514
3508
  .code-block { margin: 16px 0; box-shadow: 2px 2px 0 0 var(--color-fd-border, hsl(0 0% 15%)); }
3515
3509
  #nd-docs-layout figure.shiki.code-block { box-shadow: 2px 2px 0 0 var(--color-fd-border, hsl(0 0% 15%)) !important; }
3516
- .code-block-header { min-height: 26px; padding: 2px 6px 2px 8px; }
3510
+ .code-block-header { min-height: 32px; padding: 3px 7px 3px 9px; }
3517
3511
  .code-copy-floating { top: 6px; right: 6px; }
3518
3512
  #nd-docs-layout figure.shiki.code-block pre, .code-block pre { padding: 12px 11px !important; font-size: 12px; line-height: 1.5; }
3519
3513
  .sh__line { min-height: 1.5em; }
@@ -3523,13 +3517,11 @@ function renderFarmDocsBridgeCss(docs) {
3523
3517
  .fd-page-footer .fd-last-updated-footer { margin-left: 0; }
3524
3518
  }
3525
3519
  @media (max-width: 640px) {
3526
- .code-block-header { min-height: 22px; padding: 1px 4px 1px 7px; }
3527
- .code-block-title { font-size: 9px; }
3528
- .code-copy { width: 20px; height: 20px; }
3529
- .code-copy svg { width: 12px; height: 12px; }
3530
- .code-copy-floating { top: 5px; right: 5px; }
3531
- #nd-docs-layout figure.shiki.code-block pre, .code-block pre { padding: 10px !important; font-size: 11px; line-height: 1.55; }
3532
- .sh__line { min-height: 1.55em; }
3520
+ .code-block-header { min-height: 30px; padding: 3px 6px 3px 8px; }
3521
+ .code-copy-floating { top: 7px; right: 7px; }
3522
+ #nd-docs-layout figure.shiki.code-block pre, .code-block pre { padding: 12px !important; font-size: 12px; line-height: 1.6; }
3523
+ #nd-docs-layout figure.shiki.code-block-plain pre, .code-block-plain pre { padding: 16px 44px 16px 14px !important; line-height: 1.65; }
3524
+ .sh__line { min-height: 1.6em; }
3533
3525
  }
3534
3526
  ${farmDocsPixelBorderCss}
3535
3527
  `;
@@ -3740,9 +3732,9 @@ var import_node_events = require("events");
3740
3732
 
3741
3733
  // src/integrations.ts
3742
3734
  var FARM_INTEGRATION_INTERNAL_DISPATCH_CONTEXT_KEY = "farm.integration.internalDispatch";
3743
- function defineTypedIntegrationRoute(method, path7, input) {
3735
+ function defineTypedIntegrationRoute(method, path8, input) {
3744
3736
  return {
3745
- path: path7,
3737
+ path: path8,
3746
3738
  method,
3747
3739
  middleware: input.middleware,
3748
3740
  before: input.before,
@@ -3752,7 +3744,7 @@ function defineTypedIntegrationRoute(method, path7, input) {
3752
3744
  input: normalizeIntegrationRouteInputSchemas(input),
3753
3745
  handler: input.handler,
3754
3746
  __operation: defineIntegrationAPIOperation({
3755
- path: path7,
3747
+ path: path8,
3756
3748
  method,
3757
3749
  bodyFormat: input.bodyFormat,
3758
3750
  responseFormat: input.responseFormat,
@@ -3765,52 +3757,52 @@ function defineTypedIntegrationRoute(method, path7, input) {
3765
3757
  __name(defineTypedIntegrationRoute, "defineTypedIntegrationRoute");
3766
3758
  function createIntegrationRouteFactory() {
3767
3759
  return {
3768
- get(path7, input) {
3760
+ get(path8, input) {
3769
3761
  return defineTypedIntegrationRoute(
3770
3762
  "GET",
3771
- path7,
3763
+ path8,
3772
3764
  input
3773
3765
  );
3774
3766
  },
3775
- post(path7, input) {
3767
+ post(path8, input) {
3776
3768
  return defineTypedIntegrationRoute(
3777
3769
  "POST",
3778
- path7,
3770
+ path8,
3779
3771
  {
3780
3772
  bodyFormat: "json",
3781
3773
  ...input
3782
3774
  }
3783
3775
  );
3784
3776
  },
3785
- put(path7, input) {
3777
+ put(path8, input) {
3786
3778
  return defineTypedIntegrationRoute(
3787
3779
  "PUT",
3788
- path7,
3780
+ path8,
3789
3781
  {
3790
3782
  bodyFormat: "json",
3791
3783
  ...input
3792
3784
  }
3793
3785
  );
3794
3786
  },
3795
- patch(path7, input) {
3796
- return defineTypedIntegrationRoute("PATCH", path7, {
3787
+ patch(path8, input) {
3788
+ return defineTypedIntegrationRoute("PATCH", path8, {
3797
3789
  bodyFormat: "json",
3798
3790
  ...input
3799
3791
  });
3800
3792
  },
3801
- delete(path7, input) {
3802
- return defineTypedIntegrationRoute("DELETE", path7, {
3793
+ delete(path8, input) {
3794
+ return defineTypedIntegrationRoute("DELETE", path8, {
3803
3795
  bodyFormat: "json",
3804
3796
  ...input
3805
3797
  });
3806
3798
  },
3807
- options(path7, input) {
3808
- return defineTypedIntegrationRoute("OPTIONS", path7, input);
3799
+ options(path8, input) {
3800
+ return defineTypedIntegrationRoute("OPTIONS", path8, input);
3809
3801
  },
3810
- head(path7, input) {
3802
+ head(path8, input) {
3811
3803
  return defineTypedIntegrationRoute(
3812
3804
  "HEAD",
3813
- path7,
3805
+ path8,
3814
3806
  input
3815
3807
  );
3816
3808
  }
@@ -4049,8 +4041,8 @@ function normalizeIntegrationValidationIssues(source, error) {
4049
4041
  ];
4050
4042
  }
4051
4043
  __name(normalizeIntegrationValidationIssues, "normalizeIntegrationValidationIssues");
4052
- function normalizeIntegrationValidationPath(path7) {
4053
- return (path7 || []).map((segment) => {
4044
+ function normalizeIntegrationValidationPath(path8) {
4045
+ return (path8 || []).map((segment) => {
4054
4046
  const key = typeof segment === "object" && segment !== null && "key" in segment ? segment.key : segment;
4055
4047
  return typeof key === "symbol" ? key.description || key.toString() : key;
4056
4048
  });
@@ -4783,7 +4775,8 @@ var FARM_CACHE_INVALIDATION_STATE = /* @__PURE__ */ Symbol.for("farm.cacheInvali
4783
4775
  var globalState = globalThis;
4784
4776
  function getFarmCacheInvalidationState() {
4785
4777
  return globalState[FARM_CACHE_INVALIDATION_STATE] ?? (globalState[FARM_CACHE_INVALIDATION_STATE] = {
4786
- listeners: /* @__PURE__ */ new Set()
4778
+ listeners: /* @__PURE__ */ new Set(),
4779
+ taskListeners: /* @__PURE__ */ new Set()
4787
4780
  });
4788
4781
  }
4789
4782
  __name(getFarmCacheInvalidationState, "getFarmCacheInvalidationState");
@@ -4793,6 +4786,12 @@ function subscribeFarmCacheInvalidation(listener) {
4793
4786
  return () => state.listeners.delete(listener);
4794
4787
  }
4795
4788
  __name(subscribeFarmCacheInvalidation, "subscribeFarmCacheInvalidation");
4789
+ function subscribeFarmCacheTask(listener) {
4790
+ const state = getFarmCacheInvalidationState();
4791
+ state.taskListeners.add(listener);
4792
+ return () => state.taskListeners.delete(listener);
4793
+ }
4794
+ __name(subscribeFarmCacheTask, "subscribeFarmCacheTask");
4796
4795
 
4797
4796
  // src/server-action-security.ts
4798
4797
  var SERVER_ACTION_STORAGE_KEY = /* @__PURE__ */ Symbol.for("farm.serverActionStorage");
@@ -4803,6 +4802,9 @@ __name(getServerActionExecutionContext, "getServerActionExecutionContext");
4803
4802
  subscribeFarmCacheInvalidation((key) => {
4804
4803
  getServerActionExecutionContext()?.invalidations.add(key);
4805
4804
  });
4805
+ subscribeFarmCacheTask((task) => {
4806
+ getServerActionExecutionContext()?.cacheTasks.add(task);
4807
+ });
4806
4808
  function getServerActionStorage() {
4807
4809
  const globalState2 = globalThis;
4808
4810
  if (!globalState2[SERVER_ACTION_STORAGE_KEY]) {
@@ -4826,6 +4828,11 @@ var import_path = __toESM(require("path"));
4826
4828
  var import_node_path5 = __toESM(require("path"));
4827
4829
  var DEFAULT_FARM_I18N_COOKIE_MAX_AGE = 60 * 60 * 24 * 365;
4828
4830
 
4831
+ // src/auth-config.ts
4832
+ var import_node_module4 = require("module");
4833
+ var import_node_path6 = __toESM(require("path"));
4834
+ var import_node_url2 = require("url");
4835
+
4829
4836
  // src/config.ts
4830
4837
  var DOCS_CONFIG_FILENAMES = [
4831
4838
  "docs.config.ts",
@@ -4915,7 +4922,7 @@ async function findDocsConfigPath(rootDir, configPath) {
4915
4922
  __name(findDocsConfigPath, "findDocsConfigPath");
4916
4923
  async function loadDocsConfig(rootDir, configPath) {
4917
4924
  const fs = await import("fs/promises");
4918
- const { pathToFileURL: pathToFileURL2 } = await import("url");
4925
+ const { pathToFileURL: pathToFileURL3 } = await import("url");
4919
4926
  const root = import_path.default.resolve(rootDir || process.cwd());
4920
4927
  const resolvedPath = await findDocsConfigPath(root, configPath);
4921
4928
  if (!resolvedPath) return void 0;
@@ -4944,7 +4951,7 @@ async function loadDocsConfig(rootDir, configPath) {
4944
4951
  logLevel: "silent",
4945
4952
  sourcemap: "inline"
4946
4953
  });
4947
- const moduleUrl = pathToFileURL2(modulePath).href + `?t=${Date.now()}`;
4954
+ const moduleUrl = pathToFileURL3(modulePath).href + `?t=${Date.now()}`;
4948
4955
  let importedConfig;
4949
4956
  try {
4950
4957
  importedConfig = await import(