@farm.js/core 0.1.0-beta.96 → 0.1.0-beta.97

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 (311) hide show
  1. package/dist/after.cjs +1 -1
  2. package/dist/after.mjs +1 -1
  3. package/dist/agent-runtime.d.mts +3 -2
  4. package/dist/agent-runtime.d.ts +3 -2
  5. package/dist/api/route-manager.cjs +43 -4
  6. package/dist/api/route-manager.d.mts +4 -3
  7. package/dist/api/route-manager.d.ts +4 -3
  8. package/dist/api/route-manager.mjs +6 -6
  9. package/dist/api/runtime.cjs +43 -4
  10. package/dist/api/runtime.d.mts +1 -1
  11. package/dist/api/runtime.d.ts +1 -1
  12. package/dist/api/runtime.mjs +4 -4
  13. package/dist/api.cjs +239 -70
  14. package/dist/api.d.mts +7 -6
  15. package/dist/api.d.ts +7 -6
  16. package/dist/api.mjs +17 -11
  17. package/dist/{app-CIIEvA4r.d.ts → app-CIOx3LvY.d.ts} +4 -4
  18. package/dist/{app-O4AEC1OH.d.mts → app-DBd6437H.d.mts} +4 -4
  19. package/dist/app-markdown.d.mts +4 -3
  20. package/dist/app-markdown.d.ts +4 -3
  21. package/dist/cache.cjs +42 -4
  22. package/dist/cache.d.mts +68 -1
  23. package/dist/cache.d.ts +68 -1
  24. package/dist/cache.mjs +3 -3
  25. package/dist/{chunk-AXVJCMVF.mjs → chunk-2HDOV47R.mjs} +3 -3
  26. package/dist/chunk-2HDOV47R.mjs.map +1 -0
  27. package/dist/{chunk-RBRLLZL5.mjs → chunk-34IAPZBG.mjs} +16 -3
  28. package/dist/chunk-34IAPZBG.mjs.map +1 -0
  29. package/dist/{chunk-VV24CC42.mjs → chunk-35NPLKQJ.mjs} +2 -2
  30. package/dist/{chunk-MM46HTX6.mjs → chunk-3TWQERDE.mjs} +4 -3
  31. package/dist/chunk-3TWQERDE.mjs.map +1 -0
  32. package/dist/{chunk-RWYRFCLG.mjs → chunk-4X57GXQA.mjs} +2 -2
  33. package/dist/{chunk-3I55IGXU.mjs → chunk-52BR7LTX.mjs} +14 -15
  34. package/dist/chunk-52BR7LTX.mjs.map +1 -0
  35. package/dist/{chunk-RAGSHKDC.mjs → chunk-6EJHNHH4.mjs} +38 -3
  36. package/dist/chunk-6EJHNHH4.mjs.map +1 -0
  37. package/dist/{chunk-ZFNK77WN.mjs → chunk-6JNGOC37.mjs} +2 -2
  38. package/dist/{after.cjs.map → chunk-6JNGOC37.mjs.map} +1 -1
  39. package/dist/{chunk-MOW47IF5.mjs → chunk-6UYVU46O.mjs} +2 -2
  40. package/dist/{chunk-7MABZJIM.mjs → chunk-7PYVLJ4J.mjs} +1 -1
  41. package/dist/chunk-7PYVLJ4J.mjs.map +1 -0
  42. package/dist/{chunk-54XSGLKT.mjs → chunk-D7F7YZ7L.mjs} +93 -67
  43. package/dist/chunk-D7F7YZ7L.mjs.map +1 -0
  44. package/dist/{chunk-SCFX4UTD.mjs → chunk-EHTUKVSW.mjs} +1 -1
  45. package/dist/chunk-EHTUKVSW.mjs.map +1 -0
  46. package/dist/{chunk-LZTGDH3H.mjs → chunk-EPDIF432.mjs} +424 -10
  47. package/dist/chunk-EPDIF432.mjs.map +1 -0
  48. package/dist/{chunk-GZHKWHCH.mjs → chunk-FP5Q67FO.mjs} +167 -96
  49. package/dist/chunk-FP5Q67FO.mjs.map +1 -0
  50. package/dist/{chunk-HHZAOTQD.mjs → chunk-GJ7W6LNK.mjs} +7 -6
  51. package/dist/chunk-GJ7W6LNK.mjs.map +1 -0
  52. package/dist/{chunk-RLGUZ3HS.mjs → chunk-I3OOUWO5.mjs} +3 -3
  53. package/dist/{chunk-LKKMI7JG.mjs → chunk-IZBX2TEU.mjs} +153 -68
  54. package/dist/chunk-IZBX2TEU.mjs.map +1 -0
  55. package/dist/{chunk-74QPONAN.mjs → chunk-J3MPQ4MQ.mjs} +2 -2
  56. package/dist/{chunk-74QPONAN.mjs.map → chunk-J3MPQ4MQ.mjs.map} +1 -1
  57. package/dist/{chunk-ODJGAWDH.mjs → chunk-JV7JUD7Q.mjs} +4 -4
  58. package/dist/{chunk-Q3OX763A.mjs → chunk-LXDASSTE.mjs} +2 -2
  59. package/dist/{chunk-ZRBCBOEX.mjs → chunk-N2FY2QZ7.mjs} +28 -3
  60. package/dist/chunk-N2FY2QZ7.mjs.map +1 -0
  61. package/dist/{chunk-MRVJCLYQ.mjs → chunk-PSQ7N4XP.mjs} +4 -2
  62. package/dist/chunk-PSQ7N4XP.mjs.map +1 -0
  63. package/dist/{chunk-HVG3HLQZ.mjs → chunk-Q7WGOOAI.mjs} +3 -3
  64. package/dist/{chunk-WTYAPO5I.mjs → chunk-RCNWMEBT.mjs} +3 -2
  65. package/dist/{chunk-WTYAPO5I.mjs.map → chunk-RCNWMEBT.mjs.map} +1 -1
  66. package/dist/{chunk-3INDBMUU.mjs → chunk-TGDIACZT.mjs} +2 -2
  67. package/dist/{chunk-WB75GIX2.mjs → chunk-TQTB33JS.mjs} +14 -3
  68. package/dist/chunk-TQTB33JS.mjs.map +1 -0
  69. package/dist/{chunk-WMAYETRD.mjs → chunk-TT3E2JOF.mjs} +3 -3
  70. package/dist/{chunk-FVAM43KI.mjs → chunk-UMUWR5XA.mjs} +2 -2
  71. package/dist/{chunk-VOUJW4FL.mjs → chunk-WD2EBM3I.mjs} +70 -15
  72. package/dist/chunk-WD2EBM3I.mjs.map +1 -0
  73. package/dist/{chunk-ZPG6SNHH.mjs → chunk-WMJGA32P.mjs} +47 -5
  74. package/dist/chunk-WMJGA32P.mjs.map +1 -0
  75. package/dist/{chunk-TKQCJMY7.mjs → chunk-X4SFHKFH.mjs} +7 -4
  76. package/dist/{chunk-TKQCJMY7.mjs.map → chunk-X4SFHKFH.mjs.map} +1 -1
  77. package/dist/{chunk-Q7GPJZCO.mjs → chunk-YIBV77KZ.mjs} +26 -7
  78. package/dist/chunk-YIBV77KZ.mjs.map +1 -0
  79. package/dist/client/lifecycle.mjs +2 -2
  80. package/dist/{client-mcMC334J.d.mts → client-DWoLZ3QU.d.mts} +52 -5
  81. package/dist/{client-d5ONQ-Pd.d.ts → client-DuQuQC1h.d.ts} +52 -5
  82. package/dist/client-cache-BMxuFqwH.d.ts +18 -0
  83. package/dist/client-cache-CCK-fCe0.d.mts +18 -0
  84. package/dist/{client-plugins-BvClItiL.d.mts → client-plugins-B6-07YmP.d.mts} +52 -99
  85. package/dist/{client-plugins-B9Sq-iMg.d.ts → client-plugins-By6MVUX-.d.ts} +52 -99
  86. package/dist/client-plugins.cjs +1 -1
  87. package/dist/client-plugins.d.mts +3 -2
  88. package/dist/client-plugins.d.ts +3 -2
  89. package/dist/client-plugins.mjs +2 -2
  90. package/dist/client.cjs +757 -104
  91. package/dist/client.d.mts +124 -16
  92. package/dist/client.d.ts +124 -16
  93. package/dist/client.mjs +28 -14
  94. package/dist/config.d.mts +3 -2
  95. package/dist/config.d.ts +3 -2
  96. package/dist/{devtools-S52RRRMN.mjs → devtools-XWZX6CCL.mjs} +5 -5
  97. package/dist/{devtools-client-EOVDBPOI.mjs → devtools-client-Z7QQA3Q2.mjs} +2 -2
  98. package/dist/{devtools-ui-NJKFORTG.mjs → devtools-ui-2HG5M4EL.mjs} +3 -1
  99. package/dist/devtools-ui-2HG5M4EL.mjs.map +1 -0
  100. package/dist/docs.cjs +24 -5
  101. package/dist/docs.mjs +5 -5
  102. package/dist/i18n/server.cjs +13 -2
  103. package/dist/i18n/server.d.mts +2 -2
  104. package/dist/i18n/server.d.ts +2 -2
  105. package/dist/i18n/server.mjs +1 -1
  106. package/dist/index.cjs +1578 -772
  107. package/dist/index.d.mts +28 -20
  108. package/dist/index.d.ts +28 -20
  109. package/dist/index.mjs +53 -33
  110. package/dist/index.mjs.map +1 -1
  111. package/dist/integration-api-BT024nuJ.d.mts +97 -0
  112. package/dist/integration-api-BT024nuJ.d.ts +97 -0
  113. package/dist/integrations.d.mts +3 -2
  114. package/dist/integrations.d.ts +3 -2
  115. package/dist/internal/build-runtime.cjs +710 -532
  116. package/dist/internal/build-runtime.d.mts +5 -4
  117. package/dist/internal/build-runtime.d.ts +5 -4
  118. package/dist/internal/build-runtime.mjs +15 -15
  119. package/dist/internal/client-runtime.cjs +1 -1
  120. package/dist/internal/client-runtime.mjs +2 -2
  121. package/dist/internal/config-runtime.cjs +4 -1
  122. package/dist/internal/config-runtime.d.mts +4 -3
  123. package/dist/internal/config-runtime.d.ts +4 -3
  124. package/dist/internal/config-runtime.mjs +4 -4
  125. package/dist/internal/product-telemetry-runtime.cjs +1 -1
  126. package/dist/internal/product-telemetry-runtime.mjs +1 -1
  127. package/dist/internal/production-runtime.cjs +29 -3
  128. package/dist/internal/production-runtime.d.mts +8 -7
  129. package/dist/internal/production-runtime.d.ts +8 -7
  130. package/dist/internal/production-runtime.mjs +5 -5
  131. package/dist/{metadata-route-yV4U6X8h.d.ts → metadata-route-8_V3UonT.d.ts} +1 -1
  132. package/dist/{metadata-route-p4K1l92V.d.mts → metadata-route-CWP_HjGU.d.mts} +1 -1
  133. package/dist/middleware.cjs +28 -2
  134. package/dist/middleware.d.mts +5 -4
  135. package/dist/middleware.d.ts +5 -4
  136. package/dist/middleware.mjs +4 -4
  137. package/dist/navigation.cjs +3 -1
  138. package/dist/navigation.mjs +3 -3
  139. package/dist/observability.cjs +27 -2
  140. package/dist/observability.mjs +1 -1
  141. package/dist/plugin.cjs +474 -334
  142. package/dist/plugin.d.mts +3 -2
  143. package/dist/plugin.d.ts +3 -2
  144. package/dist/plugin.mjs +12 -12
  145. package/dist/{production-runtime-IkB0Qj4i.d.mts → production-runtime-BGRH1dKG.d.mts} +1 -1
  146. package/dist/{production-runtime-0JTch4_d.d.ts → production-runtime-CdmzsDax.d.ts} +1 -1
  147. package/dist/query/client.cjs +11 -3
  148. package/dist/query/client.mjs +12 -4
  149. package/dist/query/client.mjs.map +1 -1
  150. package/dist/{render-plan-Dc8CjNI7.d.ts → render-plan-0GeHiGVZ.d.ts} +1 -1
  151. package/dist/{render-plan-CU31j-Jk.d.mts → render-plan-DLxJYAA5.d.mts} +1 -1
  152. package/dist/renderer-client.cjs +140 -26
  153. package/dist/renderer-client.d.mts +7 -6
  154. package/dist/renderer-client.d.ts +7 -6
  155. package/dist/renderer-client.mjs +16 -19
  156. package/dist/renderer-client.mjs.map +1 -1
  157. package/dist/{request-BXa1KY8i.d.mts → request-BCNXSXLh.d.mts} +1 -1
  158. package/dist/{request-CUUBujZt.d.ts → request-BstWbZ6O.d.ts} +1 -1
  159. package/dist/request.d.mts +4 -3
  160. package/dist/request.d.ts +4 -3
  161. package/dist/{route-Y8lfz1wF.d.ts → route-4pd-EVtw.d.ts} +45 -50
  162. package/dist/{route-Cq3aObmj.d.mts → route-CvEr4Uc9.d.mts} +45 -50
  163. package/dist/routes.cjs +27 -2
  164. package/dist/routes.d.mts +3 -2
  165. package/dist/routes.d.ts +3 -2
  166. package/dist/routes.mjs +4 -4
  167. package/dist/{runtime-j1S3sDTh.d.ts → runtime-BgDQzBiu.d.ts} +1 -0
  168. package/dist/{runtime-DDwvDtS4.d.mts → runtime-CV2UCV-5.d.mts} +1 -0
  169. package/dist/server-action-security.mjs +2 -2
  170. package/dist/server-fn-client.cjs +34 -2
  171. package/dist/server-fn-client.d.mts +6 -0
  172. package/dist/server-fn-client.d.ts +6 -0
  173. package/dist/server-fn-client.mjs +1 -1
  174. package/dist/server-fn.cjs +42 -4
  175. package/dist/server-fn.mjs +5 -5
  176. package/dist/server-plugins.d.mts +4 -3
  177. package/dist/server-plugins.d.ts +4 -3
  178. package/dist/server-query-client.cjs +146 -27
  179. package/dist/server-query-client.d.mts +3 -3
  180. package/dist/server-query-client.d.ts +3 -3
  181. package/dist/server-query-client.mjs +7 -7
  182. package/dist/{server-query-runtime-3zAj77yv.d.ts → server-query-runtime-DXRNhX_3.d.ts} +2 -0
  183. package/dist/{server-query-runtime-B50KAcj5.d.mts → server-query-runtime-aP52iuL5.d.mts} +2 -0
  184. package/dist/server-query.cjs +44 -5
  185. package/dist/server-query.d.mts +4 -0
  186. package/dist/server-query.d.ts +4 -0
  187. package/dist/server-query.mjs +7 -7
  188. package/dist/server.cjs +499 -355
  189. package/dist/server.d.mts +11 -10
  190. package/dist/server.d.ts +11 -10
  191. package/dist/server.mjs +16 -16
  192. package/dist/{spa-router-CyLkwst6.d.mts → spa-router-BeyAVSc6.d.mts} +1 -1
  193. package/dist/{spa-router-BkqGXaV_.d.ts → spa-router-COgu4txb.d.ts} +1 -1
  194. package/dist/testing.cjs +27 -2
  195. package/dist/testing.d.mts +3 -2
  196. package/dist/testing.d.ts +3 -2
  197. package/dist/testing.mjs +8 -8
  198. package/dist/{utils-NKR6SoNv.d.mts → utils-DL2VwDQl.d.mts} +1 -1
  199. package/dist/{utils-B2OHrb9F.d.ts → utils-DkU2c_1B.d.ts} +1 -1
  200. package/dist/version.cjs +1 -1
  201. package/dist/version.mjs +1 -1
  202. package/dist/vite.cjs +482 -338
  203. package/dist/vite.d.mts +3 -2
  204. package/dist/vite.d.ts +3 -2
  205. package/dist/vite.mjs +16 -12
  206. package/package.json +17 -17
  207. package/types/client.d.ts +87 -1
  208. package/dist/agent-runtime.cjs.map +0 -1
  209. package/dist/api/route-manager.cjs.map +0 -1
  210. package/dist/api/runtime.cjs.map +0 -1
  211. package/dist/api.cjs.map +0 -1
  212. package/dist/app-markdown.cjs.map +0 -1
  213. package/dist/cache.cjs.map +0 -1
  214. package/dist/chunk-3I55IGXU.mjs.map +0 -1
  215. package/dist/chunk-54XSGLKT.mjs.map +0 -1
  216. package/dist/chunk-7MABZJIM.mjs.map +0 -1
  217. package/dist/chunk-AXVJCMVF.mjs.map +0 -1
  218. package/dist/chunk-GZHKWHCH.mjs.map +0 -1
  219. package/dist/chunk-HHZAOTQD.mjs.map +0 -1
  220. package/dist/chunk-LKKMI7JG.mjs.map +0 -1
  221. package/dist/chunk-LZTGDH3H.mjs.map +0 -1
  222. package/dist/chunk-MM46HTX6.mjs.map +0 -1
  223. package/dist/chunk-MRVJCLYQ.mjs.map +0 -1
  224. package/dist/chunk-Q7GPJZCO.mjs.map +0 -1
  225. package/dist/chunk-RAGSHKDC.mjs.map +0 -1
  226. package/dist/chunk-RBRLLZL5.mjs.map +0 -1
  227. package/dist/chunk-SCFX4UTD.mjs.map +0 -1
  228. package/dist/chunk-VOUJW4FL.mjs.map +0 -1
  229. package/dist/chunk-WB75GIX2.mjs.map +0 -1
  230. package/dist/chunk-ZFNK77WN.mjs.map +0 -1
  231. package/dist/chunk-ZPG6SNHH.mjs.map +0 -1
  232. package/dist/chunk-ZRBCBOEX.mjs.map +0 -1
  233. package/dist/client/lifecycle.cjs.map +0 -1
  234. package/dist/client-cache-CopR_MaI.d.mts +0 -6
  235. package/dist/client-cache-Djy_TlE8.d.ts +0 -6
  236. package/dist/client-plugins.cjs.map +0 -1
  237. package/dist/client.cjs.map +0 -1
  238. package/dist/config.cjs.map +0 -1
  239. package/dist/cron.cjs.map +0 -1
  240. package/dist/deferred.cjs.map +0 -1
  241. package/dist/deployment.cjs.map +0 -1
  242. package/dist/devtools-ui-NJKFORTG.mjs.map +0 -1
  243. package/dist/docs.cjs.map +0 -1
  244. package/dist/env-types.cjs.map +0 -1
  245. package/dist/env.cjs.map +0 -1
  246. package/dist/environment/vite.cjs.map +0 -1
  247. package/dist/environment.cjs.map +0 -1
  248. package/dist/font.cjs.map +0 -1
  249. package/dist/headers.cjs.map +0 -1
  250. package/dist/i18n/client.cjs.map +0 -1
  251. package/dist/i18n/index.cjs.map +0 -1
  252. package/dist/i18n/server.cjs.map +0 -1
  253. package/dist/image/server.cjs.map +0 -1
  254. package/dist/image/sharp.cjs.map +0 -1
  255. package/dist/image.cjs.map +0 -1
  256. package/dist/index.cjs.map +0 -1
  257. package/dist/instrumentation.cjs.map +0 -1
  258. package/dist/integrations.cjs.map +0 -1
  259. package/dist/internal/build-runtime.cjs.map +0 -1
  260. package/dist/internal/client-runtime.cjs.map +0 -1
  261. package/dist/internal/config-runtime.cjs.map +0 -1
  262. package/dist/internal/isolated-boundary.cjs.map +0 -1
  263. package/dist/internal/metadata-image-runtime.cjs.map +0 -1
  264. package/dist/internal/product-telemetry-runtime.cjs.map +0 -1
  265. package/dist/internal/production-node-env.cjs.map +0 -1
  266. package/dist/internal/production-runtime.cjs.map +0 -1
  267. package/dist/markdown.cjs.map +0 -1
  268. package/dist/middleware.cjs.map +0 -1
  269. package/dist/navigation.cjs.map +0 -1
  270. package/dist/observability.cjs.map +0 -1
  271. package/dist/plugin.cjs.map +0 -1
  272. package/dist/query/client.cjs.map +0 -1
  273. package/dist/query/index.cjs.map +0 -1
  274. package/dist/query/parsers.cjs.map +0 -1
  275. package/dist/query/server.cjs.map +0 -1
  276. package/dist/renderer/react/client.cjs.map +0 -1
  277. package/dist/renderer/react/server.cjs.map +0 -1
  278. package/dist/renderer/react/vite.cjs.map +0 -1
  279. package/dist/renderer-client.cjs.map +0 -1
  280. package/dist/renderer.cjs.map +0 -1
  281. package/dist/request.cjs.map +0 -1
  282. package/dist/router.cjs.map +0 -1
  283. package/dist/routes.cjs.map +0 -1
  284. package/dist/server-action-security.cjs.map +0 -1
  285. package/dist/server-fn-client.cjs.map +0 -1
  286. package/dist/server-fn.cjs.map +0 -1
  287. package/dist/server-plugins.cjs.map +0 -1
  288. package/dist/server-query-client.cjs.map +0 -1
  289. package/dist/server-query.cjs.map +0 -1
  290. package/dist/server.cjs.map +0 -1
  291. package/dist/storage.cjs.map +0 -1
  292. package/dist/testing.cjs.map +0 -1
  293. package/dist/theme/client.cjs.map +0 -1
  294. package/dist/theme/index.cjs.map +0 -1
  295. package/dist/theme/runtime.cjs.map +0 -1
  296. package/dist/theme/server.cjs.map +0 -1
  297. package/dist/version.cjs.map +0 -1
  298. package/dist/vite.cjs.map +0 -1
  299. package/dist/workflows.cjs.map +0 -1
  300. /package/dist/{chunk-VV24CC42.mjs.map → chunk-35NPLKQJ.mjs.map} +0 -0
  301. /package/dist/{chunk-RWYRFCLG.mjs.map → chunk-4X57GXQA.mjs.map} +0 -0
  302. /package/dist/{chunk-MOW47IF5.mjs.map → chunk-6UYVU46O.mjs.map} +0 -0
  303. /package/dist/{chunk-RLGUZ3HS.mjs.map → chunk-I3OOUWO5.mjs.map} +0 -0
  304. /package/dist/{chunk-ODJGAWDH.mjs.map → chunk-JV7JUD7Q.mjs.map} +0 -0
  305. /package/dist/{chunk-Q3OX763A.mjs.map → chunk-LXDASSTE.mjs.map} +0 -0
  306. /package/dist/{chunk-HVG3HLQZ.mjs.map → chunk-Q7WGOOAI.mjs.map} +0 -0
  307. /package/dist/{chunk-3INDBMUU.mjs.map → chunk-TGDIACZT.mjs.map} +0 -0
  308. /package/dist/{chunk-WMAYETRD.mjs.map → chunk-TT3E2JOF.mjs.map} +0 -0
  309. /package/dist/{chunk-FVAM43KI.mjs.map → chunk-UMUWR5XA.mjs.map} +0 -0
  310. /package/dist/{devtools-S52RRRMN.mjs.map → devtools-XWZX6CCL.mjs.map} +0 -0
  311. /package/dist/{devtools-client-EOVDBPOI.mjs.map → devtools-client-Z7QQA3Q2.mjs.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config-entry.ts"],"sourcesContent":["import type { FarmUserConfig } from \"./config\";\n\n/** Define a Farm application config while preserving literal types. */\nexport function defineConfig<const TConfig extends FarmUserConfig>(config: TConfig): TConfig {\n return config;\n}\n\n/** @deprecated Use {@link defineConfig}. */\nexport const defineFarmConfig = defineConfig;\n\nexport type { FarmUserConfig };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGO,SAAS,aAAmD,QAA0B;AAC3F,SAAO;AACT;AAFgB;AAKT,IAAM,mBAAmB;","names":[]}
package/dist/cron.cjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cron.ts","../src/utils.ts"],"sourcesContent":["import { toPosixPath } from \"./utils\";\n\nexport 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 = toPosixPath(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 = /^Bearer (.*)$/i.exec(authorization)?.[1] || \"\";\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 hasUnstableCharacters = (candidate: string) =>\n candidate.includes(\"\\\\\") ||\n Array.from(candidate).some((character) => {\n const code = character.charCodeAt(0);\n return code <= 31 || (code >= 127 && code <= 159);\n });\n if (hasUnstableCharacters(value)) {\n throw new TypeError(\n `Farm cron ${JSON.stringify(name)} path cannot contain backslashes or control characters.`,\n );\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 for (const segment of path.split(\"/\")) {\n let decoded = segment;\n try {\n decoded = decodeURIComponent(segment);\n } catch {\n // Malformed escapes remain literal and cannot conceal a separator or dot segment.\n }\n if (hasUnstableCharacters(decoded)) {\n throw new TypeError(\n `Farm cron ${JSON.stringify(name)} path cannot contain backslashes or control characters.`,\n );\n }\n if (decoded.includes(\"/\")) {\n throw new TypeError(\n `Farm cron ${JSON.stringify(name)} path cannot contain percent-encoded path separators.`,\n );\n }\n if (decoded === \".\" || decoded === \"..\") {\n throw new TypeError(\n `Farm cron ${JSON.stringify(name)} path cannot contain \".\" or \"..\" path segments.`,\n );\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 = (\n globalThis as typeof globalThis & {\n __env__?: Record<string, unknown>;\n }\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","import type { RouteSegment, ParsedRoute } from \"./types\";\nimport path from \"path\";\nimport {\n assertBrowserStableRoutePath,\n assertTerminalCatchAll,\n assertUniqueRouteParameters,\n} from \"./routing/specificity\";\nimport { searchParamsToObject } from \"./search-params\";\nimport { decodeRouteSegment } from \"./utils/decode\";\n\nexport function parseRoutePath(filePath: string): ParsedRoute {\n const segments: RouteSegment[] = [];\n const normalizedPath = filePath.replace(/\\\\/g, \"/\");\n const pathParts = normalizedPath.split(\"/\").filter(Boolean);\n\n const fileName = pathParts.pop() || \"\";\n const fileType = getRouteType(fileName);\n const routePath = `/${pathParts.join(\"/\")}`;\n assertBrowserStableRoutePath(routePath);\n assertTerminalCatchAll(routePath);\n assertUniqueRouteParameters(routePath);\n\n for (const part of pathParts) {\n // Route groups like `(marketing)` organize files without adding URL\n // segments. Mirrors isRouteGroup in router.ts for programmatic routes.\n if (part.startsWith(\"(\") && part.endsWith(\")\")) continue;\n if (part.startsWith(\"[\") && part.endsWith(\"]\")) {\n let segment = part.slice(1, -1);\n const isDynamic = true;\n let isOptional = false;\n let isCatchAll = false;\n\n if (segment.startsWith(\"[\") && segment.endsWith(\"]\")) {\n isOptional = true;\n segment = segment.slice(1, -1);\n if (segment.startsWith(\"...\")) {\n segment = segment.slice(3);\n isCatchAll = true;\n }\n } else if (segment.startsWith(\"...\")) {\n segment = segment.slice(3);\n isCatchAll = true;\n }\n\n segments.push({ segment, isDynamic, isOptional, isCatchAll });\n } else {\n segments.push({\n segment: part,\n isDynamic: false,\n isOptional: false,\n isCatchAll: false,\n });\n }\n }\n\n return {\n segments,\n filePath: normalizedPath,\n type: fileType,\n };\n}\n\nfunction getRouteType(fileName: string): ParsedRoute[\"type\"] {\n const baseName = fileName.replace(/\\.(tsx?|jsx?|vue|svelte|mdx?|markdown)$/, \"\");\n\n switch (baseName) {\n case \"page\":\n return \"page\";\n case \"layout\":\n return \"layout\";\n case \"loading\":\n return \"loading\";\n case \"error\":\n return \"error\";\n case \"not-found\":\n return \"not-found\";\n default:\n return \"page\";\n }\n}\n\nexport function segmentsToPattern(segments: RouteSegment[]): string {\n if (segments.length === 0) return \"/\";\n\n return (\n \"/\" +\n segments\n .map((segment) => {\n if (!segment.isDynamic) return segment.segment;\n\n if (segment.isCatchAll) {\n return segment.isOptional ? `*${segment.segment}?` : `*${segment.segment}`;\n }\n\n return `:${segment.segment}`;\n })\n .join(\"/\")\n );\n}\n\nexport function matchRoute(\n url: string,\n segments: RouteSegment[],\n): { params: Record<string, string>; matches: boolean } {\n const urlParts = url.split(\"/\").filter(Boolean).map(decodeRouteSegment);\n const params: Record<string, string> = {};\n if (segments.length === 0) {\n return { params, matches: urlParts.length === 0 };\n }\n\n let urlIndex = 0;\n let segmentIndex = 0;\n\n while (segmentIndex < segments.length && urlIndex <= urlParts.length) {\n const segment = segments[segmentIndex];\n\n if (!segment.isDynamic) {\n if (urlParts[urlIndex] !== segment.segment) {\n return { params: {}, matches: false };\n }\n urlIndex++;\n segmentIndex++;\n } else if (segment.isCatchAll) {\n const remainingParts = urlParts.slice(urlIndex);\n\n if (remainingParts.length === 0 && !segment.isOptional) {\n return { params: {}, matches: false };\n }\n\n params[segment.segment] = remainingParts.join(\"/\");\n urlIndex = urlParts.length;\n segmentIndex++;\n } else {\n if (urlIndex >= urlParts.length) {\n return { params: {}, matches: false };\n }\n\n params[segment.segment] = urlParts[urlIndex];\n urlIndex++;\n segmentIndex++;\n }\n }\n\n const matches = segmentIndex === segments.length && urlIndex === urlParts.length;\n\n return { params, matches };\n}\n\n/** Match a route segment chain as an owner of the pathname or one of its descendants. */\nexport function matchRoutePrefix(url: string, segments: RouteSegment[]): boolean {\n const urlParts = url.split(\"/\").filter(Boolean).map(decodeRouteSegment);\n let urlIndex = 0;\n\n for (const segment of segments) {\n if (segment.isCatchAll) {\n return segment.isOptional || urlIndex < urlParts.length;\n }\n\n const urlPart = urlParts[urlIndex];\n if (urlPart === undefined) return false;\n if (!segment.isDynamic && segment.segment !== urlPart) return false;\n urlIndex++;\n }\n\n return true;\n}\n\nexport function resolveAppPath(root: string, ...paths: string[]): string {\n return path.resolve(root, ...paths);\n}\n\n/**\n * Convert an absolute module path inside the project root to a root-relative\n * URL path with forward slashes (e.g. `/src/app/page.tsx`), for values the\n * client passes to dynamic `import()`. On Windows the naive root-prefix slice\n * yields `\\src\\app\\page.tsx`, which is not a valid module specifier. Returns\n * undefined for paths outside the root so callers keep their own fallbacks.\n */\nexport function toRootRelativeUrlPath(\n absolutePath: string,\n projectRoot: string,\n): string | undefined {\n if (absolutePath === projectRoot) return \"\";\n if (absolutePath.startsWith(`${projectRoot}/`) || absolutePath.startsWith(`${projectRoot}\\\\`)) {\n return absolutePath.slice(projectRoot.length).replace(/\\\\/g, \"/\");\n }\n return undefined;\n}\n\n/**\n * Normalize a filesystem path to forward slashes. Node's fs accepts these on\n * every platform, and module ids handed to bundlers (e.g. Nitro handler and\n * task entries) must not contain backslashes.\n */\nexport function toPosixPath(filePath: string): string {\n return filePath.replace(/\\\\/g, \"/\");\n}\n\nexport function toViteModuleId(filePath: string, root: string): string {\n if (!path.isAbsolute(filePath)) return filePath;\n\n const relativePath = path.relative(root, filePath);\n if (relativePath && !relativePath.startsWith(\"..\") && !path.isAbsolute(relativePath)) {\n return `/${relativePath.split(path.sep).join(\"/\")}`;\n }\n\n const normalizedPath = filePath.replace(/\\\\/g, \"/\");\n return normalizedPath.startsWith(\"/\") ? `/@fs${normalizedPath}` : `/@fs/${normalizedPath}`;\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n const fs = await import(\"fs/promises\");\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function globFiles(pattern: string, cwd: string): Promise<string[]> {\n const glob = await import(\"fast-glob\");\n return glob.default(pattern, { cwd, absolute: false });\n}\n\nexport function parseSearchParams(\n searchParams: URLSearchParams,\n): Record<string, string | string[]> {\n return searchParamsToObject(searchParams) as Record<string, string | string[]>;\n}\n\nexport const logger = {\n info: (message: string) => console.log(`[info] ${message}`),\n success: (message: string) => console.log(`[success] ${message}`),\n warn: (message: string) => console.warn(`⚠️ ${message}`),\n error: (message: string) => console.error(`❌ ${message}`),\n ready: (message: string) => console.log(`${message}`),\n event: (message: string) => console.log(` ${message}`),\n};\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/deferred.ts"],"sourcesContent":["export const FARM_DEFERRED_CONTENT_TYPE = \"application/x-farm-deferred+json\";\nexport const FARM_DEFERRED_ERROR_CODE = \"FARM_DEFERRED_DATA_ERROR\";\nexport const FARM_DEFERRED_BRAND: unique symbol = Symbol.for(\n \"farm.deferred\",\n) as typeof FARM_DEFERRED_BRAND;\n\nconst FARM_DEFERRED_MARKER = \"$farmDeferred\";\n\ntype DeferredState<T = unknown> =\n | { status: \"pending\" }\n | { status: \"fulfilled\"; value: T }\n | { status: \"rejected\"; reason: unknown };\n\nexport interface Deferred<T> extends Promise<T> {\n readonly [FARM_DEFERRED_BRAND]: true;\n}\n\nexport interface PreparedDeferredData {\n data: unknown;\n records: readonly DeferredRecord[];\n}\n\nexport interface DeferredRecord {\n id: string;\n promise: Deferred<unknown>;\n}\n\nexport type DeferredSettlement =\n | { status: \"fulfilled\"; value: unknown }\n | { status: \"rejected\"; error: { code: typeof FARM_DEFERRED_ERROR_CODE; message: string } };\n\nexport type DeferredSettlements = Record<string, DeferredSettlement>;\n\nexport interface DeferredDataResponseOptions {\n onError?: (error: unknown, id: string) => void;\n}\n\nexport class DeferredDataError extends Error {\n readonly name = \"DeferredDataError\";\n readonly code = FARM_DEFERRED_ERROR_CODE;\n\n constructor(message = \"Deferred route data failed to load\") {\n super(message);\n }\n}\n\nconst deferredStates = new WeakMap<object, DeferredState>();\n\nexport function defer<T>(value: PromiseLike<T>): Deferred<Awaited<T>> {\n if (isDeferred(value)) {\n return value as Deferred<Awaited<T>>;\n }\n\n const promise = Promise.resolve(value) as Deferred<Awaited<T>>;\n Object.defineProperty(promise, FARM_DEFERRED_BRAND, {\n configurable: false,\n enumerable: false,\n value: true,\n writable: false,\n });\n deferredStates.set(promise, { status: \"pending\" });\n promise.then(\n (resolved) => deferredStates.set(promise, { status: \"fulfilled\", value: resolved }),\n (reason) => deferredStates.set(promise, { status: \"rejected\", reason }),\n );\n return promise;\n}\n\nexport function isDeferred<T = unknown>(value: unknown): value is Deferred<T> {\n return Boolean(\n value &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n (value as Record<PropertyKey, unknown>)[FARM_DEFERRED_BRAND] === true,\n );\n}\n\nexport function prepareDeferredData(value: unknown): PreparedDeferredData {\n const context = createEncodingContext();\n return {\n data: encodeDeferredValue(value, context, new WeakSet()),\n records: context.records,\n };\n}\n\nexport function snapshotDeferredData(records: readonly DeferredRecord[]): DeferredSettlements {\n const context = createEncodingContext(records);\n const settlements: DeferredSettlements = {};\n\n for (let index = 0; index < context.records.length; index++) {\n const record = context.records[index]!;\n const state = readDeferredState(record.promise);\n\n if (state.status === \"fulfilled\") {\n try {\n settlements[record.id] = {\n status: \"fulfilled\",\n value: encodeDeferredValue(state.value, context, new WeakSet()),\n };\n } catch {\n settlements[record.id] = createRejectedSettlement();\n }\n } else {\n settlements[record.id] = createRejectedSettlement();\n }\n }\n\n return settlements;\n}\n\nexport function reviveDeferredData<T>(value: T, settlements: DeferredSettlements): T {\n return reviveDeferredValue(value, new Map(), settlements) as T;\n}\n\nexport function createDeferredDataResponse(\n value: unknown,\n init: ResponseInit = {},\n options: DeferredDataResponseOptions = {},\n): Response {\n const context = createEncodingContext();\n const data = encodeDeferredValue(value, context, new WeakSet());\n const headers = new Headers(init.headers);\n\n if (context.records.length === 0) {\n headers.set(\"Content-Type\", \"application/json; charset=utf-8\");\n return new Response(JSON.stringify(data), { ...init, headers });\n }\n\n headers.set(\"Content-Type\", `${FARM_DEFERRED_CONTENT_TYPE}; charset=utf-8`);\n headers.set(\"Cache-Control\", headers.get(\"Cache-Control\") || \"private, max-age=0\");\n const initialLine = encodeDeferredMessage({ type: \"data\", data });\n const encoder = new TextEncoder();\n let cancelled = false;\n\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(encoder.encode(initialLine));\n let pending = context.records.length;\n\n const finishRecord = () => {\n pending--;\n if (!cancelled && pending === 0) controller.close();\n };\n\n const schedule = (record: DeferredRecord) => {\n record.promise\n .then(\n (resolved) => {\n if (cancelled) return;\n try {\n const previousLength = context.records.length;\n const encoded = encodeDeferredValue(resolved, context, new WeakSet());\n const nestedRecords = context.records.slice(previousLength);\n pending += nestedRecords.length;\n controller.enqueue(\n encoder.encode(\n encodeDeferredMessage({ type: \"resolve\", id: record.id, data: encoded }),\n ),\n );\n for (const nestedRecord of nestedRecords) schedule(nestedRecord);\n } catch (error) {\n reportDeferredError(options, error, record.id);\n controller.enqueue(\n encoder.encode(\n encodeDeferredMessage({\n type: \"reject\",\n id: record.id,\n error: createDeferredPublicError(),\n }),\n ),\n );\n }\n },\n (error) => {\n if (cancelled) return;\n reportDeferredError(options, error, record.id);\n controller.enqueue(\n encoder.encode(\n encodeDeferredMessage({\n type: \"reject\",\n id: record.id,\n error: createDeferredPublicError(),\n }),\n ),\n );\n },\n )\n .finally(finishRecord);\n };\n\n const initialRecords = context.records.slice();\n for (const record of initialRecords) schedule(record);\n },\n cancel() {\n cancelled = true;\n },\n });\n\n return new Response(stream, { ...init, headers });\n}\n\nexport async function readDeferredDataResponse<T>(response: Response): Promise<T> {\n const contentType = response.headers.get(\"Content-Type\") || \"\";\n if (!contentType.toLowerCase().startsWith(FARM_DEFERRED_CONTENT_TYPE)) {\n return (await response.json()) as T;\n }\n if (!response.body) {\n throw new DeferredDataError(\"Deferred route data response has no body\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const controllers = new Map<string, ControlledDeferred>();\n let buffer = \"\";\n let complete = false;\n\n const readLine = async (): Promise<string | undefined> => {\n while (true) {\n const newline = buffer.indexOf(\"\\n\");\n if (newline >= 0) {\n const line = buffer.slice(0, newline);\n buffer = buffer.slice(newline + 1);\n return line;\n }\n if (complete) {\n if (!buffer) return undefined;\n const line = buffer;\n buffer = \"\";\n return line;\n }\n\n const chunk = await reader.read();\n complete = chunk.done;\n if (chunk.value) buffer += decoder.decode(chunk.value, { stream: !chunk.done });\n if (chunk.done) buffer += decoder.decode();\n }\n };\n\n const firstLine = await readLine();\n if (!firstLine) {\n reader.releaseLock();\n throw new DeferredDataError(\"Deferred route data response is empty\");\n }\n\n const initial = parseDeferredMessage(firstLine);\n if (initial.type !== \"data\") {\n reader.releaseLock();\n throw new DeferredDataError(\"Deferred route data response is invalid\");\n }\n const data = reviveDeferredValue(initial.data, controllers) as T;\n\n void (async () => {\n try {\n for (let line = await readLine(); line !== undefined; line = await readLine()) {\n if (!line) continue;\n const message = parseDeferredMessage(line);\n if (message.type === \"resolve\") {\n const controller = getControlledDeferred(message.id, controllers);\n controller.resolve(reviveDeferredValue(message.data, controllers));\n } else if (message.type === \"reject\") {\n getControlledDeferred(message.id, controllers).reject(\n new DeferredDataError(message.error?.message),\n );\n }\n }\n rejectPendingDeferred(controllers, \"Deferred route data stream ended before completion\");\n } catch {\n rejectPendingDeferred(controllers, \"Deferred route data stream could not be read\");\n } finally {\n reader.releaseLock();\n }\n })();\n\n return data;\n}\n\ninterface EncodingContext {\n records: DeferredRecord[];\n ids: Map<Deferred<unknown>, string>;\n nextId: number;\n}\n\ninterface ControlledDeferred {\n promise: Promise<unknown> & {\n status?: \"pending\" | \"fulfilled\" | \"rejected\";\n value?: unknown;\n reason?: unknown;\n };\n resolve(value: unknown): void;\n reject(error: unknown): void;\n}\n\nfunction createEncodingContext(records: readonly DeferredRecord[] = []): EncodingContext {\n return {\n records: [...records],\n ids: new Map(records.map((record) => [record.promise, record.id])),\n nextId: records.reduce((highest, record) => {\n const value = Number(record.id.replace(/^d/, \"\"));\n return Number.isFinite(value) ? Math.max(highest, value + 1) : highest;\n }, records.length),\n };\n}\n\nfunction encodeDeferredValue(\n value: unknown,\n context: EncodingContext,\n ancestors: WeakSet<object>,\n): unknown {\n if (isDeferred(value)) {\n let id = context.ids.get(value);\n if (!id) {\n id = `d${context.nextId++}`;\n context.ids.set(value, id);\n context.records.push({ id, promise: value as Deferred<unknown> });\n }\n return { [FARM_DEFERRED_MARKER]: id };\n }\n if (!value || typeof value !== \"object\") return value;\n if (Array.isArray(value)) {\n assertNotCircular(value, ancestors);\n const output = value.map((item) => encodeDeferredValue(item, context, ancestors));\n ancestors.delete(value);\n return output;\n }\n\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) return value;\n\n assertNotCircular(value, ancestors);\n const output: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n output[key] = encodeDeferredValue(item, context, ancestors);\n }\n ancestors.delete(value);\n // User data that happens to have the marker shape must not be revived as a\n // deferred reference. Real ids never start with \"!\", so prefix-escape the\n // value; revive strips one \"!\" back off.\n if (isDeferredMarker(output)) {\n return { [FARM_DEFERRED_MARKER]: `!${output[FARM_DEFERRED_MARKER]}` };\n }\n return output;\n}\n\nfunction reviveDeferredValue(\n value: unknown,\n controllers: Map<string, ControlledDeferred>,\n settlements?: DeferredSettlements,\n applyingSettlements = new Set<string>(),\n): unknown {\n if (isDeferredMarker(value)) {\n const id = value[FARM_DEFERRED_MARKER];\n // Escaped user data, not a deferred reference — restore the original.\n if (id.startsWith(\"!\")) {\n return { [FARM_DEFERRED_MARKER]: id.slice(1) };\n }\n const controller = getControlledDeferred(id, controllers);\n const settlement = settlements?.[id];\n if (settlement && controller.promise.status === \"pending\") {\n if (applyingSettlements.has(id)) return controller.promise;\n applyingSettlements.add(id);\n if (settlement.status === \"fulfilled\") {\n controller.resolve(\n reviveDeferredValue(settlement.value, controllers, settlements, applyingSettlements),\n );\n } else {\n controller.reject(new DeferredDataError(settlement.error.message));\n }\n applyingSettlements.delete(id);\n } else if (settlements && controller.promise.status === \"pending\") {\n controller.reject(new DeferredDataError(\"Deferred route data was not resolved\"));\n }\n return controller.promise;\n }\n if (Array.isArray(value)) {\n return value.map((item) =>\n reviveDeferredValue(item, controllers, settlements, applyingSettlements),\n );\n }\n if (!value || typeof value !== \"object\") return value;\n\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) return value;\n const output: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n output[key] = reviveDeferredValue(item, controllers, settlements, applyingSettlements);\n }\n return output;\n}\n\nfunction getControlledDeferred(\n id: string,\n controllers: Map<string, ControlledDeferred>,\n): ControlledDeferred {\n const existing = controllers.get(id);\n if (existing) return existing;\n\n let nativeResolve!: (value: unknown) => void;\n let nativeReject!: (error: unknown) => void;\n const promise = new Promise<unknown>((resolve, reject) => {\n nativeResolve = resolve;\n nativeReject = reject;\n }) as ControlledDeferred[\"promise\"];\n promise.status = \"pending\";\n promise.catch(() => undefined);\n\n const controlled: ControlledDeferred = {\n promise,\n resolve(value) {\n if (promise.status !== \"pending\") return;\n promise.status = \"fulfilled\";\n promise.value = value;\n nativeResolve(value);\n },\n reject(error) {\n if (promise.status !== \"pending\") return;\n promise.status = \"rejected\";\n promise.reason = error;\n nativeReject(error);\n },\n };\n controllers.set(id, controlled);\n return controlled;\n}\n\nfunction readDeferredState(promise: Deferred<unknown>): DeferredState {\n const tracked = deferredStates.get(promise);\n if (tracked && tracked.status !== \"pending\") return tracked;\n\n const reactState = promise as Deferred<unknown> & {\n status?: string;\n value?: unknown;\n reason?: unknown;\n };\n if (reactState.status === \"fulfilled\") {\n return { status: \"fulfilled\", value: reactState.value };\n }\n if (reactState.status === \"rejected\") {\n return { status: \"rejected\", reason: reactState.reason };\n }\n return tracked || { status: \"pending\" };\n}\n\nfunction isDeferredMarker(value: unknown): value is { [FARM_DEFERRED_MARKER]: string } {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n Object.keys(value).length === 1 &&\n typeof (value as Record<string, unknown>)[FARM_DEFERRED_MARKER] === \"string\",\n );\n}\n\nfunction assertNotCircular(value: object, ancestors: WeakSet<object>): void {\n if (ancestors.has(value)) {\n throw new TypeError(\"Deferred route data must be JSON-serializable and cannot be circular\");\n }\n ancestors.add(value);\n}\n\nfunction createDeferredPublicError() {\n return {\n code: FARM_DEFERRED_ERROR_CODE,\n message: \"Deferred route data failed to load\",\n } as const;\n}\n\nfunction createRejectedSettlement(): DeferredSettlement {\n return { status: \"rejected\", error: createDeferredPublicError() };\n}\n\nfunction reportDeferredError(\n options: DeferredDataResponseOptions,\n error: unknown,\n id: string,\n): void {\n try {\n options.onError?.(error, id);\n } catch {\n // Error reporting must not break the response stream.\n }\n}\n\nfunction encodeDeferredMessage(message: Record<string, unknown>): string {\n return `${JSON.stringify(message)}\\n`;\n}\n\nfunction parseDeferredMessage(line: string): any {\n try {\n return JSON.parse(line);\n } catch {\n throw new DeferredDataError(\"Deferred route data response contains invalid JSON\");\n }\n}\n\nfunction rejectPendingDeferred(\n controllers: Map<string, ControlledDeferred>,\n message: string,\n): void {\n for (const controller of controllers.values()) {\n if (controller.promise.status === \"pending\") {\n controller.reject(new DeferredDataError(message));\n }\n }\n}\n"],"mappings":"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","names":["output"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/deployment.ts"],"sourcesContent":["export const FARM_DEPLOYMENT_ID_HEADER = \"x-farm-deployment-id\";\nexport const FARM_DEPLOYMENT_MISMATCH_HEADER = \"x-farm-deployment-mismatch\";\nexport const FARM_DEPLOYMENT_COOKIE = \"__farm_deployment\";\nexport const FARM_DEPLOYMENT_MISMATCH_CODE = \"FARM_DEPLOYMENT_MISMATCH\";\nexport const FARM_DEPLOYMENT_MISMATCH_STATUS = 409;\n\nexport type FarmPresetRuntime = \"node\" | \"edge\" | \"unknown\";\n\nexport function getFarmPresetRuntime(preset: string): FarmPresetRuntime {\n if (\n preset === \"cloudflare\" ||\n preset === \"cloudflare-pages\" ||\n preset === \"cloudflare-module\" ||\n preset === \"netlify-edge\" ||\n preset === \"vercel-edge\" ||\n preset === \"deno\"\n ) {\n return \"edge\";\n }\n\n if (\n preset === \"node-server\" ||\n preset === \"vercel\" ||\n preset === \"netlify\" ||\n preset === \"aws-lambda\" ||\n preset === \"azure\" ||\n preset === \"firebase\" ||\n preset === \"bun\" ||\n preset === \"self-host\" ||\n preset === \"farm\"\n ) {\n return \"node\";\n }\n\n return \"unknown\";\n}\n\nexport interface FarmDeploymentMismatch {\n clientDeploymentId: string;\n serverDeploymentId: string;\n}\n\nexport interface FarmDeploymentResponseOptions {\n setCookie?: boolean;\n cookiePath?: string;\n secureCookie?: boolean;\n}\n\nexport class FarmDeploymentMismatchError extends Error {\n readonly name = \"FarmDeploymentMismatchError\";\n readonly code = FARM_DEPLOYMENT_MISMATCH_CODE;\n readonly retryable = false;\n\n constructor(\n readonly clientDeploymentId: string,\n readonly serverDeploymentId: string,\n ) {\n super(\"The application was updated while this page was open. Refresh before trying again.\");\n }\n}\n\nexport function normalizeFarmDeploymentId(value: unknown): string {\n if (typeof value !== \"string\" || value.trim() === \"\") {\n throw new TypeError(\"Farm deploymentId must be a non-empty string\");\n }\n\n const normalized = value.trim();\n if (normalized.length > 200 || /[\\u0000-\\u001f\\u007f]/.test(normalized)) {\n throw new TypeError(\"Farm deploymentId must be at most 200 characters without control bytes\");\n }\n\n return normalized;\n}\n\nexport function createFarmDeploymentRequestHeaders(\n deploymentId: string | undefined,\n init?: HeadersInit,\n): Headers {\n const headers = new Headers(init);\n if (deploymentId) {\n headers.set(FARM_DEPLOYMENT_ID_HEADER, deploymentId);\n }\n return headers;\n}\n\nexport function getFarmRequestDeploymentId(\n request: Pick<Request, \"headers\" | \"method\">,\n): string | undefined {\n const headerValue = request.headers.get(FARM_DEPLOYMENT_ID_HEADER)?.trim();\n if (headerValue) return headerValue;\n\n if (isSafeRequestMethod(request.method)) return undefined;\n return readCookie(request.headers.get(\"cookie\"), FARM_DEPLOYMENT_COOKIE);\n}\n\nexport function getFarmDeploymentMismatch(\n request: Pick<Request, \"headers\" | \"method\">,\n serverDeploymentId: string | undefined,\n): FarmDeploymentMismatch | null {\n if (!serverDeploymentId) return null;\n\n const clientDeploymentId = getFarmRequestDeploymentId(request);\n if (!clientDeploymentId || clientDeploymentId === serverDeploymentId) return null;\n\n return { clientDeploymentId, serverDeploymentId };\n}\n\nexport function createFarmDeploymentMismatchResponse(mismatch: FarmDeploymentMismatch): Response {\n return new Response(\n JSON.stringify({\n error: FARM_DEPLOYMENT_MISMATCH_CODE,\n message: \"The application deployment changed. Refresh before retrying this request.\",\n }),\n {\n status: FARM_DEPLOYMENT_MISMATCH_STATUS,\n headers: {\n \"Cache-Control\": \"no-store\",\n \"Content-Type\": \"application/json; charset=utf-8\",\n [FARM_DEPLOYMENT_ID_HEADER]: mismatch.serverDeploymentId,\n [FARM_DEPLOYMENT_MISMATCH_HEADER]: \"1\",\n },\n },\n );\n}\n\nexport function withFarmDeploymentResponse(\n response: Response,\n deploymentId: string | undefined,\n options: FarmDeploymentResponseOptions = {},\n): Response {\n if (!deploymentId) return response;\n\n const headers = new Headers(response.headers);\n headers.set(FARM_DEPLOYMENT_ID_HEADER, deploymentId);\n if (options.setCookie) {\n headers.append(\n \"Set-Cookie\",\n createFarmDeploymentCookie(\n deploymentId,\n options.cookiePath ?? \"/\",\n options.secureCookie ?? false,\n ),\n );\n }\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\nexport function getFarmResponseDeploymentId(\n response: Pick<Response, \"headers\">,\n): string | undefined {\n return response.headers.get(FARM_DEPLOYMENT_ID_HEADER)?.trim() || undefined;\n}\n\nexport function isFarmDeploymentMismatchResponse(\n response: Pick<Response, \"headers\" | \"status\">,\n clientDeploymentId: string | undefined,\n): boolean {\n const serverDeploymentId = getFarmResponseDeploymentId(response);\n if (clientDeploymentId && serverDeploymentId && clientDeploymentId !== serverDeploymentId) {\n return true;\n }\n\n return (\n response.status === FARM_DEPLOYMENT_MISMATCH_STATUS &&\n response.headers.get(FARM_DEPLOYMENT_MISMATCH_HEADER) === \"1\"\n );\n}\n\nexport function createFarmDeploymentMismatchError(\n response: Pick<Response, \"headers\">,\n clientDeploymentId: string,\n): FarmDeploymentMismatchError {\n return new FarmDeploymentMismatchError(\n clientDeploymentId,\n getFarmResponseDeploymentId(response) || \"unknown\",\n );\n}\n\nexport function createFarmDeploymentCookie(\n deploymentId: string,\n path = \"/\",\n secure = false,\n): string {\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n return [\n `${FARM_DEPLOYMENT_COOKIE}=${encodeURIComponent(deploymentId)}`,\n `Path=${normalizedPath}`,\n \"HttpOnly\",\n \"SameSite=Lax\",\n secure ? \"Secure\" : \"\",\n ]\n .filter(Boolean)\n .join(\"; \");\n}\n\nfunction readCookie(cookieHeader: string | null, name: string): string | undefined {\n if (!cookieHeader) return undefined;\n\n for (const part of cookieHeader.split(\";\")) {\n const separator = part.indexOf(\"=\");\n if (separator === -1 || part.slice(0, separator).trim() !== name) continue;\n\n const value = part.slice(separator + 1).trim();\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction isSafeRequestMethod(method: string): boolean {\n return [\"GET\", \"HEAD\", \"OPTIONS\", \"QUERY\"].includes(method.toUpperCase());\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,IAAM,4BAA4B;AAClC,IAAM,kCAAkC;AACxC,IAAM,yBAAyB;AAC/B,IAAM,gCAAgC;AACtC,IAAM,kCAAkC;AAIxC,SAAS,qBAAqB,QAAmC;AACtE,MACE,WAAW,gBACX,WAAW,sBACX,WAAW,uBACX,WAAW,kBACX,WAAW,iBACX,WAAW,QACX;AACA,WAAO;AAAA,EACT;AAEA,MACE,WAAW,iBACX,WAAW,YACX,WAAW,aACX,WAAW,gBACX,WAAW,WACX,WAAW,cACX,WAAW,SACX,WAAW,eACX,WAAW,QACX;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AA3BgB;AAwCT,IAAM,+BAAN,MAAM,qCAAoC,MAAM;AAAA,EAKrD,YACW,oBACA,oBACT;AACA,UAAM,oFAAoF;AAHjF;AACA;AANX,SAAS,OAAO;AAChB,SAAS,OAAO;AAChB,SAAS,YAAY;AAAA,EAOrB;AACF;AAXuD;AAAhD,IAAM,8BAAN;AAaA,SAAS,0BAA0B,OAAwB;AAChE,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI;AACpD,UAAM,IAAI,UAAU,8CAA8C;AAAA,EACpE;AAEA,QAAM,aAAa,MAAM,KAAK;AAC9B,MAAI,WAAW,SAAS,OAAO,wBAAwB,KAAK,UAAU,GAAG;AACvE,UAAM,IAAI,UAAU,wEAAwE;AAAA,EAC9F;AAEA,SAAO;AACT;AAXgB;AAaT,SAAS,mCACd,cACA,MACS;AACT,QAAM,UAAU,IAAI,QAAQ,IAAI;AAChC,MAAI,cAAc;AAChB,YAAQ,IAAI,2BAA2B,YAAY;AAAA,EACrD;AACA,SAAO;AACT;AATgB;AAWT,SAAS,2BACd,SACoB;AACpB,QAAM,cAAc,QAAQ,QAAQ,IAAI,yBAAyB,GAAG,KAAK;AACzE,MAAI,YAAa,QAAO;AAExB,MAAI,oBAAoB,QAAQ,MAAM,EAAG,QAAO;AAChD,SAAO,WAAW,QAAQ,QAAQ,IAAI,QAAQ,GAAG,sBAAsB;AACzE;AARgB;AAUT,SAAS,0BACd,SACA,oBAC+B;AAC/B,MAAI,CAAC,mBAAoB,QAAO;AAEhC,QAAM,qBAAqB,2BAA2B,OAAO;AAC7D,MAAI,CAAC,sBAAsB,uBAAuB,mBAAoB,QAAO;AAE7E,SAAO,EAAE,oBAAoB,mBAAmB;AAClD;AAVgB;AAYT,SAAS,qCAAqC,UAA4C;AAC/F,SAAO,IAAI;AAAA,IACT,KAAK,UAAU;AAAA,MACb,OAAO;AAAA,MACP,SAAS;AAAA,IACX,CAAC;AAAA,IACD;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,QAChB,CAAC,yBAAyB,GAAG,SAAS;AAAA,QACtC,CAAC,+BAA+B,GAAG;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AACF;AAhBgB;AAkBT,SAAS,2BACd,UACA,cACA,UAAyC,CAAC,GAChC;AACV,MAAI,CAAC,aAAc,QAAO;AAE1B,QAAM,UAAU,IAAI,QAAQ,SAAS,OAAO;AAC5C,UAAQ,IAAI,2BAA2B,YAAY;AACnD,MAAI,QAAQ,WAAW;AACrB,YAAQ;AAAA,MACN;AAAA,MACA;AAAA,QACE;AAAA,QACA,QAAQ,cAAc;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,SAAO,IAAI,SAAS,SAAS,MAAM;AAAA,IACjC,QAAQ,SAAS;AAAA,IACjB,YAAY,SAAS;AAAA,IACrB;AAAA,EACF,CAAC;AACH;AAzBgB;AA2BT,SAAS,4BACd,UACoB;AACpB,SAAO,SAAS,QAAQ,IAAI,yBAAyB,GAAG,KAAK,KAAK;AACpE;AAJgB;AAMT,SAAS,iCACd,UACA,oBACS;AACT,QAAM,qBAAqB,4BAA4B,QAAQ;AAC/D,MAAI,sBAAsB,sBAAsB,uBAAuB,oBAAoB;AACzF,WAAO;AAAA,EACT;AAEA,SACE,SAAS,WAAW,mCACpB,SAAS,QAAQ,IAAI,+BAA+B,MAAM;AAE9D;AAbgB;AAeT,SAAS,kCACd,UACA,oBAC6B;AAC7B,SAAO,IAAI;AAAA,IACT;AAAA,IACA,4BAA4B,QAAQ,KAAK;AAAA,EAC3C;AACF;AARgB;AAUT,SAAS,2BACd,cACA,OAAO,KACP,SAAS,OACD;AACR,QAAM,iBAAiB,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI;AAC7D,SAAO;AAAA,IACL,GAAG,sBAAsB,IAAI,mBAAmB,YAAY,CAAC;AAAA,IAC7D,QAAQ,cAAc;AAAA,IACtB;AAAA,IACA;AAAA,IACA,SAAS,WAAW;AAAA,EACtB,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AACd;AAfgB;AAiBhB,SAAS,WAAW,cAA6B,MAAkC;AACjF,MAAI,CAAC,aAAc,QAAO;AAE1B,aAAW,QAAQ,aAAa,MAAM,GAAG,GAAG;AAC1C,UAAM,YAAY,KAAK,QAAQ,GAAG;AAClC,QAAI,cAAc,MAAM,KAAK,MAAM,GAAG,SAAS,EAAE,KAAK,MAAM,KAAM;AAElE,UAAM,QAAQ,KAAK,MAAM,YAAY,CAAC,EAAE,KAAK;AAC7C,QAAI;AACF,aAAO,mBAAmB,KAAK;AAAA,IACjC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAhBS;AAkBT,SAAS,oBAAoB,QAAyB;AACpD,SAAO,CAAC,OAAO,QAAQ,WAAW,OAAO,EAAE,SAAS,OAAO,YAAY,CAAC;AAC1E;AAFS;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/devtools-ui.ts"],"sourcesContent":["import type { FarmDevtoolsDiagnostic, FarmDevtoolsRuntime, FarmDevtoolsSnapshot } from \"./devtools\";\n\ntype IconName =\n | \"activity\"\n | \"api\"\n | \"app\"\n | \"blocks\"\n | \"book\"\n | \"clock\"\n | \"chevron\"\n | \"close\"\n | \"copy\"\n | \"database\"\n | \"external\"\n | \"layers\"\n | \"overview\"\n | \"refresh\"\n | \"route\"\n | \"runtime\"\n | \"search\"\n | \"shield\"\n | \"terminal\";\n\nconst ICON_PATHS: Record<IconName, string> = {\n activity: '<path d=\"M22 12h-4l-3 9L9 3l-3 9H2\"/>',\n api: '<path d=\"M8 3H7a2 2 0 0 0-2 2v4a2 2 0 0 1-2 2 2 2 0 0 1 2 2v4a2 2 0 0 0 2 2h1\"/><path d=\"M16 3h1a2 2 0 0 1 2 2v4a2 2 0 0 0 2 2 2 2 0 0 0-2 2v4a2 2 0 0 1-2 2h-1\"/>',\n app: '<path d=\"M15 3h6v6\"/><path d=\"M10 14 21 3\"/><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/>',\n blocks:\n '<rect width=\"7\" height=\"7\" x=\"3\" y=\"3\"/><rect width=\"7\" height=\"7\" x=\"14\" y=\"3\"/><rect width=\"7\" height=\"7\" x=\"14\" y=\"14\"/><rect width=\"7\" height=\"7\" x=\"3\" y=\"14\"/>',\n book: '<path d=\"M4 19.5A2.5 2.5 0 0 1 6.5 17H20\"/><path d=\"M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z\"/>',\n clock: '<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 7v5l3 2\"/>',\n chevron: '<path d=\"m9 18 6-6-6-6\"/>',\n close: '<path d=\"M18 6 6 18M6 6l12 12\"/>',\n copy: '<rect width=\"14\" height=\"14\" x=\"8\" y=\"8\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/>',\n database:\n '<ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\"/><path d=\"M3 5v14c0 1.7 4 3 9 3s9-1.3 9-3V5\"/><path d=\"M3 12c0 1.7 4 3 9 3s9-1.3 9-3\"/>',\n external:\n '<path d=\"M15 3h6v6\"/><path d=\"M10 14 21 3\"/><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/>',\n layers:\n '<path d=\"m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z\"/><path d=\"m22 12.5-9.17 4.17a2 2 0 0 1-1.66 0L2 12.5\"/><path d=\"m22 17.5-9.17 4.17a2 2 0 0 1-1.66 0L2 17.5\"/>',\n overview:\n '<rect width=\"7\" height=\"9\" x=\"3\" y=\"3\"/><rect width=\"7\" height=\"5\" x=\"14\" y=\"3\"/><rect width=\"7\" height=\"9\" x=\"14\" y=\"12\"/><rect width=\"7\" height=\"5\" x=\"3\" y=\"16\"/>',\n refresh:\n '<path d=\"M20 11a8.1 8.1 0 0 0-15.5-2M4 4v5h5\"/><path d=\"M4 13a8.1 8.1 0 0 0 15.5 2M20 20v-5h-5\"/>',\n route:\n '<circle cx=\"6\" cy=\"19\" r=\"3\"/><path d=\"M9 19h5.5a3.5 3.5 0 0 0 0-7h-5a3.5 3.5 0 0 1 0-7H18\"/><circle cx=\"18\" cy=\"5\" r=\"3\"/>',\n runtime:\n '<rect width=\"20\" height=\"14\" x=\"2\" y=\"3\"/><line x1=\"8\" x2=\"16\" y1=\"21\" y2=\"21\"/><line x1=\"12\" x2=\"12\" y1=\"17\" y2=\"21\"/>',\n search: '<circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.3-4.3\"/>',\n shield: '<path d=\"M20 13c0 5-3.5 7.5-8 9-4.5-1.5-8-4-8-9V5l8-3 8 3z\"/><path d=\"m9 12 2 2 4-4\"/>',\n terminal: '<polyline points=\"4 17 10 11 4 5\"/><line x1=\"12\" x2=\"20\" y1=\"19\" y2=\"19\"/>',\n};\n\nfunction icon(name: IconName, className = \"\"): string {\n return `<svg class=\"icon ${className}\" data-lucide=\"${name}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">${ICON_PATHS[name]}</svg>`;\n}\n\nfunction escapeHtml(value: unknown): string {\n return String(value ?? \"\")\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction escapeAttribute(value: unknown): string {\n return escapeHtml(value).replace(/`/g, \"&#96;\");\n}\n\nfunction renderBadge(value: string, tone = \"neutral\"): string {\n return `<span class=\"badge badge-${tone}\">${escapeHtml(value)}</span>`;\n}\n\nfunction renderRuntime(runtime: FarmDevtoolsRuntime | undefined): string {\n if (!runtime) return '<span class=\"muted\">Inherited</span>';\n const details = [\n runtime.regions?.length ? runtime.regions.join(\", \") : null,\n runtime.maxDuration ? `${runtime.maxDuration}s` : null,\n ].filter(Boolean);\n return `<span class=\"runtime-value\">${renderBadge(runtime.runtime, runtime.runtime)}${\n details.length ? `<small>${escapeHtml(details.join(\" / \"))}</small>` : \"\"\n }</span>`;\n}\n\nfunction renderEmpty(title: string, detail: string): string {\n return `<div class=\"empty-state\">\n ${icon(\"activity\")}\n <strong>${escapeHtml(title)}</strong>\n <span>${escapeHtml(detail)}</span>\n </div>`;\n}\n\nfunction renderFilter(id: string, placeholder: string): string {\n return `<label class=\"filter-control\">\n ${icon(\"search\")}\n <span class=\"sr-only\">${escapeHtml(placeholder)}</span>\n <input type=\"search\" placeholder=\"${escapeAttribute(placeholder)}\" data-filter=\"${escapeAttribute(id)}\" autocomplete=\"off\">\n <kbd>/</kbd>\n </label>`;\n}\n\nfunction renderDiagnostics(diagnostics: FarmDevtoolsDiagnostic[]): string {\n if (diagnostics.length === 0) {\n return `<div class=\"diagnostic diagnostic-ready\">\n <span class=\"diagnostic-mark\">${icon(\"shield\")}</span>\n <div><strong>Framework checks passed</strong><p>Routes and configured systems are internally consistent.</p></div>\n ${renderBadge(\"ready\", \"ready\")}\n </div>`;\n }\n\n return diagnostics\n .map(\n (diagnostic) => `<article class=\"diagnostic diagnostic-${diagnostic.severity}\">\n <span class=\"diagnostic-mark\">${icon(\n diagnostic.severity === \"error\" ? \"activity\" : \"shield\",\n )}</span>\n <div>\n <span class=\"diagnostic-code\">${escapeHtml(diagnostic.code)}</span>\n <strong>${escapeHtml(diagnostic.title)}</strong>\n <p>${escapeHtml(diagnostic.message)}</p>\n ${diagnostic.action ? `<small>${escapeHtml(diagnostic.action)}</small>` : \"\"}\n </div>\n ${renderBadge(diagnostic.severity, diagnostic.severity)}\n </article>`,\n )\n .join(\"\");\n}\n\nfunction renderSystemRows(snapshot: FarmDevtoolsSnapshot): string {\n const rows = [\n [\"Integrations\", snapshot.counts.integrations, \"Configured product adapters\", \"blocks\"],\n [\"Storage\", snapshot.counts.storageMounts, \"Root driver and named mounts\", \"database\"],\n [\"Cron\", snapshot.counts.cronJobs, \"Portable scheduled API routes\", \"clock\"],\n [\"Workflows\", snapshot.counts.workflows, \"Discovered workflow modules\", \"activity\"],\n [\"Docs\", snapshot.docs.enabled ? \"On\" : \"Off\", snapshot.docs.entry || \"No docs route\", \"book\"],\n ] as const;\n\n return rows\n .map(\n ([label, value, detail, rowIcon]) => `<div class=\"system-row\">\n <span class=\"system-icon\">${icon(rowIcon)}</span>\n <div><strong>${escapeHtml(label)}</strong><small>${escapeHtml(detail)}</small></div>\n <span class=\"system-value\">${escapeHtml(value)}</span>\n </div>`,\n )\n .join(\"\");\n}\n\nfunction renderIntegrations(snapshot: FarmDevtoolsSnapshot): string {\n if (snapshot.integrations.length === 0) {\n return renderEmpty(\n \"No integrations configured\",\n \"Register product systems through farm.config.ts when the app needs them.\",\n );\n }\n\n return `<div class=\"table-scroll\"><table>\n <thead><tr><th>Registry key</th><th>Adapter</th><th>Routes</th><th>Runtime surface</th></tr></thead>\n <tbody>${snapshot.integrations\n .map(\n (integration) => `<tr>\n <td><code>${escapeHtml(integration.key)}</code><small class=\"cell-detail\">${escapeHtml(\n integration.category,\n )}</small></td>\n <td>${escapeHtml(integration.type)}</td>\n <td>${\n integration.routes.length\n ? integration.routes\n .map(\n (route) =>\n `<span class=\"route-operation\"><code>${escapeHtml(\n route.path,\n )}</code><small>${escapeHtml(route.methods.join(\", \"))}</small></span>`,\n )\n .join(\"\")\n : '<span class=\"muted\">No HTTP routes</span>'\n }</td>\n <td><span class=\"runtime-facts\">${renderBadge(\n integration.serverRuntime ? \"server\" : \"platform\",\n )}<span>${integration.middlewareCount} middleware</span><span>${\n integration.providerCount\n } providers</span><span>${integration.schemaModelCount} models</span></span></td>\n </tr>`,\n )\n .join(\"\")}</tbody>\n </table></div>`;\n}\n\nfunction renderMiddleware(snapshot: FarmDevtoolsSnapshot): string {\n if (snapshot.middleware.length === 0) {\n return renderEmpty(\"No middleware configured\", \"Requests currently enter routes directly.\");\n }\n return `<div class=\"table-scroll\"><table>\n <thead><tr><th>Path</th><th>Source</th><th>Handlers</th><th>File</th></tr></thead>\n <tbody>${snapshot.middleware\n .map(\n (entry) =>\n `<tr><td><code>${escapeHtml(entry.path)}</code></td><td>${renderBadge(\n entry.source,\n )}</td><td>${entry.handlerCount}</td><td class=\"file-cell\">${escapeHtml(\n entry.filePath,\n )}</td></tr>`,\n )\n .join(\"\")}</tbody>\n </table></div>`;\n}\n\nfunction renderStorage(snapshot: FarmDevtoolsSnapshot): string {\n return `<div class=\"table-scroll\"><table>\n <thead><tr><th>Mount</th><th>Driver</th><th>State</th></tr></thead>\n <tbody>${snapshot.storage\n .map(\n (entry) =>\n `<tr><td><code>${escapeHtml(entry.mount)}</code></td><td>${escapeHtml(\n entry.driver,\n )}</td><td>${renderBadge(entry.default ? \"default\" : \"configured\")}</td></tr>`,\n )\n .join(\"\")}</tbody>\n </table></div>`;\n}\n\nfunction renderCron(snapshot: FarmDevtoolsSnapshot): string {\n if (snapshot.cron.length === 0) {\n return renderEmpty(\n \"No cron routes configured\",\n \"Add named schedules under cron in farm.config.ts.\",\n );\n }\n return `<div class=\"table-scroll\"><table>\n <thead><tr><th>Name</th><th>Schedule (UTC)</th><th>Target</th></tr></thead>\n <tbody>${snapshot.cron\n .map(\n (job) =>\n `<tr><td><code>${escapeHtml(job.name)}</code></td><td>${job.schedule\n .map((schedule) => `<code class=\"schedule\">${escapeHtml(schedule)}</code>`)\n .join(\"\")}</td><td><code>${escapeHtml(job.path)}</code></td></tr>`,\n )\n .join(\"\")}</tbody>\n </table></div>`;\n}\n\nfunction renderWorkflows(snapshot: FarmDevtoolsSnapshot): string {\n if (snapshot.workflows.length === 0) {\n return renderEmpty(\n \"No workflows discovered\",\n \"Workflow directories are enabled but currently empty.\",\n );\n }\n return `<div class=\"table-scroll\"><table>\n <thead><tr><th>Workflow</th><th>Schedule</th><th>Endpoint</th><th>Source</th></tr></thead>\n <tbody>${snapshot.workflows\n .map(\n (workflow) =>\n `<tr><td><code>${escapeHtml(workflow.id)}</code></td><td>${\n workflow.schedule.length\n ? workflow.schedule.map((schedule) => `<code>${escapeHtml(schedule)}</code>`).join(\"\")\n : '<span class=\"muted\">Manual</span>'\n }</td><td><code>${escapeHtml(workflow.routePath)}</code></td><td class=\"file-cell\">${escapeHtml(\n workflow.filePath,\n )}</td></tr>`,\n )\n .join(\"\")}</tbody>\n </table></div>`;\n}\n\nfunction renderFeatureMatrix(snapshot: FarmDevtoolsSnapshot): string {\n const features = [\n [\"OpenAPI\", snapshot.features.openapi],\n [\"Markdown\", snapshot.features.markdown],\n [\"Server components\", snapshot.features.serverComponents],\n [\"Server actions\", snapshot.features.serverActions],\n [\"Optimized boundary\", snapshot.features.optimizedBoundary],\n [\"Observability\", snapshot.features.observability],\n ] as const;\n return `<div class=\"feature-matrix\">${features\n .map(\n ([label, enabled]) =>\n `<div><span>${escapeHtml(label)}</span>${renderBadge(\n enabled ? \"enabled\" : \"disabled\",\n enabled ? \"ready\" : \"neutral\",\n )}</div>`,\n )\n .join(\"\")}</div>`;\n}\n\nfunction renderEnvironment(snapshot: FarmDevtoolsSnapshot): string {\n const renderKeys = (keys: string[]) =>\n keys.length\n ? `<div class=\"key-list\">${keys.map((key) => `<code>${escapeHtml(key)}</code>`).join(\"\")}</div>`\n : '<span class=\"muted\">No validated keys</span>';\n return `<div class=\"environment-grid\">\n <div><span class=\"mini-label\">Server keys</span>${renderKeys(snapshot.environment.server)}</div>\n <div><span class=\"mini-label\">Public keys</span>${renderKeys(snapshot.environment.public)}</div>\n </div>`;\n}\n\nfunction renderLayers(snapshot: FarmDevtoolsSnapshot): string {\n if (snapshot.layers.length === 0) {\n return renderEmpty(\n \"No layers extended\",\n \"This project owns its complete route and config surface.\",\n );\n }\n return `<div class=\"layer-list\">${snapshot.layers\n .map(\n (layer) =>\n `<div><span>${icon(\"layers\")}<strong>${escapeHtml(\n layer.name,\n )}</strong></span><code>${escapeHtml(layer.source)}</code><small>${escapeHtml(\n layer.srcDir,\n )}</small></div>`,\n )\n .join(\"\")}</div>`;\n}\n\ntype InspectorEntry = {\n id: string;\n label: string;\n description: string;\n icon: IconName;\n value?: string | number;\n searchValue?: string;\n detailMeta?: string;\n content: string;\n};\n\nfunction renderPropertyList(entries: Array<[label: string, value: string]>): string {\n return `<dl class=\"property-list\">${entries\n .map(([label, value]) => `<div><dt>${escapeHtml(label)}</dt><dd>${value}</dd></div>`)\n .join(\"\")}</dl>`;\n}\n\nfunction renderDetailIntro(\n label: string,\n title: string,\n description: string,\n detailIcon: IconName,\n): string {\n return `<div class=\"detail-intro\">\n <span class=\"detail-icon\">${icon(detailIcon)}</span>\n <div><span class=\"mini-label\">${escapeHtml(label)}</span><h2>${escapeHtml(\n title,\n )}</h2><p>${escapeHtml(description)}</p></div>\n </div>`;\n}\n\nfunction renderInspector(\n scope: string,\n title: string,\n entries: InspectorEntry[],\n filterPlaceholder?: string,\n): string {\n if (entries.length === 0) {\n return `<div class=\"single-pane\">\n <header class=\"pane-header\"><strong>${escapeHtml(title)}</strong><span>0 items</span></header>\n ${renderEmpty(`No ${title.toLowerCase()} found`, \"Farm has no runtime data for this surface yet.\")}\n </div>`;\n }\n\n return `<div class=\"split-view\" data-inspector=\"${escapeAttribute(scope)}\">\n <section class=\"pane pane-list\">\n <header class=\"pane-header\"><strong>${escapeHtml(title)}</strong><span>${entries.length} ${\n entries.length === 1 ? \"item\" : \"items\"\n }</span></header>\n ${\n filterPlaceholder\n ? `<div class=\"pane-tools\">${renderFilter(scope, filterPlaceholder)}</div>`\n : \"\"\n }\n <div class=\"pane-scroll inspector-list\" data-filter-rows=\"${escapeAttribute(scope)}\">\n ${entries\n .map(\n (\n entry,\n index,\n ) => `<button type=\"button\" class=\"inspector-row\" data-detail-trigger=\"${escapeAttribute(\n scope,\n )}\" data-detail-id=\"${escapeAttribute(entry.id)}\" data-search-value=\"${escapeAttribute(\n entry.searchValue || `${entry.label} ${entry.description}`,\n )}\" aria-selected=\"${index === 0 ? \"true\" : \"false\"}\">\n <span class=\"inspector-row-copy\"><strong>${escapeHtml(\n entry.label,\n )}</strong><small>${escapeHtml(entry.description)}</small></span>\n ${entry.value === undefined ? \"\" : `<span class=\"inspector-row-value\">${escapeHtml(entry.value)}</span>`}\n </button>`,\n )\n .join(\"\")}\n <div class=\"filtered-empty\" data-filter-empty=\"${escapeAttribute(\n scope,\n )}\" hidden>No items match this filter.</div>\n </div>\n </section>\n <section class=\"pane pane-detail\">\n ${entries\n .map(\n (entry, index) => `<article class=\"detail-panel\" data-detail-panel=\"${escapeAttribute(\n scope,\n )}\" data-detail-id=\"${escapeAttribute(entry.id)}\"${index === 0 ? \"\" : \" hidden\"}>\n <header class=\"pane-header\"><strong>${escapeHtml(entry.label)}</strong><span>${escapeHtml(\n entry.detailMeta || entry.description,\n )}</span></header>\n <div class=\"detail-scroll\">${entry.content}</div>\n </article>`,\n )\n .join(\"\")}\n </section>\n </div>`;\n}\n\nfunction renderJson(value: unknown): string {\n return `<pre class=\"json-viewer\"><code>${escapeHtml(JSON.stringify(value, null, 2))}</code></pre>`;\n}\n\nfunction renderOverviewInspector(\n snapshot: FarmDevtoolsSnapshot,\n healthLabel: string,\n generatedTime: string,\n): string {\n const scheduledCount = snapshot.counts.cronJobs + snapshot.counts.workflows;\n return renderInspector(\"overview\", \"Project\", [\n {\n id: \"diagnostics\",\n label: \"Diagnostics\",\n description: \"Actionable framework checks\",\n icon: \"shield\",\n value: snapshot.counts.diagnostics,\n detailMeta: healthLabel,\n content: `${renderDetailIntro(\n \"Project health\",\n healthLabel,\n snapshot.diagnostics.length\n ? \"Farm found configuration details that deserve attention before production.\"\n : \"Routes and configured systems are internally consistent.\",\n \"shield\",\n )}<div class=\"detail-section\">${renderDiagnostics(snapshot.diagnostics)}</div>`,\n },\n {\n id: \"project\",\n label: snapshot.project.name,\n description: snapshot.project.root,\n icon: \"app\",\n value: snapshot.project.srcDir,\n detailMeta: \"Active project\",\n content: `${renderDetailIntro(\n \"Active project\",\n snapshot.project.name,\n \"The application currently resolved by the Farm development server.\",\n \"app\",\n )}${renderPropertyList([\n [\"Root\", `<code>${escapeHtml(snapshot.project.root)}</code>`],\n [\"Source directory\", `<code>${escapeHtml(snapshot.project.srcDir)}</code>`],\n [\"Base path\", `<code>${escapeHtml(snapshot.project.basePath)}</code>`],\n [\"Deployment ID\", `<code>${escapeHtml(snapshot.project.deploymentId)}</code>`],\n [\"Snapshot\", `<span class=\"mono\">${escapeHtml(generatedTime)}</span>`],\n ])}`,\n },\n {\n id: \"routes\",\n label: \"Route surface\",\n description: \"Pages, boundaries, and typed endpoints\",\n icon: \"route\",\n value: snapshot.counts.pages + snapshot.counts.apiRoutes,\n detailMeta: `${snapshot.counts.pages} pages / ${snapshot.counts.apiRoutes} API`,\n content: `${renderDetailIntro(\n \"Application routing\",\n `${snapshot.counts.pages + snapshot.counts.apiRoutes} registered routes`,\n \"Farm resolves page boundaries and server endpoints from the same application tree.\",\n \"route\",\n )}${renderPropertyList([\n [\"Pages\", `<strong>${snapshot.counts.pages}</strong>`],\n [\"Layouts\", `<strong>${snapshot.counts.layouts}</strong>`],\n [\"Loading boundaries\", `<strong>${snapshot.counts.loadingBoundaries}</strong>`],\n [\"Error boundaries\", `<strong>${snapshot.counts.errorBoundaries}</strong>`],\n [\"API routes\", `<strong>${snapshot.counts.apiRoutes}</strong>`],\n ])}`,\n },\n {\n id: \"systems\",\n label: \"Connected systems\",\n description: \"Integrations, storage, and request layers\",\n icon: \"blocks\",\n value: snapshot.counts.integrations,\n detailMeta: \"Configured surfaces\",\n content: `${renderDetailIntro(\n \"System map\",\n \"Application services\",\n \"Product integrations and framework services visible to the running application.\",\n \"blocks\",\n )}<div class=\"detail-section\">${renderSystemRows(snapshot)}</div>`,\n },\n {\n id: \"deployment\",\n label: \"Runtime\",\n description: `${snapshot.deployment.target} / ${snapshot.deployment.preset}`,\n icon: \"runtime\",\n value: scheduledCount,\n detailMeta: \"Deployment controls\",\n content: `${renderDetailIntro(\n \"Deployment runtime\",\n snapshot.deployment.target,\n \"The resolved deployment adapter, output contract, and enabled framework surfaces.\",\n \"runtime\",\n )}${renderPropertyList([\n [\"Target\", `<code>${escapeHtml(snapshot.deployment.target)}</code>`],\n [\"Nitro preset\", `<code>${escapeHtml(snapshot.deployment.preset)}</code>`],\n [\n \"Output\",\n `<code>${escapeHtml(snapshot.deployment.outputDir || \"Framework default\")}</code>`,\n ],\n [\"Scheduled work\", `<strong>${scheduledCount}</strong>`],\n ])}<div class=\"detail-section\">${renderFeatureMatrix(snapshot)}</div>`,\n },\n ]);\n}\n\nfunction renderRoutesInspector(snapshot: FarmDevtoolsSnapshot): string {\n return renderInspector(\n \"routes\",\n \"Routes\",\n snapshot.routes.map((route, index) => ({\n id: `route-${index}`,\n label: route.pattern,\n description: route.filePath,\n icon: \"route\",\n value: route.kind,\n searchValue: `${route.kind} ${route.pattern} ${route.filePath} ${\n route.runtime?.runtime || \"inherited\"\n }`,\n detailMeta: route.kind,\n content: `${renderDetailIntro(\n `${route.kind} route`,\n route.pattern,\n route.filePath,\n \"route\",\n )}${renderPropertyList([\n [\"Kind\", renderBadge(route.kind, route.kind)],\n [\"Pattern\", `<code>${escapeHtml(route.pattern)}</code>`],\n [\"Runtime\", renderRuntime(route.runtime)],\n [\"Source\", `<code>${escapeHtml(route.filePath)}</code>`],\n ])}`,\n })),\n \"Filter routes or files\",\n );\n}\n\nfunction renderApiInspector(snapshot: FarmDevtoolsSnapshot): string {\n return renderInspector(\n \"api\",\n \"API routes\",\n snapshot.apiRoutes.map((route, index) => ({\n id: `api-${index}`,\n label: route.path,\n description: route.filePath,\n icon: \"api\",\n value: route.methods.length,\n searchValue: `${route.path} ${route.methods.join(\" \")} ${route.filePath} ${\n route.runtime.runtime\n }`,\n detailMeta: route.methods.join(\" / \"),\n content: `${renderDetailIntro(\n \"Server endpoint\",\n route.path,\n route.filePath,\n \"api\",\n )}${renderPropertyList([\n [\n \"Methods\",\n `<span class=\"method-list\">${route.methods\n .map((method) => renderBadge(method, \"method\"))\n .join(\"\")}</span>`,\n ],\n [\"Runtime\", renderRuntime(route.runtime)],\n [\"Source\", `<code>${escapeHtml(route.filePath)}</code>`],\n ])}`,\n })),\n \"Filter endpoints or methods\",\n );\n}\n\nfunction renderSystemsInspector(snapshot: FarmDevtoolsSnapshot): string {\n return renderInspector(\"systems\", \"Systems\", [\n {\n id: \"integrations\",\n label: \"Integrations\",\n description: \"Configured product adapters\",\n icon: \"blocks\",\n value: snapshot.integrations.length,\n content: renderIntegrations(snapshot),\n },\n {\n id: \"middleware\",\n label: \"Middleware\",\n description: \"Request layers and source modules\",\n icon: \"shield\",\n value: snapshot.middleware.length,\n content: renderMiddleware(snapshot),\n },\n {\n id: \"storage\",\n label: \"Storage mounts\",\n description: \"Root driver and named namespaces\",\n icon: \"database\",\n value: snapshot.storage.length,\n content: renderStorage(snapshot),\n },\n {\n id: \"docs\",\n label: \"Documentation\",\n description: snapshot.docs.entry || \"No docs route\",\n icon: \"book\",\n value: snapshot.docs.enabled ? \"on\" : \"off\",\n content: `${renderDetailIntro(\n \"Documentation\",\n snapshot.docs.enabled ? \"Docs enabled\" : \"Docs disabled\",\n \"Farm can serve application documentation from the same development runtime.\",\n \"book\",\n )}${renderPropertyList([\n [\"State\", renderBadge(snapshot.docs.enabled ? \"enabled\" : \"disabled\")],\n [\"Entry\", `<code>${escapeHtml(snapshot.docs.entry || \"Not configured\")}</code>`],\n ])}`,\n },\n ]);\n}\n\nfunction renderRuntimeInspector(snapshot: FarmDevtoolsSnapshot): string {\n return renderInspector(\"runtime\", \"Runtime\", [\n {\n id: \"deployment\",\n label: \"Deployment\",\n description: `${snapshot.deployment.target} / ${snapshot.deployment.preset}`,\n icon: \"runtime\",\n content: `${renderDetailIntro(\n \"Deployment target\",\n snapshot.deployment.target,\n \"Resolved platform adapter and build output for this application.\",\n \"runtime\",\n )}${renderPropertyList([\n [\"Target\", `<code>${escapeHtml(snapshot.deployment.target)}</code>`],\n [\"Nitro preset\", `<code>${escapeHtml(snapshot.deployment.preset)}</code>`],\n [\n \"Output directory\",\n `<code>${escapeHtml(snapshot.deployment.outputDir || \"Framework default\")}</code>`,\n ],\n ])}`,\n },\n {\n id: \"cron\",\n label: \"Cron routes\",\n description: \"Portable scheduled API routes\",\n icon: \"clock\",\n value: snapshot.cron.length,\n content: renderCron(snapshot),\n },\n {\n id: \"workflows\",\n label: \"Workflows\",\n description: \"Discovered workflow modules\",\n icon: \"activity\",\n value: snapshot.workflows.length,\n content: renderWorkflows(snapshot),\n },\n {\n id: \"features\",\n label: \"Framework features\",\n description: \"Resolved configuration switches\",\n icon: \"blocks\",\n content: renderFeatureMatrix(snapshot),\n },\n {\n id: \"environment\",\n label: \"Environment\",\n description: \"Validated key names only\",\n icon: \"shield\",\n value: snapshot.environment.server.length + snapshot.environment.public.length,\n content: renderEnvironment(snapshot),\n },\n {\n id: \"layers\",\n label: \"Layers\",\n description: \"Extended source roots\",\n icon: \"layers\",\n value: snapshot.layers.length,\n content: renderLayers(snapshot),\n },\n ]);\n}\n\nfunction renderRawInspector(snapshot: FarmDevtoolsSnapshot): string {\n return renderInspector(\"raw\", \"Raw snapshot\", [\n {\n id: \"snapshot\",\n label: \"Snapshot\",\n description: \"Complete serialized runtime state\",\n icon: \"terminal\",\n content: renderJson(snapshot),\n },\n {\n id: \"routes\",\n label: \"Routes\",\n description: \"Pages and route boundaries\",\n icon: \"route\",\n value: snapshot.routes.length,\n content: renderJson(snapshot.routes),\n },\n {\n id: \"api\",\n label: \"API\",\n description: \"Typed server endpoints\",\n icon: \"api\",\n value: snapshot.apiRoutes.length,\n content: renderJson(snapshot.apiRoutes),\n },\n {\n id: \"systems\",\n label: \"Systems\",\n description: \"Integrations, middleware, and storage\",\n icon: \"blocks\",\n content: renderJson({\n integrations: snapshot.integrations,\n middleware: snapshot.middleware,\n storage: snapshot.storage,\n }),\n },\n {\n id: \"diagnostics\",\n label: \"Diagnostics\",\n description: \"Framework health findings\",\n icon: \"shield\",\n value: snapshot.diagnostics.length,\n content: renderJson(snapshot.diagnostics),\n },\n ]);\n}\n\nfunction renderNavigationItem(view: string, label: string): string {\n return `<button type=\"button\" class=\"nav-item\" data-view-trigger=\"${view}\" aria-selected=\"false\">\n <span>${escapeHtml(label)}</span>\n </button>`;\n}\n\nexport function renderFarmDevtoolsHtml(snapshot: FarmDevtoolsSnapshot): string {\n const healthLabel =\n snapshot.health === \"ready\" ? \"Ready\" : snapshot.health === \"error\" ? \"Error\" : \"Attention\";\n const generatedTime = new Date(snapshot.generatedAt).toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n });\n\n return `<!doctype html>\n<html lang=\"en\" class=\"devtools-frame\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <meta name=\"color-scheme\" content=\"dark\">\n <title>Farm Devtools - ${escapeHtml(snapshot.project.name)}</title>\n <style>\n :root {\n color-scheme: dark;\n --background: #000;\n --surface: #050505;\n --surface-raised: #090909;\n --foreground: #f5f5f5;\n --muted: #858585;\n --muted-strong: #a8a8a8;\n --line: rgb(255 255 255 / 0.12);\n --line-soft: rgb(255 255 255 / 0.065);\n --line-strong: rgb(255 255 255 / 0.22);\n --font-sans: \"Geist Sans\", Geist, Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n --font-mono: \"Geist Mono\", \"SFMono-Regular\", Consolas, \"Liberation Mono\", Menlo, monospace;\n }\n * { box-sizing: border-box; }\n html { min-width: 320px; min-height: 100%; background: var(--background); }\n body { min-height: 100vh; min-height: 100dvh; margin: 0; overflow: hidden; background: #030303; color: var(--foreground); font-family: var(--font-sans); font-size: 14px; letter-spacing: 0; text-rendering: optimizeLegibility; }\n button, input { color: inherit; font: inherit; letter-spacing: 0; }\n button, a { -webkit-tap-highlight-color: transparent; }\n button { cursor: pointer; }\n a { color: inherit; }\n [hidden] { display: none !important; }\n code, kbd, .badge, .mono, .mini-label, .metric-label, .metric-detail, .section-index, .diagnostic-code, th, .statusbar, .eyebrow { font-family: var(--font-mono); letter-spacing: 0; }\n .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }\n .icon { width: 16px; height: 16px; flex: 0 0 auto; }\n .stage { display: grid; min-height: 100vh; min-height: 100dvh; place-items: center; padding: 20px; }\n .shell { display: flex; width: min(1280px, 100%); height: min(780px, calc(100dvh - 40px)); min-height: 560px; min-width: 0; flex-direction: column; overflow: hidden; border: 1px solid var(--line-strong); background: var(--background); box-shadow: 0 24px 80px rgb(0 0 0 / 0.72); }\n .topbar { z-index: 30; display: flex; min-height: 42px; flex: 0 0 auto; align-items: stretch; border-bottom: 1px solid var(--line); background: var(--background); }\n .brand { display: flex; min-width: 170px; align-items: center; gap: 8px; padding: 0 12px; border-right: 1px solid var(--line); text-decoration: none; font-family: var(--font-mono); font-size: 10px; text-transform: uppercase; white-space: nowrap; }\n .brand-mark { display: grid; width: 18px; height: 18px; place-items: center; border: 1px solid var(--line-strong); color: #fff; font-family: var(--font-sans); font-size: 9px; font-weight: 650; }\n .brand-slash { color: #555; }\n .brand-product { color: var(--muted-strong); }\n .tabbar { display: flex; min-width: 0; flex: 1 1 auto; align-items: stretch; overflow-x: auto; scrollbar-width: none; }\n .tabbar::-webkit-scrollbar { display: none; }\n .nav-item { position: relative; display: flex; min-width: max-content; min-height: 41px; align-items: center; gap: 7px; padding: 0 11px; border: 0; background: transparent; color: var(--muted); font-family: var(--font-mono); font-size: 10px; text-transform: uppercase; transition: background-color 140ms ease-out, color 140ms ease-out; }\n .nav-item::after { position: absolute; right: 10px; bottom: -1px; left: 10px; height: 1px; background: transparent; content: \"\"; }\n .nav-item:hover, .nav-item:focus-visible { background: rgb(255 255 255 / 0.035); color: var(--foreground); outline: none; }\n .nav-item[aria-selected=\"true\"] { color: #fff; }\n .nav-item[aria-selected=\"true\"]::after { background: #fff; }\n .nav-item .icon { width: 13px; height: 13px; }\n .nav-item small { color: #666; font-size: 9px; font-weight: 400; }\n .topbar-meta { display: flex; flex: 0 0 auto; margin-left: auto; border-left: 1px solid var(--line); }\n .topbar-status { display: flex; min-width: max-content; align-items: center; gap: 7px; padding: 0 11px; color: var(--muted-strong); font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; }\n .status-dot { width: 5px; height: 5px; background: #fff; box-shadow: 0 0 0 3px rgb(255 255 255 / 0.06); }\n .status-dot-attention { background: #909090; animation: status-pulse 1.8s ease-in-out infinite; }\n .status-dot-error { background: transparent; border: 1px solid #fff; }\n .topbar-actions { display: flex; }\n .action { display: inline-flex; width: 40px; min-height: 41px; align-items: center; justify-content: center; padding: 0; border: 0; border-left: 1px solid var(--line); background: transparent; color: var(--muted-strong); text-decoration: none; transition: background-color 140ms ease-out, color 140ms ease-out; }\n .action:hover, .action:focus-visible { background: #fff; color: #000; outline: none; }\n .action[data-copied=\"true\"] { background: #fff; color: #000; }\n .workspace { min-height: 0; flex: 1 1 auto; }\n .eyebrow { display: block; color: var(--muted); font-size: 9px; font-weight: 400; text-transform: uppercase; }\n .content { height: 100%; min-width: 0; }\n .view { height: 100%; min-width: 0; overflow: hidden; }\n .split-view { display: grid; height: 100%; min-height: 0; grid-template-columns: clamp(230px, 28%, 300px) minmax(0, 1fr); }\n .pane { min-width: 0; min-height: 0; overflow: hidden; background: var(--background); }\n .pane-list { display: flex; flex-direction: column; border-right: 1px solid var(--line); }\n .pane-detail { position: relative; }\n .pane-header { display: flex; min-height: 38px; align-items: center; justify-content: space-between; gap: 12px; padding: 0 12px; border-bottom: 1px solid var(--line); background: var(--surface); }\n .pane-header strong { overflow: hidden; font-size: 11px; font-weight: 520; text-overflow: ellipsis; white-space: nowrap; }\n .pane-header span { overflow: hidden; color: var(--muted); font-family: var(--font-mono); font-size: 9px; text-overflow: ellipsis; white-space: nowrap; }\n .pane-tools { border-bottom: 1px solid var(--line); }\n .pane-tools .filter-control { width: 100%; min-height: 36px; border: 0; }\n .pane-scroll, .detail-scroll { min-height: 0; overflow: auto; overscroll-behavior: contain; }\n .pane-scroll { flex: 1 1 auto; }\n .inspector-list { scrollbar-width: thin; scrollbar-color: var(--line-strong) transparent; }\n .inspector-row { position: relative; display: grid; width: 100%; min-height: 54px; grid-template-columns: 24px minmax(0, 1fr) auto; align-items: center; gap: 9px; padding: 8px 11px; border: 0; border-bottom: 1px solid var(--line-soft); background: transparent; color: var(--muted); text-align: left; transition: background-color 120ms ease-out, color 120ms ease-out; }\n .inspector-row::before { position: absolute; inset: 0 auto 0 0; width: 1px; background: transparent; content: \"\"; }\n .inspector-row:hover, .inspector-row:focus-visible { background: rgb(255 255 255 / 0.035); color: var(--foreground); outline: none; }\n .inspector-row[aria-selected=\"true\"] { background: rgb(255 255 255 / 0.075); color: #fff; }\n .inspector-row[aria-selected=\"true\"]::before { background: #fff; }\n .inspector-row-icon { display: grid; color: var(--muted-strong); place-items: center; }\n .inspector-row-icon .icon { width: 14px; height: 14px; }\n .inspector-row-copy { min-width: 0; }\n .inspector-row-copy strong, .inspector-row-copy small { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .inspector-row-copy strong { color: inherit; font-size: 11px; font-weight: 520; }\n .inspector-row-copy small { margin-top: 3px; color: var(--muted); font-family: var(--font-mono); font-size: 9px; }\n .inspector-row-value { color: var(--muted-strong); font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; }\n .detail-panel { display: flex; height: 100%; min-height: 0; flex-direction: column; }\n .detail-scroll { flex: 1 1 auto; }\n .detail-intro { display: grid; min-height: 132px; grid-template-columns: 34px minmax(0, 1fr); align-items: start; gap: 14px; padding: 22px; border-bottom: 1px solid var(--line); }\n .detail-icon { display: grid; width: 32px; height: 32px; border: 1px solid var(--line); color: var(--muted-strong); place-items: center; }\n .detail-icon .icon { width: 15px; height: 15px; }\n .detail-intro .mini-label { margin: 1px 0 8px; }\n .detail-intro h2 { margin: 0; overflow-wrap: anywhere; font-size: 20px; font-weight: 530; line-height: 1.2; }\n .detail-intro p { max-width: 680px; margin: 8px 0 0; color: var(--muted); font-size: 11px; line-height: 1.55; }\n .detail-section { border-top: 1px solid var(--line); }\n .detail-intro + .detail-section { border-top: 0; }\n .property-list { margin: 0; }\n .property-list > div { display: grid; min-height: 48px; grid-template-columns: minmax(120px, 0.32fr) minmax(0, 1fr); align-items: center; gap: 18px; padding: 9px 16px; border-bottom: 1px solid var(--line-soft); }\n .property-list dt { color: var(--muted); font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; }\n .property-list dd { min-width: 0; margin: 0; overflow-wrap: anywhere; color: var(--muted-strong); font-size: 11px; }\n .property-list dd > code { color: var(--foreground); font-size: 10px; }\n .single-pane { height: 100%; min-height: 0; }\n .json-viewer { min-height: 100%; margin: 0; padding: 16px; overflow: auto; background: #000; color: var(--muted-strong); font-family: var(--font-mono); font-size: 10px; line-height: 1.65; tab-size: 2; white-space: pre-wrap; word-break: break-word; }\n .diagnostic { display: grid; grid-template-columns: 32px minmax(0, 1fr) auto; align-items: start; gap: 12px; min-height: 88px; padding: 16px 18px; border-bottom: 1px solid var(--line-soft); }\n .diagnostic:last-child { border-bottom: 0; }\n .diagnostic-mark { display: grid; width: 28px; height: 28px; place-items: center; border: 1px solid var(--line); color: var(--muted-strong); }\n .diagnostic-code { display: block; margin-bottom: 5px; color: var(--muted); font-size: 9px; }\n .diagnostic strong { display: block; font-size: 12px; font-weight: 540; }\n .diagnostic p { margin: 5px 0 0; color: var(--muted-strong); font-size: 11px; line-height: 1.5; }\n .diagnostic small { display: block; margin-top: 6px; color: var(--muted); font-size: 10px; line-height: 1.5; }\n .diagnostic-warning { box-shadow: inset 1px 0 var(--line-strong); }\n .system-row { display: grid; grid-template-columns: 32px minmax(0, 1fr) auto; min-height: 64px; align-items: center; gap: 10px; padding: 11px 16px; border-bottom: 1px solid var(--line-soft); }\n .system-row:last-child { border-bottom: 0; }\n .system-icon { display: grid; width: 28px; height: 28px; place-items: center; color: var(--muted-strong); }\n .system-row strong, .system-row small { display: block; }\n .system-row strong { font-size: 12px; font-weight: 520; }\n .system-row small { margin-top: 3px; overflow: hidden; color: var(--muted); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; }\n .system-value { font-family: var(--font-mono); font-size: 11px; }\n .filter-control { display: flex; width: min(280px, 34vw); min-height: 34px; align-items: center; gap: 8px; padding: 0 9px; border: 1px solid var(--line); background: #000; color: var(--muted); }\n .filter-control:focus-within { border-color: var(--line-strong); color: #fff; }\n .filter-control input { min-width: 0; flex: 1; border: 0; outline: 0; background: transparent; color: var(--foreground); font-family: var(--font-mono); font-size: 10px; }\n .filter-control input::placeholder { color: #666; }\n .filter-control kbd { padding: 1px 5px; border: 1px solid var(--line); color: var(--muted); font-size: 9px; }\n .table-scroll { width: 100%; overflow-x: auto; }\n table { width: 100%; border-collapse: collapse; table-layout: auto; }\n th { height: 36px; padding: 0 16px; border-bottom: 1px solid var(--line); background: #030303; color: var(--muted); font-size: 9px; font-weight: 400; text-align: left; text-transform: uppercase; white-space: nowrap; }\n td { min-height: 48px; padding: 12px 16px; border-bottom: 1px solid var(--line-soft); color: var(--muted-strong); font-size: 11px; line-height: 1.55; vertical-align: top; }\n tr:last-child td { border-bottom: 0; }\n tbody tr { transition: background-color 120ms ease-out; }\n tbody tr:hover { background: rgb(255 255 255 / 0.035); }\n td code { color: var(--foreground); font-size: 10px; white-space: nowrap; }\n .file-cell { max-width: 420px; overflow: hidden; font-family: var(--font-mono); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; }\n .badge { display: inline-flex; min-height: 20px; align-items: center; padding: 1px 6px; border: 1px solid var(--line); color: var(--muted-strong); font-size: 9px; font-weight: 400; text-transform: uppercase; white-space: nowrap; }\n .badge-ready, .badge-page, .badge-node { border-color: var(--line-strong); color: #fff; }\n .badge-warning, .badge-attention, .badge-edge { border-style: dashed; color: #fff; }\n .badge-error { background: #fff; color: #000; }\n .badge-method { min-width: 36px; justify-content: center; border-color: var(--line-soft); color: #d0d0d0; }\n .method-list, .runtime-value, .runtime-facts { display: flex; flex-wrap: wrap; align-items: center; gap: 5px; }\n .runtime-value small, .runtime-facts span { color: var(--muted); font-family: var(--font-mono); font-size: 9px; }\n .cell-detail { display: block; margin-top: 4px; color: var(--muted); font-family: var(--font-mono); font-size: 9px; }\n .route-operation { display: flex; align-items: center; justify-content: space-between; gap: 12px; }\n .route-operation + .route-operation { margin-top: 5px; }\n .route-operation small { color: var(--muted); font-family: var(--font-mono); font-size: 9px; white-space: nowrap; }\n .schedule { display: block; }\n .schedule + .schedule { margin-top: 4px; }\n .muted { color: var(--muted); }\n .empty-state { display: grid; min-height: 156px; place-items: center; align-content: center; gap: 7px; padding: 24px; color: var(--muted); text-align: center; }\n .empty-state strong { color: var(--muted-strong); font-size: 12px; font-weight: 520; }\n .empty-state span { max-width: 420px; font-size: 10px; line-height: 1.5; }\n .filtered-empty { padding: 24px; color: var(--muted); font-family: var(--font-mono); font-size: 10px; text-align: center; }\n .feature-matrix > div { display: flex; min-height: 45px; align-items: center; justify-content: space-between; gap: 16px; padding: 9px 16px; border-bottom: 1px solid var(--line-soft); }\n .feature-matrix > div:last-child { border-bottom: 0; }\n .feature-matrix span:first-child { font-size: 11px; }\n .environment-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .environment-grid > div { min-height: 128px; padding: 16px; }\n .environment-grid > div + div { border-left: 1px solid var(--line); }\n .mini-label { display: block; margin-bottom: 12px; color: var(--muted); font-size: 9px; text-transform: uppercase; }\n .key-list { display: flex; flex-wrap: wrap; gap: 6px; }\n .key-list code { padding: 4px 6px; border: 1px solid var(--line-soft); color: var(--muted-strong); font-size: 9px; }\n .layer-list > div { display: grid; grid-template-columns: minmax(120px, 0.7fr) minmax(0, 1fr) auto; min-height: 52px; align-items: center; gap: 14px; padding: 10px 16px; border-bottom: 1px solid var(--line-soft); }\n .layer-list > div:last-child { border-bottom: 0; }\n .layer-list span { display: flex; align-items: center; gap: 8px; }\n .layer-list strong { font-size: 11px; font-weight: 520; }\n .layer-list code, .layer-list small { color: var(--muted); font-size: 9px; }\n .statusbar { display: flex; min-height: 29px; flex: 0 0 auto; align-items: center; justify-content: space-between; gap: 16px; padding: 0 10px; border-top: 1px solid var(--line); background: var(--surface); color: var(--muted); font-size: 9px; text-transform: uppercase; }\n .statusbar span { display: flex; align-items: center; gap: 7px; }\n @keyframes status-pulse { 0%, 100% { opacity: 0.4; } 50% { opacity: 1; } }\n @media (max-width: 1100px) {\n .topbar-status { display: none; }\n }\n @media (max-width: 840px) {\n .stage { display: block; padding: 0; }\n .shell { width: 100%; height: 100dvh; min-height: 0; border: 0; }\n .topbar { flex-wrap: wrap; }\n .brand { min-width: auto; height: 40px; border-right: 0; }\n .brand-product, .brand-slash { display: none; }\n .tabbar { order: 3; width: 100%; flex-basis: 100%; border-top: 1px solid var(--line); }\n .topbar-meta { height: 40px; }\n .nav-item { min-height: 39px; }\n .split-view { grid-template-columns: 1fr; grid-template-rows: minmax(150px, 34%) minmax(0, 1fr); }\n .pane-list { border-right: 0; border-bottom: 1px solid var(--line); }\n .filter-control { width: 100%; }\n }\n @media (max-width: 560px) {\n .detail-intro { min-height: 112px; padding: 16px; }\n .detail-intro h2 { font-size: 17px; }\n .property-list > div { grid-template-columns: minmax(98px, 0.38fr) minmax(0, 1fr); gap: 12px; padding-inline: 12px; }\n .environment-grid { grid-template-columns: 1fr; }\n .environment-grid > div + div { border-top: 1px solid var(--line); border-left: 0; }\n .statusbar span:last-child { display: none; }\n }\n @media (prefers-reduced-motion: reduce) {\n html { scroll-behavior: auto; }\n *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; }\n }\n </style>\n <style data-assistant-ui-layout>\n :root {\n --background: #0a0a0a;\n --surface: #0a0a0a;\n --surface-raised: #111111;\n --foreground: #ededed;\n --muted: #929299;\n --muted-strong: #b4b4ba;\n --line: rgb(255 255 255 / 0.11);\n --line-soft: rgb(255 255 255 / 0.075);\n --line-strong: rgb(255 255 255 / 0.16);\n --accent: #1c1c1e;\n }\n html, body { width: 100%; height: 100%; background: #080808; }\n body { position: relative; min-height: 100dvh; overflow: hidden; font-size: 13px; }\n .stage {\n position: fixed;\n inset: 0;\n z-index: 2;\n display: grid;\n min-height: 0;\n padding: 20px;\n place-items: center;\n pointer-events: none;\n }\n .shell {\n width: min(960px, 92vw);\n height: min(560px, 80dvh);\n min-width: 0;\n min-height: 0;\n border: 1px solid var(--line-strong);\n border-radius: 12px;\n background: var(--background);\n box-shadow: 0 24px 80px rgb(0 0 0 / 0.72), 0 4px 18px rgb(0 0 0 / 0.45);\n pointer-events: auto;\n animation: devtools-window-in 180ms cubic-bezier(0.175, 0.885, 0.32, 1.08);\n }\n .topbar {\n min-height: 40px;\n height: 40px;\n align-items: center;\n justify-content: space-between;\n flex-wrap: nowrap;\n border-bottom-color: var(--line);\n background: var(--background);\n }\n .brand { display: none; }\n .tabbar {\n height: 100%;\n flex: 1 1 auto;\n align-items: stretch;\n order: initial;\n width: auto;\n flex-basis: auto;\n padding-inline-start: 8px;\n border-top: 0;\n }\n .nav-item {\n min-height: 39px;\n height: 39px;\n gap: 0;\n padding: 0 12px;\n border-radius: 0;\n color: var(--muted);\n font-family: var(--font-sans);\n font-size: 13px;\n font-weight: 500;\n text-transform: none;\n }\n .nav-item::after {\n right: 8px;\n bottom: -1px;\n left: 8px;\n height: 2px;\n border-radius: 999px;\n }\n .nav-item:hover, .nav-item:focus-visible { background: transparent; color: var(--foreground); }\n .nav-item[aria-selected=\"true\"] { color: var(--foreground); }\n .topbar-meta {\n height: 100%;\n align-items: center;\n gap: 8px;\n margin-left: 0;\n padding: 0 8px 0 4px;\n border-left: 0;\n }\n .project-select {\n display: inline-flex;\n height: 28px;\n min-width: 0;\n align-items: center;\n gap: 5px;\n padding: 0 9px;\n border: 1px solid var(--line);\n border-radius: 8px;\n color: var(--muted-strong);\n font-size: 12px;\n white-space: nowrap;\n }\n .project-select .icon { width: 12px; height: 12px; transform: rotate(90deg); }\n .topbar-status {\n min-width: max-content;\n gap: 6px;\n padding: 0;\n color: var(--muted);\n font-family: var(--font-sans);\n font-size: 11px;\n text-transform: none;\n }\n .status-dot {\n width: 6px;\n height: 6px;\n border: 0;\n border-radius: 999px;\n background: #2dd4bf;\n box-shadow: none;\n }\n .status-dot-attention { background: #f59e0b; animation: none; }\n .status-dot-error { background: #ef4444; }\n .close-action {\n display: inline-flex;\n width: 28px;\n height: 28px;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: var(--muted);\n text-decoration: none;\n transition: background-color 120ms ease-out, color 120ms ease-out;\n }\n .close-action:hover, .close-action:focus-visible { background: var(--accent); color: var(--foreground); outline: none; }\n .close-action .icon { width: 14px; height: 14px; }\n .workspace, .content, .view { min-height: 0; }\n .split-view {\n grid-template-columns: clamp(14rem, 28%, 18rem) minmax(0, 1fr);\n grid-template-rows: minmax(0, 1fr);\n }\n .pane { background: var(--background); }\n .pane-list { border-right: 1px solid var(--line); border-bottom: 0; }\n .pane-header {\n min-height: 32px;\n height: 32px;\n max-height: 32px;\n flex: 0 0 32px;\n padding: 0 12px;\n border-bottom-color: var(--line);\n background: var(--background);\n }\n .pane-header strong {\n color: var(--muted);\n font-size: 11px;\n font-weight: 400;\n line-height: 1;\n }\n .pane-header span {\n color: var(--muted);\n font-family: var(--font-sans);\n font-size: 10px;\n line-height: 1;\n }\n .pane-tools { border-bottom-color: var(--line); }\n .pane-tools .filter-control { min-height: 32px; height: 32px; }\n .filter-control {\n min-height: 32px;\n gap: 7px;\n padding: 0 10px;\n border-color: var(--line);\n border-radius: 0;\n background: var(--background);\n }\n .filter-control .icon { width: 13px; height: 13px; }\n .filter-control input { font-family: var(--font-sans); font-size: 11px; }\n .filter-control input::placeholder { color: var(--muted); }\n .filter-control kbd {\n padding: 1px 5px;\n border-color: var(--line);\n border-radius: 4px;\n color: var(--muted);\n font-size: 9px;\n }\n .inspector-row {\n min-height: 44px;\n grid-template-columns: minmax(0, 1fr) auto;\n gap: 8px;\n padding: 6px 11px 6px 12px;\n border: 0;\n border-left: 2px solid transparent;\n border-radius: 0;\n color: var(--muted-strong);\n }\n .inspector-row::before { display: none; }\n .inspector-row:hover, .inspector-row:focus-visible { background: rgb(255 255 255 / 0.035); color: var(--foreground); }\n .inspector-row[aria-selected=\"true\"] {\n border-left-color: var(--foreground);\n background: var(--accent);\n color: var(--foreground);\n }\n .inspector-row-copy strong { font-size: 12px; font-weight: 500; }\n .inspector-row-copy small {\n margin-top: 2px;\n color: var(--muted);\n font-family: var(--font-sans);\n font-size: 10px;\n }\n .inspector-row-value {\n padding: 2px 6px;\n border: 1px solid var(--line);\n border-radius: 999px;\n background: rgb(255 255 255 / 0.035);\n color: var(--muted);\n font-family: var(--font-sans);\n font-size: 9px;\n line-height: 1.2;\n text-transform: none;\n }\n .detail-intro {\n display: block;\n min-height: 0;\n padding: 12px;\n border-bottom-color: var(--line-soft);\n }\n .detail-icon { display: none; }\n .detail-intro .mini-label { margin: 0 0 8px; }\n .detail-intro h2 { font-size: 13px; font-weight: 500; line-height: 1.3; }\n .detail-intro p { margin-top: 6px; font-size: 11px; line-height: 1.5; }\n .detail-section, .detail-intro + .detail-section { border-top-color: var(--line); }\n .property-list > div {\n min-height: 36px;\n grid-template-columns: minmax(96px, 0.28fr) minmax(0, 1fr);\n gap: 14px;\n padding: 7px 12px;\n border-bottom-color: var(--line-soft);\n }\n .property-list dt { font-family: var(--font-sans); font-size: 10px; text-transform: none; }\n .property-list dd { color: var(--foreground); font-size: 11px; }\n .property-list dd > code { font-size: 10px; }\n .json-viewer {\n padding: 12px;\n background: var(--background);\n color: var(--muted-strong);\n font-size: 10px;\n line-height: 1.55;\n }\n .diagnostic {\n min-height: 68px;\n grid-template-columns: 24px minmax(0, 1fr) auto;\n gap: 10px;\n padding: 11px 12px;\n border-bottom-color: var(--line-soft);\n }\n .diagnostic-mark { width: 22px; height: 22px; border: 0; }\n .diagnostic-mark .icon { width: 13px; height: 13px; }\n .diagnostic-code { margin-bottom: 3px; font-size: 9px; }\n .diagnostic strong { font-size: 11px; font-weight: 500; }\n .diagnostic p { margin-top: 3px; font-size: 10px; line-height: 1.45; }\n .diagnostic small { margin-top: 4px; font-size: 9px; }\n .diagnostic-warning { box-shadow: none; }\n .system-row {\n min-height: 48px;\n grid-template-columns: 24px minmax(0, 1fr) auto;\n gap: 8px;\n padding: 8px 12px;\n border-bottom-color: var(--line-soft);\n }\n .system-icon { width: 20px; height: 20px; }\n .system-icon .icon { width: 13px; height: 13px; }\n .system-row strong { font-size: 11px; font-weight: 500; }\n .system-row small { margin-top: 2px; font-size: 10px; }\n .system-value { color: var(--muted); font-size: 10px; }\n table { font-size: 11px; }\n th {\n height: 32px;\n padding: 0 12px;\n background: var(--background);\n font-family: var(--font-sans);\n font-size: 10px;\n font-weight: 400;\n text-transform: none;\n }\n td { min-height: 40px; padding: 9px 12px; font-size: 10px; }\n td code, .file-cell { font-size: 9px; }\n .badge {\n min-height: 18px;\n padding: 1px 6px;\n border-radius: 999px;\n background: rgb(255 255 255 / 0.04);\n font-family: var(--font-sans);\n font-size: 9px;\n text-transform: none;\n }\n .badge-error { background: var(--foreground); color: var(--background); }\n .badge-warning, .badge-attention, .badge-edge { border-style: solid; }\n .empty-state { min-height: 100%; padding: 24px; gap: 6px; }\n .empty-state .icon { display: none; }\n .empty-state strong { font-size: 12px; font-weight: 400; }\n .empty-state span { font-size: 11px; }\n .feature-matrix > div { min-height: 36px; padding: 7px 12px; border-bottom-color: var(--line-soft); }\n .feature-matrix span:first-child { font-size: 11px; }\n .environment-grid > div { min-height: 104px; padding: 12px; }\n .mini-label { margin-bottom: 8px; font-family: var(--font-sans); font-size: 10px; text-transform: none; }\n .key-list code { border-radius: 4px; font-size: 9px; }\n .layer-list > div { min-height: 44px; padding: 8px 12px; border-bottom-color: var(--line-soft); }\n .layer-list strong { font-size: 11px; font-weight: 500; }\n .statusbar { display: none; }\n html.devtools-frame .stage { position: static; width: 100%; height: 100%; min-height: 100%; padding: 0; }\n html.devtools-frame .shell { width: 100%; height: 100%; border-radius: 12px; box-shadow: none; animation: none; }\n @keyframes devtools-window-in {\n from { opacity: 0; transform: scale(0.985) translateY(4px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n @media (max-width: 700px) {\n .stage { display: grid; padding: 0; }\n .shell {\n width: 100%;\n height: 100%;\n min-height: 0;\n border: 1px solid var(--line-strong);\n border-radius: 10px;\n }\n .topbar { flex-wrap: nowrap; }\n .tabbar {\n order: initial;\n width: auto;\n flex-basis: auto;\n border-top: 0;\n padding-inline-start: 4px;\n }\n .topbar-meta { height: 40px; }\n .nav-item { min-height: 39px; height: 39px; padding-inline: 9px; }\n .split-view { grid-template-columns: 1fr; grid-template-rows: minmax(148px, 36%) minmax(0, 1fr); }\n .pane-list { border-right: 0; border-bottom: 1px solid var(--line); }\n }\n @media (max-width: 560px) {\n .project-select { display: none; }\n .topbar-status { display: none; }\n .topbar-meta { gap: 4px; padding-left: 0; }\n .status-label { display: none; }\n .detail-intro { min-height: 0; padding: 12px; }\n .detail-intro h2 { font-size: 13px; }\n .property-list > div { grid-template-columns: minmax(82px, 0.34fr) minmax(0, 1fr); gap: 10px; padding-inline: 10px; }\n }\n @media (prefers-reduced-motion: reduce) {\n .shell { animation: none; }\n }\n </style>\n</head>\n<body>\n <div class=\"stage\">\n <div class=\"shell\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Farm.js DevTools\">\n <header class=\"topbar\">\n <nav class=\"tabbar\" aria-label=\"Devtools views\">\n ${renderNavigationItem(\"overview\", \"Overview\")}\n ${renderNavigationItem(\"routes\", \"Routes\")}\n ${renderNavigationItem(\"api\", \"API\")}\n ${renderNavigationItem(\"systems\", \"Systems\")}\n ${renderNavigationItem(\"runtime\", \"Runtime\")}\n ${renderNavigationItem(\"raw\", \"Raw\")}\n </nav>\n <div class=\"topbar-meta\">\n <span class=\"project-select\">${escapeHtml(snapshot.project.name)} ${icon(\n \"chevron\",\n )}</span>\n <span class=\"topbar-status\"><span class=\"status-dot\"></span><span class=\"status-label\">1 instance</span></span>\n <button class=\"close-action\" type=\"button\" data-close-devtools aria-label=\"Close DevTools\" title=\"Close DevTools\">${icon(\n \"close\",\n )}</button>\n </div>\n </header>\n <div class=\"workspace\">\n <main class=\"content\">\n <section class=\"view\" data-view-panel=\"overview\">${renderOverviewInspector(\n snapshot,\n healthLabel,\n generatedTime,\n )}</section>\n <section class=\"view\" data-view-panel=\"routes\" hidden>${renderRoutesInspector(\n snapshot,\n )}</section>\n <section class=\"view\" data-view-panel=\"api\" hidden>${renderApiInspector(\n snapshot,\n )}</section>\n <section class=\"view\" data-view-panel=\"systems\" hidden>${renderSystemsInspector(\n snapshot,\n )}</section>\n <section class=\"view\" data-view-panel=\"runtime\" hidden>${renderRuntimeInspector(\n snapshot,\n )}</section>\n <section class=\"view\" data-view-panel=\"raw\" hidden>${renderRawInspector(snapshot)}</section>\n </main>\n </div>\n </div>\n </div>\n <script>\n (() => {\n const embedded = window.parent !== window;\n const closeDevtools = () => {\n if (embedded && window.parent !== window) {\n window.parent.postMessage({ type: \"farm:devtools:close\" }, location.origin);\n return;\n }\n location.assign(\"/\");\n };\n document.querySelector(\"[data-close-devtools]\")?.addEventListener(\"click\", closeDevtools);\n document.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n closeDevtools();\n return;\n }\n if (embedded && window.parent !== window) {\n window.parent.postMessage(\n {\n type: \"farm:devtools:keydown\",\n event: {\n key: event.key,\n code: event.code,\n altKey: event.altKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n shiftKey: event.shiftKey,\n repeat: event.repeat,\n },\n },\n location.origin,\n );\n }\n });\n\n const validViews = new Set([\"overview\", \"routes\", \"api\", \"systems\", \"runtime\", \"raw\"]);\n const triggers = Array.from(document.querySelectorAll(\"[data-view-trigger]\"));\n const panels = Array.from(document.querySelectorAll(\"[data-view-panel]\"));\n const selectView = (view, updateHash = true) => {\n const nextView = validViews.has(view) ? view : \"overview\";\n triggers.forEach((trigger) => {\n trigger.setAttribute(\"aria-selected\", String(trigger.dataset.viewTrigger === nextView));\n });\n panels.forEach((panel) => {\n panel.hidden = panel.dataset.viewPanel !== nextView;\n });\n if (updateHash) {\n history.replaceState(null, \"\", nextView === \"overview\" ? location.pathname : \"#\" + nextView);\n const activePanel = panels.find((panel) => panel.dataset.viewPanel === nextView);\n if (activePanel) activePanel.scrollTop = 0;\n }\n };\n triggers.forEach((trigger) => trigger.addEventListener(\"click\", () => selectView(trigger.dataset.viewTrigger)));\n window.addEventListener(\"hashchange\", () => selectView(location.hash.slice(1), false));\n selectView(location.hash.slice(1), false);\n\n document.querySelectorAll(\"[data-detail-trigger]\").forEach((trigger) => {\n trigger.addEventListener(\"click\", () => {\n const scope = trigger.dataset.detailTrigger;\n const id = trigger.dataset.detailId;\n document.querySelectorAll('[data-detail-trigger=\"' + scope + '\"]').forEach((row) => {\n row.setAttribute(\"aria-selected\", String(row.dataset.detailId === id));\n });\n document.querySelectorAll('[data-detail-panel=\"' + scope + '\"]').forEach((panel) => {\n panel.hidden = panel.dataset.detailId !== id;\n });\n });\n });\n\n document.querySelectorAll(\"[data-filter]\").forEach((input) => {\n input.addEventListener(\"input\", () => {\n const id = input.dataset.filter;\n const query = input.value.trim().toLowerCase();\n const rows = Array.from(document.querySelectorAll('[data-filter-rows=\"' + id + '\"] [data-search-value]'));\n let visible = 0;\n rows.forEach((row) => {\n const matches = !query || (row.dataset.searchValue || \"\").toLowerCase().includes(query);\n row.hidden = !matches;\n if (matches) visible += 1;\n });\n const selected = rows.find((row) => row.getAttribute(\"aria-selected\") === \"true\");\n if (selected?.hidden) rows.find((row) => !row.hidden)?.click();\n const empty = document.querySelector('[data-filter-empty=\"' + id + '\"]');\n if (empty) empty.hidden = visible !== 0;\n });\n });\n\n document.addEventListener(\"keydown\", (event) => {\n if (event.key !== \"/\" || event.metaKey || event.ctrlKey || event.altKey) return;\n const active = document.activeElement;\n if (active && (active.tagName === \"INPUT\" || active.tagName === \"TEXTAREA\")) return;\n const panel = document.querySelector(\"[data-view-panel]:not([hidden])\");\n const input = panel?.querySelector(\"[data-filter]\");\n if (input) {\n event.preventDefault();\n input.focus();\n }\n });\n\n document.querySelector(\"[data-refresh]\")?.addEventListener(\"click\", () => location.reload());\n document.querySelector(\"[data-copy-snapshot]\")?.addEventListener(\"click\", async (event) => {\n const button = event.currentTarget;\n const label = button.querySelector(\"[data-copy-label]\");\n try {\n const response = await fetch(\"/__farm/devtools.json\", { cache: \"no-store\" });\n const value = JSON.stringify(await response.json(), null, 2);\n if (navigator.clipboard?.writeText) await navigator.clipboard.writeText(value);\n else {\n const textarea = document.createElement(\"textarea\");\n textarea.value = value;\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand(\"copy\");\n textarea.remove();\n }\n button.dataset.copied = \"true\";\n if (label) label.textContent = \"Copied\";\n setTimeout(() => {\n button.dataset.copied = \"false\";\n if (label) label.textContent = \"Copy JSON\";\n }, 1600);\n } catch {\n if (label) label.textContent = \"Copy failed\";\n }\n });\n })();\n </script>\n</body>\n</html>`;\n}\n"],"mappings":"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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;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;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;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,YAiiBhD,qBAAqB,YAAY,UAAU,CAAC;AAAA,YAC5C,qBAAqB,UAAU,QAAQ,CAAC;AAAA,YACxC,qBAAqB,OAAO,KAAK,CAAC;AAAA,YAClC,qBAAqB,WAAW,SAAS,CAAC;AAAA,YAC1C,qBAAqB,WAAW,SAAS,CAAC;AAAA,YAC1C,qBAAqB,OAAO,KAAK,CAAC;AAAA;AAAA;AAAA,yCAGL,WAAW,SAAS,QAAQ,IAAI,CAAC,IAAI;AAAA,IAClE;AAAA,EACF,CAAC;AAAA;AAAA,8HAEmH;AAAA,IAClH;AAAA,EACF,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,6DAKkD;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA,kEACuD;AAAA,IACtD;AAAA,EACF,CAAC;AAAA,+DACoD;AAAA,IACnD;AAAA,EACF,CAAC;AAAA,mEACwD;AAAA,IACvD;AAAA,EACF,CAAC;AAAA,mEACwD;AAAA,IACvD;AAAA,EACF,CAAC;AAAA,+DACoD,mBAAmB,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;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuI3F;AA5tBgB;","names":[]}