@farm.js/core 0.1.0-beta.6 → 0.1.0-beta.8
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.
- package/dist/after.cjs +227 -0
- package/dist/after.cjs.map +1 -0
- package/dist/after.d.mts +25 -0
- package/dist/after.d.ts +25 -0
- package/dist/after.mjs +14 -0
- package/dist/after.mjs.map +1 -0
- package/dist/agent-runtime.cjs +2379 -0
- package/dist/agent-runtime.cjs.map +1 -0
- package/dist/agent-runtime.d.mts +94 -0
- package/dist/agent-runtime.d.ts +94 -0
- package/dist/agent-runtime.mjs +479 -0
- package/dist/agent-runtime.mjs.map +1 -0
- package/dist/api/route-manager.d.mts +66 -0
- package/dist/api/route-manager.d.ts +66 -0
- package/dist/api/runtime.d.mts +3 -0
- package/dist/api/runtime.d.ts +3 -0
- package/dist/api.cjs +4100 -0
- package/dist/api.cjs.map +1 -0
- package/dist/api.d.mts +48 -0
- package/dist/api.d.ts +48 -0
- package/dist/api.mjs +93 -0
- package/dist/api.mjs.map +1 -0
- package/dist/app-BWtqQu3R.d.mts +302 -0
- package/dist/app-markdown.cjs +244 -0
- package/dist/app-markdown.cjs.map +1 -0
- package/dist/app-markdown.d.mts +22 -0
- package/dist/app-markdown.d.ts +22 -0
- package/dist/app-markdown.mjs +27 -0
- package/dist/app-markdown.mjs.map +1 -0
- package/dist/app-xltejvLY.d.ts +302 -0
- package/dist/cache.cjs +945 -0
- package/dist/cache.cjs.map +1 -0
- package/dist/cache.d.mts +192 -0
- package/dist/cache.d.ts +192 -0
- package/dist/cache.mjs +46 -0
- package/dist/cache.mjs.map +1 -0
- package/dist/chunk-2ED5Q2GH.mjs +422 -0
- package/dist/chunk-2ED5Q2GH.mjs.map +1 -0
- package/dist/chunk-32W4QEJP.mjs +158 -0
- package/dist/chunk-32W4QEJP.mjs.map +1 -0
- package/dist/chunk-3XNTL3FQ.mjs +452 -0
- package/dist/chunk-3XNTL3FQ.mjs.map +1 -0
- package/dist/chunk-44ZCFSKE.mjs +84 -0
- package/dist/chunk-44ZCFSKE.mjs.map +1 -0
- package/dist/chunk-4MGVSBRP.mjs +7787 -0
- package/dist/chunk-4MGVSBRP.mjs.map +1 -0
- package/dist/chunk-4S3ORGFA.mjs +44 -0
- package/dist/chunk-4S3ORGFA.mjs.map +1 -0
- package/dist/chunk-5BY76U2M.mjs +1 -0
- package/dist/chunk-5BY76U2M.mjs.map +1 -0
- package/dist/chunk-5ZGPRGWV.mjs +136 -0
- package/dist/chunk-5ZGPRGWV.mjs.map +1 -0
- package/dist/chunk-65A7QIKI.mjs +142 -0
- package/dist/chunk-65A7QIKI.mjs.map +1 -0
- package/dist/chunk-74YTBPTY.mjs +450 -0
- package/dist/chunk-74YTBPTY.mjs.map +1 -0
- package/dist/chunk-7FBJLMQH.mjs +338 -0
- package/dist/chunk-7FBJLMQH.mjs.map +1 -0
- package/dist/chunk-7HO6AEOP.mjs +74 -0
- package/dist/chunk-7HO6AEOP.mjs.map +1 -0
- package/dist/chunk-7MABZJIM.mjs +29 -0
- package/dist/chunk-7MABZJIM.mjs.map +1 -0
- package/dist/chunk-7N62DNSO.mjs +41 -0
- package/dist/chunk-7N62DNSO.mjs.map +1 -0
- package/dist/chunk-7ZY5AIJO.mjs +161 -0
- package/dist/chunk-7ZY5AIJO.mjs.map +1 -0
- package/dist/chunk-ALCLXXTY.mjs +187 -0
- package/dist/chunk-ALCLXXTY.mjs.map +1 -0
- package/dist/chunk-AZ7YUVNR.mjs +65 -0
- package/dist/chunk-AZ7YUVNR.mjs.map +1 -0
- package/dist/chunk-B232I2GP.mjs +163 -0
- package/dist/chunk-B232I2GP.mjs.map +1 -0
- package/dist/chunk-B4W3BNTL.mjs +483 -0
- package/dist/chunk-B4W3BNTL.mjs.map +1 -0
- package/dist/chunk-C2ROET2V.mjs +718 -0
- package/dist/chunk-C2ROET2V.mjs.map +1 -0
- package/dist/chunk-CGILA3WO.mjs +14 -0
- package/dist/chunk-CGILA3WO.mjs.map +1 -0
- package/dist/chunk-CGIXMLSY.mjs +184 -0
- package/dist/chunk-CGIXMLSY.mjs.map +1 -0
- package/dist/chunk-DJSGLHCN.mjs +597 -0
- package/dist/chunk-DJSGLHCN.mjs.map +1 -0
- package/dist/chunk-E2MPIBRE.mjs +149 -0
- package/dist/chunk-E2MPIBRE.mjs.map +1 -0
- package/dist/chunk-E6EPN5BT.mjs +203 -0
- package/dist/chunk-E6EPN5BT.mjs.map +1 -0
- package/dist/chunk-EI43C4RA.mjs +6277 -0
- package/dist/chunk-EI43C4RA.mjs.map +1 -0
- package/dist/chunk-EJ7T4TPB.mjs +622 -0
- package/dist/chunk-EJ7T4TPB.mjs.map +1 -0
- package/dist/chunk-FQYDHKKU.mjs +128 -0
- package/dist/chunk-FQYDHKKU.mjs.map +1 -0
- package/dist/chunk-FRPWCMMG.mjs +299 -0
- package/dist/chunk-FRPWCMMG.mjs.map +1 -0
- package/dist/chunk-GN72QAIH.mjs +146 -0
- package/dist/chunk-GN72QAIH.mjs.map +1 -0
- package/dist/chunk-GQVGIUSN.mjs +149 -0
- package/dist/chunk-GQVGIUSN.mjs.map +1 -0
- package/dist/chunk-GS6K5OCM.mjs +407 -0
- package/dist/chunk-GS6K5OCM.mjs.map +1 -0
- package/dist/chunk-GXASWWJU.mjs +364 -0
- package/dist/chunk-GXASWWJU.mjs.map +1 -0
- package/dist/chunk-GY2STC2S.mjs +180 -0
- package/dist/chunk-GY2STC2S.mjs.map +1 -0
- package/dist/chunk-H2FA2SBS.mjs +51 -0
- package/dist/chunk-H2FA2SBS.mjs.map +1 -0
- package/dist/chunk-I4CUBGVF.mjs +93 -0
- package/dist/chunk-I4CUBGVF.mjs.map +1 -0
- package/dist/chunk-ITN462YM.mjs +98 -0
- package/dist/chunk-ITN462YM.mjs.map +1 -0
- package/dist/chunk-J23HNLFY.mjs +72 -0
- package/dist/chunk-J23HNLFY.mjs.map +1 -0
- package/dist/chunk-J4FNJ5IU.mjs +179 -0
- package/dist/chunk-J4FNJ5IU.mjs.map +1 -0
- package/dist/chunk-J5YWQVI5.mjs +211 -0
- package/dist/chunk-J5YWQVI5.mjs.map +1 -0
- package/dist/chunk-JDEOUK5V.mjs +427 -0
- package/dist/chunk-JDEOUK5V.mjs.map +1 -0
- package/dist/chunk-JK25YEN6.mjs +219 -0
- package/dist/chunk-JK25YEN6.mjs.map +1 -0
- package/dist/chunk-K4667E2Q.mjs +1916 -0
- package/dist/chunk-K4667E2Q.mjs.map +1 -0
- package/dist/chunk-LGHEOHBU.mjs +218 -0
- package/dist/chunk-LGHEOHBU.mjs.map +1 -0
- package/dist/chunk-LM2YNO4U.mjs +24 -0
- package/dist/chunk-LM2YNO4U.mjs.map +1 -0
- package/dist/chunk-ME4MO2RJ.mjs +3540 -0
- package/dist/chunk-ME4MO2RJ.mjs.map +1 -0
- package/dist/chunk-MIUW47JX.mjs +639 -0
- package/dist/chunk-MIUW47JX.mjs.map +1 -0
- package/dist/chunk-NNLCAVB6.mjs +391 -0
- package/dist/chunk-NNLCAVB6.mjs.map +1 -0
- package/dist/chunk-P7QDS5AT.mjs +191 -0
- package/dist/chunk-P7QDS5AT.mjs.map +1 -0
- package/dist/chunk-PFE6GMNE.mjs +603 -0
- package/dist/chunk-PFE6GMNE.mjs.map +1 -0
- package/dist/chunk-QGOHVJ6J.mjs +63 -0
- package/dist/chunk-QGOHVJ6J.mjs.map +1 -0
- package/dist/chunk-QKVUNGAH.mjs +39 -0
- package/dist/chunk-QKVUNGAH.mjs.map +1 -0
- package/dist/chunk-QM746KUO.mjs +56 -0
- package/dist/chunk-QM746KUO.mjs.map +1 -0
- package/dist/chunk-QTZZ2ISQ.mjs +753 -0
- package/dist/chunk-QTZZ2ISQ.mjs.map +1 -0
- package/dist/chunk-RBRLLZL5.mjs +81 -0
- package/dist/chunk-RBRLLZL5.mjs.map +1 -0
- package/dist/chunk-RHIFZZUI.mjs +69 -0
- package/dist/chunk-RHIFZZUI.mjs.map +1 -0
- package/dist/chunk-RQ633A5I.mjs +187 -0
- package/dist/chunk-RQ633A5I.mjs.map +1 -0
- package/dist/chunk-SCFX4UTD.mjs +28 -0
- package/dist/chunk-SCFX4UTD.mjs.map +1 -0
- package/dist/chunk-SL6HTIOK.mjs +66 -0
- package/dist/chunk-SL6HTIOK.mjs.map +1 -0
- package/dist/chunk-SPBBQLXI.mjs +207 -0
- package/dist/chunk-SPBBQLXI.mjs.map +1 -0
- package/dist/chunk-SSA7THPX.mjs +10 -0
- package/dist/chunk-SSA7THPX.mjs.map +1 -0
- package/dist/chunk-T4QJQK76.mjs +459 -0
- package/dist/chunk-T4QJQK76.mjs.map +1 -0
- package/dist/chunk-TQAEEJB4.mjs +157 -0
- package/dist/chunk-TQAEEJB4.mjs.map +1 -0
- package/dist/chunk-UB5UOSHB.mjs +458 -0
- package/dist/chunk-UB5UOSHB.mjs.map +1 -0
- package/dist/chunk-USWZZUEH.mjs +25 -0
- package/dist/chunk-USWZZUEH.mjs.map +1 -0
- package/dist/chunk-UVCIEUJC.mjs +16 -0
- package/dist/chunk-UVCIEUJC.mjs.map +1 -0
- package/dist/chunk-UXUAWNO5.mjs +396 -0
- package/dist/chunk-UXUAWNO5.mjs.map +1 -0
- package/dist/chunk-V3XURYJO.mjs +756 -0
- package/dist/chunk-V3XURYJO.mjs.map +1 -0
- package/dist/chunk-V6WE6JSZ.mjs +352 -0
- package/dist/chunk-V6WE6JSZ.mjs.map +1 -0
- package/dist/chunk-V7RBCSDJ.mjs +170 -0
- package/dist/chunk-V7RBCSDJ.mjs.map +1 -0
- package/dist/chunk-VCANOYFI.mjs +588 -0
- package/dist/chunk-VCANOYFI.mjs.map +1 -0
- package/dist/chunk-VY2UYN5R.mjs +224 -0
- package/dist/chunk-VY2UYN5R.mjs.map +1 -0
- package/dist/chunk-W2CRQFF6.mjs +1352 -0
- package/dist/chunk-W2CRQFF6.mjs.map +1 -0
- package/dist/chunk-WDU6QXNK.mjs +872 -0
- package/dist/chunk-WDU6QXNK.mjs.map +1 -0
- package/dist/chunk-WZ5QFROO.mjs +23 -0
- package/dist/chunk-WZ5QFROO.mjs.map +1 -0
- package/dist/chunk-XIVV5IWN.mjs +541 -0
- package/dist/chunk-XIVV5IWN.mjs.map +1 -0
- package/dist/chunk-YW7OBE6Q.mjs +119 -0
- package/dist/chunk-YW7OBE6Q.mjs.map +1 -0
- package/dist/chunk-Z5CQMP54.mjs +365 -0
- package/dist/chunk-Z5CQMP54.mjs.map +1 -0
- package/dist/chunk-ZBE6MLHL.mjs +230 -0
- package/dist/chunk-ZBE6MLHL.mjs.map +1 -0
- package/dist/chunk-ZVWA4ZQ3.mjs +189 -0
- package/dist/chunk-ZVWA4ZQ3.mjs.map +1 -0
- package/dist/chunk-ZZ57EH5Z.mjs +173 -0
- package/dist/chunk-ZZ57EH5Z.mjs.map +1 -0
- package/dist/client-BT1mFQas.d.mts +447 -0
- package/dist/client-Nn0q4eO4.d.ts +447 -0
- package/dist/client-cache-CIlyBlmx.d.ts +6 -0
- package/dist/client-cache-D-EZ7XVW.d.mts +6 -0
- package/dist/client-plugins-BI2R6Eae.d.mts +1926 -0
- package/dist/client-plugins-DU9oMspX.d.ts +1926 -0
- package/dist/client-plugins.cjs +415 -0
- package/dist/client-plugins.cjs.map +1 -0
- package/dist/client-plugins.d.mts +22 -0
- package/dist/client-plugins.d.ts +22 -0
- package/dist/client-plugins.mjs +10 -0
- package/dist/client-plugins.mjs.map +1 -0
- package/dist/client.cjs +5402 -0
- package/dist/client.cjs.map +1 -0
- package/dist/client.d.mts +447 -0
- package/dist/client.d.ts +447 -0
- package/dist/client.mjs +110 -0
- package/dist/client.mjs.map +1 -0
- package/dist/config.cjs +38 -0
- package/dist/config.cjs.map +1 -0
- package/dist/config.d.mts +29 -0
- package/dist/config.d.ts +29 -0
- package/dist/config.mjs +10 -0
- package/dist/config.mjs.map +1 -0
- package/dist/cron.cjs +406 -0
- package/dist/cron.cjs.map +1 -0
- package/dist/cron.d.mts +78 -0
- package/dist/cron.d.ts +78 -0
- package/dist/cron.mjs +30 -0
- package/dist/cron.mjs.map +1 -0
- package/dist/deferred.cjs +438 -0
- package/dist/deferred.cjs.map +1 -0
- package/dist/deferred.d.mts +42 -0
- package/dist/deferred.d.ts +42 -0
- package/dist/deferred.mjs +28 -0
- package/dist/deferred.mjs.map +1 -0
- package/dist/deployment.cjs +199 -0
- package/dist/deployment.cjs.map +1 -0
- package/dist/deployment.d.mts +34 -0
- package/dist/deployment.d.ts +34 -0
- package/dist/deployment.mjs +38 -0
- package/dist/deployment.mjs.map +1 -0
- package/dist/devtools-REQTS3I7.mjs +371 -0
- package/dist/devtools-REQTS3I7.mjs.map +1 -0
- package/dist/devtools-client-3XRTBND5.mjs +216 -0
- package/dist/devtools-client-3XRTBND5.mjs.map +1 -0
- package/dist/devtools-ui-NJKFORTG.mjs +1349 -0
- package/dist/devtools-ui-NJKFORTG.mjs.map +1 -0
- package/dist/docs.cjs +5548 -0
- package/dist/docs.cjs.map +1 -0
- package/dist/docs.d.mts +69 -0
- package/dist/docs.d.ts +69 -0
- package/dist/docs.mjs +47 -0
- package/dist/docs.mjs.map +1 -0
- package/dist/env-types.cjs +232 -0
- package/dist/env-types.cjs.map +1 -0
- package/dist/env-types.d.mts +12 -0
- package/dist/env-types.d.ts +12 -0
- package/dist/env-types.mjs +11 -0
- package/dist/env-types.mjs.map +1 -0
- package/dist/env.cjs +215 -0
- package/dist/env.cjs.map +1 -0
- package/dist/env.d.mts +45 -0
- package/dist/env.d.ts +45 -0
- package/dist/env.mjs +22 -0
- package/dist/env.mjs.map +1 -0
- package/dist/environment/vite.d.mts +22 -0
- package/dist/environment/vite.d.ts +22 -0
- package/dist/environment.cjs +96 -0
- package/dist/environment.cjs.map +1 -0
- package/dist/environment.d.mts +18 -0
- package/dist/environment.d.ts +18 -0
- package/dist/environment.mjs +14 -0
- package/dist/environment.mjs.map +1 -0
- package/dist/headers.cjs +126 -0
- package/dist/headers.cjs.map +1 -0
- package/dist/headers.d.mts +22 -0
- package/dist/headers.d.ts +22 -0
- package/dist/headers.mjs +12 -0
- package/dist/headers.mjs.map +1 -0
- package/dist/i18n/client.d.mts +32 -0
- package/dist/i18n/client.d.ts +32 -0
- package/dist/i18n/index.d.mts +20 -0
- package/dist/i18n/index.d.ts +20 -0
- package/dist/i18n/server.d.mts +30 -0
- package/dist/i18n/server.d.ts +30 -0
- package/dist/image/server.d.mts +37 -0
- package/dist/image/server.d.ts +37 -0
- package/dist/image/sharp.d.mts +7 -0
- package/dist/image/sharp.d.ts +7 -0
- package/dist/image-config-Duob7wER.d.mts +50 -0
- package/dist/image-config-Duob7wER.d.ts +50 -0
- package/dist/image.cjs +209 -0
- package/dist/image.cjs.map +1 -0
- package/dist/image.d.mts +39 -0
- package/dist/image.d.ts +39 -0
- package/dist/image.mjs +165 -0
- package/dist/image.mjs.map +1 -0
- package/dist/index.cjs +42186 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +454 -0
- package/dist/index.d.ts +454 -0
- package/dist/index.mjs +980 -0
- package/dist/index.mjs.map +1 -0
- package/dist/integration-api-CHT2OKAf.d.mts +93 -0
- package/dist/integration-api-CHT2OKAf.d.ts +93 -0
- package/dist/integration-orm-GQLGU66X.mjs +13 -0
- package/dist/integration-orm-GQLGU66X.mjs.map +1 -0
- package/dist/integrations.cjs +2820 -0
- package/dist/integrations.cjs.map +1 -0
- package/dist/integrations.d.mts +22 -0
- package/dist/integrations.d.ts +22 -0
- package/dist/integrations.mjs +51 -0
- package/dist/integrations.mjs.map +1 -0
- package/dist/internal/build-runtime.cjs +643 -322
- package/dist/internal/build-runtime.cjs.map +1 -1
- package/dist/internal/build-runtime.d.mts +39 -0
- package/dist/internal/build-runtime.d.ts +39 -0
- package/dist/internal/build-runtime.mjs +11 -10
- package/dist/internal/client-runtime.d.mts +2 -0
- package/dist/internal/client-runtime.d.ts +2 -0
- package/dist/internal/config-runtime.cjs +135 -39
- package/dist/internal/config-runtime.cjs.map +1 -1
- package/dist/internal/config-runtime.d.mts +39 -0
- package/dist/internal/config-runtime.d.ts +39 -0
- package/dist/internal/config-runtime.mjs +5 -4
- package/dist/internal/production-node-env.d.mts +12 -0
- package/dist/internal/production-node-env.d.ts +12 -0
- package/dist/internal/production-runtime.d.mts +39 -0
- package/dist/internal/production-runtime.d.ts +39 -0
- package/dist/layers-VWVDTPUZ.mjs +16 -0
- package/dist/layers-VWVDTPUZ.mjs.map +1 -0
- package/dist/manager-THKFTOFE.mjs +10 -0
- package/dist/manager-THKFTOFE.mjs.map +1 -0
- package/dist/markdown.cjs +364 -0
- package/dist/markdown.cjs.map +1 -0
- package/dist/markdown.d.mts +60 -0
- package/dist/markdown.d.ts +60 -0
- package/dist/markdown.mjs +18 -0
- package/dist/markdown.mjs.map +1 -0
- package/dist/metadata-Cm9ujH4I.d.ts +22 -0
- package/dist/metadata-DacXbnLA.d.mts +22 -0
- package/dist/middleware.cjs +2148 -0
- package/dist/middleware.cjs.map +1 -0
- package/dist/middleware.d.mts +164 -0
- package/dist/middleware.d.ts +164 -0
- package/dist/middleware.mjs +49 -0
- package/dist/middleware.mjs.map +1 -0
- package/dist/navigation-errors-Dvwpzaer.d.mts +13 -0
- package/dist/navigation-errors-Dvwpzaer.d.ts +13 -0
- package/dist/navigation.cjs +1329 -0
- package/dist/navigation.cjs.map +1 -0
- package/dist/navigation.d.mts +14 -0
- package/dist/navigation.d.ts +14 -0
- package/dist/navigation.mjs +33 -0
- package/dist/navigation.mjs.map +1 -0
- package/dist/nitro-QO5LV6QK.mjs +689 -0
- package/dist/nitro-QO5LV6QK.mjs.map +1 -0
- package/dist/observability.cjs +186 -0
- package/dist/observability.cjs.map +1 -0
- package/dist/observability.d.mts +335 -0
- package/dist/observability.d.ts +335 -0
- package/dist/observability.mjs +16 -0
- package/dist/observability.mjs.map +1 -0
- package/dist/params-BALtrRim.d.ts +15 -0
- package/dist/params-ry-lxqmy.d.mts +15 -0
- package/dist/plugin-BJDf43dc.d.mts +165 -0
- package/dist/plugin-BJDf43dc.d.ts +165 -0
- package/dist/plugin.cjs +23470 -0
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.mts +22 -0
- package/dist/plugin.d.ts +22 -0
- package/dist/plugin.mjs +8 -7
- package/dist/production-runtime-4KKq1AVC.d.mts +79 -0
- package/dist/production-runtime-C_B79w2P.d.mts +28 -0
- package/dist/production-runtime-DDEM1D2q.d.ts +28 -0
- package/dist/production-runtime-DRsWDN2x.d.ts +79 -0
- package/dist/query/client.d.mts +61 -0
- package/dist/query/client.d.ts +61 -0
- package/dist/query/index.d.mts +90 -0
- package/dist/query/index.d.ts +90 -0
- package/dist/query/parsers.d.mts +25 -0
- package/dist/query/parsers.d.ts +25 -0
- package/dist/query/server.d.mts +55 -0
- package/dist/query/server.d.ts +55 -0
- package/dist/request-Dsq4kGW0.d.mts +6 -0
- package/dist/request-udtobOLv.d.ts +6 -0
- package/dist/request.d.mts +2 -0
- package/dist/request.d.ts +2 -0
- package/dist/resolver-DJqjLMg_.d.mts +14 -0
- package/dist/resolver-IH4RmPEl.d.ts +14 -0
- package/dist/route-runtime-DoOHzCAD.d.mts +38 -0
- package/dist/route-runtime-DoOHzCAD.d.ts +38 -0
- package/dist/router.d.mts +36 -0
- package/dist/router.d.ts +36 -0
- package/dist/routes.d.mts +224 -0
- package/dist/routes.d.ts +224 -0
- package/dist/runtime-9nQjVM7X.d.mts +206 -0
- package/dist/runtime-Cxpq6xZN.d.mts +27 -0
- package/dist/runtime-DgeS2skB.d.ts +206 -0
- package/dist/runtime-bv63eUiO.d.ts +27 -0
- package/dist/server-action-security.d.mts +43 -0
- package/dist/server-action-security.d.ts +43 -0
- package/dist/server-fn-client.d.mts +32 -0
- package/dist/server-fn-client.d.ts +32 -0
- package/dist/server-fn.d.mts +93 -0
- package/dist/server-fn.d.ts +93 -0
- package/dist/server-plugins.d.mts +55 -0
- package/dist/server-plugins.d.ts +55 -0
- package/dist/server-query-client.d.mts +50 -0
- package/dist/server-query-client.d.ts +50 -0
- package/dist/server-query.d.mts +36 -0
- package/dist/server-query.d.ts +36 -0
- package/dist/server.cjs +731 -447
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.mts +48 -0
- package/dist/server.d.ts +48 -0
- package/dist/server.mjs +9 -8
- package/dist/server.mjs.map +1 -1
- package/dist/storage.d.mts +52 -0
- package/dist/storage.d.ts +52 -0
- package/dist/testing.d.mts +101 -0
- package/dist/testing.d.ts +101 -0
- package/dist/transport-BmbGTXA5.d.mts +49 -0
- package/dist/transport-BmbGTXA5.d.ts +49 -0
- package/dist/types-BMxWr97v.d.mts +81 -0
- package/dist/types-BMxWr97v.d.ts +81 -0
- package/dist/types-C9N-nk5R.d.mts +53 -0
- package/dist/types-C9N-nk5R.d.ts +53 -0
- package/dist/types-D1A6-XvH.d.mts +73 -0
- package/dist/types-D1A6-XvH.d.ts +73 -0
- package/dist/utils-B-cUHwoK.d.ts +23 -0
- package/dist/utils-Cm41AefV.d.mts +23 -0
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -1
- package/dist/version.d.mts +3 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.mjs +1 -1
- package/dist/vite.cjs +682 -437
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.d.mts +22 -0
- package/dist/vite.d.ts +22 -0
- package/dist/vite.mjs +6 -5
- package/dist/workflows.d.mts +110 -0
- package/dist/workflows.d.ts +110 -0
- package/package.json +3 -2
- package/types/client.d.ts +1 -1
- package/types/image.d.ts +4 -0
- package/types/images.d.ts +59 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/storage/index.ts","../../src/integration-orm.ts","../../src/config-runtime.ts","../../src/integration-api.ts","../../src/request-context.ts","../../src/server/response.ts","../../src/integrations.ts","../../src/markdown.ts","../../src/workflows.ts","../../src/cron.ts","../../src/env.ts","../../src/app-markdown.ts","../../src/route-runtime.ts","../../src/route-rules.ts","../../src/server-action-security.ts","../../src/cache-invalidation.ts","../../src/layers.ts","../../src/config.ts","../../src/deployment.ts","../../src/devtools-config.ts","../../src/image-config.ts","../../src/i18n/config.ts","../../src/build/production-vite.ts","../../src/utils.ts"],"sourcesContent":["import { createStorage, prefixStorage, builtinDrivers, type BuiltinDriverName } from \"unstorage\";\nimport type { Driver, Storage } from \"unstorage\";\nimport type { Database } from \"db0\";\nimport memoryDriver from \"unstorage/drivers/memory\";\nimport type {\n FarmStorageClient,\n FarmStorageClientConfig,\n FarmStorageConfigObject,\n FarmStorageLocalDriverConfig,\n FarmStorageDatabaseConfig,\n FarmStorageDatabaseDriverMap,\n FarmStorageDatabaseDriverName,\n FarmStorageRuntimeClient,\n FarmStorageMountConfig,\n FarmStorageMounts,\n FarmStorageUserConfig,\n} from \"./types\";\n\nexport type {\n FarmStorageBuiltinDriverConfig,\n FarmStorageClient,\n FarmStorageClientConfig,\n FarmStorageConfigObject,\n FarmStorageCustomDriverConfig,\n FarmStorageDatabaseConfig,\n FarmStorageDatabaseDriverName,\n FarmStorageLocalDriverConfig,\n FarmStorageRuntimeClient,\n FarmStorageMountConfig,\n FarmStorageMounts,\n FarmStorageUserConfig,\n} from \"./types\";\nexport type {\n BuiltinDriverName,\n BuiltinDriverOptions,\n Driver,\n Storage,\n StorageMeta,\n StorageValue,\n TransactionOptions,\n} from \"unstorage\";\nexport type { ConnectorName, ConnectorOptions, Database } from \"db0\";\n\ntype DriverFactoryModule = {\n default: (options?: Record<string, any>) => Driver;\n};\n\ntype DriverResolver = () => Driver | Promise<Driver>;\ntype ModuleLoader = <T = any>(specifier: string) => Promise<T>;\n\nconst loadModule: ModuleLoader = (specifier) => import(/* @vite-ignore */ specifier);\n\nconst DATABASE_CONNECTORS: {\n [K in FarmStorageDatabaseDriverName]: {\n connector: FarmStorageDatabaseDriverMap[K];\n load: () => Promise<{ default: (options?: any) => any }>;\n };\n} = {\n sqlite: {\n connector: \"node-sqlite\",\n load: () => loadModule(\"db0/connectors/node-sqlite\"),\n },\n \"node-sqlite\": {\n connector: \"node-sqlite\",\n load: () => loadModule(\"db0/connectors/node-sqlite\"),\n },\n sqlite3: {\n connector: \"sqlite3\",\n load: () => loadModule(\"db0/connectors/sqlite3\"),\n },\n \"better-sqlite3\": {\n connector: \"better-sqlite3\",\n load: () => loadModule(\"db0/connectors/better-sqlite3\"),\n },\n postgres: {\n connector: \"postgresql\",\n load: () => loadModule(\"db0/connectors/postgresql\"),\n },\n postgresql: {\n connector: \"postgresql\",\n load: () => loadModule(\"db0/connectors/postgresql\"),\n },\n pg: {\n connector: \"postgresql\",\n load: () => loadModule(\"db0/connectors/postgresql\"),\n },\n mysql: {\n connector: \"mysql2\",\n load: () => loadModule(\"db0/connectors/mysql2\"),\n },\n mysql2: {\n connector: \"mysql2\",\n load: () => loadModule(\"db0/connectors/mysql2\"),\n },\n pglite: {\n connector: \"pglite\",\n load: () => loadModule(\"db0/connectors/pglite\"),\n },\n planetscale: {\n connector: \"planetscale\",\n load: () => loadModule(\"db0/connectors/planetscale\"),\n },\n libsql: {\n connector: \"libsql\",\n load: () => loadModule(\"db0/connectors/libsql/node\"),\n },\n \"libsql-node\": {\n connector: \"libsql-node\",\n load: () => loadModule(\"db0/connectors/libsql/node\"),\n },\n \"libsql-http\": {\n connector: \"libsql-http\",\n load: () => loadModule(\"db0/connectors/libsql/http\"),\n },\n};\n\nfunction createMemoryStorage(): Storage {\n return createStorage({\n driver: memoryDriver(),\n });\n}\n\nconst GLOBAL_STORAGE_KEY = Symbol.for(\"farmjs.storage.global\");\n\nfunction readGlobalStorage(): Storage | undefined {\n return (globalThis as unknown as Record<PropertyKey, Storage | undefined>)[GLOBAL_STORAGE_KEY];\n}\n\nfunction writeGlobalStorage(storage: Storage): Storage {\n (globalThis as unknown as Record<PropertyKey, Storage | undefined>)[GLOBAL_STORAGE_KEY] = storage;\n return storage;\n}\n\nfunction getActiveGlobalStorage(): Storage {\n const existing = readGlobalStorage();\n if (existing) {\n return existing;\n }\n return writeGlobalStorage(createMemoryStorage());\n}\n\nlet globalStorage = getActiveGlobalStorage();\n\nfunction normalizeMountKey(base?: string): string {\n return (base || \"\")\n .trim()\n .replace(/^[:/\\\\]+|[:/\\\\]+$/g, \"\")\n .replace(/[\\\\/]+/g, \":\");\n}\n\nfunction isDriverInstance(value: unknown): value is Driver {\n return (\n !!value &&\n typeof value === \"object\" &&\n typeof (value as Driver).getItem === \"function\" &&\n typeof (value as Driver).getKeys === \"function\"\n );\n}\n\nfunction isStorageInstance(value: unknown): value is Storage {\n return (\n !!value &&\n typeof value === \"object\" &&\n typeof (value as Storage).mount === \"function\" &&\n typeof (value as Storage).getMount === \"function\"\n );\n}\n\nfunction isStorageClient(value: unknown): value is FarmStorageClient {\n return (\n !!value &&\n typeof value === \"object\" &&\n (value as FarmStorageClient).kind === \"farm-storage-client\" &&\n typeof (value as FarmStorageClient).resolveDriver === \"function\" &&\n typeof (value as FarmStorageClient).createStorage === \"function\"\n );\n}\n\nfunction isDatabaseDriverName(name: string): name is FarmStorageDatabaseDriverName {\n return name in DATABASE_CONNECTORS;\n}\n\nfunction extractDriverOptions(config: FarmStorageClientConfig): Record<string, any> | undefined {\n const source = config as Record<string, any>;\n const {\n client: _client,\n driver: _driver,\n mounts: _mounts,\n options,\n tableName: _tableName,\n ...inlineOptions\n } = source;\n const hasInlineOptions = Object.keys(inlineOptions).length > 0;\n\n if (options && typeof options === \"object\" && !Array.isArray(options)) {\n return hasInlineOptions ? { ...inlineOptions, ...options } : options;\n }\n\n if (hasInlineOptions) {\n return inlineOptions;\n }\n\n return options;\n}\n\nasync function loadBuiltinDriver(\n name: BuiltinDriverName,\n options?: Record<string, any>,\n): Promise<Driver> {\n const modulePath = builtinDrivers[name];\n\n if (!modulePath) {\n throw new Error(`Unsupported storage driver \"${name}\".`);\n }\n\n const module = (await loadModule(modulePath)) as DriverFactoryModule;\n return module.default(options);\n}\n\nasync function loadDatabaseDriver(config: FarmStorageDatabaseConfig): Promise<Driver> {\n const connectorEntry = DATABASE_CONNECTORS[config.driver as FarmStorageDatabaseDriverName];\n const [{ createDatabase }, connectorModule, db0DriverModule] = await Promise.all([\n loadModule<typeof import(\"db0\")>(\"db0\"),\n connectorEntry.load(),\n loadModule<typeof import(\"unstorage/drivers/db0\")>(\"unstorage/drivers/db0\"),\n ]);\n\n const database = createDatabase(connectorModule.default(extractDriverOptions(config) || {}));\n return db0DriverModule.default({\n database,\n tableName: config.tableName,\n });\n}\n\nasync function resolveDriver(config?: FarmStorageMountConfig): Promise<Driver> {\n if (config && isStorageClient(config)) {\n return config.resolveDriver();\n }\n\n const driverInput = config?.driver ?? \"memory\";\n\n if (typeof driverInput === \"function\") {\n return await driverInput();\n }\n\n if (isDriverInstance(driverInput)) {\n return driverInput;\n }\n\n if (isDatabaseDriverName(driverInput)) {\n return loadDatabaseDriver(config as FarmStorageDatabaseConfig);\n }\n\n if (driverInput === \"local\") {\n return loadBuiltinDriver(\"fs-lite\", extractDriverOptions(config as FarmStorageMountConfig));\n }\n\n return loadBuiltinDriver(\n driverInput as BuiltinDriverName,\n extractDriverOptions(config as FarmStorageClientConfig),\n );\n}\n\nfunction createStorageClientFromResolver(resolveDriver: DriverResolver): FarmStorageClient {\n let driverPromise: Promise<Driver> | undefined;\n let storagePromise: Promise<Storage> | undefined;\n\n const ensureDriver = async () => {\n driverPromise ??= Promise.resolve(resolveDriver());\n return driverPromise;\n };\n\n const ensureStorage = async () => {\n storagePromise ??= ensureDriver().then((driver) =>\n createStorage({\n driver,\n }),\n );\n return storagePromise;\n };\n\n const target = {\n kind: \"farm-storage-client\" as const,\n ready: ensureStorage,\n createStorage: ensureStorage,\n resolveDriver: ensureDriver,\n };\n\n return new Proxy(target as FarmStorageClient, {\n get(currentTarget, prop, receiver) {\n if (prop === \"then\") {\n return undefined;\n }\n\n if (Reflect.has(currentTarget, prop)) {\n return Reflect.get(currentTarget, prop, receiver);\n }\n\n return (...args: any[]) =>\n ensureStorage().then(async (storage) => {\n const member = Reflect.get(storage as object, prop);\n\n if (typeof member !== \"function\") {\n return member;\n }\n\n const result = Reflect.apply(member, storage, args);\n\n if (prop === \"dispose\") {\n return Promise.resolve(result).finally(() => {\n storagePromise = undefined;\n });\n }\n\n return result;\n });\n },\n });\n}\n\nexport function defineStorageClient(resolveDriver: DriverResolver): FarmStorageClient {\n return createStorageClientFromResolver(resolveDriver);\n}\n\nexport function createStorageClient(config: FarmStorageClientConfig): FarmStorageClient {\n return defineStorageClient(() => resolveDriver(config));\n}\n\nexport function driverStorage(\n driver: Driver | (() => Driver | Promise<Driver>),\n): FarmStorageClient {\n return defineStorageClient(() => (typeof driver === \"function\" ? driver() : driver));\n}\n\nexport function databaseStorage(\n database: Database,\n options: { tableName?: string } = {},\n): FarmStorageClient {\n return defineStorageClient(async () => {\n const db0DriverModule =\n await loadModule<typeof import(\"unstorage/drivers/db0\")>(\"unstorage/drivers/db0\");\n return db0DriverModule.default({\n database,\n tableName: options.tableName,\n });\n });\n}\n\nexport function memoryStorage(): FarmStorageClient {\n return createStorageClient({ driver: \"memory\" });\n}\n\nexport function localStorage(options: Omit<FarmStorageLocalDriverConfig, \"driver\"> = {}) {\n return createStorageClient({\n driver: \"local\",\n ...options,\n });\n}\n\nexport function sqliteStorage(options: Omit<FarmStorageDatabaseConfig, \"driver\">) {\n return createStorageClient({\n driver: \"sqlite\",\n ...options,\n });\n}\n\nexport function mysqlStorage(options: Omit<FarmStorageDatabaseConfig, \"driver\">) {\n return createStorageClient({\n driver: \"mysql\",\n ...options,\n });\n}\n\nexport function mysql2Storage(options: Omit<FarmStorageDatabaseConfig, \"driver\">) {\n return mysqlStorage(options);\n}\n\nexport function postgresStorage(options: Omit<FarmStorageDatabaseConfig, \"driver\">) {\n return createStorageClient({\n driver: \"postgres\",\n ...options,\n });\n}\n\nexport function pgStorage(options: Omit<FarmStorageDatabaseConfig, \"driver\">) {\n return postgresStorage(options);\n}\n\nexport function pgliteStorage(options: Omit<FarmStorageDatabaseConfig, \"driver\">) {\n return createStorageClient({\n driver: \"pglite\",\n ...options,\n });\n}\n\nexport function planetscaleStorage(options: Omit<FarmStorageDatabaseConfig, \"driver\">) {\n return createStorageClient({\n driver: \"planetscale\",\n ...options,\n });\n}\n\nexport function libsqlStorage(options: Omit<FarmStorageDatabaseConfig, \"driver\">) {\n return createStorageClient({\n driver: \"libsql\",\n ...options,\n });\n}\n\nexport function redisStorage(\n options: Omit<Extract<FarmStorageClientConfig, { driver: \"redis\" }>, \"driver\">,\n) {\n return createStorageClient({\n driver: \"redis\",\n ...options,\n });\n}\n\nexport function s3Storage(\n options: Omit<Extract<FarmStorageClientConfig, { driver: \"s3\" }>, \"driver\">,\n) {\n return createStorageClient({\n driver: \"s3\",\n ...options,\n });\n}\n\nexport function mongodbStorage(\n options: Omit<Extract<FarmStorageClientConfig, { driver: \"mongodb\" }>, \"driver\">,\n) {\n return createStorageClient({\n driver: \"mongodb\",\n ...options,\n });\n}\n\nexport function upstashStorage(\n options: Omit<Extract<FarmStorageClientConfig, { driver: \"upstash\" }>, \"driver\">,\n) {\n return createStorageClient({\n driver: \"upstash\",\n ...options,\n });\n}\n\nexport function netlifyBlobsStorage(\n options: Omit<Extract<FarmStorageClientConfig, { driver: \"netlify-blobs\" }>, \"driver\">,\n) {\n return createStorageClient({\n driver: \"netlify-blobs\",\n ...options,\n });\n}\n\nexport function vercelKVStorage(\n options: Omit<Extract<FarmStorageClientConfig, { driver: \"vercel-kv\" }>, \"driver\">,\n) {\n return createStorageClient({\n driver: \"vercel-kv\",\n ...options,\n });\n}\n\nexport function vercelBlobStorage(\n options: Omit<Extract<FarmStorageClientConfig, { driver: \"vercel-blob\" }>, \"driver\">,\n) {\n return createStorageClient({\n driver: \"vercel-blob\",\n ...options,\n });\n}\n\nasync function mountNamespaces(storage: Storage, mounts?: FarmStorageMounts): Promise<void> {\n if (!mounts) {\n return;\n }\n\n for (const [base, config] of Object.entries(mounts)) {\n storage.mount(normalizeMountKey(base), await resolveDriver(config));\n }\n}\n\nexport async function createFarmStorage(config: FarmStorageUserConfig = {}): Promise<Storage> {\n if (isStorageInstance(config)) {\n return config;\n }\n\n if (isStorageClient(config)) {\n return config.createStorage();\n }\n\n const rootConfig = isStorageClient(config.client) ? config.client : config;\n const storage = createStorage({\n driver: await resolveDriver(rootConfig),\n });\n\n await mountNamespaces(storage, config.mounts);\n return storage;\n}\n\nexport async function resolveStorageRuntimeClient(\n config: FarmStorageUserConfig | undefined,\n): Promise<unknown | undefined> {\n if (!config || isStorageInstance(config) || isStorageClient(config)) {\n return undefined;\n }\n\n const client = config.client;\n if (!client || isStorageInstance(client) || isStorageClient(client)) {\n return undefined;\n }\n\n return typeof client === \"function\" ? await client() : client;\n}\n\nexport async function initStorage(config: FarmStorageUserConfig = {}): Promise<Storage> {\n globalStorage = getActiveGlobalStorage();\n const nextStorage = await createFarmStorage(config);\n const previousStorage = globalStorage;\n globalStorage = writeGlobalStorage(nextStorage);\n\n if (previousStorage !== nextStorage) {\n await previousStorage.dispose().catch(() => {});\n }\n\n return globalStorage;\n}\n\nexport function getStorage(namespace?: string): Storage {\n globalStorage = getActiveGlobalStorage();\n const base = normalizeMountKey(namespace);\n if (!base) {\n return globalStorage;\n }\n\n const namespaced = prefixStorage(globalStorage, base);\n return {\n ...namespaced,\n async clear() {\n const keys = await namespaced.getKeys();\n await Promise.all(keys.map((key) => namespaced.removeItem(key)));\n },\n } as Storage;\n}\n\nexport async function disposeStorage(): Promise<void> {\n globalStorage = getActiveGlobalStorage();\n const previousStorage = globalStorage;\n globalStorage = writeGlobalStorage(createMemoryStorage());\n await previousStorage.dispose().catch(() => {});\n}\n","import type {\n AnyFieldBuilder,\n AnyModelDefinition,\n FieldBuilder,\n JsonValue,\n ModelDefinition,\n OrmClient,\n SchemaDefinition,\n SchemaModels,\n} from \"@farming-labs/orm\";\nimport type {\n FarmIntegrationSchema,\n FarmIntegrationSchemaField,\n FarmIntegrationSchemaModel,\n} from \"./integrations\";\nimport { resolveStorageRuntimeClient } from \"./storage\";\nimport type { FarmStorageUserConfig } from \"./storage/types\";\nimport type { FarmConfig } from \"./types\";\n\ntype RuntimeClientFactory<TClient> = () => TClient | Promise<TClient>;\n\nexport type FarmIntegrationOrmSchema = SchemaDefinition<Record<string, AnyModelDefinition>>;\n\nexport type FarmIntegrationOrmClient<TSchema extends FarmIntegrationOrmSchema> = OrmClient<TSchema>;\n\ntype FarmIntegrationOrmFieldKind<TField extends FarmIntegrationSchemaField> = TField[\"type\"] extends\n | \"id\"\n | \"uuid\"\n ? \"id\"\n : TField[\"type\"] extends \"text\"\n ? \"string\"\n : TField[\"type\"] extends \"number\"\n ? \"decimal\"\n : Extract<TField[\"type\"], \"string\" | \"boolean\" | \"integer\" | \"datetime\" | \"json\" | \"enum\">;\n\ntype FarmIntegrationOrmFieldNullable<TField extends FarmIntegrationSchemaField> = TField extends {\n nullable: true;\n}\n ? true\n : TField extends { required: false }\n ? true\n : false;\n\ntype FarmIntegrationOrmEnumValue<TField extends FarmIntegrationSchemaField> = TField extends {\n values: readonly (infer TValue extends string)[];\n}\n ? TValue\n : string;\n\ntype FarmIntegrationOrmFieldValue<TField extends FarmIntegrationSchemaField> =\n TField[\"type\"] extends \"id\" | \"uuid\" | \"string\" | \"text\"\n ? string\n : TField[\"type\"] extends \"boolean\"\n ? boolean\n : TField[\"type\"] extends \"integer\"\n ? number\n : TField[\"type\"] extends \"number\"\n ? string\n : TField[\"type\"] extends \"datetime\"\n ? Date\n : TField[\"type\"] extends \"json\"\n ? JsonValue\n : TField[\"type\"] extends \"enum\"\n ? FarmIntegrationOrmEnumValue<TField>\n : never;\n\nexport type InferFarmIntegrationOrmField<TField extends FarmIntegrationSchemaField> = FieldBuilder<\n FarmIntegrationOrmFieldKind<TField>,\n FarmIntegrationOrmFieldNullable<TField>,\n FarmIntegrationOrmFieldValue<TField>\n>;\n\nexport type InferFarmIntegrationOrmFields<TModel extends FarmIntegrationSchemaModel> = {\n [TFieldKey in keyof TModel[\"fields\"] & string]: InferFarmIntegrationOrmField<\n Extract<TModel[\"fields\"][TFieldKey], FarmIntegrationSchemaField>\n >;\n};\n\nexport type InferFarmIntegrationOrmSchema<TSchema extends FarmIntegrationSchema> =\n SchemaDefinition<{\n [TModelKey in keyof TSchema[\"models\"] & string]: ModelDefinition<\n InferFarmIntegrationOrmFields<\n Extract<TSchema[\"models\"][TModelKey], FarmIntegrationSchemaModel>\n >,\n {}\n >;\n }>;\n\nexport type InferFarmIntegrationOrmClient<TSchema extends FarmIntegrationSchema | undefined> =\n TSchema extends FarmIntegrationSchema ? OrmClient<InferFarmIntegrationOrmSchema<TSchema>> : never;\n\nexport interface CreateIntegrationOrmOptions<\n TClient = unknown,\n TSchema extends FarmIntegrationSchema = FarmIntegrationSchema,\n> {\n schema: TSchema;\n config?: Pick<FarmConfig, \"storage\">;\n storage?: FarmStorageUserConfig;\n client?: TClient | RuntimeClientFactory<TClient>;\n}\n\nexport async function createIntegrationOrm<\n TClient = unknown,\n TSchema extends FarmIntegrationSchema = FarmIntegrationSchema,\n>(\n options: CreateIntegrationOrmOptions<TClient, TSchema>,\n): Promise<InferFarmIntegrationOrmClient<TSchema>> {\n const [schema, client] = await Promise.all([\n farmIntegrationSchemaToOrmSchema(options.schema),\n resolveIntegrationOrmRuntimeClient(options),\n ]);\n\n if (!client) {\n throw new Error(\n \"Schema-backed integration storage requires a runtime client at farm.config storage.client.\",\n );\n }\n\n const { createOrmFromRuntime } = await import(\"@farming-labs/orm-runtime\");\n return createOrmFromRuntime({\n schema,\n client,\n }) as Promise<InferFarmIntegrationOrmClient<TSchema>>;\n}\n\nexport async function resolveIntegrationOrmRuntimeClient<TClient = unknown>(\n options: Omit<CreateIntegrationOrmOptions<TClient>, \"schema\">,\n): Promise<TClient | unknown | undefined> {\n if (options.client !== undefined) {\n return typeof options.client === \"function\"\n ? await (options.client as RuntimeClientFactory<TClient>)()\n : options.client;\n }\n\n return resolveStorageRuntimeClient(options.storage ?? options.config?.storage);\n}\n\nexport async function farmIntegrationSchemaToOrmSchema(\n schema: FarmIntegrationSchema,\n): Promise<FarmIntegrationOrmSchema> {\n const orm = await import(\"@farming-labs/orm\");\n const models: Record<string, AnyModelDefinition> = {};\n\n for (const [modelKey, modelSchema] of Object.entries(schema.models)) {\n models[modelKey] = orm.model({\n table: modelSchema.name ?? modelKey,\n fields: createOrmModelFields(orm, modelSchema),\n constraints: createOrmModelConstraints(modelSchema),\n description: modelSchema.description,\n }) as AnyModelDefinition;\n }\n\n return orm.defineSchema(models) as FarmIntegrationOrmSchema;\n}\n\nfunction createOrmModelFields(\n orm: typeof import(\"@farming-labs/orm\"),\n modelSchema: FarmIntegrationSchemaModel,\n): Record<string, AnyFieldBuilder> {\n return Object.fromEntries(\n Object.entries(modelSchema.fields).map(([fieldKey, fieldSchema]) => [\n fieldKey,\n createOrmField(orm, fieldKey, fieldSchema),\n ]),\n );\n}\n\nfunction createOrmField(\n orm: typeof import(\"@farming-labs/orm\"),\n fieldKey: string,\n field: FarmIntegrationSchemaField,\n): AnyFieldBuilder {\n let builder = createOrmFieldBuilder(orm, fieldKey, field) as AnyFieldBuilder;\n\n if (field.unique) {\n builder = builder.unique();\n }\n\n if (field.nullable || field.required === false) {\n builder = builder.nullable();\n }\n\n if (field.default !== undefined) {\n builder =\n field.type === \"datetime\" && field.default === \"now\"\n ? builder.defaultNow()\n : builder.default(field.default as never);\n }\n\n if (field.reference) {\n builder = builder.references(`${field.reference.model}.${field.reference.field}`);\n }\n\n if (field.name && field.name !== fieldKey) {\n builder = builder.map(field.name);\n }\n\n if (field.description) {\n builder = builder.describe(field.description);\n }\n\n return builder;\n}\n\nfunction createOrmFieldBuilder(\n orm: typeof import(\"@farming-labs/orm\"),\n fieldKey: string,\n field: FarmIntegrationSchemaField,\n): AnyFieldBuilder {\n switch (field.type) {\n case \"id\":\n case \"uuid\":\n return orm.id();\n case \"string\":\n case \"text\":\n return orm.string();\n case \"boolean\":\n return orm.boolean();\n case \"integer\":\n return orm.integer();\n case \"number\":\n return orm.decimal();\n case \"datetime\":\n return orm.datetime();\n case \"json\":\n return orm.json();\n case \"enum\": {\n if (!field.values?.length) {\n throw new Error(`Integration schema enum field \"${fieldKey}\" must define values.`);\n }\n\n return orm.enumeration(field.values as readonly [string, ...string[]]);\n }\n default:\n throw new Error(\n `Unsupported integration schema field type \"${field.type}\" for \"${fieldKey}\".`,\n );\n }\n}\n\nfunction createOrmModelConstraints(modelSchema: FarmIntegrationSchemaModel) {\n const unique: Array<readonly [string, ...string[]]> = [];\n const indexes: Array<readonly [string, ...string[]]> = [];\n\n for (const constraint of modelSchema.constraints ?? []) {\n if (!constraint.fields.length) {\n continue;\n }\n\n const fields = constraint.fields as readonly [string, ...string[]];\n if (constraint.type === \"unique\") {\n unique.push(fields);\n } else {\n indexes.push(fields);\n }\n }\n\n return {\n unique,\n indexes,\n };\n}\n\nexport type IntegrationOrmModelNames<TSchema extends FarmIntegrationOrmSchema> =\n keyof SchemaModels<TSchema> & string;\n","export { loadConfig, resolveConfig, resolveDeployConfig } from \"./config\";\nexport { loadFarmProductionVite } from \"./build/production-vite\";\nexport type { FarmProductionViteRuntime } from \"./build/production-vite\";\nexport { logger } from \"./utils\";\n","export type FarmIntegrationAPIMethod =\n | \"GET\"\n | \"POST\"\n | \"PUT\"\n | \"PATCH\"\n | \"DELETE\"\n | \"OPTIONS\"\n | \"HEAD\";\n\nexport type FarmIntegrationAPIBodyFormat = \"json\" | \"form\" | \"none\";\nexport type FarmIntegrationAPIResponseFormat = \"json\" | \"text\" | \"response\";\n\nexport interface FarmIntegrationAPIOperation<\n TBody = never,\n TQuery = never,\n TResponse = unknown,\n TServer extends boolean = false,\n TMethod extends FarmIntegrationAPIMethod = FarmIntegrationAPIMethod,\n> {\n readonly kind: \"farm-integration-api-operation\";\n path: string;\n method: TMethod;\n bodyFormat?: FarmIntegrationAPIBodyFormat;\n responseFormat?: FarmIntegrationAPIResponseFormat;\n headers?: Record<string, string>;\n credentials?: RequestCredentials;\n isServer?: TServer;\n __pathless?: boolean;\n __types?: {\n body: TBody;\n query: TQuery;\n response: TResponse;\n };\n}\n\nexport type FarmIntegrationAPI = {\n [key: string]: FarmIntegrationAPI | FarmIntegrationAPIOperation<any, any, any, any, any>;\n};\n\nexport type FarmIntegrationRouteOperationCarrier<\n TPath extends string = string,\n TOperation extends FarmIntegrationAPIOperation<any, any, any, any, any> =\n FarmIntegrationAPIOperation<any, any, any, any, any>,\n> = {\n path: TPath;\n __operation: TOperation;\n};\n\ntype IntegrationAPIBuilderOptions<TServer extends boolean = false> = Omit<\n FarmIntegrationAPIOperation<any, any, any, TServer>,\n \"kind\" | \"method\" | \"path\" | \"__pathless\" | \"__types\"\n>;\n\nexport function defineIntegrationAPIOperation<\n TBody = never,\n TQuery = never,\n TResponse = unknown,\n TServer extends boolean = false,\n TMethod extends FarmIntegrationAPIMethod = FarmIntegrationAPIMethod,\n>(\n operation: Omit<\n FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, TMethod>,\n \"kind\" | \"__types\"\n >,\n): FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, TMethod> {\n return {\n kind: \"farm-integration-api-operation\",\n ...operation,\n };\n}\n\nexport function defineIntegrationAPI<TAPI extends FarmIntegrationAPI>(api: TAPI): TAPI {\n return api;\n}\n\nfunction operation<\n TBody = never,\n TQuery = never,\n TResponse = unknown,\n TServer extends boolean = false,\n TMethod extends FarmIntegrationAPIMethod = FarmIntegrationAPIMethod,\n>(\n method: TMethod,\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n): FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, TMethod> {\n const hasExplicitPath = typeof pathOrOptions === \"string\";\n const path = hasExplicitPath ? pathOrOptions : \"\";\n const options = (\n hasExplicitPath\n ? maybeOptions\n : {\n ...maybeOptions,\n ...pathOrOptions,\n }\n ) as IntegrationAPIBuilderOptions<TServer>;\n\n return defineIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, TMethod>({\n path,\n method,\n __pathless: !hasExplicitPath,\n ...options,\n });\n}\n\nfunction get<TResponse = unknown, TServer extends boolean = false>(\n path: string,\n options?: IntegrationAPIBuilderOptions<TServer>,\n): FarmIntegrationAPIOperation<never, never, TResponse, TServer, \"GET\">;\nfunction get<TQuery = never, TResponse = unknown, TServer extends boolean = false>(\n path: string,\n options?: IntegrationAPIBuilderOptions<TServer>,\n): FarmIntegrationAPIOperation<never, TQuery, TResponse, TServer, \"GET\">;\nfunction get<TResponse = unknown, TServer extends boolean = false>(\n options?: IntegrationAPIBuilderOptions<TServer>,\n): FarmIntegrationAPIOperation<never, never, TResponse, TServer, \"GET\">;\nfunction get<TQuery = never, TResponse = unknown, TServer extends boolean = false>(\n options?: IntegrationAPIBuilderOptions<TServer>,\n): FarmIntegrationAPIOperation<never, TQuery, TResponse, TServer, \"GET\">;\nfunction get(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<boolean>,\n maybeOptions: IntegrationAPIBuilderOptions<boolean> = {} as IntegrationAPIBuilderOptions<boolean>,\n) {\n return operation<never, any, any, boolean>(\"GET\", pathOrOptions, maybeOptions);\n}\n\nfunction isOperation(value: unknown): value is FarmIntegrationAPIOperation<any, any, any, any> {\n return (\n !!value &&\n typeof value === \"object\" &&\n (value as FarmIntegrationAPIOperation<any, any, any, any>).kind ===\n \"farm-integration-api-operation\"\n );\n}\n\nfunction bindRoutePath<TAPI extends FarmIntegrationAPI>(path: string, api: TAPI): TAPI {\n const entries = Object.entries(api as Record<string, unknown>).map(([key, value]) => {\n if (isOperation(value)) {\n return [\n key,\n {\n ...value,\n path,\n __pathless: false,\n },\n ];\n }\n\n if (value && typeof value === \"object\") {\n return [key, bindRoutePath(path, value as FarmIntegrationAPI)];\n }\n\n return [key, value];\n });\n\n return Object.fromEntries(entries) as TAPI;\n}\n\ntype RouteOperationsToAPI<\n TOperations extends readonly FarmIntegrationAPIOperation<any, any, any, any, any>[],\n> = {\n [TMethod in Lowercase<TOperations[number][\"method\"] & string>]: Extract<\n TOperations[number],\n { method: Uppercase<TMethod> }\n >;\n};\n\ntype StripRouteClientPrefix<TPath extends string> = TPath extends `/api/${string}/${infer TRest}`\n ? TRest\n : TPath extends `/${string}/${infer TRest}`\n ? TRest\n : TPath extends `/${infer TRest}`\n ? TRest\n : TPath;\n\ntype NormalizeRouteSegment<TSegment extends string> = TSegment extends `[...${infer TName}]`\n ? TName\n : TSegment extends `[${infer TName}]`\n ? TName\n : TSegment extends `${infer TName}(${string}`\n ? TName\n : CamelCaseRouteSegment<TSegment>;\n\ntype CamelCaseRouteSegment<TSegment extends string> =\n TSegment extends `${infer THead}-${infer TTail}`\n ? `${THead}${Capitalize<CamelCaseRouteSegment<TTail>>}`\n : TSegment;\n\ntype RouteNamespaceFromPath<\n TPath extends string,\n TOperation extends FarmIntegrationAPIOperation<any, any, any, any, any>,\n> = TPath extends `${infer THead}/${infer TTail}`\n ? {\n [TKey in NormalizeRouteSegment<THead>]: RouteNamespaceFromPath<TTail, TOperation>;\n }\n : {\n [TKey in NormalizeRouteSegment<TPath>]: {\n [TMethod in Lowercase<TOperation[\"method\"] & string>]: TOperation;\n };\n };\n\ntype UnionToIntersection<TUnion> = (\n TUnion extends unknown ? (value: TUnion) => void : never\n) extends (value: infer TIntersection) => void\n ? TIntersection\n : never;\n\ntype ExpandRecursively<TValue> = TValue extends (...args: any[]) => any\n ? TValue\n : TValue extends object\n ? { [TKey in keyof TValue]: ExpandRecursively<TValue[TKey]> }\n : TValue;\n\ntype RoutesToAPI<TRoutes extends readonly FarmIntegrationRouteOperationCarrier<string, any>[]> =\n ExpandRecursively<\n UnionToIntersection<\n TRoutes[number] extends FarmIntegrationRouteOperationCarrier<infer TPath, infer TOperation>\n ? RouteNamespaceFromPath<StripRouteClientPrefix<TPath>, TOperation>\n : never\n >\n >;\n\nexport type InferIntegrationAPIFromRoutes<\n TRoutes extends readonly FarmIntegrationRouteOperationCarrier<string, any>[],\n> = RoutesToAPI<TRoutes>;\n\nfunction route<TAPI extends FarmIntegrationAPI>(path: string, definition: TAPI): TAPI;\nfunction route<TOperations extends readonly FarmIntegrationAPIOperation<any, any, any, any, any>[]>(\n path: string,\n ...operations: TOperations\n): RouteOperationsToAPI<TOperations>;\nfunction route(\n path: string,\n definitionOrOperation: FarmIntegrationAPI | FarmIntegrationAPIOperation<any, any, any, any, any>,\n ...operations: readonly FarmIntegrationAPIOperation<any, any, any, any, any>[]\n) {\n if (isOperation(definitionOrOperation)) {\n const allOperations = [definitionOrOperation, ...operations];\n return Object.fromEntries(\n allOperations.map((operation) => [\n operation.method.toLowerCase(),\n {\n ...operation,\n path,\n __pathless: false,\n },\n ]),\n );\n }\n\n return bindRoutePath(path, definitionOrOperation as FarmIntegrationAPI);\n}\n\nfunction normalizeRouteSegment(segment: string): string {\n if (!segment) {\n return \"index\";\n }\n\n if (segment.startsWith(\"[...\") && segment.endsWith(\"]\")) {\n return segment.slice(4, -1) || \"index\";\n }\n\n if (segment.startsWith(\"[\") && segment.endsWith(\"]\")) {\n return segment.slice(1, -1) || \"index\";\n }\n\n const matcherIndex = segment.indexOf(\"(\");\n if (matcherIndex > 0) {\n return segment.slice(0, matcherIndex);\n }\n\n return camelCaseRouteSegment(segment);\n}\n\nfunction camelCaseRouteSegment(segment: string): string {\n return segment.replace(/-([a-zA-Z0-9])/g, (_match, value: string) => value.toUpperCase());\n}\n\nfunction getRouteClientSegments(path: string): string[] {\n const segments = path.split(\"/\").filter(Boolean);\n if (segments.length === 0) {\n return [\"index\"];\n }\n\n const stripped =\n segments[0] === \"api\" && segments.length > 2\n ? segments.slice(2)\n : segments.length > 1\n ? segments.slice(1)\n : [segments[segments.length - 1]];\n\n return stripped.map(normalizeRouteSegment).filter(Boolean);\n}\n\nfunction setRouteOperation(\n target: Record<string, unknown>,\n pathSegments: string[],\n operation: FarmIntegrationAPIOperation<any, any, any, any, any>,\n) {\n const [head, ...tail] = pathSegments;\n if (!head) {\n return;\n }\n\n if (tail.length === 0) {\n const leaf = ((target[head] as Record<string, unknown> | undefined) || {}) as Record<\n string,\n unknown\n >;\n leaf[operation.method.toLowerCase()] = {\n ...operation,\n path: operation.path,\n __pathless: false,\n };\n target[head] = leaf;\n return;\n }\n\n const branch = ((target[head] as Record<string, unknown> | undefined) || {}) as Record<\n string,\n unknown\n >;\n target[head] = branch;\n setRouteOperation(branch, tail, operation);\n}\n\nfunction fromRoutes<TRoutes extends readonly FarmIntegrationRouteOperationCarrier<string, any>[]>(\n routes: TRoutes,\n): RoutesToAPI<TRoutes> {\n const definition: Record<string, unknown> = {};\n\n for (const route of routes) {\n if (!isOperation(route.__operation)) {\n continue;\n }\n\n setRouteOperation(definition, getRouteClientSegments(route.path), {\n ...route.__operation,\n path: route.path,\n __pathless: false,\n });\n }\n\n return definition as RoutesToAPI<TRoutes>;\n}\n\nexport const api = {\n get,\n route,\n fromRoutes,\n post<TBody = never, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n ): FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, \"POST\"> {\n return operation<TBody, TQuery, TResponse, TServer, \"POST\">(\"POST\", pathOrOptions, {\n bodyFormat: \"json\",\n ...(typeof pathOrOptions === \"string\" ? maybeOptions : pathOrOptions),\n });\n },\n put<TBody = never, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n ): FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, \"PUT\"> {\n return operation<TBody, TQuery, TResponse, TServer, \"PUT\">(\"PUT\", pathOrOptions, {\n bodyFormat: \"json\",\n ...(typeof pathOrOptions === \"string\" ? maybeOptions : pathOrOptions),\n });\n },\n patch<TBody = never, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n ): FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, \"PATCH\"> {\n return operation<TBody, TQuery, TResponse, TServer, \"PATCH\">(\"PATCH\", pathOrOptions, {\n bodyFormat: \"json\",\n ...(typeof pathOrOptions === \"string\" ? maybeOptions : pathOrOptions),\n });\n },\n delete<TBody = never, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n ): FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, \"DELETE\"> {\n return operation<TBody, TQuery, TResponse, TServer, \"DELETE\">(\"DELETE\", pathOrOptions, {\n bodyFormat: \"json\",\n ...(typeof pathOrOptions === \"string\" ? maybeOptions : pathOrOptions),\n });\n },\n options<TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n ): FarmIntegrationAPIOperation<never, TQuery, TResponse, TServer, \"OPTIONS\"> {\n return operation<never, TQuery, TResponse, TServer, \"OPTIONS\">(\n \"OPTIONS\",\n pathOrOptions,\n maybeOptions,\n );\n },\n head<TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n ): FarmIntegrationAPIOperation<never, TQuery, TResponse, TServer, \"HEAD\"> {\n return operation<never, TQuery, TResponse, TServer, \"HEAD\">(\n \"HEAD\",\n pathOrOptions,\n maybeOptions,\n );\n },\n form: {\n post<TBody = never, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n ): FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, \"POST\"> {\n return operation<TBody, TQuery, TResponse, TServer, \"POST\">(\"POST\", pathOrOptions, {\n bodyFormat: \"form\",\n ...(typeof pathOrOptions === \"string\" ? maybeOptions : pathOrOptions),\n });\n },\n put<TBody = never, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n ): FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, \"PUT\"> {\n return operation<TBody, TQuery, TResponse, TServer, \"PUT\">(\"PUT\", pathOrOptions, {\n bodyFormat: \"form\",\n ...(typeof pathOrOptions === \"string\" ? maybeOptions : pathOrOptions),\n });\n },\n patch<TBody = never, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n ): FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, \"PATCH\"> {\n return operation<TBody, TQuery, TResponse, TServer, \"PATCH\">(\"PATCH\", pathOrOptions, {\n bodyFormat: \"form\",\n ...(typeof pathOrOptions === \"string\" ? maybeOptions : pathOrOptions),\n });\n },\n delete<TBody = never, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n ): FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, \"DELETE\"> {\n return operation<TBody, TQuery, TResponse, TServer, \"DELETE\">(\"DELETE\", pathOrOptions, {\n bodyFormat: \"form\",\n ...(typeof pathOrOptions === \"string\" ? maybeOptions : pathOrOptions),\n });\n },\n },\n};\n\nexport const endpoint = api;\n","type RequestContextCarrier = object;\n\nexport interface SetRequestContextOptions {\n exposeToPage?: boolean;\n}\n\nexport interface RequestContextSnapshotOptions {\n exposedOnly?: boolean;\n}\n\ninterface RequestContextBucket {\n privateData: Map<string, any>;\n exposedData: Map<string, any>;\n}\n\nconst REQUEST_CONTEXT_STORE_KEY = Symbol.for(\"farm.requestContextStore\");\n\ntype GlobalWithRequestContextStore = typeof globalThis & {\n [REQUEST_CONTEXT_STORE_KEY]?: WeakMap<RequestContextCarrier, RequestContextBucket>;\n};\n\nfunction getRequestContextStore() {\n const globalState = globalThis as GlobalWithRequestContextStore;\n if (!globalState[REQUEST_CONTEXT_STORE_KEY]) {\n globalState[REQUEST_CONTEXT_STORE_KEY] = new WeakMap<\n RequestContextCarrier,\n RequestContextBucket\n >();\n }\n\n return globalState[REQUEST_CONTEXT_STORE_KEY]!;\n}\n\nfunction getBucket(target: RequestContextCarrier): RequestContextBucket {\n const requestContextStore = getRequestContextStore();\n let bucket = requestContextStore.get(target);\n if (!bucket) {\n bucket = {\n privateData: new Map<string, any>(),\n exposedData: new Map<string, any>(),\n };\n requestContextStore.set(target, bucket);\n }\n return bucket;\n}\n\nexport function setRequestContext(\n target: RequestContextCarrier,\n key: string,\n value: any,\n options: SetRequestContextOptions = {},\n): void {\n const bucket = getBucket(target);\n bucket.privateData.set(key, value);\n if (options.exposeToPage) {\n bucket.exposedData.set(key, value);\n }\n}\n\nexport function getRequestContext<T = any>(\n target: RequestContextCarrier,\n key: string,\n): T | undefined {\n const requestContextStore = getRequestContextStore();\n const bucket = requestContextStore.get(target);\n return bucket?.privateData.get(key) as T | undefined;\n}\n\nexport function hasRequestContext(target: RequestContextCarrier, key: string): boolean {\n const requestContextStore = getRequestContextStore();\n const bucket = requestContextStore.get(target);\n return bucket?.privateData.has(key) ?? false;\n}\n\nexport function deleteRequestContext(target: RequestContextCarrier, key: string): boolean {\n const requestContextStore = getRequestContextStore();\n const bucket = requestContextStore.get(target);\n if (!bucket) return false;\n const removedPrivate = bucket.privateData.delete(key);\n bucket.exposedData.delete(key);\n return removedPrivate;\n}\n\nexport function clearRequestContext(target: RequestContextCarrier): void {\n const requestContextStore = getRequestContextStore();\n const bucket = requestContextStore.get(target);\n if (!bucket) return;\n bucket.privateData.clear();\n bucket.exposedData.clear();\n}\n\nexport function getRequestContextSnapshot(\n target: RequestContextCarrier,\n options: RequestContextSnapshotOptions = {},\n): Map<string, any> {\n const requestContextStore = getRequestContextStore();\n const bucket = requestContextStore.get(target);\n if (!bucket) return new Map<string, any>();\n if (options.exposedOnly) {\n return new Map(bucket.exposedData);\n }\n return new Map(bucket.privateData);\n}\n","import { once } from \"node:events\";\nimport type { ServerResponse } from \"node:http\";\n\nexport async function sendWebResponse(res: ServerResponse, response: Response): Promise<void> {\n res.statusCode = response.status;\n\n const responseHeaders = response.headers as Headers & {\n getSetCookie?: () => string[];\n };\n const setCookies = responseHeaders.getSetCookie?.() || [];\n if (setCookies.length > 0) {\n res.setHeader(\"Set-Cookie\", setCookies);\n }\n\n response.headers.forEach((value, key) => {\n if (key.toLowerCase() === \"set-cookie\" && setCookies.length > 0) {\n return;\n }\n res.setHeader(key, value);\n });\n\n if (!response.body) {\n res.end();\n return;\n }\n\n if (typeof res.write !== \"function\") {\n const body = await response.arrayBuffer();\n res.end(Buffer.from(body));\n return;\n }\n\n const reader = response.body.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n if (!value || value.byteLength === 0) {\n continue;\n }\n\n if (!res.write(value)) {\n await once(res, \"drain\");\n }\n }\n\n res.end();\n } catch (error) {\n if (!res.writableEnded) {\n const responseError = error instanceof Error ? error : new Error(String(error));\n if (typeof res.destroy === \"function\") {\n res.destroy(responseError);\n } else {\n res.end();\n }\n }\n throw error;\n } finally {\n reader.releaseLock();\n }\n}\n","import type { ComponentType, ReactNode } from \"react\";\nimport { api as integrationApi, defineIntegrationAPIOperation } from \"./integration-api\";\nimport type {\n FarmIntegrationAPI,\n FarmIntegrationAPIBodyFormat,\n FarmIntegrationAPIMethod,\n FarmIntegrationAPIOperation,\n FarmIntegrationAPIResponseFormat,\n FarmIntegrationRouteOperationCarrier,\n InferIntegrationAPIFromRoutes,\n} from \"./integration-api\";\nimport type { InferFarmIntegrationOrmClient } from \"./integration-orm\";\nimport type { FarmPlugin, FarmPluginContext, FarmRequestStore } from \"./plugin\";\nimport {\n clearRequestContext,\n deleteRequestContext,\n getRequestContext,\n getRequestContextSnapshot,\n hasRequestContext,\n setRequestContext,\n} from \"./request-context\";\nimport { sendWebResponse } from \"./server/response\";\nimport type { FarmRequest } from \"./types\";\n\nexport { api, defineIntegrationAPI, defineIntegrationAPIOperation } from \"./integration-api\";\nexport type {\n FarmIntegrationAPI,\n FarmIntegrationAPIBodyFormat,\n FarmIntegrationAPIMethod,\n FarmIntegrationAPIOperation,\n FarmIntegrationAPIResponseFormat,\n} from \"./integration-api\";\n\nexport type FarmIntegrationCategory = \"auth\" | \"payment\" | \"monitoring\" | \"logging\" | (string & {});\n\n/** @deprecated Use FarmIntegrationCategory instead. */\nexport type FarmIntegrationSlot = FarmIntegrationCategory;\n\nexport type FarmIntegrationRouteParamValue = string | string[];\nexport type FarmIntegrationRouteParams = Record<string, FarmIntegrationRouteParamValue>;\nexport type FarmIntegrationRouteMethod =\n | FarmIntegrationAPIMethod\n | Lowercase<FarmIntegrationAPIMethod>\n | \"ALL\"\n | \"all\";\nexport type FarmIntegrationRouteInputSource = \"body\" | \"query\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type FarmIntegrationValidationPathSegment =\n | PropertyKey\n | {\n readonly key: PropertyKey;\n };\n\nexport interface FarmIntegrationRouteInput<TBody = unknown, TQuery = unknown> {\n body?: TBody;\n query?: TQuery;\n}\n\nexport interface FarmIntegrationValidationIssue {\n source: FarmIntegrationRouteInputSource;\n path?: readonly (string | number)[];\n code?: string;\n message: string;\n}\n\nexport interface FarmIntegrationValidationErrorLike {\n issues?: readonly {\n path?: readonly FarmIntegrationValidationPathSegment[];\n code?: string;\n message?: string;\n }[];\n message?: string;\n}\n\nexport type FarmIntegrationValidationResult<TValue> =\n | {\n success: true;\n data: TValue;\n }\n | {\n success: false;\n error: FarmIntegrationValidationErrorLike;\n };\n\nexport type FarmIntegrationStandardValidationResult<TValue> =\n | {\n value: TValue;\n }\n | {\n issues: readonly {\n path?: readonly FarmIntegrationValidationPathSegment[];\n code?: string;\n message: string;\n }[];\n };\n\nexport interface FarmIntegrationInputSchema<TValue = unknown> {\n _output?: TValue;\n parse?(value: unknown): MaybePromise<TValue>;\n safeParse?(value: unknown): MaybePromise<FarmIntegrationValidationResult<TValue>>;\n safeParseAsync?(value: unknown): Promise<FarmIntegrationValidationResult<TValue>>;\n \"~standard\"?: {\n validate(value: unknown): MaybePromise<FarmIntegrationStandardValidationResult<TValue>>;\n types?: {\n output: TValue;\n };\n };\n}\n\nexport interface FarmIntegrationRouteInputSchemas<TBody = unknown, TQuery = unknown> {\n body?: FarmIntegrationInputSchema<TBody>;\n query?: FarmIntegrationInputSchema<TQuery>;\n}\n\n/** @deprecated Use `FarmRequestStore` and access it through `ctx.req`. */\nexport type FarmIntegrationRequestContextStore = FarmRequestStore;\n\nexport const FARM_INTEGRATION_INTERNAL_DISPATCH_CONTEXT_KEY = \"farm.integration.internalDispatch\";\n\nexport type FarmIntegrationRouteDb<TSchema extends FarmIntegrationSchema | undefined> =\n InferFarmIntegrationOrmClient<TSchema>;\n\nexport interface FarmIntegrationRouteStorageArgs<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n getClient(): Promise<unknown | undefined>;\n getOrm(): Promise<FarmIntegrationRouteDb<TSchema>>;\n}\n\nexport interface FarmIntegrationRouteArgs<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n db: FarmIntegrationRouteDb<TSchema>;\n getDb(): Promise<FarmIntegrationRouteDb<TSchema>>;\n storage: FarmIntegrationRouteStorageArgs<TSchema>;\n}\n\nexport interface FarmIntegrationConfigContext<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n key: string;\n integration: FarmIntegration<TSchema, any>;\n appConfig: FarmPluginContext[\"config\"];\n /** Alias for appConfig. */\n config: FarmPluginContext[\"config\"];\n args: FarmIntegrationRouteArgs<TSchema>;\n env: Record<string, string | undefined>;\n isDev: boolean;\n isProd: boolean;\n}\n\nexport interface FarmIntegrationConfigDefinition<\n TConfig = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n schema?: FarmIntegrationInputSchema<TConfig>;\n env?: Record<string, string | readonly string[]>;\n defaults?:\n | Partial<TConfig>\n | ((context: FarmIntegrationConfigContext<TSchema>) => MaybePromise<Partial<TConfig>>);\n input?:\n | Partial<TConfig>\n | ((context: FarmIntegrationConfigContext<TSchema>) => MaybePromise<Partial<TConfig>>);\n resolve?(\n context: FarmIntegrationConfigContext<TSchema>,\n ): MaybePromise<TConfig | Partial<TConfig> | undefined>;\n}\n\nexport type FarmIntegrationConfigInput<\n TConfig = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = FarmIntegrationInputSchema<TConfig> | FarmIntegrationConfigDefinition<TConfig, TSchema>;\n\nexport type FarmIntegrationLifecycleLogLevel = \"info\" | \"warn\" | \"error\";\n\nexport interface FarmIntegrationLifecycleLogger {\n info(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n error(message: string, meta?: Record<string, unknown>): void;\n}\n\nexport interface FarmIntegrationLifecycleContext<\n TConfig = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> extends FarmIntegrationConfigContext<TSchema> {\n integration: FarmIntegration<TSchema, TConfig>;\n integrationConfig: TConfig;\n log: FarmIntegrationLifecycleLogger;\n reason?: string;\n cleanup(callback?: () => MaybePromise<void>): Promise<void>;\n}\n\nexport type FarmIntegrationLifecycleHook<\n TConfig = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = (context: FarmIntegrationLifecycleContext<TConfig, TSchema>) => MaybePromise<void>;\n\n/**\n * Small per-call integration metadata. Values received over HTTP are\n * client-controlled and should be validated before authorization decisions.\n */\nexport type FarmIntegrationData = Record<string, unknown>;\n\nexport interface FarmIntegrationHandlerContext<\n TBody = unknown,\n TQuery = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n request: Request;\n requestId: string;\n url: URL;\n pathname: string;\n method: string;\n params: FarmIntegrationRouteParams;\n input: FarmIntegrationRouteInput<TBody, TQuery>;\n args: FarmIntegrationRouteArgs<TSchema>;\n data: FarmIntegrationData;\n integration: {\n category: FarmIntegrationCategory;\n /** @deprecated Use category instead. */\n slot: FarmIntegrationCategory;\n type: string;\n instance: unknown;\n };\n route: {\n kind: \"route\" | \"middleware\";\n path: string;\n methods: readonly string[];\n };\n req: FarmRequestStore;\n /** @deprecated Use `req` instead. */\n requestContext: FarmRequestStore;\n config: FarmPluginContext[\"config\"];\n isDev: boolean;\n isProd: boolean;\n}\n\nexport interface FarmIntegrationRouteHookContext<\n TBody = unknown,\n TQuery = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> extends FarmIntegrationHandlerContext<TBody, TQuery, TSchema> {\n response?: Response;\n}\n\nexport type FarmIntegrationRouteHook<\n TBody = unknown,\n TQuery = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = {\n bivarianceHack(\n request: Request,\n context: FarmIntegrationRouteHookContext<TBody, TQuery, TSchema>,\n ): Promise<Response | void> | Response | void;\n}[\"bivarianceHack\"];\n\nexport interface FarmIntegrationRoute<\n TBody = unknown,\n TQuery = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n path: string;\n method?: FarmIntegrationRouteMethod;\n methods?: readonly FarmIntegrationRouteMethod[];\n middleware?: readonly FarmIntegrationRouteMiddleware<TSchema>[];\n before?: readonly FarmIntegrationRouteHook<TBody, TQuery, TSchema>[];\n after?: readonly FarmIntegrationRouteHook<TBody, TQuery, TSchema>[];\n rawBody?: boolean;\n bodyFormat?: FarmIntegrationAPIBodyFormat;\n body?: FarmIntegrationInputSchema<TBody>;\n query?: FarmIntegrationInputSchema<TQuery>;\n input?: FarmIntegrationRouteInputSchemas<TBody, TQuery>;\n handler(\n request: Request,\n context: FarmIntegrationHandlerContext<TBody, TQuery, TSchema>,\n ): Promise<Response> | Response;\n}\n\nexport interface FarmTypedIntegrationRoute<\n TPath extends string = string,\n TBody = never,\n TQuery = never,\n TResponse = unknown,\n TServer extends boolean = false,\n TMethod extends FarmIntegrationAPIMethod = FarmIntegrationAPIMethod,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> extends FarmIntegrationRoute<TBody, TQuery, TSchema> {\n path: TPath;\n method: TMethod;\n __operation: FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, TMethod>;\n}\n\nexport interface FarmIntegrationRouteMiddleware<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n handler(\n request: Request,\n context: FarmIntegrationHandlerContext<unknown, unknown, TSchema>,\n ): Promise<Response | void> | Response | void;\n}\n\nexport interface FarmIntegrationMiddleware<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n matcher?: string | string[];\n handler(\n request: Request,\n context: FarmIntegrationHandlerContext<unknown, unknown, TSchema>,\n ): Promise<Response | void> | Response | void;\n}\n\nexport interface FarmIntegrationProviderProps {\n children: ReactNode;\n}\n\nexport interface FarmIntegrationProvider {\n name: string;\n type: string;\n props?: Record<string, unknown>;\n component?: ComponentType<FarmIntegrationProviderProps>;\n}\n\nexport interface FarmIntegrationDocumentNavigation {\n matcher: string | readonly string[];\n}\n\nexport type FarmIntegrationSchemaFieldType =\n | \"id\"\n | \"uuid\"\n | \"string\"\n | \"text\"\n | \"boolean\"\n | \"integer\"\n | \"number\"\n | \"datetime\"\n | \"json\"\n | \"enum\";\n\nexport interface FarmIntegrationSchemaReference {\n model: string;\n field: string;\n relation?: \"belongsTo\" | \"hasOne\" | \"hasMany\";\n onDelete?: \"cascade\" | \"restrict\" | \"setNull\" | \"noAction\";\n enforced?: \"db\" | \"app\" | \"none\";\n}\n\nexport interface FarmIntegrationSchemaField {\n type: FarmIntegrationSchemaFieldType;\n name?: string;\n description?: string;\n required?: boolean;\n nullable?: boolean;\n primaryKey?: boolean;\n unique?: boolean;\n index?: boolean;\n list?: boolean;\n default?: unknown;\n values?: readonly string[];\n reference?: FarmIntegrationSchemaReference;\n meta?: Record<string, unknown>;\n}\n\nexport interface FarmIntegrationSchemaConstraint {\n type: \"unique\" | \"index\";\n fields: readonly string[];\n name?: string;\n meta?: Record<string, unknown>;\n}\n\nexport interface FarmIntegrationSchemaModel {\n name?: string;\n description?: string;\n fields: Record<string, FarmIntegrationSchemaField>;\n constraints?: readonly FarmIntegrationSchemaConstraint[];\n meta?: Record<string, unknown>;\n}\n\nexport interface FarmIntegrationSchemaModelExtension {\n name?: string;\n description?: string;\n fields?: Record<string, FarmIntegrationSchemaField>;\n constraints?: readonly FarmIntegrationSchemaConstraint[];\n meta?: Record<string, unknown>;\n}\n\nexport interface FarmIntegrationSchemaModelOverride {\n name?: string;\n description?: string;\n fields?: Record<string, Partial<FarmIntegrationSchemaField>>;\n constraints?: readonly FarmIntegrationSchemaConstraint[];\n meta?: Record<string, unknown>;\n}\n\nexport interface FarmIntegrationSchema {\n models: Record<string, FarmIntegrationSchemaModel>;\n meta?: Record<string, unknown>;\n extend?: Record<string, FarmIntegrationSchemaModelExtension>;\n override?: Record<string, FarmIntegrationSchemaModelOverride>;\n}\n\nexport function defineIntegrationSchema<TSchema extends FarmIntegrationSchema>(\n schema: TSchema,\n): TSchema {\n return schema;\n}\n\nexport type FarmIntegrationLogPhase =\n | \"registered\"\n | \"validate\"\n | \"setup\"\n | \"ready\"\n | \"dispose\"\n | \"request:start\"\n | \"request:end\"\n | \"request:error\";\n\nexport interface FarmIntegrationLogEvent {\n category: FarmIntegrationCategory;\n /** @deprecated Use category instead. */\n slot: FarmIntegrationCategory;\n type: string;\n phase: FarmIntegrationLogPhase;\n route?: {\n kind: \"route\" | \"middleware\";\n path: string;\n methods: readonly string[];\n };\n requestId?: string;\n request?: Request;\n response?: Response;\n error?: unknown;\n durationMs?: number;\n level?: FarmIntegrationLifecycleLogLevel;\n message?: string;\n meta?: Record<string, unknown>;\n context: Map<string, unknown>;\n}\n\nexport type FarmIntegrationLogger = (event: FarmIntegrationLogEvent) => void | Promise<void>;\n\nexport interface FarmIntegration<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n TConfig = unknown,\n> {\n readonly kind: \"farm-integration\";\n category: FarmIntegrationCategory;\n /** @deprecated Use category instead. */\n slot?: FarmIntegrationCategory;\n type: string;\n instance: unknown;\n /** Set to false when a platform adapter owns this integration's production routes. */\n serverRuntime?: boolean;\n api?: FarmIntegrationAPI;\n schema?: TSchema;\n config?: FarmIntegrationConfigInput<TConfig, TSchema>;\n validate?: FarmIntegrationLifecycleHook<TConfig, TSchema>;\n setup?: FarmIntegrationLifecycleHook<TConfig, TSchema>;\n ready?: FarmIntegrationLifecycleHook<TConfig, TSchema>;\n dispose?: FarmIntegrationLifecycleHook<TConfig, TSchema>;\n log?: FarmIntegrationLogger;\n routes?: readonly FarmIntegrationRoute<any, any, TSchema>[];\n endpoints?: FarmIntegrationEndpoints<TSchema>;\n middleware?: readonly FarmIntegrationMiddleware<TSchema>[];\n providers?: readonly FarmIntegrationProvider[];\n documentNavigations?: readonly FarmIntegrationDocumentNavigation[];\n plugins?: readonly FarmPlugin[];\n}\n\nexport type FarmIntegrationsUserConfig = Record<string, FarmIntegration<any, any> | undefined>;\n\nconst FARM_INTEGRATION_PLUGIN_SERVER_RUNTIME = Symbol.for(\n \"@farm.js/core/integration-plugin-server-runtime\",\n);\n\n/** @internal Identifies lifecycle plugins owned by platform-managed integrations. */\nexport function getFarmIntegrationPluginServerRuntime(plugin: FarmPlugin): boolean | undefined {\n const value = (plugin as FarmPlugin & Record<symbol, unknown>)[\n FARM_INTEGRATION_PLUGIN_SERVER_RUNTIME\n ];\n return typeof value === \"boolean\" ? value : undefined;\n}\n\ntype IntegrationRouteBuilderOptions<\n TBody,\n TQuery,\n TServer extends boolean,\n TSchema extends FarmIntegrationSchema | undefined,\n> = {\n middleware?: readonly FarmIntegrationRouteMiddleware<TSchema>[];\n before?: readonly FarmIntegrationRouteHook<TBody, TQuery, TSchema>[];\n after?: readonly FarmIntegrationRouteHook<TBody, TQuery, TSchema>[];\n rawBody?: boolean;\n headers?: Record<string, string>;\n credentials?: RequestCredentials;\n bodyFormat?: FarmIntegrationAPIBodyFormat;\n responseFormat?: FarmIntegrationAPIResponseFormat;\n isServer?: TServer;\n body?: FarmIntegrationInputSchema<TBody>;\n query?: FarmIntegrationInputSchema<TQuery>;\n input?: FarmIntegrationRouteInputSchemas<TBody, TQuery>;\n handler(\n request: Request,\n context: FarmIntegrationHandlerContext<TBody, TQuery, TSchema>,\n ): Promise<Response> | Response;\n};\n\nfunction defineTypedIntegrationRoute<\n TPath extends string,\n TBody,\n TQuery,\n TResponse,\n TServer extends boolean,\n TMethod extends FarmIntegrationAPIMethod,\n TSchema extends FarmIntegrationSchema | undefined,\n>(\n method: TMethod,\n path: TPath,\n input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>,\n): FarmTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, TMethod, TSchema> {\n return {\n path,\n method,\n middleware: input.middleware,\n before: input.before,\n after: input.after,\n rawBody: input.rawBody,\n bodyFormat: input.bodyFormat,\n input: normalizeIntegrationRouteInputSchemas(input),\n handler: input.handler,\n __operation: defineIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, TMethod>({\n path,\n method,\n bodyFormat: input.bodyFormat,\n responseFormat: input.responseFormat,\n headers: input.headers,\n credentials: input.credentials,\n isServer: input.isServer,\n }),\n };\n}\n\nexport interface FarmIntegrationRouteFactory<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n get<TPath extends string, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n path: TPath,\n input: Omit<IntegrationRouteBuilderOptions<never, TQuery, TServer, TSchema>, \"bodyFormat\">,\n ): FarmTypedIntegrationRoute<TPath, never, TQuery, TResponse, TServer, \"GET\", TSchema>;\n post<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>,\n ): FarmTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, \"POST\", TSchema>;\n put<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>,\n ): FarmTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, \"PUT\", TSchema>;\n patch<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>,\n ): FarmTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, \"PATCH\", TSchema>;\n delete<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>,\n ): FarmTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, \"DELETE\", TSchema>;\n options<\n TPath extends string,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: Omit<IntegrationRouteBuilderOptions<never, TQuery, TServer, TSchema>, \"bodyFormat\">,\n ): FarmTypedIntegrationRoute<TPath, never, TQuery, TResponse, TServer, \"OPTIONS\", TSchema>;\n head<TPath extends string, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n path: TPath,\n input: Omit<IntegrationRouteBuilderOptions<never, TQuery, TServer, TSchema>, \"bodyFormat\">,\n ): FarmTypedIntegrationRoute<TPath, never, TQuery, TResponse, TServer, \"HEAD\", TSchema>;\n}\n\nexport interface FarmIntegrationRoutesFactoryContext<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n route: FarmIntegrationRouteFactory<TSchema>;\n integrationRoute: FarmIntegrationRouteFactory<TSchema>;\n}\n\nexport type FarmIntegrationRoutesFactory<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = (\n context: FarmIntegrationRoutesFactoryContext<TSchema>,\n) => readonly FarmIntegrationRoute<any, any, TSchema>[];\n\nexport type FarmIntegrationEndpointValue<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> =\n | FarmIntegrationRoute<any, any, TSchema>\n | readonly FarmIntegrationEndpointValue<TSchema>[]\n | {\n readonly [key: string]: FarmIntegrationEndpointValue<TSchema> | undefined;\n };\n\nexport type FarmIntegrationEndpoints<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = {\n readonly [key: string]: FarmIntegrationEndpointValue<TSchema> | undefined;\n};\n\nexport interface FarmIntegrationEndpointsFactoryContext<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> extends FarmIntegrationRoutesFactoryContext<TSchema> {\n endpoint: FarmIntegrationRouteFactory<TSchema>;\n}\n\nexport type FarmIntegrationEndpointsFactory<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = (context: FarmIntegrationEndpointsFactoryContext<TSchema>) => FarmIntegrationEndpoints<TSchema>;\n\nfunction createIntegrationRouteFactory<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n>(): FarmIntegrationRouteFactory<TSchema> {\n return {\n get<TPath extends string, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n path: TPath,\n input: Omit<IntegrationRouteBuilderOptions<never, TQuery, TServer, TSchema>, \"bodyFormat\">,\n ) {\n return defineTypedIntegrationRoute<TPath, never, TQuery, TResponse, TServer, \"GET\", TSchema>(\n \"GET\",\n path,\n input,\n );\n },\n post<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(path: TPath, input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>) {\n return defineTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, \"POST\", TSchema>(\n \"POST\",\n path,\n {\n bodyFormat: \"json\",\n ...input,\n },\n );\n },\n put<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(path: TPath, input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>) {\n return defineTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, \"PUT\", TSchema>(\n \"PUT\",\n path,\n {\n bodyFormat: \"json\",\n ...input,\n },\n );\n },\n patch<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(path: TPath, input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>) {\n return defineTypedIntegrationRoute<\n TPath,\n TBody,\n TQuery,\n TResponse,\n TServer,\n \"PATCH\",\n TSchema\n >(\"PATCH\", path, {\n bodyFormat: \"json\",\n ...input,\n });\n },\n delete<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(path: TPath, input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>) {\n return defineTypedIntegrationRoute<\n TPath,\n TBody,\n TQuery,\n TResponse,\n TServer,\n \"DELETE\",\n TSchema\n >(\"DELETE\", path, {\n bodyFormat: \"json\",\n ...input,\n });\n },\n options<\n TPath extends string,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: Omit<IntegrationRouteBuilderOptions<never, TQuery, TServer, TSchema>, \"bodyFormat\">,\n ) {\n return defineTypedIntegrationRoute<\n TPath,\n never,\n TQuery,\n TResponse,\n TServer,\n \"OPTIONS\",\n TSchema\n >(\"OPTIONS\", path, input);\n },\n head<\n TPath extends string,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: Omit<IntegrationRouteBuilderOptions<never, TQuery, TServer, TSchema>, \"bodyFormat\">,\n ) {\n return defineTypedIntegrationRoute<TPath, never, TQuery, TResponse, TServer, \"HEAD\", TSchema>(\n \"HEAD\",\n path,\n input,\n );\n },\n };\n}\n\nexport function createIntegrationRoute<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n>(_schema?: TSchema): FarmIntegrationRouteFactory<TSchema> {\n return createIntegrationRouteFactory<TSchema>();\n}\n\nexport const integrationRoute = createIntegrationRouteFactory<undefined>();\n\ntype RegisteredIntegrationRuntime = {\n integration: FarmIntegration;\n config: FarmPluginContext[\"config\"];\n isDev: boolean;\n isProd: boolean;\n};\n\nconst INTEGRATION_RUNTIME_REGISTRY_KEY = Symbol.for(\"farm.integrationRuntimeRegistry\");\nconst INTEGRATION_REQUEST_DISPATCHER_KEY = Symbol.for(\"farm.integrationRequestDispatcher\");\n\ntype IntegrationRequestDispatcher = (\n runtime: RegisteredIntegrationRuntime,\n request: Request,\n options?: { currentRequest?: Request },\n) => Promise<Response | null>;\n\ntype GlobalWithIntegrationRuntimeRegistry = typeof globalThis & {\n [INTEGRATION_RUNTIME_REGISTRY_KEY]?: Map<string, RegisteredIntegrationRuntime>;\n [INTEGRATION_REQUEST_DISPATCHER_KEY]?: IntegrationRequestDispatcher;\n};\n\nfunction getIntegrationRuntimeRegistry() {\n const globalState = globalThis as GlobalWithIntegrationRuntimeRegistry;\n if (!globalState[INTEGRATION_RUNTIME_REGISTRY_KEY]) {\n globalState[INTEGRATION_RUNTIME_REGISTRY_KEY] = new Map<string, RegisteredIntegrationRuntime>();\n }\n\n return globalState[INTEGRATION_RUNTIME_REGISTRY_KEY]!;\n}\n\ntype FarmIntegrationRoutesInput<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = readonly FarmIntegrationRoute<any, any, TSchema>[] | FarmIntegrationRoutesFactory<TSchema>;\n\ntype FarmIntegrationEndpointsInput<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = FarmIntegrationEndpoints<TSchema> | FarmIntegrationEndpointsFactory<TSchema>;\n\ntype FarmIntegrationInput<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n TConfig = unknown,\n> = Omit<\n FarmIntegration<TSchema, TConfig>,\n \"kind\" | \"category\" | \"slot\" | \"config\" | \"routes\" | \"endpoints\"\n> & {\n config?: FarmIntegrationConfigInput<TConfig, TSchema>;\n routes?: FarmIntegrationRoutesInput<TSchema>;\n endpoints?: FarmIntegrationEndpointsInput<TSchema>;\n} & (\n | {\n category: FarmIntegrationCategory;\n slot?: FarmIntegrationCategory;\n }\n | {\n category?: FarmIntegrationCategory;\n slot: FarmIntegrationCategory;\n }\n );\n\ntype FarmIntegrationCategoryInput =\n | {\n category: FarmIntegrationCategory;\n slot?: FarmIntegrationCategory;\n }\n | {\n category?: FarmIntegrationCategory;\n slot: FarmIntegrationCategory;\n };\n\ntype FarmIntegrationShapeForInference = FarmIntegrationCategoryInput & {\n api?: FarmIntegrationAPI;\n schema?: FarmIntegrationSchema;\n config?: unknown;\n routes?: unknown;\n endpoints?: unknown;\n};\n\ntype ExtractIntegrationSchema<TIntegration> = TIntegration extends {\n schema: infer TSchema extends FarmIntegrationSchema;\n}\n ? TSchema\n : undefined;\n\ntype ResolveIntegrationRoutesInput<TRoutes, TSchema extends FarmIntegrationSchema | undefined> =\n TRoutes extends FarmIntegrationRoutesFactory<TSchema> ? ReturnType<TRoutes> : TRoutes;\n\ntype ResolveIntegrationEndpointsInput<\n TEndpoints,\n TSchema extends FarmIntegrationSchema | undefined,\n> =\n TEndpoints extends FarmIntegrationEndpointsFactory<TSchema> ? ReturnType<TEndpoints> : TEndpoints;\n\ntype ExtractIntegrationRoutesFromRoutesInput<\n TRoutes,\n TSchema extends FarmIntegrationSchema | undefined,\n> =\n ResolveIntegrationRoutesInput<TRoutes, TSchema> extends readonly (infer TRoute)[]\n ? TRoute\n : never;\n\ntype ExtractIntegrationRoutesFromEndpointValue<TValue> =\n TValue extends FarmIntegrationRouteOperationCarrier<string, any>\n ? TValue\n : TValue extends readonly (infer TItem)[]\n ? ExtractIntegrationRoutesFromEndpointValue<TItem>\n : TValue extends object\n ? ExtractIntegrationRoutesFromEndpointValue<TValue[keyof TValue]>\n : never;\n\ntype ExtractIntegrationRoutesFromEndpointsInput<\n TEndpoints,\n TSchema extends FarmIntegrationSchema | undefined,\n> = ExtractIntegrationRoutesFromEndpointValue<\n ResolveIntegrationEndpointsInput<TEndpoints, TSchema>\n>;\n\ntype ExtractIntegrationRouteUnion<TIntegration, TSchema extends FarmIntegrationSchema | undefined> =\n | (TIntegration extends { routes: infer TRoutes }\n ? ExtractIntegrationRoutesFromRoutesInput<TRoutes, TSchema>\n : never)\n | (TIntegration extends { endpoints: infer TEndpoints }\n ? ExtractIntegrationRoutesFromEndpointsInput<TEndpoints, TSchema>\n : never);\n\ntype ExtractDefinedIntegrationRoutes<\n TIntegration,\n TSchema extends FarmIntegrationSchema | undefined,\n> = [ExtractIntegrationRouteUnion<TIntegration, TSchema>] extends [never]\n ? undefined\n : readonly ExtractIntegrationRouteUnion<TIntegration, TSchema>[];\n\ntype ExtractDefinedIntegrationEndpoints<\n TIntegration,\n TSchema extends FarmIntegrationSchema | undefined,\n> = TIntegration extends { endpoints: infer TEndpoints }\n ? ResolveIntegrationEndpointsInput<TEndpoints, TSchema>\n : undefined;\n\ntype ExtractIntegrationAPIRoutes<\n TIntegration,\n TSchema extends FarmIntegrationSchema | undefined,\n> = Extract<\n ExtractIntegrationRouteUnion<TIntegration, TSchema>,\n FarmIntegrationRouteOperationCarrier<string, any>\n>;\n\ntype ExtractIntegrationCategory<TIntegration extends FarmIntegrationCategoryInput> =\n TIntegration extends {\n category: infer TCategory extends FarmIntegrationCategory;\n }\n ? TCategory\n : TIntegration extends { slot: infer TSlot extends FarmIntegrationCategory }\n ? TSlot\n : FarmIntegrationCategory;\n\ntype ExtractDerivedIntegrationAPI<\n TIntegration extends FarmIntegrationShapeForInference,\n TSchema extends FarmIntegrationSchema | undefined = ExtractIntegrationSchema<TIntegration>,\n> = TIntegration extends { api: infer TAPI extends FarmIntegrationAPI }\n ? TAPI\n : [ExtractIntegrationAPIRoutes<TIntegration, TSchema>] extends [never]\n ? FarmIntegrationAPI | undefined\n : InferIntegrationAPIFromRoutes<readonly ExtractIntegrationAPIRoutes<TIntegration, TSchema>[]>;\n\nexport type DefinedIntegration<\n TIntegration extends FarmIntegrationShapeForInference,\n TSchema extends FarmIntegrationSchema | undefined = ExtractIntegrationSchema<TIntegration>,\n> = Omit<TIntegration, \"kind\" | \"category\" | \"slot\" | \"api\" | \"routes\" | \"endpoints\"> & {\n readonly kind: \"farm-integration\";\n category: ExtractIntegrationCategory<TIntegration>;\n slot: ExtractIntegrationCategory<TIntegration>;\n routes: ExtractDefinedIntegrationRoutes<TIntegration, TSchema>;\n endpoints: ExtractDefinedIntegrationEndpoints<TIntegration, TSchema>;\n api: ExtractDerivedIntegrationAPI<TIntegration, TSchema>;\n};\n\nfunction isIntegrationEndpointRoute(value: unknown): value is FarmIntegrationRoute {\n return (\n !!value &&\n typeof value === \"object\" &&\n typeof (value as { path?: unknown }).path === \"string\" &&\n typeof (value as { handler?: unknown }).handler === \"function\"\n );\n}\n\nfunction flattenIntegrationEndpoints(\n endpoints: FarmIntegrationEndpointValue | FarmIntegrationEndpoints | undefined,\n): FarmIntegrationRoute[] {\n if (!endpoints) {\n return [];\n }\n\n if (Array.isArray(endpoints)) {\n return endpoints.flatMap((endpoint) => flattenIntegrationEndpoints(endpoint));\n }\n\n if (isIntegrationEndpointRoute(endpoints)) {\n return [endpoints];\n }\n\n if (typeof endpoints === \"object\") {\n return Object.values(endpoints).flatMap((endpoint) => flattenIntegrationEndpoints(endpoint));\n }\n\n return [];\n}\n\nexport function defineIntegration<\n const TSchema extends FarmIntegrationSchema | undefined,\n const TConfig,\n TIntegration extends FarmIntegrationInput<TSchema, TConfig>,\n>(\n integration: TIntegration & FarmIntegrationInput<TSchema, TConfig>,\n): DefinedIntegration<TIntegration, TSchema>;\nexport function defineIntegration<\n const TSchema extends FarmIntegrationSchema | undefined,\n const TConfig,\n TIntegration extends FarmIntegrationInput<TSchema, TConfig>,\n>(\n integration: TIntegration & FarmIntegrationInput<TSchema, TConfig>,\n): DefinedIntegration<TIntegration, TSchema> {\n const category = integration.category ?? integration.slot;\n\n if (!category) {\n throw new Error(\"Integration category is required.\");\n }\n\n if (integration.category && integration.slot && integration.category !== integration.slot) {\n throw new Error(\"Integration category and slot must match when both are provided.\");\n }\n\n const routeFactory = createIntegrationRoute(integration.schema);\n const routes =\n typeof integration.routes === \"function\"\n ? integration.routes({\n route: routeFactory,\n integrationRoute: routeFactory,\n })\n : integration.routes;\n const endpoints =\n typeof integration.endpoints === \"function\"\n ? integration.endpoints({\n endpoint: routeFactory,\n route: routeFactory,\n integrationRoute: routeFactory,\n })\n : integration.endpoints;\n const endpointRoutes = flattenIntegrationEndpoints(endpoints);\n const allRoutes =\n routes?.length || endpointRoutes.length\n ? ([...(routes || []), ...endpointRoutes] as readonly FarmIntegrationRoute[])\n : undefined;\n\n const derivedApi =\n integration.api ||\n (allRoutes?.length\n ? integrationApi.fromRoutes(\n allRoutes as unknown as ReadonlyArray<{\n path: string;\n __operation: FarmIntegrationAPIOperation<any, any, any, any, any>;\n }>,\n )\n : undefined);\n\n return {\n kind: \"farm-integration\",\n ...integration,\n endpoints,\n routes: allRoutes,\n api: derivedApi,\n category,\n slot: category,\n } as unknown as DefinedIntegration<TIntegration, TSchema>;\n}\n\nexport function isFarmIntegration(value: unknown): value is FarmIntegration {\n return (\n !!value && typeof value === \"object\" && (value as FarmIntegration).kind === \"farm-integration\"\n );\n}\n\nexport function resolveIntegrationPlugins(\n integrations: FarmIntegrationsUserConfig | undefined,\n): FarmPlugin[] {\n if (!integrations) {\n return [];\n }\n\n const plugins: FarmPlugin[] = [];\n for (const [key, integration] of Object.entries(integrations)) {\n if (!integration || !isFarmIntegration(integration)) {\n continue;\n }\n\n plugins.push(createIntegrationPlugin(key, integration));\n\n if (integration.plugins?.length) {\n plugins.push(...integration.plugins);\n }\n }\n\n return plugins;\n}\n\nexport function getIntegrationProviders(\n integrations: FarmIntegrationsUserConfig | undefined,\n): Array<Pick<FarmIntegrationProvider, \"name\" | \"type\" | \"props\">> {\n if (!integrations) {\n return [];\n }\n\n const providers: Array<Pick<FarmIntegrationProvider, \"name\" | \"type\" | \"props\">> = [];\n for (const integration of Object.values(integrations)) {\n if (!integration || !isFarmIntegration(integration) || !integration.providers?.length) {\n continue;\n }\n\n for (const provider of integration.providers) {\n providers.push({\n name: provider.name,\n type: provider.type,\n props: provider.props,\n });\n }\n }\n\n return providers;\n}\n\nexport function getIntegrationDocumentNavigationMatchers(\n integrations: FarmIntegrationsUserConfig | undefined,\n): string[] {\n if (!integrations) {\n return [];\n }\n\n const matchers: string[] = [];\n for (const integration of Object.values(integrations)) {\n if (\n !integration ||\n !isFarmIntegration(integration) ||\n !integration.documentNavigations?.length\n ) {\n continue;\n }\n\n for (const navigation of integration.documentNavigations) {\n const items = Array.isArray(navigation.matcher) ? navigation.matcher : [navigation.matcher];\n\n for (const item of items) {\n matchers.push(item);\n }\n }\n }\n\n return matchers;\n}\n\nexport function getIntegrationSchemas(\n integrations: FarmIntegrationsUserConfig | undefined,\n): Record<string, FarmIntegrationSchema> {\n if (!integrations) {\n return {};\n }\n\n const schemaEntries = Object.entries(integrations)\n .map(([key, integration]) => {\n const schema = integration && isFarmIntegration(integration) ? integration.schema : undefined;\n return schema ? ([key, schema] as const) : null;\n })\n .filter((value): value is readonly [string, FarmIntegrationSchema] => value !== null);\n\n return Object.fromEntries(schemaEntries);\n}\n\nexport function getRegisteredIntegrationRuntime(\n key: string,\n): RegisteredIntegrationRuntime | undefined {\n return getIntegrationRuntimeRegistry().get(key);\n}\n\nexport function getRegisteredIntegrations(): Record<string, FarmIntegration> {\n return Object.fromEntries(\n Array.from(getIntegrationRuntimeRegistry().entries()).map(([key, runtime]) => [\n key,\n runtime.integration,\n ]),\n );\n}\n\nexport function getRegisteredIntegrationSchemas(): Record<string, FarmIntegrationSchema> {\n return getIntegrationSchemas(getRegisteredIntegrations());\n}\n\nexport function matchIntegrationRoute(\n integrations: FarmIntegrationsUserConfig | undefined,\n input: {\n pathname: string;\n method?: string;\n },\n): {\n key: string;\n integration: FarmIntegration;\n route: {\n path: string;\n methods: readonly string[];\n };\n params: FarmIntegrationRouteParams;\n} | null {\n if (!integrations) {\n return null;\n }\n\n for (const [key, integration] of Object.entries(integrations)) {\n if (!integration || !isFarmIntegration(integration)) {\n continue;\n }\n\n const routes = normalizeIntegrationRoutes(integration.routes || []);\n\n for (const route of routes) {\n if (!matchesMethod(route.methods, input.method)) {\n continue;\n }\n\n const params = extractPathParams(route.path, input.pathname);\n if (!params) {\n continue;\n }\n\n return {\n key,\n integration,\n route: {\n path: route.path,\n methods: route.methods,\n },\n params,\n };\n }\n }\n\n return null;\n}\n\nexport function matchRegisteredIntegrationRoute(input: { pathname: string; method?: string }): {\n key: string;\n integration: FarmIntegration;\n route: {\n path: string;\n methods: readonly string[];\n };\n params: FarmIntegrationRouteParams;\n} | null {\n return matchIntegrationRoute(getRegisteredIntegrations(), input);\n}\n\nfunction createClientSafeIntegrationAPI(\n api: FarmIntegrationAPI | undefined,\n): FarmIntegrationAPI | undefined {\n if (!api) {\n return undefined;\n }\n\n const entries = Object.entries(api as Record<string, unknown>).map(([key, value]) => {\n if (\n value &&\n typeof value === \"object\" &&\n (value as FarmIntegrationAPIOperation<any, any, any, any, any>).kind ===\n \"farm-integration-api-operation\"\n ) {\n const operation = value as FarmIntegrationAPIOperation<any, any, any, any, any>;\n return [\n key,\n defineIntegrationAPIOperation({\n path: operation.path,\n method: operation.method,\n bodyFormat: operation.bodyFormat,\n responseFormat: operation.responseFormat,\n credentials: operation.credentials,\n isServer: operation.isServer,\n }),\n ];\n }\n\n if (value && typeof value === \"object\") {\n return [key, createClientSafeIntegrationAPI(value as FarmIntegrationAPI)];\n }\n\n return [key, value];\n });\n\n return Object.fromEntries(entries) as FarmIntegrationAPI;\n}\n\nexport function getRegisteredIntegrationAPIManifest(): Record<string, FarmIntegrationAPI> {\n const manifestEntries = Object.entries(getRegisteredIntegrations())\n .map(([key, integration]) => {\n const api = createClientSafeIntegrationAPI(integration.api);\n return api ? ([key, api] as const) : null;\n })\n .filter((value): value is readonly [string, FarmIntegrationAPI] => value !== null);\n\n return Object.fromEntries(manifestEntries);\n}\n\ntype IntegrationLifecycleCleanup = () => MaybePromise<void>;\n\nfunction getIntegrationRuntimeEnv(): Record<string, string | undefined> {\n return typeof process !== \"undefined\" ? process.env : {};\n}\n\nfunction isIntegrationConfigDefinition(\n value: unknown,\n): value is FarmIntegrationConfigDefinition<unknown> {\n return (\n !!value &&\n typeof value === \"object\" &&\n (\"schema\" in value ||\n \"env\" in value ||\n \"defaults\" in value ||\n \"input\" in value ||\n \"resolve\" in value)\n );\n}\n\nfunction mergeIntegrationConfigValue(current: unknown, next: unknown): unknown {\n if (next === undefined) {\n return current;\n }\n\n if (isPlainIntegrationConfigObject(current) && isPlainIntegrationConfigObject(next)) {\n return {\n ...current,\n ...next,\n };\n }\n\n return next;\n}\n\nfunction isPlainIntegrationConfigObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nasync function resolveIntegrationConfigPart<TValue>(\n value: TValue | ((context: FarmIntegrationConfigContext) => MaybePromise<TValue>) | undefined,\n context: FarmIntegrationConfigContext,\n): Promise<TValue | undefined> {\n if (typeof value === \"function\") {\n return (value as (context: FarmIntegrationConfigContext) => MaybePromise<TValue>)(context);\n }\n\n return value;\n}\n\nfunction resolveIntegrationEnvConfig(\n env: Record<string, string | readonly string[]> | undefined,\n): Record<string, string> | undefined {\n if (!env) {\n return undefined;\n }\n\n const runtimeEnv = getIntegrationRuntimeEnv();\n const config: Record<string, string> = {};\n\n for (const [key, names] of Object.entries(env)) {\n const envNames = Array.isArray(names) ? names : [names];\n const value = envNames.map((name) => runtimeEnv[name]).find((entry) => entry !== undefined);\n if (value !== undefined) {\n config[key] = value;\n }\n }\n\n return config;\n}\n\nasync function parseIntegrationConfigSchema<TConfig>(\n integration: FarmIntegration<any, any>,\n schema: FarmIntegrationInputSchema<TConfig>,\n value: unknown,\n): Promise<TConfig> {\n const parser = schema.safeParseAsync || schema.safeParse;\n if (parser) {\n const result = await parser.call(schema, value);\n if (result.success) {\n return result.data;\n }\n\n throw createIntegrationConfigValidationError(integration, result.error);\n }\n\n if (schema[\"~standard\"]?.validate) {\n const result = await schema[\"~standard\"].validate(value);\n if (\"value\" in result) {\n return result.value;\n }\n\n throw createIntegrationConfigValidationError(integration, {\n issues: result.issues,\n });\n }\n\n if (schema.parse) {\n try {\n return await schema.parse(value);\n } catch (error) {\n throw createIntegrationConfigValidationError(\n integration,\n normalizeIntegrationValidationError(error),\n );\n }\n }\n\n throw new Error(\n `Integration \"${integration.type}\" config schema must expose safeParse, safeParseAsync, parse, or ~standard.validate.`,\n );\n}\n\nfunction createIntegrationConfigValidationError(\n integration: FarmIntegration<any, any>,\n error: FarmIntegrationValidationErrorLike,\n) {\n const issues =\n Array.isArray(error.issues) && error.issues.length > 0\n ? error.issues\n .map((issue) => {\n const normalizedPath = normalizeIntegrationValidationPath(issue.path);\n const path = normalizedPath.length ? `${normalizedPath.join(\".\")}: ` : \"\";\n return `${path}${issue.message || \"Invalid config\"}`;\n })\n .join(\"; \")\n : error.message || \"Invalid config\";\n\n return new Error(`Integration \"${integration.type}\" config validation failed: ${issues}`);\n}\n\nasync function resolveIntegrationConfig<TConfig>(\n integration: FarmIntegration<any, TConfig>,\n context: FarmIntegrationConfigContext,\n): Promise<TConfig> {\n const config = integration.config;\n if (!config) {\n return undefined as TConfig;\n }\n\n if (!isIntegrationConfigDefinition(config)) {\n return parseIntegrationConfigSchema(integration, config, {});\n }\n\n let value: unknown = {};\n value = mergeIntegrationConfigValue(\n value,\n await resolveIntegrationConfigPart(config.defaults, context),\n );\n value = mergeIntegrationConfigValue(value, resolveIntegrationEnvConfig(config.env));\n value = mergeIntegrationConfigValue(\n value,\n await resolveIntegrationConfigPart(config.input, context),\n );\n value = mergeIntegrationConfigValue(value, await config.resolve?.(context));\n\n return config.schema\n ? parseIntegrationConfigSchema(integration, config.schema, value)\n : (value as TConfig);\n}\n\nfunction createIntegrationLifecycleLogger(\n integration: FarmIntegration<any, any>,\n phase: FarmIntegrationLogPhase,\n): FarmIntegrationLifecycleLogger {\n const write = (\n level: FarmIntegrationLifecycleLogLevel,\n message: string,\n meta?: Record<string, unknown>,\n ) => {\n if (!integration.log) {\n return;\n }\n\n void Promise.resolve(\n integration.log({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase,\n level,\n message,\n meta,\n context: new Map(),\n }),\n ).catch(() => {});\n };\n\n return {\n info(message, meta) {\n write(\"info\", message, meta);\n },\n warn(message, meta) {\n write(\"warn\", message, meta);\n },\n error(message, meta) {\n write(\"error\", message, meta);\n },\n };\n}\n\nconst INTEGRATION_DATA_HEADER = \"x-farm-integration-data\";\nconst INTEGRATION_DATA_HEADER_MAX_LENGTH = 16 * 1024;\nconst BLOCKED_INTEGRATION_DATA_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nfunction isFarmIntegrationData(value: unknown): value is FarmIntegrationData {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isPlainIntegrationDataObject(value: unknown): value is Record<string, unknown> {\n if (!isFarmIntegrationData(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction sanitizeIntegrationDataValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => sanitizeIntegrationDataValue(item));\n }\n\n if (!isPlainIntegrationDataObject(value)) {\n return value;\n }\n\n const sanitized: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n if (BLOCKED_INTEGRATION_DATA_KEYS.has(key)) {\n continue;\n }\n\n sanitized[key] = sanitizeIntegrationDataValue(item);\n }\n\n return sanitized;\n}\n\nfunction normalizeIntegrationData(value: FarmIntegrationData | undefined): FarmIntegrationData {\n if (!isFarmIntegrationData(value)) {\n return {};\n }\n\n const sanitized = sanitizeIntegrationDataValue(value);\n return isFarmIntegrationData(sanitized) ? sanitized : {};\n}\n\nfunction getIntegrationDataHeaderByteLength(value: string): number {\n return new TextEncoder().encode(value).byteLength;\n}\n\nfunction parseIntegrationDataHeader(request: Request): FarmIntegrationData {\n const raw = request.headers.get(INTEGRATION_DATA_HEADER);\n if (!raw) {\n return {};\n }\n\n if (getIntegrationDataHeaderByteLength(raw) > INTEGRATION_DATA_HEADER_MAX_LENGTH) {\n return {};\n }\n\n try {\n const value = JSON.parse(raw);\n return normalizeIntegrationData(value);\n } catch {\n return {};\n }\n}\n\nfunction resolveIntegrationData(request: Request, data?: FarmIntegrationData): FarmIntegrationData {\n return {\n ...parseIntegrationDataHeader(request),\n ...normalizeIntegrationData(data),\n };\n}\n\nfunction createIntegrationPlugin(integrationKey: string, integration: FarmIntegration): FarmPlugin {\n const routes = normalizeIntegrationRoutes(integration.routes || []);\n const middleware = [...(integration.middleware || [])];\n const cleanupCallbacks: IntegrationLifecycleCleanup[] = [];\n let integrationConfigPromise: Promise<unknown> | undefined;\n\n const runCleanup = async () => {\n const callbacks = cleanupCallbacks.splice(0).reverse();\n for (const callback of callbacks) {\n await callback();\n }\n };\n\n const createLifecycleContext = async (\n context: FarmPluginContext,\n phase: FarmIntegrationLogPhase,\n options: { reason?: string } = {},\n ): Promise<FarmIntegrationLifecycleContext> => {\n const args = createIntegrationRouteArgs({\n integration,\n config: context.config,\n });\n const configContext: FarmIntegrationConfigContext = {\n key: integrationKey,\n integration,\n appConfig: context.config,\n config: context.config,\n args,\n env: getIntegrationRuntimeEnv(),\n isDev: context.isDev,\n isProd: context.isProd,\n };\n integrationConfigPromise ??= resolveIntegrationConfig(integration, configContext);\n\n return {\n ...configContext,\n integrationConfig: await integrationConfigPromise,\n log: createIntegrationLifecycleLogger(integration, phase),\n reason: options.reason,\n async cleanup(callback) {\n if (callback) {\n cleanupCallbacks.push(callback);\n return;\n }\n\n await runCleanup();\n },\n };\n };\n\n const plugin: FarmPlugin = {\n name: `farm:integration:${integration.category}:${integration.type}`,\n enforce: \"pre\",\n\n async init(context) {\n getIntegrationRuntimeRegistry().set(integrationKey, {\n integration,\n config: context.config,\n isDev: context.isDev,\n isProd: context.isProd,\n });\n\n await createLifecycleContext(context, \"validate\");\n\n if (integration.validate) {\n await integration.validate(await createLifecycleContext(context, \"validate\"));\n }\n\n if (integration.setup) {\n await integration.setup(await createLifecycleContext(context, \"setup\"));\n }\n\n if (!integration.log) {\n return;\n }\n\n for (const route of routes) {\n await integration.log({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"registered\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n context: new Map(),\n });\n }\n\n for (const entry of middleware) {\n await integration.log({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"registered\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n context: new Map(),\n });\n }\n },\n\n async ready(context) {\n if (integration.ready) {\n await integration.ready(await createLifecycleContext(context, \"ready\"));\n }\n },\n\n async shutdown(payload, context) {\n try {\n if (integration.dispose) {\n await integration.dispose(\n await createLifecycleContext(context, \"dispose\", {\n reason: payload.reason,\n }),\n );\n }\n } finally {\n await runCleanup();\n }\n },\n\n async beforeRequest(req, res, context) {\n const fullUrl = `http://${req.headers.host || \"localhost\"}${req.url || \"/\"}`;\n const url = new URL(fullUrl);\n const pathname = url.pathname;\n const requestId = getRequestId(req);\n let bodyLoaded = false;\n let requestBody: Buffer | undefined;\n\n const getRequestBody = async () => {\n if (!bodyLoaded) {\n bodyLoaded = true;\n if (req.method && req.method !== \"GET\" && req.method !== \"HEAD\") {\n requestBody = await readRequestBody(req);\n }\n }\n\n return requestBody;\n };\n\n const createHandlerRequest = async () => {\n return createWebRequest(req, fullUrl, await getRequestBody());\n };\n\n for (const entry of middleware) {\n const params = resolveMatcherParams(entry.matcher, pathname);\n if (!params) {\n continue;\n }\n\n const request = await createHandlerRequest();\n const handlerContext = createIntegrationHandlerContext({\n integration,\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n rawRequest: req,\n params,\n pathname,\n requestId,\n pluginContext: context,\n });\n const startedAt = Date.now();\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:start\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n requestId,\n context: handlerContext.req.snapshot(),\n });\n\n try {\n const response = await entry.handler(request, handlerContext);\n if (response) {\n await sendWebResponse(res, response);\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return;\n }\n\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n } catch (error) {\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:error\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n requestId,\n durationMs: Date.now() - startedAt,\n error,\n context: handlerContext.req.snapshot(),\n });\n throw error;\n }\n }\n\n for (const route of routes) {\n const params = matchesMethod(route.methods, req.method)\n ? extractPathParams(route.path, pathname)\n : null;\n if (!params) {\n continue;\n }\n\n const request = await createHandlerRequest();\n const handlerContext = createIntegrationHandlerContext({\n integration,\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n rawRequest: req,\n params,\n pathname,\n requestId,\n pluginContext: context,\n });\n const startedAt = Date.now();\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:start\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n requestId,\n context: handlerContext.req.snapshot(),\n });\n\n try {\n const validation = await validateIntegrationRouteInput(route, request, url);\n if (!validation.success) {\n await sendWebResponse(res, validation.response);\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response: validation.response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return;\n }\n handlerContext.input = validation.input;\n\n for (const middlewareEntry of route.middleware || []) {\n const middlewareResponse = await middlewareEntry.handler(request, handlerContext);\n if (middlewareResponse) {\n await sendWebResponse(res, middlewareResponse);\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response: middlewareResponse,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return;\n }\n }\n\n const beforeResponse = await runIntegrationRouteBeforeHooks(\n route,\n request,\n handlerContext,\n );\n if (beforeResponse) {\n const response = await runIntegrationRouteAfterHooks(\n route,\n request,\n handlerContext,\n beforeResponse,\n );\n await sendWebResponse(res, response);\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return;\n }\n\n const handlerResponse = await route.handler(request, handlerContext);\n const response = await runIntegrationRouteAfterHooks(\n route,\n request,\n handlerContext,\n handlerResponse,\n );\n await sendWebResponse(res, response);\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return;\n } catch (error) {\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:error\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n requestId,\n durationMs: Date.now() - startedAt,\n error,\n context: handlerContext.req.snapshot(),\n });\n throw error;\n }\n }\n },\n };\n\n Object.defineProperty(plugin, FARM_INTEGRATION_PLUGIN_SERVER_RUNTIME, {\n value: integration.serverRuntime !== false,\n });\n\n return plugin;\n}\n\nfunction createIntegrationHandlerContext(input: {\n integration: FarmIntegration;\n route: FarmIntegrationHandlerContext[\"route\"];\n request: Request;\n rawRequest: FarmRequest;\n params: FarmIntegrationRouteParams;\n pathname: string;\n requestId: string;\n pluginContext: FarmPluginContext;\n}): FarmIntegrationHandlerContext {\n const req = createIntegrationRequestContextStore(\n input.rawRequest,\n input.request,\n input.pluginContext,\n );\n\n return {\n request: input.request,\n requestId: input.requestId,\n url: new URL(input.request.url),\n pathname: input.pathname,\n method: input.request.method,\n params: input.params,\n input: {},\n args: createIntegrationRouteArgs({\n integration: input.integration,\n config: input.pluginContext.config,\n }),\n data: resolveIntegrationData(input.request),\n integration: {\n category: input.integration.category,\n slot: input.integration.category,\n type: input.integration.type,\n instance: input.integration.instance,\n },\n route: input.route,\n req,\n requestContext: req,\n config: input.pluginContext.config,\n isDev: input.pluginContext.isDev,\n isProd: input.pluginContext.isProd,\n };\n}\n\ntype NormalizedIntegrationRoute = Omit<FarmIntegrationRoute, \"method\" | \"methods\"> & {\n methods: readonly string[];\n __operation?: FarmIntegrationAPIOperation<any, any, any, any, any>;\n};\n\nfunction normalizeIntegrationRoutes(\n routes: readonly FarmIntegrationRoute[],\n): NormalizedIntegrationRoute[] {\n return routes.map((route) => ({\n ...route,\n methods: normalizeIntegrationRouteMethods(route),\n input: normalizeIntegrationRouteInputSchemas(route),\n }));\n}\n\nfunction normalizeIntegrationRouteMethods(route: Pick<FarmIntegrationRoute, \"method\" | \"methods\">) {\n const input =\n route.methods && route.methods.length > 0\n ? [...route.methods]\n : route.method\n ? [route.method]\n : [\"ALL\"];\n\n return input.map((method) => String(method).toUpperCase());\n}\n\nfunction normalizeIntegrationRouteInputSchemas<TBody, TQuery>(\n route: Pick<FarmIntegrationRoute<TBody, TQuery>, \"body\" | \"query\" | \"input\">,\n): FarmIntegrationRouteInputSchemas<TBody, TQuery> | undefined {\n const input: FarmIntegrationRouteInputSchemas<TBody, TQuery> = {\n ...route.input,\n };\n\n if (route.body) {\n input.body = route.body;\n }\n\n if (route.query) {\n input.query = route.query;\n }\n\n return input.body || input.query ? input : undefined;\n}\n\ntype IntegrationRouteInputValidationResult =\n | {\n success: true;\n input: FarmIntegrationRouteInput;\n }\n | {\n success: false;\n response: Response;\n };\n\nasync function validateIntegrationRouteInput(\n route: NormalizedIntegrationRoute,\n request: Request,\n url: URL,\n): Promise<IntegrationRouteInputValidationResult> {\n const schemas = route.input;\n if (!schemas?.body && !schemas?.query) {\n return {\n success: true,\n input: {},\n };\n }\n\n const input: FarmIntegrationRouteInput = {};\n const issues: FarmIntegrationValidationIssue[] = [];\n\n if (schemas.query) {\n const queryResult = await parseIntegrationInputSchema(\n \"query\",\n schemas.query,\n createQueryInput(url.searchParams),\n );\n if (queryResult.success) {\n input.query = queryResult.data;\n } else {\n issues.push(...queryResult.issues);\n }\n }\n\n if (schemas.body) {\n const bodyInput = await readIntegrationValidationBody(\n request,\n getIntegrationRouteBodyFormat(route),\n );\n\n if (bodyInput.success) {\n const bodyResult = await parseIntegrationInputSchema(\"body\", schemas.body, bodyInput.data);\n if (bodyResult.success) {\n input.body = bodyResult.data;\n } else {\n issues.push(...bodyResult.issues);\n }\n } else {\n issues.push(bodyInput.issue);\n }\n }\n\n if (issues.length > 0) {\n return {\n success: false,\n response: createIntegrationValidationResponse(issues),\n };\n }\n\n return {\n success: true,\n input,\n };\n}\n\nasync function parseIntegrationInputSchema<TValue>(\n source: FarmIntegrationRouteInputSource,\n schema: FarmIntegrationInputSchema<TValue>,\n value: unknown,\n): Promise<\n | {\n success: true;\n data: TValue;\n }\n | {\n success: false;\n issues: FarmIntegrationValidationIssue[];\n }\n> {\n const parser = schema.safeParseAsync || schema.safeParse;\n if (parser) {\n const result = await parser.call(schema, value);\n if (result.success) {\n return {\n success: true,\n data: result.data,\n };\n }\n\n return {\n success: false,\n issues: normalizeIntegrationValidationIssues(source, result.error),\n };\n }\n\n if (schema[\"~standard\"]?.validate) {\n const result = await schema[\"~standard\"].validate(value);\n if (\"value\" in result) {\n return {\n success: true,\n data: result.value,\n };\n }\n\n return {\n success: false,\n issues: normalizeIntegrationValidationIssues(source, {\n issues: result.issues,\n }),\n };\n }\n\n if (schema.parse) {\n try {\n return {\n success: true,\n data: await schema.parse(value),\n };\n } catch (error) {\n return {\n success: false,\n issues: normalizeIntegrationValidationIssues(\n source,\n normalizeIntegrationValidationError(error),\n ),\n };\n }\n }\n\n return {\n success: false,\n issues: [\n {\n source,\n message:\n \"Input schema must expose safeParse, safeParseAsync, parse, or ~standard.validate.\",\n },\n ],\n };\n}\n\nfunction createIntegrationValidationResponse(issues: readonly FarmIntegrationValidationIssue[]) {\n return Response.json(\n {\n error: \"Integration route input validation failed\",\n issues,\n },\n {\n status: 400,\n },\n );\n}\n\nfunction normalizeIntegrationValidationIssues(\n source: FarmIntegrationRouteInputSource,\n error: FarmIntegrationValidationErrorLike,\n): FarmIntegrationValidationIssue[] {\n if (Array.isArray(error.issues) && error.issues.length > 0) {\n return error.issues.map((issue) => ({\n source,\n path: normalizeIntegrationValidationPath(issue.path),\n code: issue.code,\n message: issue.message || \"Invalid input\",\n }));\n }\n\n return [\n {\n source,\n path: [],\n message: error.message || \"Invalid input\",\n },\n ];\n}\n\nfunction normalizeIntegrationValidationPath(\n path: readonly FarmIntegrationValidationPathSegment[] | undefined,\n): (string | number)[] {\n return (path || []).map((segment) => {\n const key =\n typeof segment === \"object\" && segment !== null && \"key\" in segment ? segment.key : segment;\n return typeof key === \"symbol\" ? key.description || key.toString() : key;\n });\n}\n\nfunction normalizeIntegrationValidationError(error: unknown): FarmIntegrationValidationErrorLike {\n if (error && typeof error === \"object\") {\n return error as FarmIntegrationValidationErrorLike;\n }\n\n return {\n message: error instanceof Error ? error.message : String(error || \"Invalid input\"),\n };\n}\n\nasync function readIntegrationValidationBody(\n request: Request,\n format: FarmIntegrationAPIBodyFormat,\n): Promise<\n | {\n success: true;\n data: unknown;\n }\n | {\n success: false;\n issue: FarmIntegrationValidationIssue;\n }\n> {\n if (request.method === \"GET\" || request.method === \"HEAD\" || format === \"none\") {\n return {\n success: true,\n data: undefined,\n };\n }\n\n try {\n if (format === \"form\") {\n return {\n success: true,\n data: createFormInput(await request.clone().formData()),\n };\n }\n\n const text = await request.clone().text();\n if (text.trim().length === 0) {\n return {\n success: true,\n data: undefined,\n };\n }\n\n return {\n success: true,\n data: JSON.parse(text),\n };\n } catch (error) {\n return {\n success: false,\n issue: {\n source: \"body\",\n path: [],\n message:\n format === \"json\"\n ? \"Expected a valid JSON request body.\"\n : error instanceof Error && error.message\n ? error.message\n : \"Could not parse request body.\",\n },\n };\n }\n}\n\nfunction getIntegrationRouteBodyFormat(route: NormalizedIntegrationRoute) {\n return route.bodyFormat || route.__operation?.bodyFormat || \"json\";\n}\n\nfunction createIntegrationRouteArgs(input: {\n integration: FarmIntegration;\n config: FarmPluginContext[\"config\"];\n}): FarmIntegrationRouteArgs {\n let clientPromise: Promise<unknown | undefined> | undefined;\n let ormPromise: Promise<unknown> | undefined;\n\n const getClient = () => {\n clientPromise ??= import(\"./storage\").then(({ resolveStorageRuntimeClient }) =>\n resolveStorageRuntimeClient(input.config.storage),\n );\n return clientPromise;\n };\n\n const getOrm = () => {\n if (!input.integration.schema) {\n throw new Error(\n `Integration \"${input.integration.type}\" does not define a schema for ctx.args.db.`,\n );\n }\n\n ormPromise ??= import(\"./integration-orm\").then(({ createIntegrationOrm }) =>\n createIntegrationOrm({\n schema: input.integration.schema!,\n config: input.config,\n }),\n );\n return ormPromise;\n };\n\n return {\n db: createLazyIntegrationOrmClient(getOrm) as never,\n getDb: getOrm as never,\n storage: {\n getClient,\n getOrm: getOrm as never,\n },\n };\n}\n\nfunction createLazyIntegrationOrmClient(resolveOrm: () => Promise<unknown>) {\n const modelProxyCache = new Map<PropertyKey, unknown>();\n\n return new Proxy(\n {},\n {\n get(_target, prop) {\n if (prop === \"then\") {\n return undefined;\n }\n\n if (prop === \"transaction\" || prop === \"batch\") {\n return async (...args: unknown[]) => {\n const orm = (await resolveOrm()) as Record<PropertyKey, unknown>;\n const member = orm[prop];\n if (typeof member !== \"function\") {\n throw new Error(`Integration ORM does not expose \"${String(prop)}\".`);\n }\n return member.apply(orm, args);\n };\n }\n\n if (prop === \"$driver\") {\n return undefined;\n }\n\n if (!modelProxyCache.has(prop)) {\n modelProxyCache.set(prop, createLazyIntegrationOrmModel(resolveOrm, prop));\n }\n\n return modelProxyCache.get(prop);\n },\n },\n );\n}\n\nfunction createLazyIntegrationOrmModel(resolveOrm: () => Promise<unknown>, modelName: PropertyKey) {\n return new Proxy(\n {},\n {\n get(_target, prop) {\n if (prop === \"then\") {\n return undefined;\n }\n\n return async (...args: unknown[]) => {\n const orm = (await resolveOrm()) as Record<PropertyKey, Record<PropertyKey, unknown>>;\n const model = orm[modelName];\n const member = model?.[prop];\n if (typeof member !== \"function\") {\n throw new Error(\n `Integration ORM model \"${String(modelName)}\" does not expose \"${String(prop)}\".`,\n );\n }\n return member.apply(model, args);\n };\n },\n },\n );\n}\n\nasync function runIntegrationRouteBeforeHooks(\n route: NormalizedIntegrationRoute,\n request: Request,\n context: FarmIntegrationHandlerContext,\n): Promise<Response | undefined> {\n const hookContext = context as FarmIntegrationRouteHookContext;\n hookContext.response = undefined;\n\n for (const hook of route.before || []) {\n const response = await hook(request, hookContext);\n if (response) {\n hookContext.response = response;\n return response;\n }\n\n if (hookContext.response) {\n return hookContext.response;\n }\n }\n\n return undefined;\n}\n\nasync function runIntegrationRouteAfterHooks(\n route: NormalizedIntegrationRoute,\n request: Request,\n context: FarmIntegrationHandlerContext,\n response: Response,\n): Promise<Response> {\n const hookContext = context as FarmIntegrationRouteHookContext;\n let currentResponse = response;\n\n for (const hook of route.after || []) {\n hookContext.response = currentResponse;\n const nextResponse = await hook(request, hookContext);\n currentResponse = nextResponse || hookContext.response || currentResponse;\n }\n\n hookContext.response = currentResponse;\n return currentResponse;\n}\n\nfunction createQueryInput(searchParams: URLSearchParams): Record<string, string | string[]> {\n const input: Record<string, string | string[]> = {};\n searchParams.forEach((value, key) => {\n const existing = input[key];\n if (existing === undefined) {\n input[key] = value;\n return;\n }\n\n input[key] = Array.isArray(existing) ? [...existing, value] : [existing, value];\n });\n return input;\n}\n\nfunction createFormInput(\n formData: FormData,\n): Record<string, FormDataEntryValue | FormDataEntryValue[]> {\n const input: Record<string, FormDataEntryValue | FormDataEntryValue[]> = {};\n formData.forEach((value, key) => {\n const existing = input[key];\n if (existing === undefined) {\n input[key] = value;\n return;\n }\n\n input[key] = Array.isArray(existing) ? [...existing, value] : [existing, value];\n });\n return input;\n}\n\nexport async function dispatchIntegrationRequest(\n runtime: RegisteredIntegrationRuntime,\n request: Request,\n options: {\n currentRequest?: Request;\n data?: FarmIntegrationData;\n internal?: boolean;\n } = {},\n): Promise<Response | null> {\n const integration = runtime.integration;\n const url = new URL(request.url);\n const pathname = url.pathname;\n const requestId =\n request.headers.get(\"x-request-id\") ||\n options.currentRequest?.headers.get(\"x-request-id\") ||\n String(Date.now());\n const routes = normalizeIntegrationRoutes(integration.routes || []);\n const middleware = [...(integration.middleware || [])];\n\n for (const entry of middleware) {\n const params = resolveMatcherParams(entry.matcher, pathname);\n if (!params) {\n continue;\n }\n\n const handlerContext = createServerIntegrationHandlerContext({\n runtime,\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n params,\n pathname,\n requestId,\n currentRequest: options.currentRequest,\n data: options.data,\n internal: options.internal === true,\n });\n const startedAt = Date.now();\n\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:start\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n requestId,\n context: handlerContext.req.snapshot(),\n });\n\n try {\n const response = await entry.handler(request, handlerContext);\n if (response) {\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return response;\n }\n\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n } catch (error) {\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:error\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n requestId,\n durationMs: Date.now() - startedAt,\n error,\n context: handlerContext.req.snapshot(),\n });\n throw error;\n }\n }\n\n for (const route of routes) {\n const params = matchesMethod(route.methods, request.method)\n ? extractPathParams(route.path, pathname)\n : null;\n if (!params) {\n continue;\n }\n\n const handlerContext = createServerIntegrationHandlerContext({\n runtime,\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n params,\n pathname,\n requestId,\n currentRequest: options.currentRequest,\n data: options.data,\n internal: options.internal === true,\n });\n const startedAt = Date.now();\n\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:start\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n requestId,\n context: handlerContext.req.snapshot(),\n });\n\n try {\n const validation = await validateIntegrationRouteInput(route, request, url);\n if (!validation.success) {\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response: validation.response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return validation.response;\n }\n handlerContext.input = validation.input;\n\n for (const middlewareEntry of route.middleware || []) {\n const middlewareResponse = await middlewareEntry.handler(request, handlerContext);\n if (middlewareResponse) {\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response: middlewareResponse,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return middlewareResponse;\n }\n }\n\n const beforeResponse = await runIntegrationRouteBeforeHooks(route, request, handlerContext);\n if (beforeResponse) {\n const response = await runIntegrationRouteAfterHooks(\n route,\n request,\n handlerContext,\n beforeResponse,\n );\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return response;\n }\n\n const handlerResponse = await route.handler(request, handlerContext);\n const response = await runIntegrationRouteAfterHooks(\n route,\n request,\n handlerContext,\n handlerResponse,\n );\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return response;\n } catch (error) {\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:error\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n requestId,\n durationMs: Date.now() - startedAt,\n error,\n context: handlerContext.req.snapshot(),\n });\n throw error;\n }\n }\n\n return null;\n}\n\n(globalThis as GlobalWithIntegrationRuntimeRegistry)[INTEGRATION_REQUEST_DISPATCHER_KEY] =\n dispatchIntegrationRequest;\n\nfunction createIntegrationRequestContextStore(\n rawRequest: FarmRequest,\n request: Request,\n pluginContext: FarmPluginContext,\n): FarmIntegrationRequestContextStore {\n return {\n get(key) {\n const requestValue = pluginContext.requestContext.get(request, key);\n if (requestValue !== undefined) {\n return requestValue;\n }\n\n return pluginContext.requestContext.get(rawRequest, key);\n },\n set(key, value, options) {\n pluginContext.requestContext.set(rawRequest, key, value, options);\n pluginContext.requestContext.set(request, key, value, options);\n },\n has(key) {\n return (\n pluginContext.requestContext.has(request, key) ||\n pluginContext.requestContext.has(rawRequest, key)\n );\n },\n delete(key) {\n const deletedRequest = pluginContext.requestContext.delete(request, key);\n const deletedRaw = pluginContext.requestContext.delete(rawRequest, key);\n return deletedRequest || deletedRaw;\n },\n clear() {\n pluginContext.requestContext.clear(rawRequest);\n pluginContext.requestContext.clear(request);\n },\n snapshot(options) {\n const merged = pluginContext.requestContext.getAll(rawRequest, options);\n const requestSnapshot = pluginContext.requestContext.getAll(request, options);\n for (const [key, value] of requestSnapshot) {\n merged.set(key, value);\n }\n return merged;\n },\n };\n}\n\nfunction createServerIntegrationHandlerContext(input: {\n runtime: RegisteredIntegrationRuntime;\n route: FarmIntegrationHandlerContext[\"route\"];\n request: Request;\n params: FarmIntegrationRouteParams;\n pathname: string;\n requestId: string;\n currentRequest?: Request;\n data?: FarmIntegrationData;\n internal?: boolean;\n}): FarmIntegrationHandlerContext {\n const req = createServerIntegrationRequestContextStore(input.request, input.currentRequest);\n\n if (input.internal) {\n req.set(FARM_INTEGRATION_INTERNAL_DISPATCH_CONTEXT_KEY, true);\n }\n\n return {\n request: input.request,\n requestId: input.requestId,\n url: new URL(input.request.url),\n pathname: input.pathname,\n method: input.request.method,\n params: input.params,\n input: {},\n args: createIntegrationRouteArgs({\n integration: input.runtime.integration,\n config: input.runtime.config,\n }),\n data: resolveIntegrationData(input.request, input.data),\n integration: {\n category: input.runtime.integration.category,\n slot: input.runtime.integration.category,\n type: input.runtime.integration.type,\n instance: input.runtime.integration.instance,\n },\n route: input.route,\n req,\n requestContext: req,\n config: input.runtime.config,\n isDev: input.runtime.isDev,\n isProd: input.runtime.isProd,\n };\n}\n\nfunction createServerIntegrationRequestContextStore(\n request: Request,\n currentRequest?: Request,\n): FarmIntegrationRequestContextStore {\n return {\n get(key) {\n const requestValue = getRequestContext(request, key);\n if (requestValue !== undefined) {\n return requestValue;\n }\n\n if (currentRequest) {\n return getRequestContext(currentRequest, key);\n }\n\n return undefined;\n },\n set(key, value, options) {\n setRequestContext(request, key, value, options);\n if (currentRequest) {\n setRequestContext(currentRequest, key, value, options);\n }\n },\n has(key) {\n return (\n hasRequestContext(request, key) ||\n (!!currentRequest && hasRequestContext(currentRequest, key))\n );\n },\n delete(key) {\n const deletedRequest = deleteRequestContext(request, key);\n const deletedCurrent = currentRequest ? deleteRequestContext(currentRequest, key) : false;\n return deletedRequest || deletedCurrent;\n },\n clear() {\n clearRequestContext(request);\n if (currentRequest) {\n clearRequestContext(currentRequest);\n }\n },\n snapshot(options) {\n const merged = currentRequest\n ? getRequestContextSnapshot(currentRequest, options)\n : new Map<string, unknown>();\n const requestSnapshot = getRequestContextSnapshot(request, options);\n for (const [key, value] of requestSnapshot) {\n merged.set(key, value);\n }\n return merged;\n },\n };\n}\n\nfunction createWebRequest(req: FarmRequest, fullUrl: string, body?: Buffer): Request {\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value == null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n headers.append(key, item);\n }\n continue;\n }\n\n headers.set(key, value);\n }\n\n return new Request(fullUrl, {\n method: req.method,\n headers,\n body: body as BodyInit | undefined,\n });\n}\n\nfunction matchesMethod(methods: readonly string[], method: string | undefined): boolean {\n if (!method) {\n return false;\n }\n\n return methods.some((item) => item.toUpperCase() === method.toUpperCase());\n}\n\nfunction matchesMatcher(\n matcher: string | readonly string[] | undefined,\n pathname: string,\n): boolean {\n return resolveMatcherParams(matcher, pathname) !== null;\n}\n\nfunction resolveMatcherParams(\n matcher: string | readonly string[] | undefined,\n pathname: string,\n): FarmIntegrationRouteParams | null {\n if (!matcher) {\n return {};\n }\n\n const list = Array.isArray(matcher) ? matcher : [matcher];\n for (const item of list) {\n if (item === \"/(.*)\" || item === \"*\") {\n return {};\n }\n if (item.endsWith(\"(.*)\")) {\n const prefix = item.slice(0, -4);\n if (pathname === prefix || pathname.startsWith(`${prefix}/`)) {\n return {};\n }\n continue;\n }\n const params = extractPathParams(item, pathname);\n if (params) {\n return params;\n }\n }\n\n return null;\n}\n\nfunction matchesPath(pattern: string, pathname: string): boolean {\n return extractPathParams(pattern, pathname) !== null;\n}\n\nfunction extractPathParams(pattern: string, pathname: string): FarmIntegrationRouteParams | null {\n const routeSegments = splitPath(pattern);\n const pathSegments = splitPath(pathname);\n const params: FarmIntegrationRouteParams = {};\n\n let routeIndex = 0;\n let pathIndex = 0;\n\n while (routeIndex < routeSegments.length && pathIndex < pathSegments.length) {\n const routeSegment = routeSegments[routeIndex];\n const pathSegment = pathSegments[pathIndex];\n\n if (isCatchAllSegment(routeSegment)) {\n params[getSegmentParamName(routeSegment)] = pathSegments\n .slice(pathIndex)\n .map((segment) => decodeURIComponent(segment));\n return params;\n }\n\n if (isDynamicSegment(routeSegment)) {\n params[getSegmentParamName(routeSegment)] = decodeURIComponent(pathSegment);\n routeIndex += 1;\n pathIndex += 1;\n continue;\n }\n\n if (routeSegment !== pathSegment) {\n return null;\n }\n\n routeIndex += 1;\n pathIndex += 1;\n }\n\n if (routeIndex === routeSegments.length && pathIndex === pathSegments.length) {\n return params;\n }\n\n if (routeIndex === routeSegments.length - 1 && isCatchAllSegment(routeSegments[routeIndex])) {\n params[getSegmentParamName(routeSegments[routeIndex])] = [];\n return params;\n }\n\n return null;\n}\n\nfunction splitPath(value: string): string[] {\n return value.split(\"/\").filter(Boolean);\n}\n\nfunction isDynamicSegment(segment: string): boolean {\n return segment.startsWith(\"[\") && segment.endsWith(\"]\");\n}\n\nfunction isCatchAllSegment(segment: string): boolean {\n return segment.startsWith(\"[...\") && segment.endsWith(\"]\");\n}\n\nfunction getSegmentParamName(segment: string): string {\n if (isCatchAllSegment(segment)) {\n return segment.slice(4, -1);\n }\n\n return segment.slice(1, -1);\n}\n\nfunction getRequestId(req: FarmRequest): string {\n const headerValue = req.headers[\"x-request-id\"];\n if (Array.isArray(headerValue)) {\n return headerValue[0] || String(Date.now());\n }\n return headerValue || String(Date.now());\n}\n\nasync function readRequestBody(req: FarmRequest): Promise<Buffer> {\n return await new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk) => {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n req.on(\"end\", () => {\n resolve(Buffer.concat(chunks));\n });\n req.on(\"error\", reject);\n });\n}\n\nfunction normalizeMatcher(matcher: string | readonly string[] | undefined): string {\n if (!matcher) {\n return \"/(.*)\";\n }\n return typeof matcher === \"string\" ? matcher : matcher.join(\", \");\n}\n","export type FarmMarkdownRouteInput =\n | string\n | {\n route: string;\n title?: string;\n cache?: number | false;\n };\n\nexport interface FarmMarkdownUserConfig {\n enabled?: boolean;\n expose?: boolean | FarmMarkdownRouteInput[];\n routes?: FarmMarkdownRouteInput[];\n cache?: number | false;\n includeMetadata?: boolean;\n}\n\nexport interface FarmMarkdownResolvedRoute {\n route: string;\n title?: string;\n cache?: number | false;\n}\n\nexport interface FarmMarkdownResolvedConfig {\n enabled: boolean;\n expose: true | FarmMarkdownResolvedRoute[];\n cache: number | false;\n includeMetadata: boolean;\n}\n\nexport interface FarmMarkdownMirrorTarget {\n pathname: string;\n route: FarmMarkdownResolvedRoute | null;\n}\n\nexport interface CreateMarkdownMirrorResponseOptions {\n request: Request;\n config?: FarmMarkdownResolvedConfig;\n routeExists?: (pathname: string) => boolean;\n renderPage: (request: Request) => Response | Promise<Response>;\n}\n\nexport function resolveMarkdownConfig(\n config: FarmMarkdownUserConfig | boolean | undefined,\n): FarmMarkdownResolvedConfig {\n if (config === false || config === undefined) {\n return {\n enabled: false,\n expose: [],\n cache: false,\n includeMetadata: true,\n };\n }\n\n if (config === true) {\n return {\n enabled: true,\n expose: true,\n cache: false,\n includeMetadata: true,\n };\n }\n\n const exposeInput = config.expose ?? config.routes ?? [];\n const expose =\n exposeInput === true\n ? true\n : Array.isArray(exposeInput)\n ? exposeInput.map(normalizeMarkdownRouteInput)\n : [];\n\n return {\n enabled: config.enabled !== false && (expose === true || expose.length > 0),\n expose,\n cache: config.cache ?? false,\n includeMetadata: config.includeMetadata ?? true,\n };\n}\n\nexport function resolveMarkdownMirrorTarget(\n config: FarmMarkdownResolvedConfig | undefined,\n pathname: string,\n): FarmMarkdownMirrorTarget | null {\n if (!config?.enabled || !pathname.endsWith(\".md\")) {\n return null;\n }\n\n const targetPathname = normalizeMarkdownRoute(pathname.slice(0, -\".md\".length) || \"/\");\n const route = findExposedMarkdownRoute(config, targetPathname);\n if (!route && config.expose !== true) {\n return null;\n }\n\n return {\n pathname: targetPathname,\n route,\n };\n}\n\nexport async function createMarkdownMirrorResponse(\n options: CreateMarkdownMirrorResponseOptions,\n): Promise<Response | null> {\n if (options.request.method !== \"GET\" && options.request.method !== \"HEAD\") {\n return null;\n }\n\n const requestUrl = new URL(options.request.url);\n const target = resolveMarkdownMirrorTarget(options.config, requestUrl.pathname);\n if (!target) {\n return null;\n }\n\n if (options.routeExists && !options.routeExists(target.pathname)) {\n return null;\n }\n\n const pageUrl = new URL(options.request.url);\n pageUrl.pathname = target.pathname;\n const headers = new Headers(options.request.headers);\n headers.set(\"accept\", \"text/html\");\n\n const pageResponse = await options.renderPage(\n new Request(pageUrl, {\n method: \"GET\",\n headers,\n }),\n );\n\n if (!isHtmlResponse(pageResponse)) {\n return null;\n }\n\n const html = await pageResponse.text();\n const markdown = htmlToMarkdown(html, {\n title: target.route?.title,\n includeMetadata: options.config?.includeMetadata ?? true,\n sourcePath: target.pathname,\n });\n const headersOut = new Headers({\n \"Content-Type\": \"text/markdown; charset=utf-8\",\n \"X-Farm-Markdown-Route\": target.pathname,\n });\n const cache = target.route?.cache ?? options.config?.cache ?? false;\n headersOut.set(\"Cache-Control\", createMarkdownCacheHeader(cache));\n\n return new Response(options.request.method === \"HEAD\" ? null : markdown, {\n status: pageResponse.status,\n headers: headersOut,\n });\n}\n\nexport function htmlToMarkdown(\n html: string,\n options: {\n title?: string;\n sourcePath?: string;\n includeMetadata?: boolean;\n } = {},\n): string {\n const title = options.title ?? extractHtmlTitle(html);\n let source = extractHtmlBody(html)\n .replace(/<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/<style\\b[^>]*>[\\s\\S]*?<\\/style>/gi, \"\")\n .replace(/<noscript\\b[^>]*>[\\s\\S]*?<\\/noscript>/gi, \"\")\n .replace(/<!--[\\s\\S]*?-->/g, \"\");\n\n source = source.replace(/<pre\\b[^>]*><code\\b[^>]*>([\\s\\S]*?)<\\/code><\\/pre>/gi, (_, code) => {\n return `\\n\\n\\`\\`\\`\\n${decodeHtml(stripTags(code)).trim()}\\n\\`\\`\\`\\n\\n`;\n });\n source = source.replace(/<pre\\b[^>]*>([\\s\\S]*?)<\\/pre>/gi, (_, code) => {\n return `\\n\\n\\`\\`\\`\\n${decodeHtml(stripTags(code)).trim()}\\n\\`\\`\\`\\n\\n`;\n });\n source = source.replace(/<h([1-6])\\b[^>]*>([\\s\\S]*?)<\\/h\\1>/gi, (_, level, content) => {\n return `\\n\\n${\"#\".repeat(Number(level))} ${toInlineMarkdown(content).trim()}\\n\\n`;\n });\n source = source.replace(/<p\\b[^>]*>([\\s\\S]*?)<\\/p>/gi, (_, content) => {\n return `\\n\\n${toInlineMarkdown(content).trim()}\\n\\n`;\n });\n source = source.replace(/<blockquote\\b[^>]*>([\\s\\S]*?)<\\/blockquote>/gi, (_, content) => {\n const quote = htmlToMarkdown(content, { includeMetadata: false })\n .split(\"\\n\")\n .filter((line) => line.trim().length > 0)\n .map((line) => `> ${line}`)\n .join(\"\\n\");\n return `\\n\\n${quote}\\n\\n`;\n });\n source = source.replace(/<li\\b[^>]*>([\\s\\S]*?)<\\/li>/gi, (_, content) => {\n return `\\n- ${toInlineMarkdown(content).trim()}`;\n });\n source = source\n .replace(/<\\/?(ul|ol|main|section|article|header|footer|nav|aside|div)\\b[^>]*>/gi, \"\\n\")\n .replace(/<br\\s*\\/?>/gi, \"\\n\")\n .replace(/<hr\\s*\\/?>/gi, \"\\n\\n---\\n\\n\");\n\n let markdown = stripTags(source)\n .split(\"\\n\")\n .map((line) => line.replace(/[ \\t]+$/g, \"\"))\n .join(\"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n\n if (options.includeMetadata !== false) {\n const metadata: string[] = [];\n if (title && !markdown.startsWith(\"# \")) {\n metadata.push(`# ${title}`);\n }\n if (options.sourcePath) {\n metadata.push(`Source: ${options.sourcePath}`);\n }\n if (metadata.length) {\n markdown = `${metadata.join(\"\\n\\n\")}${markdown ? `\\n\\n${markdown}` : \"\"}`;\n }\n }\n\n return `${markdown}\\n`;\n}\n\nfunction normalizeMarkdownRouteInput(input: FarmMarkdownRouteInput): FarmMarkdownResolvedRoute {\n if (typeof input === \"string\") {\n return {\n route: normalizeMarkdownRoute(input),\n };\n }\n\n return {\n ...input,\n route: normalizeMarkdownRoute(input.route),\n };\n}\n\nfunction normalizeMarkdownRoute(route: string): string {\n const withoutMarkdownExtension = route.endsWith(\".md\") ? route.slice(0, -3) : route;\n const withSlash = withoutMarkdownExtension.startsWith(\"/\")\n ? withoutMarkdownExtension\n : `/${withoutMarkdownExtension}`;\n const normalized = withSlash.replace(/\\/+/g, \"/\").replace(/\\/$/g, \"\");\n return normalized === \"\" || normalized === \"/index\" ? \"/\" : normalized;\n}\n\nfunction findExposedMarkdownRoute(\n config: FarmMarkdownResolvedConfig,\n pathname: string,\n): FarmMarkdownResolvedRoute | null {\n if (config.expose === true) {\n return null;\n }\n\n return config.expose.find((route) => routeMatches(route.route, pathname)) ?? null;\n}\n\nfunction routeMatches(pattern: string, pathname: string): boolean {\n if (pattern === pathname) {\n return true;\n }\n\n const escaped = pattern\n .split(\"/\")\n .map((segment) => {\n if (/^\\[\\.\\.\\.[^\\]]+\\]$/.test(segment)) {\n return \".*\";\n }\n if (/^\\[[^\\]]+\\]$/.test(segment)) {\n return \"[^/]+\";\n }\n return segment.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n })\n .join(\"/\");\n\n return new RegExp(`^${escaped}$`).test(pathname);\n}\n\nfunction isHtmlResponse(response: Response): boolean {\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n return contentType.includes(\"text/html\");\n}\n\nfunction createMarkdownCacheHeader(cache: number | false): string {\n if (cache === false || cache <= 0) {\n return \"no-store\";\n }\n\n return `public, max-age=${cache}, s-maxage=${cache}`;\n}\n\nfunction extractHtmlTitle(html: string): string | undefined {\n const match = html.match(/<title\\b[^>]*>([\\s\\S]*?)<\\/title>/i);\n return match ? decodeHtml(stripTags(match[1])).trim() : undefined;\n}\n\nfunction extractHtmlBody(html: string): string {\n const rootMatch = html.match(\n /<div\\b[^>]*id=[\"']root[\"'][^>]*>([\\s\\S]*?)<\\/div>\\s*(?:<script|<\\/body>|$)/i,\n );\n const bodyMatch = html.match(/<body\\b[^>]*>([\\s\\S]*?)<\\/body>/i);\n const body = rootMatch ? rootMatch[1] : bodyMatch ? bodyMatch[1] : html;\n return extractFirstElementContent(body, [\"main\", \"article\"]) ?? body;\n}\n\nfunction extractFirstElementContent(html: string, tagNames: string[]): string | undefined {\n for (const tagName of tagNames) {\n const match = html.match(new RegExp(`<${tagName}\\\\b[^>]*>([\\\\s\\\\S]*?)<\\\\/${tagName}>`, \"i\"));\n if (match) {\n return match[1];\n }\n }\n\n return undefined;\n}\n\nfunction toInlineMarkdown(html: string): string {\n let source = html\n .replace(/<a\\b[^>]*href=[\"']([^\"']+)[\"'][^>]*>([\\s\\S]*?)<\\/a>/gi, (_, href, text) => {\n const label: string = toInlineMarkdown(text).trim() || href;\n return `[${label}](${decodeHtml(href)})`;\n })\n .replace(\n /<img\\b[^>]*src=[\"']([^\"']+)[\"'][^>]*alt=[\"']([^\"']*)[\"'][^>]*\\/?>/gi,\n (_, src, alt) => {\n return `})`;\n },\n )\n .replace(/<strong\\b[^>]*>([\\s\\S]*?)<\\/strong>/gi, (_, content) => {\n return `**${toInlineMarkdown(content).trim()}**`;\n })\n .replace(/<b\\b[^>]*>([\\s\\S]*?)<\\/b>/gi, (_, content) => {\n return `**${toInlineMarkdown(content).trim()}**`;\n })\n .replace(/<em\\b[^>]*>([\\s\\S]*?)<\\/em>/gi, (_, content) => {\n return `_${toInlineMarkdown(content).trim()}_`;\n })\n .replace(/<i\\b[^>]*>([\\s\\S]*?)<\\/i>/gi, (_, content) => {\n return `_${toInlineMarkdown(content).trim()}_`;\n })\n .replace(/<code\\b[^>]*>([\\s\\S]*?)<\\/code>/gi, (_, content) => {\n return `\\`${decodeHtml(stripTags(content)).trim()}\\``;\n })\n .replace(/<br\\s*\\/?>/gi, \"\\n\");\n\n source = stripTags(source);\n return decodeHtml(source).replace(/\\s+/g, \" \");\n}\n\nfunction stripTags(input: string): string {\n return input.replace(/<[^>]+>/g, \"\");\n}\n\nfunction decodeHtml(input: string): string {\n return input\n .replace(/ /g, \" \")\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&#x([0-9a-f]+);/gi, (_, code) => String.fromCodePoint(Number.parseInt(code, 16)))\n .replace(/&#(\\d+);/g, (_, code) => String.fromCodePoint(Number.parseInt(code, 10)));\n}\n","export type FarmWorkflowSchedule = string | string[];\n\nexport interface FarmWorkflowsUserConfig {\n /** Enable or disable Farm workflow discovery. Enabled by default. */\n enabled?: boolean;\n /** Directory or directories to scan for workflow modules. */\n dir?: string | string[];\n /** Alias for dir. */\n dirs?: string[];\n /** HTTP route used for manual and URL-based cron invocation. */\n route?: string;\n /** Environment variable that stores the optional runner secret. */\n secretEnv?: string;\n /** Inline runner secret. Prefer secretEnv for deployed apps. */\n secret?: string;\n}\n\nexport interface FarmWorkflowsResolvedConfig {\n enabled: boolean;\n dirs: string[];\n route: string;\n secretEnv: string;\n secret?: string;\n}\n\nexport interface FarmWorkflowLogger {\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n}\n\nexport interface FarmWorkflowRunContext<TPayload = unknown> {\n id: string;\n name: string;\n payload: TPayload;\n scheduledTime?: number | string;\n request?: Request;\n event?: unknown;\n env: Record<string, string | undefined>;\n data: Map<string, unknown>;\n log: FarmWorkflowLogger;\n}\n\nexport interface FarmWorkflowDefinition<TPayload = unknown, TResult = unknown> {\n kind?: \"farm-workflow\";\n id?: string;\n description?: string;\n schedule?: FarmWorkflowSchedule;\n timezone?: string;\n run: (ctx: FarmWorkflowRunContext<TPayload>) => TResult | Promise<TResult>;\n}\n\nexport interface FarmCronDefinition<\n TPayload = unknown,\n TResult = unknown,\n> extends FarmWorkflowDefinition<TPayload, TResult> {\n schedule: FarmWorkflowSchedule;\n}\n\nexport interface FarmDiscoveredWorkflow {\n id: string;\n filePath: string;\n description?: string;\n schedule: string[];\n timezone?: string;\n routePath: string;\n}\n\nexport interface PreparedFarmWorkflows {\n workflows: FarmDiscoveredWorkflow[];\n tasks: Record<string, { handler: string; description: string }>;\n scheduledTasks: Record<string, string | string[]>;\n handlerPath?: string;\n manifestPath?: string;\n}\n\nexport interface FarmWorkflowHTTPHandlerOptions {\n workflows: FarmDiscoveredWorkflow[];\n config: FarmWorkflowsResolvedConfig;\n loadModule: (workflow: FarmDiscoveredWorkflow) => Promise<Record<string, any>>;\n}\n\nexport const DEFAULT_FARM_WORKFLOW_DIRS = [\"src/jobs\", \"src/workflows\", \"src/cron\"];\nexport const DEFAULT_FARM_WORKFLOW_ROUTE = \"/api/_farm/workflows\";\nexport const DEFAULT_FARM_WORKFLOW_SECRET_ENV = \"CRON_SECRET\";\n\nexport function defineWorkflow<const TPayload = unknown, TResult = unknown>(\n definition: FarmWorkflowDefinition<TPayload, TResult>,\n): FarmWorkflowDefinition<TPayload, TResult> {\n return {\n ...definition,\n kind: \"farm-workflow\",\n };\n}\n\nexport function defineTask<const TPayload = unknown, TResult = unknown>(\n definition: FarmWorkflowDefinition<TPayload, TResult>,\n): FarmWorkflowDefinition<TPayload, TResult> {\n return defineWorkflow(definition);\n}\n\n/**\n * @deprecated Configure `cron` in `farm.config.ts` and point it at an API route.\n */\nexport function defineCron<const TPayload = unknown, TResult = unknown>(\n definition: FarmCronDefinition<TPayload, TResult>,\n): FarmCronDefinition<TPayload, TResult> {\n return {\n ...definition,\n kind: \"farm-workflow\",\n };\n}\n\nexport function resolveWorkflowsConfig(\n workflows: FarmWorkflowsUserConfig | boolean | undefined,\n): FarmWorkflowsResolvedConfig {\n if (workflows === false) {\n return {\n enabled: false,\n dirs: [...DEFAULT_FARM_WORKFLOW_DIRS],\n route: DEFAULT_FARM_WORKFLOW_ROUTE,\n secretEnv: DEFAULT_FARM_WORKFLOW_SECRET_ENV,\n };\n }\n\n const options = workflows && typeof workflows === \"object\" ? workflows : {};\n const dirs = normalizeWorkflowDirs(options);\n\n return {\n enabled: options.enabled ?? true,\n dirs,\n route: normalizeWorkflowRoute(options.route || DEFAULT_FARM_WORKFLOW_ROUTE),\n secretEnv: options.secretEnv || DEFAULT_FARM_WORKFLOW_SECRET_ENV,\n secret: options.secret,\n };\n}\n\nexport async function discoverFarmWorkflows(\n config: {\n root?: string;\n workflows?: FarmWorkflowsResolvedConfig | FarmWorkflowsUserConfig | boolean;\n },\n options: {\n loadModule?: (filePath: string) => Promise<Record<string, any>>;\n } = {},\n): Promise<FarmDiscoveredWorkflow[]> {\n const workflowConfig = isResolvedWorkflowConfig(config.workflows)\n ? config.workflows\n : resolveWorkflowsConfig(config.workflows);\n if (!workflowConfig.enabled) return [];\n\n const root = config.root || process.cwd();\n const files = await findWorkflowFiles(root, workflowConfig.dirs);\n const workflows: FarmDiscoveredWorkflow[] = [];\n const seenIds = new Map<string, string>();\n\n for (const filePath of files) {\n const module = options.loadModule\n ? await options.loadModule(filePath)\n : await loadWorkflowModule(filePath, root);\n const definition = resolveWorkflowDefinition(module);\n if (!definition) continue;\n\n const id = normalizeWorkflowId(definition.id || workflowIdFromFile(root, filePath));\n const previousPath = seenIds.get(id);\n if (previousPath) {\n throw new Error(\n `Duplicate Farm workflow id \"${id}\" found in ${relativePath(root, previousPath)} and ${relativePath(root, filePath)}.`,\n );\n }\n seenIds.set(id, filePath);\n\n workflows.push({\n id,\n filePath,\n description: definition.description,\n schedule: normalizeSchedule(definition.schedule),\n timezone: definition.timezone,\n routePath: joinRoute(workflowConfig.route, encodeURIComponent(id)),\n });\n }\n\n return workflows;\n}\n\nexport function createFarmWorkflowRequestHandler(options: FarmWorkflowHTTPHandlerOptions) {\n const workflowsById = new Map(options.workflows.map((workflow) => [workflow.id, workflow]));\n\n return async function handleFarmWorkflowRequest(request: Request): Promise<Response | null> {\n const url = new URL(request.url);\n const route = normalizeWorkflowRoute(options.config.route);\n if (url.pathname !== route && !url.pathname.startsWith(`${route}/`)) {\n return null;\n }\n\n if (url.pathname === route) {\n const secretError = verifyWorkflowSecret(request, options.config);\n if (secretError) return secretError;\n\n return Response.json({\n workflows: options.workflows.map(toWorkflowMetadata),\n });\n }\n\n const id = decodeURIComponent(url.pathname.slice(route.length + 1));\n const workflow = workflowsById.get(id);\n if (!workflow) {\n return Response.json({ error: `Workflow \"${id}\" was not found.` }, { status: 404 });\n }\n\n const secretError = verifyWorkflowSecret(request, options.config);\n if (secretError) return secretError;\n\n const payload = await readWorkflowPayload(request);\n const module = await options.loadModule(workflow);\n const result = await runFarmWorkflowModule(module, {\n id: workflow.id,\n name: workflow.id,\n payload,\n request,\n scheduledTime: readScheduledTime(payload),\n });\n\n return Response.json({\n id: workflow.id,\n ok: true,\n result: result ?? null,\n });\n };\n}\n\nexport async function runFarmWorkflowModule(\n module: Record<string, any>,\n context: {\n id: string;\n name?: string;\n payload?: unknown;\n scheduledTime?: number | string;\n request?: Request;\n event?: unknown;\n env?: Record<string, string | undefined>;\n },\n): Promise<unknown> {\n const definition = resolveWorkflowDefinition(module);\n if (!definition) {\n throw new Error(`Farm workflow \"${context.id}\" does not export a workflow definition.`);\n }\n\n return await definition.run({\n id: context.id,\n name: context.name || context.id,\n payload: context.payload,\n scheduledTime: context.scheduledTime,\n request: context.request,\n event: context.event,\n env: context.env || process.env,\n data: new Map<string, unknown>(),\n log: console,\n });\n}\n\nexport async function prepareFarmWorkflowsForNitro(config: {\n root?: string;\n distDir?: string;\n workflows?: FarmWorkflowsResolvedConfig | FarmWorkflowsUserConfig | boolean;\n}): Promise<PreparedFarmWorkflows> {\n const workflowConfig = isResolvedWorkflowConfig(config.workflows)\n ? config.workflows\n : resolveWorkflowsConfig(config.workflows);\n const workflows = await discoverFarmWorkflows({\n root: config.root,\n workflows: workflowConfig,\n });\n\n if (workflows.length === 0) {\n return {\n workflows,\n tasks: {},\n scheduledTasks: {},\n };\n }\n\n const root = config.root || process.cwd();\n const distDir = config.distDir || \".farm\";\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const generatedDir = path.join(root, distDir, \".nitro\", \"farm-workflows\");\n await fs.mkdir(generatedDir, { recursive: true });\n\n const tasks: PreparedFarmWorkflows[\"tasks\"] = {};\n const scheduledTasks = createScheduledTasks(workflows);\n\n for (const workflow of workflows) {\n const wrapperPath = path.join(generatedDir, `${safeFileName(workflow.id)}.mjs`);\n await fs.writeFile(wrapperPath, createNitroTaskWrapper(workflow), \"utf8\");\n tasks[workflow.id] = {\n handler: wrapperPath,\n description: workflow.description || `Farm workflow ${workflow.id}`,\n };\n }\n\n const handlerPath = path.join(generatedDir, \"http-handler.mjs\");\n await fs.writeFile(\n handlerPath,\n createNitroWorkflowHTTPHandler(workflowConfig, workflows),\n \"utf8\",\n );\n\n const manifestPath = path.join(generatedDir, \"manifest.json\");\n await fs.writeFile(\n manifestPath,\n JSON.stringify(\n {\n route: workflowConfig.route,\n secretEnv: workflowConfig.secretEnv,\n trigger: {\n method: \"GET\",\n authorization: `Bearer $${workflowConfig.secretEnv}`,\n },\n workflows: workflows.map(toWorkflowMetadata),\n },\n null,\n 2,\n ),\n \"utf8\",\n );\n\n return {\n workflows,\n tasks,\n scheduledTasks,\n handlerPath,\n manifestPath,\n };\n}\n\nexport function createFarmWorkflowVercelCrons(\n workflows: FarmDiscoveredWorkflow[],\n): Array<{ path: string; schedule: string }> {\n return workflows.flatMap((workflow) =>\n workflow.schedule.map((schedule) => ({\n path: workflow.routePath,\n schedule,\n })),\n );\n}\n\nexport function applyFarmWorkflowVercelCrons(\n vercelConfig: Record<string, any>,\n workflows: FarmDiscoveredWorkflow[],\n): Record<string, any> {\n const crons = createFarmWorkflowVercelCrons(workflows);\n if (crons.length === 0) return vercelConfig;\n\n const existingCrons = Array.isArray(vercelConfig.crons) ? vercelConfig.crons : [];\n const seen = new Set(existingCrons.map((cron) => `${cron.path}:${cron.schedule}`));\n const nextCrons = [...existingCrons];\n for (const cron of crons) {\n const key = `${cron.path}:${cron.schedule}`;\n if (seen.has(key)) continue;\n seen.add(key);\n nextCrons.push(cron);\n }\n return {\n ...vercelConfig,\n crons: nextCrons,\n };\n}\n\nfunction isResolvedWorkflowConfig(value: unknown): value is FarmWorkflowsResolvedConfig {\n return (\n !!value &&\n typeof value === \"object\" &&\n \"dirs\" in value &&\n Array.isArray((value as FarmWorkflowsResolvedConfig).dirs) &&\n typeof (value as FarmWorkflowsResolvedConfig).route === \"string\"\n );\n}\n\nfunction normalizeWorkflowDirs(options: FarmWorkflowsUserConfig): string[] {\n const rawDirs =\n options.dirs ||\n (Array.isArray(options.dir) ? options.dir : options.dir ? [options.dir] : undefined);\n const dirs = rawDirs && rawDirs.length > 0 ? rawDirs : DEFAULT_FARM_WORKFLOW_DIRS;\n return [...new Set(dirs.map((dir) => trimSlashes(dir)).filter(Boolean))];\n}\n\nfunction normalizeWorkflowRoute(route: string): string {\n const trimmed = route.trim();\n if (!trimmed || trimmed === \"/\") return DEFAULT_FARM_WORKFLOW_ROUTE;\n return `/${trimSlashes(trimmed)}`;\n}\n\nfunction normalizeWorkflowId(id: string): string {\n const normalized = id\n .replace(/\\\\/g, \"/\")\n .replace(/\\.(tsx?|jsx?|mjs|cjs)$/, \"\")\n .replace(/\\/index$/, \"\")\n .replace(/[^a-zA-Z0-9._/-]+/g, \"-\")\n .replace(/^\\/+|\\/+$/g, \"\")\n .replace(/\\/+/g, \"/\");\n return normalized || \"workflow\";\n}\n\nfunction normalizeSchedule(schedule: FarmWorkflowSchedule | undefined): string[] {\n if (!schedule) return [];\n return (Array.isArray(schedule) ? schedule : [schedule])\n .map((value) => value.trim())\n .filter(Boolean);\n}\n\nfunction resolveWorkflowDefinition(\n module: Record<string, any>,\n): FarmWorkflowDefinition | FarmCronDefinition | null {\n const candidates = [module.default, module.workflow, module.cron, module.task, module.job];\n for (const candidate of candidates) {\n if (candidate && typeof candidate === \"object\" && typeof candidate.run === \"function\") {\n return candidate as FarmWorkflowDefinition;\n }\n }\n return null;\n}\n\nasync function findWorkflowFiles(root: string, dirs: string[]): Promise<string[]> {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const files: string[] = [];\n\n for (const dir of dirs) {\n const absoluteDir = path.isAbsolute(dir) ? dir : path.join(root, dir);\n if (!(await pathExists(absoluteDir))) continue;\n await walkWorkflowDir(absoluteDir, files);\n }\n\n return files.sort();\n}\n\nasync function walkWorkflowDir(dir: string, files: string[]): Promise<void> {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const filePath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (entry.name === \"node_modules\" || entry.name.startsWith(\".\")) continue;\n await walkWorkflowDir(filePath, files);\n continue;\n }\n if (isWorkflowFile(entry.name)) {\n files.push(filePath);\n }\n }\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n const fs = await import(\"fs/promises\");\n return fs\n .access(filePath)\n .then(() => true)\n .catch(() => false);\n}\n\nfunction isWorkflowFile(fileName: string): boolean {\n return /\\.(?:ts|tsx|js|jsx|mjs|cjs)$/.test(fileName) && !/\\.d\\.[cm]?ts$/.test(fileName);\n}\n\nasync function loadWorkflowModule(filePath: string, root: string): Promise<Record<string, any>> {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const { pathToFileURL } = await import(\"url\");\n const { build } = await import(\"esbuild\");\n const outDir = path.join(root, \".farm\", \".workflow-loader\");\n await fs.mkdir(outDir, { recursive: true });\n const outfile = path.join(\n outDir,\n `workflow-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`,\n );\n\n await build({\n absWorkingDir: root,\n entryPoints: [filePath],\n outfile,\n bundle: true,\n format: \"esm\",\n platform: \"node\",\n target: `node${process.versions.node.split(\".\")[0]}`,\n packages: \"external\",\n external: [\"@farm.js/core\", \"@farm.js/core/*\", \"nitro\", \"nitro/*\"],\n jsx: \"automatic\",\n logLevel: \"silent\",\n sourcemap: \"inline\",\n });\n\n try {\n return await import(/* @vite-ignore */ `${pathToFileURL(outfile).href}?t=${Date.now()}`);\n } finally {\n await fs.unlink(outfile).catch(() => undefined);\n }\n}\n\nfunction workflowIdFromFile(root: string, filePath: string): string {\n const normalizedRoot = root.replace(/\\\\/g, \"/\");\n const normalizedFile = filePath.replace(/\\\\/g, \"/\");\n const relative = normalizedFile.startsWith(`${normalizedRoot}/`)\n ? normalizedFile.slice(normalizedRoot.length + 1)\n : normalizedFile;\n return normalizeWorkflowId(\n relative.replace(/^src\\/(?:jobs|workflows|cron)\\//, \"\").replace(/\\.(tsx?|jsx?|mjs|cjs)$/, \"\"),\n );\n}\n\nfunction createScheduledTasks(\n workflows: FarmDiscoveredWorkflow[],\n): Record<string, string | string[]> {\n const scheduleMap = new Map<string, string[]>();\n for (const workflow of workflows) {\n for (const schedule of workflow.schedule) {\n const taskIds = scheduleMap.get(schedule) || [];\n taskIds.push(workflow.id);\n scheduleMap.set(schedule, taskIds);\n }\n }\n\n return Object.fromEntries(\n [...scheduleMap.entries()].map(([schedule, taskIds]) => [\n schedule,\n taskIds.length === 1 ? taskIds[0] : taskIds,\n ]),\n );\n}\n\nfunction createNitroTaskWrapper(workflow: FarmDiscoveredWorkflow): string {\n const normalizedPath = workflow.filePath.replace(/\\\\/g, \"/\");\n return `\nimport { defineTask } from \"nitro/runtime\";\nimport { runFarmWorkflowModule } from \"@farm.js/core/workflows\";\nimport * as workflowModule from ${JSON.stringify(normalizedPath)};\n\nexport default defineTask({\n meta: {\n description: ${JSON.stringify(workflow.description || `Farm workflow ${workflow.id}`)}\n },\n async run(event) {\n const payload = event?.payload || {};\n const env = event?.context?.cloudflare?.env || event?.context?.env || process.env;\n return await runFarmWorkflowModule(workflowModule, {\n id: ${JSON.stringify(workflow.id)},\n name: event?.name || ${JSON.stringify(workflow.id)},\n payload,\n scheduledTime: payload.scheduledTime,\n request: event?.context?.request,\n event,\n env\n });\n }\n});\n`.trim();\n}\n\nfunction createNitroWorkflowHTTPHandler(\n config: FarmWorkflowsResolvedConfig,\n workflows: FarmDiscoveredWorkflow[],\n): string {\n return `\nimport { H3 } from \"h3\";\nimport { runTask } from \"nitro/runtime\";\n\nconst route = ${JSON.stringify(config.route)};\nconst secretEnv = ${JSON.stringify(config.secretEnv)};\nconst inlineSecret = ${JSON.stringify(config.secret || \"\")};\nconst workflows = ${JSON.stringify(workflows.map(toWorkflowMetadata))};\nconst workflowIds = new Set(workflows.map((workflow) => workflow.id));\n\nfunction json(value, status = 200) {\n return new Response(JSON.stringify(value), {\n status,\n headers: { \"content-type\": \"application/json\" }\n });\n}\n\nfunction getHeader(event, name) {\n return event.req.headers.get(name);\n}\n\nfunction getSecret() {\n return inlineSecret || process.env[secretEnv] || \"\";\n}\n\nfunction verifySecret(event) {\n const secret = getSecret();\n if (!secret) return null;\n const authorization = getHeader(event, \"authorization\") || \"\";\n const headerSecret = getHeader(event, \"x-farm-workflow-secret\") || \"\";\n const querySecret = event.url.searchParams.get(\"secret\") || \"\";\n const bearer = authorization.startsWith(\"Bearer \") ? authorization.slice(7) : \"\";\n if (headerSecret === secret || querySecret === secret || bearer === secret) return null;\n return json({ error: \"Unauthorized workflow request.\" }, 401);\n}\n\nasync function readPayload(event) {\n if (event.req.method === \"GET\" || event.req.method === \"HEAD\") {\n const payload = Object.fromEntries(event.url.searchParams.entries());\n delete payload.secret;\n return payload;\n }\n return await event.req.json().catch(() => ({}));\n}\n\nexport default new H3()\n .get(route, (event) => {\n const unauthorized = verifySecret(event);\n if (unauthorized) return unauthorized;\n return { workflows };\n })\n .all(route + \"/:id\", async (event) => {\n const id = decodeURIComponent(event.context.params?.id || \"\");\n if (!workflowIds.has(id)) {\n return json({ error: \"Workflow \" + id + \" was not found.\" }, 404);\n }\n\n const unauthorized = verifySecret(event);\n if (unauthorized) return unauthorized;\n\n const payload = await readPayload(event);\n const result = await runTask(id, {\n payload,\n context: {\n source: \"http\",\n request: event.req,\n route,\n url: event.url.href,\n method: event.req.method\n }\n });\n return {\n id,\n ok: true,\n result: result ?? null\n };\n });\n`.trim();\n}\n\nfunction toWorkflowMetadata(workflow: FarmDiscoveredWorkflow) {\n return {\n id: workflow.id,\n description: workflow.description || null,\n schedule: workflow.schedule,\n timezone: workflow.timezone || null,\n path: workflow.routePath,\n };\n}\n\nasync function readWorkflowPayload(request: Request): Promise<unknown> {\n const url = new URL(request.url);\n if (request.method === \"GET\" || request.method === \"HEAD\") {\n const payload = Object.fromEntries(url.searchParams.entries());\n delete payload.secret;\n return payload;\n }\n\n const contentType = request.headers.get(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\")) {\n return await request.json().catch(() => ({}));\n }\n\n const text = await request.text().catch(() => \"\");\n return text ? { text } : {};\n}\n\nfunction readScheduledTime(payload: unknown): number | string | undefined {\n return payload && typeof payload === \"object\" && \"scheduledTime\" in payload\n ? (payload as { scheduledTime?: number | string }).scheduledTime\n : undefined;\n}\n\nfunction verifyWorkflowSecret(\n request: Request,\n config: FarmWorkflowsResolvedConfig,\n): Response | null {\n const secret = config.secret || process.env[config.secretEnv] || \"\";\n if (!secret) return null;\n\n const url = new URL(request.url);\n const authorization = request.headers.get(\"authorization\") || \"\";\n const bearer = authorization.startsWith(\"Bearer \") ? authorization.slice(7) : \"\";\n const headerSecret = request.headers.get(\"x-farm-workflow-secret\") || \"\";\n const querySecret = url.searchParams.get(\"secret\") || \"\";\n if (bearer === secret || headerSecret === secret || querySecret === secret) return null;\n\n return Response.json({ error: \"Unauthorized workflow request.\" }, { status: 401 });\n}\n\nfunction joinRoute(...parts: string[]): string {\n return `/${parts\n .map((part) => trimSlashes(part))\n .filter(Boolean)\n .join(\"/\")}`;\n}\n\nfunction trimSlashes(value: string): string {\n return value.replace(/^\\/+|\\/+$/g, \"\");\n}\n\nfunction safeFileName(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"-\") || \"workflow\";\n}\n\nfunction relativePath(root: string, filePath: string): string {\n return filePath.replace(/\\\\/g, \"/\").replace(`${root.replace(/\\\\/g, \"/\")}/`, \"\");\n}\n","export type FarmCronSchedule = string | string[];\n\nexport interface FarmCronJobConfig {\n /** Portable five-field cron expression, or a list of expressions. */\n schedule: FarmCronSchedule;\n /** Farm API route invoked with GET when the schedule fires. */\n path: string;\n /** Human-readable purpose shown by local tooling and deployment manifests. */\n description?: string;\n /** Disable this schedule without removing its configuration. */\n enabled?: boolean;\n}\n\nexport type FarmCronUserConfig = Record<string, FarmCronJobConfig>;\n\nexport interface FarmCronJob {\n name: string;\n schedule: string[];\n path: string;\n description?: string;\n}\n\nexport interface FarmCronResolvedConfig {\n enabled: boolean;\n secretEnv: typeof DEFAULT_FARM_CRON_SECRET_ENV;\n jobs: FarmCronJob[];\n}\n\nexport interface PreparedFarmCron {\n jobs: FarmCronJob[];\n tasks: Record<string, { handler: string; description: string }>;\n scheduledTasks: Record<string, string | string[]>;\n manifestPath?: string;\n}\n\nexport interface FarmCronRouteOptions {\n /** Environment variable containing the bearer token. */\n secretEnv?: string;\n /** Inline token, primarily useful in tests. Environment variables are preferred. */\n secret?: string;\n /** Allow a production route without a secret. Defaults to false. */\n allowUnsecured?: boolean;\n}\n\nexport interface FarmCronCloudflareConfig {\n deployConfig: true;\n wrangler: {\n triggers: {\n crons: string[];\n };\n };\n}\n\nexport const DEFAULT_FARM_CRON_SECRET_ENV = \"CRON_SECRET\";\nexport const FARM_CRON_MANIFEST = \"cron-manifest.json\";\n\nconst CRON_FIELD_RANGES = [\n [0, 59, \"minute\"],\n [0, 23, \"hour\"],\n [1, 31, \"day of month\"],\n [1, 12, \"month\"],\n [0, 6, \"day of week\"],\n] as const;\n\nexport function resolveCronConfig(\n cron: FarmCronResolvedConfig | FarmCronUserConfig | false | undefined,\n): FarmCronResolvedConfig {\n if (isResolvedCronConfig(cron)) return cron;\n if (!cron) {\n return {\n enabled: false,\n secretEnv: DEFAULT_FARM_CRON_SECRET_ENV,\n jobs: [],\n };\n }\n\n const jobs: FarmCronJob[] = [];\n for (const [name, job] of Object.entries(cron)) {\n if (!job || typeof job !== \"object\" || Array.isArray(job)) {\n throw new TypeError(`Farm cron ${JSON.stringify(name)} must be a configuration object.`);\n }\n if (job.enabled === false) continue;\n jobs.push(normalizeCronJob(name, job));\n }\n\n return {\n enabled: jobs.length > 0,\n secretEnv: DEFAULT_FARM_CRON_SECRET_ENV,\n jobs,\n };\n}\n\nexport async function prepareFarmCronForNitro(config: {\n root?: string;\n distDir?: string;\n cron?: FarmCronResolvedConfig | FarmCronUserConfig | false;\n}): Promise<PreparedFarmCron> {\n const cron = isResolvedCronConfig(config.cron) ? config.cron : resolveCronConfig(config.cron);\n const root = config.root || process.cwd();\n const distDir = config.distDir || \".farm\";\n const fs = await import(\"node:fs/promises\");\n const path = await import(\"node:path\");\n const manifestPath = path.join(root, distDir, FARM_CRON_MANIFEST);\n const generatedDir = path.join(root, distDir, \".nitro\", \"farm-cron\");\n\n if (!cron.enabled) {\n await Promise.all([\n fs.rm(manifestPath, { force: true }),\n fs.rm(generatedDir, { recursive: true, force: true }),\n ]);\n return {\n jobs: [],\n tasks: {},\n scheduledTasks: {},\n };\n }\n\n await fs.rm(generatedDir, { recursive: true, force: true });\n await fs.mkdir(generatedDir, { recursive: true });\n\n const tasks: PreparedFarmCron[\"tasks\"] = {};\n for (const job of cron.jobs) {\n const taskName = getFarmCronTaskName(job.name);\n const wrapperPath = path.join(generatedDir, `${safeFileName(job.name)}.mjs`);\n await fs.writeFile(wrapperPath, createNitroCronTaskWrapper(job, cron.secretEnv), \"utf8\");\n tasks[taskName] = {\n handler: wrapperPath,\n description: job.description || `Farm cron ${job.name}`,\n };\n }\n\n const manifest = createFarmCronManifest(cron);\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, \"utf8\");\n\n return {\n jobs: cron.jobs,\n tasks,\n scheduledTasks: createCronScheduledTasks(cron.jobs),\n manifestPath,\n };\n}\n\nexport function createFarmCronManifest(cron: FarmCronResolvedConfig) {\n return {\n schemaVersion: 1,\n secretEnv: cron.secretEnv,\n jobs: cron.jobs.map((job) => ({\n name: job.name,\n schedule: job.schedule,\n path: job.path,\n description: job.description || null,\n })),\n };\n}\n\nexport function createFarmCronVercelCrons(\n jobs: FarmCronJob[],\n): Array<{ path: string; schedule: string }> {\n return jobs.flatMap((job) =>\n job.schedule.map((schedule) => ({\n path: job.path,\n schedule,\n })),\n );\n}\n\nexport function applyFarmCronVercelCrons(\n vercelConfig: Record<string, any>,\n jobs: FarmCronJob[],\n): Record<string, any> {\n const existingCrons = Array.isArray(vercelConfig.crons) ? vercelConfig.crons : [];\n const seen = new Set(existingCrons.map((cron) => `${cron.path}:${cron.schedule}`));\n const crons = [...existingCrons];\n\n for (const cron of createFarmCronVercelCrons(jobs)) {\n const key = `${cron.path}:${cron.schedule}`;\n if (seen.has(key)) continue;\n seen.add(key);\n crons.push(cron);\n }\n\n return crons.length > 0 ? { ...vercelConfig, crons } : vercelConfig;\n}\n\nexport function createFarmCronCloudflareTriggers(jobs: FarmCronJob[]): string[] {\n return [...new Set(jobs.flatMap((job) => job.schedule))];\n}\n\nexport function createFarmCronCloudflareConfig(\n jobs: FarmCronJob[],\n): FarmCronCloudflareConfig | undefined {\n const crons = createFarmCronCloudflareTriggers(jobs);\n if (crons.length === 0) return undefined;\n\n return {\n deployConfig: true,\n wrangler: {\n triggers: { crons },\n },\n };\n}\n\nexport function mergeScheduledTasks(\n ...maps: Array<Record<string, string | string[]> | undefined>\n): Record<string, string | string[]> {\n const merged = new Map<string, string[]>();\n\n for (const map of maps) {\n for (const [schedule, taskNames] of Object.entries(map || {})) {\n const current = merged.get(schedule) || [];\n for (const taskName of Array.isArray(taskNames) ? taskNames : [taskNames]) {\n if (!current.includes(taskName)) current.push(taskName);\n }\n merged.set(schedule, current);\n }\n }\n\n return Object.fromEntries(\n [...merged].map(([schedule, taskNames]) => [\n schedule,\n taskNames.length === 1 ? taskNames[0] : taskNames,\n ]),\n );\n}\n\nexport function isCronRequestAuthorized(\n request: Request,\n options: FarmCronRouteOptions = {},\n): boolean {\n const secretEnv = options.secretEnv || DEFAULT_FARM_CRON_SECRET_ENV;\n const secret = options.secret || readEnvironmentValue(secretEnv);\n if (!secret) {\n return (\n options.allowUnsecured === true ||\n (!getFarmRuntimeBindings() && readEnvironmentValue(\"NODE_ENV\") !== \"production\")\n );\n }\n\n const authorization = request.headers.get(\"authorization\") || \"\";\n const bearer = authorization.startsWith(\"Bearer \") ? authorization.slice(7) : \"\";\n return bearer === secret || request.headers.get(\"x-farm-cron-secret\") === secret;\n}\n\nexport function cronRoute<TArgs extends unknown[], TResult>(\n handler: (request: Request, ...args: TArgs) => TResult,\n options: FarmCronRouteOptions = {},\n): (request: Request, ...args: TArgs) => TResult | Promise<Response> {\n return (request, ...args) => {\n if (!isCronRequestAuthorized(request, options)) {\n return Promise.resolve(\n Response.json({ error: \"Unauthorized cron request.\" }, { status: 401 }),\n );\n }\n return handler(request, ...args);\n };\n}\n\nfunction normalizeCronJob(name: string, job: FarmCronJobConfig): FarmCronJob {\n if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(name)) {\n throw new TypeError(\n `Farm cron name ${JSON.stringify(name)} must start with a letter or number and contain only letters, numbers, dots, underscores, or hyphens.`,\n );\n }\n if (!job || typeof job !== \"object\" || Array.isArray(job)) {\n throw new TypeError(`Farm cron ${JSON.stringify(name)} must be a configuration object.`);\n }\n\n const path = normalizeCronPath(name, job.path);\n const rawSchedule = Array.isArray(job.schedule) ? job.schedule : [job.schedule];\n const schedule = [...new Set(rawSchedule.map((value) => normalizeCronExpression(name, value)))];\n if (schedule.length === 0) {\n throw new TypeError(`Farm cron ${JSON.stringify(name)} must define at least one schedule.`);\n }\n\n return {\n name,\n schedule,\n path,\n description: job.description?.trim() || undefined,\n };\n}\n\nfunction normalizeCronPath(name: string, value: unknown): string {\n if (typeof value !== \"string\" || !value.trim().startsWith(\"/\")) {\n throw new TypeError(`Farm cron ${JSON.stringify(name)} path must start with \"/\".`);\n }\n\n const path = value.trim();\n if (path.startsWith(\"//\") || path.includes(\"?\") || path.includes(\"#\")) {\n throw new TypeError(\n `Farm cron ${JSON.stringify(name)} path must be an application pathname without a host, query, or hash.`,\n );\n }\n return path.length > 1 ? path.replace(/\\/+$/, \"\") : path;\n}\n\nfunction normalizeCronExpression(name: string, value: unknown): string {\n if (typeof value !== \"string\") {\n throw new TypeError(`Farm cron ${JSON.stringify(name)} schedule must be a string.`);\n }\n\n const expression = value.trim().replace(/\\s+/g, \" \");\n const fields = expression.split(\" \");\n if (fields.length !== CRON_FIELD_RANGES.length) {\n throw new TypeError(\n `Farm cron ${JSON.stringify(name)} schedule ${JSON.stringify(expression)} must use five fields: minute hour day-of-month month day-of-week.`,\n );\n }\n\n fields.forEach((field, index) => {\n const [minimum, maximum, label] = CRON_FIELD_RANGES[index];\n validateCronField(name, expression, field, minimum, maximum, label);\n });\n if (fields[2] !== \"*\" && fields[4] !== \"*\") {\n throw new TypeError(\n `Farm cron ${JSON.stringify(name)} schedule ${JSON.stringify(expression)} cannot constrain both day-of-month and day-of-week.`,\n );\n }\n return expression;\n}\n\nfunction validateCronField(\n name: string,\n expression: string,\n field: string,\n minimum: number,\n maximum: number,\n label: string,\n): void {\n for (const segment of field.split(\",\")) {\n const [range, stepText, ...extra] = segment.split(\"/\");\n if (!range || extra.length > 0 || (stepText !== undefined && !isIntegerInRange(stepText, 1))) {\n throwInvalidCronField(name, expression, label);\n }\n\n if (range === \"*\") continue;\n const bounds = range.split(\"-\");\n if (bounds.length > 2 || !bounds.every((value) => isIntegerInRange(value, minimum, maximum))) {\n throwInvalidCronField(name, expression, label);\n }\n if (bounds.length === 2 && Number(bounds[0]) > Number(bounds[1])) {\n throwInvalidCronField(name, expression, label);\n }\n }\n}\n\nfunction isIntegerInRange(value: string, minimum: number, maximum = Number.MAX_SAFE_INTEGER) {\n if (!/^\\d+$/.test(value)) return false;\n const parsed = Number(value);\n return parsed >= minimum && parsed <= maximum;\n}\n\nfunction throwInvalidCronField(name: string, expression: string, label: string): never {\n throw new TypeError(\n `Farm cron ${JSON.stringify(name)} schedule ${JSON.stringify(expression)} has an invalid ${label} field.`,\n );\n}\n\nfunction isResolvedCronConfig(value: unknown): value is FarmCronResolvedConfig {\n return (\n !!value &&\n typeof value === \"object\" &&\n \"enabled\" in value &&\n typeof (value as FarmCronResolvedConfig).enabled === \"boolean\" &&\n \"jobs\" in value &&\n Array.isArray((value as FarmCronResolvedConfig).jobs) &&\n \"secretEnv\" in value\n );\n}\n\nfunction createCronScheduledTasks(jobs: FarmCronJob[]): Record<string, string | string[]> {\n const scheduledTasks: Record<string, string | string[]> = {};\n for (const job of jobs) {\n const taskName = getFarmCronTaskName(job.name);\n for (const schedule of job.schedule) {\n scheduledTasks[schedule] = mergeTaskNames(scheduledTasks[schedule], taskName);\n }\n }\n return scheduledTasks;\n}\n\nfunction mergeTaskNames(\n current: string | string[] | undefined,\n taskName: string,\n): string | string[] {\n if (!current) return taskName;\n const names = Array.isArray(current) ? current : [current];\n return names.includes(taskName) ? names : [...names, taskName];\n}\n\nfunction getFarmCronTaskName(name: string): string {\n return `farm:cron:${name}`;\n}\n\nfunction createNitroCronTaskWrapper(job: FarmCronJob, secretEnv: string): string {\n return `\nimport { defineTask, useNitroApp } from \"nitro/runtime\";\n\nconst name = ${JSON.stringify(job.name)};\nconst path = ${JSON.stringify(job.path)};\nconst secretEnv = ${JSON.stringify(secretEnv)};\n\nfunction readSecret(event) {\n const runtimeEnv = event?.context?.cloudflare?.env || event?.context?.env || {};\n return runtimeEnv[secretEnv] || (typeof process !== \"undefined\" ? process.env?.[secretEnv] : \"\") || \"\";\n}\n\nexport default defineTask({\n meta: {\n name: ${JSON.stringify(getFarmCronTaskName(job.name))},\n description: ${JSON.stringify(job.description || `Farm cron ${job.name}`)}\n },\n async run(event) {\n const headers = new Headers({\n \"x-farm-cron-name\": name,\n \"x-farm-cron-scheduled-at\": String(event?.payload?.scheduledTime || Date.now())\n });\n const secret = readSecret(event);\n if (secret) headers.set(\"authorization\", \"Bearer \" + secret);\n\n const response = await useNitroApp().fetch(path, { method: \"GET\", headers });\n const contentType = response.headers.get(\"content-type\") || \"\";\n const body = response.status === 204\n ? null\n : contentType.includes(\"application/json\")\n ? await response.json().catch(() => null)\n : await response.text();\n\n if (!response.ok) {\n const detail = typeof body === \"string\" ? body : JSON.stringify(body);\n throw new Error(\n \"Farm cron \" + JSON.stringify(name) + \" received \" + response.status +\n \" from \" + path + (detail ? \": \" + detail : \"\")\n );\n }\n\n return { result: body };\n }\n});\n`.trim();\n}\n\nfunction readEnvironmentValue(name: string): string | undefined {\n const runtimeValue = getFarmRuntimeBindings()?.[name];\n if (typeof runtimeValue === \"string\") return runtimeValue;\n return typeof process !== \"undefined\" ? process.env?.[name] : undefined;\n}\n\nfunction getFarmRuntimeBindings(): Record<string, unknown> | undefined {\n const runtimeBindings = (\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","export interface EnvSchema<TOutput = unknown> {\n parse(value: unknown): TOutput;\n}\n\nexport type EnvParser<TOutput = unknown> =\n | EnvSchema<TOutput>\n | ((value: string | undefined, context: { key: string; scope: \"server\" | \"public\" }) => TOutput);\n\nexport type EnvShape = Record<string, EnvParser<any>>;\n\nexport type InferEnvParser<TParser> =\n TParser extends EnvSchema<infer TOutput>\n ? TOutput\n : TParser extends (value: string | undefined, context: any) => infer TOutput\n ? TOutput\n : never;\n\nexport type InferEnvShape<TShape> = TShape extends EnvShape\n ? { [K in keyof TShape]: InferEnvParser<TShape[K]> }\n : {};\n\nexport interface FarmEnvConfig<\n TServer extends EnvShape = EnvShape,\n TPublic extends EnvShape = EnvShape,\n> {\n server?: TServer;\n public?: TPublic;\n}\n\nexport interface ResolvedFarmEnv<\n TServer extends Record<string, any> = Record<string, unknown>,\n TPublic extends Record<string, any> = Record<string, unknown>,\n> {\n server: TServer;\n public: TPublic;\n}\n\nexport type InferEnv<TConfig> =\n TConfig extends FarmEnvConfig<infer TServer, infer TPublic>\n ? ResolvedFarmEnv<InferEnvShape<TServer>, InferEnvShape<TPublic>>\n : ResolvedFarmEnv;\n\n/**\n * Augmented by generated src/farm-env.d.ts for project-specific autocomplete.\n */\nexport interface FarmEnvTypes {}\n\nexport type FarmServerEnv = FarmEnvTypes extends { server: infer TServer }\n ? TServer extends Record<string, any>\n ? TServer\n : Record<string, unknown>\n : Record<string, unknown>;\n\nexport type FarmPublicEnv = FarmEnvTypes extends { public: infer TPublic }\n ? TPublic extends Record<string, any>\n ? TPublic\n : Record<string, unknown>\n : Record<string, unknown>;\n\nexport type FarmTypedEnv = ResolvedFarmEnv<FarmServerEnv, FarmPublicEnv>;\n\ndeclare const __FARM_PUBLIC_ENV__: Record<string, unknown> | undefined;\ndeclare const __FARM_ENV__: ResolvedFarmEnv | undefined;\n\nconst FARM_ENV_SYMBOL = Symbol.for(\"farm.env\");\nconst farmEnvGlobal = globalThis as typeof globalThis & {\n [FARM_ENV_SYMBOL]?: ResolvedFarmEnv;\n};\nlet currentEnv: ResolvedFarmEnv = getInitialEnv();\n\nexport function resolveEnv<TConfig extends FarmEnvConfig<any, any> | undefined>(\n config: TConfig,\n source: Record<string, string | undefined> = getProcessEnv(),\n): InferEnv<NonNullable<TConfig>> {\n const resolved = {\n server: resolveEnvScope(config?.server, source, \"server\"),\n public: resolveEnvScope(config?.public, source, \"public\"),\n } as InferEnv<NonNullable<TConfig>>;\n\n return resolved;\n}\n\nexport function setEnv(env: ResolvedFarmEnv): void {\n currentEnv = normalizeResolvedEnv(env);\n if (typeof window === \"undefined\") {\n farmEnvGlobal[FARM_ENV_SYMBOL] = currentEnv;\n }\n}\n\nexport function getResolvedEnv<TEnv extends ResolvedFarmEnv = FarmTypedEnv>(): TEnv {\n return getCurrentEnv() as TEnv;\n}\n\nexport function getEnv<TServer extends Record<string, any> = FarmServerEnv>(): TServer;\nexport function getEnv<TKey extends Extract<keyof FarmServerEnv, string>>(\n key: TKey,\n): FarmServerEnv[TKey];\nexport function getEnv(key?: string): unknown {\n assertServerEnvAccess();\n if (key === undefined) {\n return getCurrentEnv().server;\n }\n\n return getCurrentEnv().server[key];\n}\n\nexport function getPublicEnv<TPublic extends Record<string, any> = FarmPublicEnv>(): TPublic;\nexport function getPublicEnv<TKey extends Extract<keyof FarmPublicEnv, string>>(\n key: TKey,\n): FarmPublicEnv[TKey];\nexport function getPublicEnv(key?: string): unknown {\n if (key === undefined) {\n return getCurrentEnv().public;\n }\n\n return getCurrentEnv().public[key];\n}\n\nexport const env = createEnvProxy(\"server\") as FarmServerEnv;\nexport const serverEnv = env;\nexport const publicEnv = createEnvProxy(\"public\") as FarmPublicEnv;\n\nfunction resolveEnvScope(\n shape: EnvShape | undefined,\n source: Record<string, string | undefined>,\n scope: \"server\" | \"public\",\n): Record<string, unknown> {\n if (!shape) {\n return {};\n }\n\n const resolved: Record<string, unknown> = {};\n\n for (const [key, parser] of Object.entries(shape)) {\n try {\n resolved[key] = parseEnvValue(parser, source[key], key, scope);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid ${scope} env \"${key}\": ${message}`);\n }\n }\n\n return resolved;\n}\n\nfunction parseEnvValue(\n parser: EnvParser<any>,\n value: string | undefined,\n key: string,\n scope: \"server\" | \"public\",\n): unknown {\n if (typeof parser === \"function\") {\n return parser(value, { key, scope });\n }\n\n if (parser && typeof parser.parse === \"function\") {\n return parser.parse(value);\n }\n\n throw new Error(\"expected a parser function or schema with parse()\");\n}\n\nfunction createEnvProxy(scope: \"server\" | \"public\"): Record<string, unknown> {\n return new Proxy(\n {},\n {\n get(_target, property) {\n if (typeof property === \"symbol\") {\n return undefined;\n }\n\n const env = getEnvScope(scope);\n return env[property];\n },\n ownKeys() {\n return Reflect.ownKeys(getEnvScope(scope));\n },\n getOwnPropertyDescriptor(_target, property) {\n const env = getEnvScope(scope);\n if (!(property in env)) {\n return undefined;\n }\n\n return {\n enumerable: true,\n configurable: true,\n value: env[property as keyof typeof env],\n };\n },\n has(_target, property) {\n return property in getEnvScope(scope);\n },\n },\n );\n}\n\nfunction getEnvScope(scope: \"server\" | \"public\"): Record<string, unknown> {\n if (scope === \"server\") {\n assertServerEnvAccess();\n }\n\n return getCurrentEnv()[scope] || {};\n}\n\nfunction assertServerEnvAccess(): void {\n if (typeof window !== \"undefined\") {\n throw new Error(\"Farm server env is not available in the browser. Use publicEnv.\");\n }\n}\n\nfunction getInitialEnv(): ResolvedFarmEnv {\n const injectedEnv = getInjectedEnv();\n if (injectedEnv) {\n return injectedEnv;\n }\n\n if (typeof window === \"undefined\" && farmEnvGlobal[FARM_ENV_SYMBOL]) {\n return normalizeResolvedEnv(farmEnvGlobal[FARM_ENV_SYMBOL]);\n }\n\n return {\n server: {},\n public: getInjectedPublicEnv(),\n };\n}\n\nfunction getCurrentEnv(): ResolvedFarmEnv {\n if (typeof window === \"undefined\" && farmEnvGlobal[FARM_ENV_SYMBOL]) {\n return farmEnvGlobal[FARM_ENV_SYMBOL];\n }\n\n return currentEnv;\n}\n\nfunction getInjectedEnv(): ResolvedFarmEnv | null {\n try {\n if (typeof __FARM_ENV__ !== \"undefined\" && __FARM_ENV__) {\n return normalizeResolvedEnv(__FARM_ENV__);\n }\n } catch {\n // The compile-time global is only defined in Farm server bundles.\n }\n\n return null;\n}\n\nfunction getInjectedPublicEnv(): Record<string, unknown> {\n try {\n if (typeof __FARM_PUBLIC_ENV__ !== \"undefined\" && __FARM_PUBLIC_ENV__) {\n return __FARM_PUBLIC_ENV__;\n }\n } catch {\n // The compile-time global is only defined in Farm browser bundles.\n }\n\n return {};\n}\n\nfunction normalizeResolvedEnv(env: ResolvedFarmEnv): ResolvedFarmEnv {\n return {\n server: isRecord(env.server) ? env.server : {},\n public: isRecord(env.public) ? env.public : {},\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction getProcessEnv(): Record<string, string | undefined> {\n if (typeof process !== \"undefined\" && process.env) {\n return process.env;\n }\n\n return {};\n}\n","import React from \"react\";\nimport { readFile } from \"fs/promises\";\nimport path from \"path\";\nimport { pathToFileURL } from \"url\";\nimport type { Metadata, RouteModule } from \"./types\";\n\nexport type FarmMdxComponent = React.ComponentType<any> | keyof React.JSX.IntrinsicElements;\nexport type FarmMdxComponents = Record<string, FarmMdxComponent>;\n\nexport interface FarmMdxUserConfig {\n /**\n * Component map or module path that exports `components` or a default component map.\n * Relative paths resolve from the project root.\n */\n components?: string | FarmMdxComponents;\n /**\n * Serve source-authored markdown pages at `/route.md`.\n * Enabled by default for `page.md` and `page.mdx`.\n */\n markdownRoutes?: boolean;\n /**\n * Class name used for the wrapper around rendered markdown content.\n */\n className?: string;\n}\n\nexport interface FarmMdxResolvedConfig {\n components?: string | FarmMdxComponents;\n markdownRoutes: boolean;\n className: string;\n}\n\nexport interface FarmMarkdownPageSource {\n source: string;\n filePath: string;\n}\n\nexport interface FarmMarkdownPageModuleInput extends FarmMarkdownPageSource {\n components?: FarmMdxComponents;\n config?: FarmMdxResolvedConfig;\n}\n\nexport function resolveMdxConfig(config: FarmMdxUserConfig | undefined): FarmMdxResolvedConfig {\n return {\n components: config?.components,\n markdownRoutes: config?.markdownRoutes ?? true,\n className: config?.className ?? \"farm-markdown\",\n };\n}\n\nexport function isFarmMarkdownPageFile(filePath: string): boolean {\n return /(^|[/\\\\])page\\.mdx?$/i.test(filePath);\n}\n\nexport function normalizeFarmMarkdownRoutePath(pathname: string): string {\n const withoutExtension = pathname.replace(/\\.md$/i, \"\");\n const normalized = withoutExtension.startsWith(\"/\") ? withoutExtension : `/${withoutExtension}`;\n return normalized === \"/index\" ? \"/\" : normalized.replace(/\\/+$/g, \"\") || \"/\";\n}\n\nexport function parseMarkdownFrontmatter(source: string): {\n frontmatter: Record<string, string>;\n body: string;\n} {\n if (!source.startsWith(\"---\")) {\n return { frontmatter: {}, body: source };\n }\n\n const endIndex = source.indexOf(\"\\n---\", 3);\n if (endIndex === -1) {\n return { frontmatter: {}, body: source };\n }\n\n const frontmatterSource = source.slice(3, endIndex).trim();\n const closingFenceEnd = endIndex + \"\\n---\".length;\n const bodyStart =\n source.slice(closingFenceEnd, closingFenceEnd + 2) === \"\\r\\n\"\n ? closingFenceEnd + 2\n : source[closingFenceEnd] === \"\\n\"\n ? closingFenceEnd + 1\n : closingFenceEnd;\n const body = source.slice(bodyStart);\n const frontmatter: Record<string, string> = {};\n\n for (const line of frontmatterSource.split(/\\r?\\n/)) {\n const separator = line.indexOf(\":\");\n if (separator === -1) continue;\n const key = line.slice(0, separator).trim();\n const value = line\n .slice(separator + 1)\n .trim()\n .replace(/^[\"']|[\"']$/g, \"\");\n if (key && value) frontmatter[key] = value;\n }\n\n return { frontmatter, body };\n}\n\nexport function titleFromMarkdown(body: string, fallback?: string): string | undefined {\n return body.match(/^#\\s+(.+)$/m)?.[1]?.trim() || fallback;\n}\n\nexport function createMarkdownMetadata(\n source: string,\n filePath: string,\n): (Metadata & Record<string, any>) | undefined {\n const { frontmatter, body } = parseMarkdownFrontmatter(source);\n const routeTitle = titleFromMarkdown(body);\n const title = frontmatter.title || routeTitle;\n const description = frontmatter.description;\n\n if (!title && !description) {\n return undefined;\n }\n\n return {\n ...(title ? { title } : {}),\n ...(description ? { description } : {}),\n source: filePath,\n };\n}\n\nasync function evaluateMdxSource(source: string, filePath: string) {\n const [{ evaluate }, runtime, remarkGfmModule] = await Promise.all([\n import(\"@mdx-js/mdx\"),\n import(\"react/jsx-runtime\"),\n import(\"remark-gfm\"),\n ]);\n const remarkGfm = remarkGfmModule.default;\n\n return evaluate(source, {\n ...runtime,\n baseUrl: pathToFileURL(filePath),\n remarkPlugins: [remarkGfm],\n });\n}\n\nexport function createFarmMarkdownRouteModule(\n input: FarmMarkdownPageModuleInput,\n): RouteModule & { source: string } {\n const { body } = parseMarkdownFrontmatter(input.source);\n const components = input.components || {};\n const className = input.config?.className || \"farm-markdown\";\n let evaluatedPromise: Promise<{ default: React.ComponentType<any> }> | undefined;\n\n const loadContent = async () => {\n evaluatedPromise ??= evaluateMdxSource(body, input.filePath) as Promise<{\n default: React.ComponentType<any>;\n }>;\n return evaluatedPromise;\n };\n\n async function FarmMarkdownPage(props: any) {\n const evaluated = await loadContent();\n const MDXContent = evaluated.default;\n return React.createElement(\n \"article\",\n { className, \"data-farm-markdown-page\": \"\" },\n React.createElement(MDXContent, {\n ...props,\n components: {\n ...components,\n ...props?.components,\n },\n }),\n );\n }\n\n return {\n default: FarmMarkdownPage as unknown as RouteModule[\"default\"],\n metadata: createMarkdownMetadata(input.source, input.filePath),\n source: input.source,\n };\n}\n\nexport async function createFarmMarkdownRouteModuleFromFile(\n filePath: string,\n options: {\n components?: FarmMdxComponents;\n config?: FarmMdxResolvedConfig;\n } = {},\n) {\n const source = await readFile(filePath, \"utf8\");\n return createFarmMarkdownRouteModule({\n source,\n filePath,\n components: options.components,\n config: options.config,\n });\n}\n\nexport async function loadFarmMdxComponents(\n config: FarmMdxResolvedConfig | undefined,\n options: {\n root: string;\n loadModule?: (modulePath: string) => Promise<unknown>;\n },\n): Promise<FarmMdxComponents> {\n const configured = config?.components;\n if (!configured) {\n return {};\n }\n\n if (typeof configured !== \"string\") {\n return configured;\n }\n\n const modulePath = path.isAbsolute(configured) ? configured : path.join(options.root, configured);\n const mod = options.loadModule\n ? await options.loadModule(modulePath)\n : await import(pathToFileURL(modulePath).href);\n const maybeModule = mod as {\n components?: FarmMdxComponents;\n default?: FarmMdxComponents;\n };\n\n return maybeModule.components || maybeModule.default || {};\n}\n\nexport async function createFarmMarkdownSourceResponse(options: {\n request: Request;\n config?: FarmMdxResolvedConfig;\n resolveSource: (\n pathname: string,\n ) => Promise<FarmMarkdownPageSource | null> | FarmMarkdownPageSource | null;\n}): Promise<Response | null> {\n if (options.request.method !== \"GET\" && options.request.method !== \"HEAD\") {\n return null;\n }\n if (options.config?.markdownRoutes === false) {\n return null;\n }\n\n const url = new URL(options.request.url);\n if (!url.pathname.endsWith(\".md\")) {\n return null;\n }\n\n const targetPathname = normalizeFarmMarkdownRoutePath(url.pathname);\n const source = await options.resolveSource(targetPathname);\n if (!source) {\n return null;\n }\n\n return new Response(options.request.method === \"HEAD\" ? null : source.source, {\n status: 200,\n headers: {\n \"Content-Type\": \"text/markdown; charset=utf-8\",\n \"Cache-Control\": \"public, s-maxage=60, stale-while-revalidate=300\",\n \"X-Farm-Markdown-Route\": targetPathname,\n \"X-Farm-Markdown-Source\": source.filePath,\n },\n });\n}\n","export type FarmRouteRuntime = \"auto\" | \"node\" | \"edge\";\nexport type FarmRouteRegions = \"auto\" | readonly string[];\nexport type FarmRouteMaxDuration = \"auto\" | number;\n\n/** Portable execution controls shared by file, programmatic, and config routes. */\nexport interface FarmRouteRuntimeConfig {\n runtime?: FarmRouteRuntime;\n regions?: FarmRouteRegions;\n maxDuration?: FarmRouteMaxDuration;\n}\n\nexport interface ResolvedFarmRouteRuntimeConfig {\n runtime: FarmRouteRuntime;\n regions?: string[];\n maxDuration?: number;\n}\n\nexport type FarmRouteRuntimeEntryKind = \"page\" | \"api\" | \"rule\";\nexport type FarmRouteRenderingMode = \"static\" | \"dynamic\";\n\nexport interface FarmRouteRuntimeManifestEntry extends ResolvedFarmRouteRuntimeConfig {\n kind: FarmRouteRuntimeEntryKind;\n pattern: string;\n rendering: FarmRouteRenderingMode;\n source?: string;\n}\n\nexport interface FarmRouteRuntimeManifest {\n version: 1;\n routes: FarmRouteRuntimeManifestEntry[];\n}\n\nexport function normalizeFarmRouteRuntimeConfig(\n value: FarmRouteRuntimeConfig | null | undefined,\n source = \"Route configuration\",\n): FarmRouteRuntimeConfig {\n if (!value) return {};\n\n const normalized: FarmRouteRuntimeConfig = {};\n\n if (value.runtime !== undefined) {\n if (value.runtime !== \"auto\" && value.runtime !== \"node\" && value.runtime !== \"edge\") {\n throw new TypeError(`${source} runtime must be \"auto\", \"node\", or \"edge\"`);\n }\n normalized.runtime = value.runtime;\n }\n\n if (value.regions !== undefined) {\n if (value.regions === \"auto\") {\n normalized.regions = \"auto\";\n } else {\n if (!Array.isArray(value.regions) || value.regions.length === 0) {\n throw new TypeError(`${source} regions must be \"auto\" or a non-empty string array`);\n }\n\n const regions = Array.from(\n new Set(\n value.regions.map((region) => {\n if (\n typeof region !== \"string\" ||\n !region.trim() ||\n /[\\u0000-\\u001f\\u007f]/.test(region)\n ) {\n throw new TypeError(`${source} regions must contain non-empty region identifiers`);\n }\n return region.trim();\n }),\n ),\n );\n\n normalized.regions = regions;\n }\n }\n\n if (value.maxDuration !== undefined) {\n if (value.maxDuration === \"auto\") {\n normalized.maxDuration = \"auto\";\n } else if (\n typeof value.maxDuration !== \"number\" ||\n !Number.isInteger(value.maxDuration) ||\n value.maxDuration <= 0\n ) {\n throw new TypeError(`${source} maxDuration must be \"auto\" or a positive integer in seconds`);\n } else {\n normalized.maxDuration = value.maxDuration;\n }\n }\n\n return normalized;\n}\n\n/** Merge from lowest to highest precedence. Explicit \"auto\" values reset inherited hints. */\nexport function mergeFarmRouteRuntimeConfigs(\n ...configs: Array<FarmRouteRuntimeConfig | null | undefined>\n): FarmRouteRuntimeConfig {\n const merged: FarmRouteRuntimeConfig = {};\n\n for (const config of configs) {\n if (!config) continue;\n if (config.runtime !== undefined) merged.runtime = config.runtime;\n if (config.regions !== undefined) merged.regions = config.regions;\n if (config.maxDuration !== undefined) merged.maxDuration = config.maxDuration;\n }\n\n return merged;\n}\n\nexport function resolveFarmRouteRuntimeConfig(\n config: FarmRouteRuntimeConfig | null | undefined,\n source?: string,\n): ResolvedFarmRouteRuntimeConfig {\n const normalized = normalizeFarmRouteRuntimeConfig(config, source);\n\n return {\n runtime: normalized.runtime ?? \"auto\",\n ...(normalized.regions && normalized.regions !== \"auto\"\n ? { regions: [...normalized.regions] }\n : {}),\n ...(typeof normalized.maxDuration === \"number\" ? { maxDuration: normalized.maxDuration } : {}),\n };\n}\n\nexport function hasFarmRouteRuntimeControls(\n config: FarmRouteRuntimeConfig | null | undefined,\n): boolean {\n return Boolean(\n config &&\n (config.runtime !== undefined ||\n config.regions !== undefined ||\n config.maxDuration !== undefined),\n );\n}\n\nexport function getFarmRouteRuntimeConfig(value: unknown): FarmRouteRuntimeConfig {\n if (!value || typeof value !== \"object\") return {};\n const route = value as FarmRouteRuntimeConfig;\n return {\n ...(route.runtime !== undefined ? { runtime: route.runtime } : {}),\n ...(route.regions !== undefined ? { regions: route.regions } : {}),\n ...(route.maxDuration !== undefined ? { maxDuration: route.maxDuration } : {}),\n };\n}\n\nexport function createFarmRouteRuntimeKey(config: ResolvedFarmRouteRuntimeConfig): string {\n return JSON.stringify({\n runtime: config.runtime,\n regions: config.regions || null,\n maxDuration: config.maxDuration || null,\n });\n}\n\n/** Resolve matching route rules from broadest to most specific. */\nexport function resolveFarmRouteRuleRuntimeConfig(\n pathname: string,\n routeRules: Record<string, FarmRouteRuntimeConfig> | null | undefined,\n): FarmRouteRuntimeConfig {\n if (!routeRules) return {};\n\n const matches = Object.entries(routeRules)\n .filter(\n ([pattern, rule]) =>\n hasFarmRouteRuntimeControls(rule) && farmRouteRuleMatches(pattern, pathname),\n )\n .sort(([left], [right]) => compareFarmRouteRuleSpecificity(left, right));\n\n return mergeFarmRouteRuntimeConfigs(...matches.map(([, rule]) => rule));\n}\n\nexport function farmRouteRuleMatches(pattern: string, pathname: string): boolean {\n const normalizedPattern = normalizeRoutePattern(pattern);\n const normalizedPathname = normalizeRoutePattern(pathname);\n if (normalizedPattern === normalizedPathname) return true;\n\n const expression = normalizedPattern\n .split(\"/\")\n .filter(Boolean)\n .map((segment) => {\n if (segment === \"**\") return \".*\";\n if (segment === \"*\") return \"[^/]+\";\n if (/^\\[\\[\\.\\.\\..+\\]\\]$/.test(segment)) return \".*\";\n if (/^\\[\\.\\.\\..+\\]$/.test(segment)) return \".+\";\n if (/^\\[.+\\]$/.test(segment) || /^:.+$/.test(segment)) return \"[^/]+\";\n return escapeRegExp(segment);\n })\n .join(\"/\");\n\n return new RegExp(`^/${expression}/?$`).test(normalizedPathname);\n}\n\nfunction compareFarmRouteRuleSpecificity(left: string, right: string): number {\n const leftScore = getFarmRouteRuleSpecificity(left);\n const rightScore = getFarmRouteRuleSpecificity(right);\n return leftScore - rightScore || left.localeCompare(right);\n}\n\nfunction getFarmRouteRuleSpecificity(pattern: string): number {\n return normalizeRoutePattern(pattern)\n .split(\"/\")\n .filter(Boolean)\n .reduce((score, segment) => {\n if (segment === \"**\" || segment.startsWith(\"[[...\")) return score + 1;\n if (segment === \"*\" || segment.startsWith(\"[...\")) return score + 10;\n if (/^\\[.+\\]$/.test(segment) || /^:.+$/.test(segment)) return score + 50;\n return score + 100;\n }, 0);\n}\n\nfunction normalizeRoutePattern(value: string): string {\n const withSlash = value.trim().startsWith(\"/\") ? value.trim() : `/${value.trim()}`;\n return withSlash.length > 1 ? withSlash.replace(/\\/+$/, \"\") : withSlash;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import type { HeaderConfig, RedirectConfig } from \"./config\";\nimport type { FarmRouteRuntimeConfig } from \"./route-runtime\";\nimport { normalizeFarmRouteRuntimeConfig } from \"./route-runtime\";\n\nexport type FarmRouteRuleRenderMode = \"static\" | \"dynamic\";\n\nexport type FarmRouteRuleRedirect =\n | string\n | {\n to: string;\n statusCode?: number;\n permanent?: boolean;\n };\n\nexport type FarmRouteRuleCors =\n | boolean\n | {\n origin?: string;\n methods?: string | readonly string[];\n headers?: string | readonly string[];\n };\n\nexport interface FarmRouteRule extends FarmRouteRuntimeConfig {\n prerender?: boolean;\n render?: FarmRouteRuleRenderMode;\n ssr?: boolean;\n swr?: boolean | number;\n isr?: boolean | number;\n cors?: FarmRouteRuleCors;\n headers?: Record<string, string>;\n redirect?: FarmRouteRuleRedirect;\n}\n\nexport type FarmRouteRules = Record<string, FarmRouteRule>;\n\nexport function normalizeRouteRules(routeRules: FarmRouteRules | undefined): FarmRouteRules {\n if (!routeRules) return {};\n\n const normalized: FarmRouteRules = {};\n for (const [source, rule] of Object.entries(routeRules)) {\n if (!source || !rule) continue;\n const normalizedSource = normalizeRuleSource(source);\n normalized[normalizedSource] = {\n ...rule,\n ...normalizeFarmRouteRuntimeConfig(rule, `Route rule \"${normalizedSource}\"`),\n };\n }\n return normalized;\n}\n\nexport function routeRulesToRedirects(routeRules: FarmRouteRules): RedirectConfig[] {\n return Object.entries(routeRules)\n .filter((entry): entry is [string, FarmRouteRule & { redirect: FarmRouteRuleRedirect }] =>\n Boolean(entry[1].redirect),\n )\n .map(([source, rule]) => {\n const redirect = typeof rule.redirect === \"string\" ? { to: rule.redirect } : rule.redirect;\n return {\n source,\n destination: redirect.to,\n permanent: redirect.permanent,\n statusCode: redirect.statusCode ?? (redirect.permanent === true ? 308 : undefined),\n };\n });\n}\n\nexport function routeRulesToHeaders(routeRules: FarmRouteRules): HeaderConfig[] {\n const configs: HeaderConfig[] = [];\n\n for (const [source, rule] of Object.entries(routeRules)) {\n const headers = {\n ...normalizeCorsHeaders(rule.cors),\n ...rule.headers,\n };\n\n const entries = Object.entries(headers);\n if (entries.length === 0) continue;\n\n configs.push({\n source,\n headers: entries.map(([key, value]) => ({ key, value })),\n });\n }\n\n return configs;\n}\n\nexport function routeRulesToNitroRouteRules(routeRules: FarmRouteRules): Record<string, any> {\n const nitroRules: Record<string, any> = {};\n\n for (const [source, rule] of Object.entries(routeRules)) {\n const nitroRule: Record<string, any> = { ...rule };\n\n if (rule.render === \"static\") {\n nitroRule.prerender = true;\n } else if (rule.render === \"dynamic\") {\n nitroRule.prerender = false;\n }\n\n if (rule.redirect && typeof rule.redirect !== \"string\") {\n nitroRule.redirect = rule.redirect.to;\n if (rule.redirect.statusCode) {\n nitroRule.statusCode = rule.redirect.statusCode;\n }\n }\n\n if (rule.cors) {\n nitroRule.cors = true;\n nitroRule.headers = {\n ...normalizeCorsHeaders(rule.cors),\n ...rule.headers,\n };\n }\n\n delete nitroRule.render;\n delete nitroRule.runtime;\n delete nitroRule.regions;\n delete nitroRule.maxDuration;\n nitroRules[source] = nitroRule;\n }\n\n return nitroRules;\n}\n\nfunction normalizeCorsHeaders(cors: FarmRouteRuleCors | undefined): Record<string, string> {\n if (!cors) return {};\n\n if (cors === true) {\n return {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"*\",\n \"Access-Control-Allow-Headers\": \"*\",\n };\n }\n\n return {\n \"Access-Control-Allow-Origin\": cors.origin ?? \"*\",\n \"Access-Control-Allow-Methods\": normalizeList(cors.methods) ?? \"*\",\n \"Access-Control-Allow-Headers\": normalizeList(cors.headers) ?? \"*\",\n };\n}\n\nfunction normalizeList(value: string | readonly string[] | undefined): string | undefined {\n if (!value || typeof value === \"string\") return value;\n return value.join(\", \");\n}\n\nfunction normalizeRuleSource(source: string): string {\n const trimmed = source.trim();\n if (!trimmed) return \"/\";\n return trimmed.startsWith(\"/\") ? trimmed : `/${trimmed}`;\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { subscribeFarmCacheInvalidation, subscribeFarmCacheTask } from \"./cache-invalidation\";\n\nexport const DEFAULT_SERVER_ACTION_BODY_SIZE_LIMIT = 1_000_000;\n\nexport interface FarmServerActionsConfig {\n /** Additional trusted origins or host patterns, such as https://app.example.com. */\n allowedOrigins?: readonly string[];\n /** Maximum encoded request body size in bytes or as a size string such as \"1mb\". */\n bodySizeLimit?: number | string;\n}\n\nexport interface ResolvedFarmServerActionsConfig {\n allowedOrigins: readonly string[];\n bodySizeLimit: number;\n}\n\nexport type ServerActionRequestKind = \"javascript\" | \"form\";\n\nexport interface PreparedServerActionRequest {\n body: string | FormData;\n contentType: string;\n}\n\nexport type SanitizedServerActionError = {\n name: \"ServerActionError\";\n message: \"Server function failed\";\n};\n\ntype ServerActionRequestErrorCode =\n | \"BODY_TOO_LARGE\"\n | \"INVALID_ACTION_ID\"\n | \"INVALID_BODY\"\n | \"INVALID_CONTENT_LENGTH\"\n | \"INVALID_METHOD\"\n | \"INVALID_ORIGIN\"\n | \"MISSING_ORIGIN\"\n | \"UNSUPPORTED_CONTENT_TYPE\";\n\nexport class ServerActionRequestError extends Error {\n readonly code: ServerActionRequestErrorCode;\n readonly status: number;\n\n constructor(code: ServerActionRequestErrorCode, status: number, message: string) {\n super(message);\n this.name = \"ServerActionRequestError\";\n this.code = code;\n this.status = status;\n }\n}\n\ntype ServerActionExecutionContext = {\n request: Request;\n signal: AbortSignal;\n invalidations: Set<string>;\n cacheTasks: Set<Promise<void>>;\n};\n\nconst SERVER_ACTION_STORAGE_KEY = Symbol.for(\"farm.serverActionStorage\");\nconst FALLBACK_ABORT_CONTROLLER_KEY = Symbol.for(\"farm.serverActionFallbackAbortController\");\nconst FORM_ACTION_CONTENT_TYPES = new Set([\n \"application/x-www-form-urlencoded\",\n \"multipart/form-data\",\n]);\nconst JAVASCRIPT_ACTION_CONTENT_TYPES = new Set([\n \"application/octet-stream\",\n \"application/x-www-form-urlencoded\",\n \"multipart/form-data\",\n \"text/plain\",\n]);\n\ntype GlobalWithServerActionStorage = typeof globalThis & {\n [SERVER_ACTION_STORAGE_KEY]?: AsyncLocalStorage<ServerActionExecutionContext>;\n [FALLBACK_ABORT_CONTROLLER_KEY]?: AbortController;\n};\n\nexport function resolveServerActionsConfig(\n config: FarmServerActionsConfig | undefined,\n): ResolvedFarmServerActionsConfig {\n const allowedOrigins = (config?.allowedOrigins ?? []).map(normalizeAllowedOriginPattern);\n const bodySizeLimit = parseBodySizeLimit(\n config?.bodySizeLimit ?? DEFAULT_SERVER_ACTION_BODY_SIZE_LIMIT,\n );\n\n return Object.freeze({\n allowedOrigins: Object.freeze(allowedOrigins),\n bodySizeLimit,\n });\n}\n\nexport function validateServerActionRequest(\n request: Request,\n config: ResolvedFarmServerActionsConfig,\n): void {\n if (request.method.toUpperCase() !== \"POST\") {\n throw new ServerActionRequestError(\n \"INVALID_METHOD\",\n 405,\n \"Server actions only accept POST requests\",\n );\n }\n\n const requestUrl = new URL(request.url);\n const sourceOrigin = getRequestSourceOrigin(request);\n const fetchSite = request.headers.get(\"sec-fetch-site\")?.trim().toLowerCase();\n\n if (!sourceOrigin) {\n if (fetchSite !== \"same-origin\") {\n throw new ServerActionRequestError(\n \"MISSING_ORIGIN\",\n 403,\n \"Server action request is missing same-origin metadata\",\n );\n }\n return;\n }\n\n const matchesRequest =\n sourceOrigin === requestUrl.origin || matchesHostHeader(sourceOrigin, request);\n const matchesConfiguredOrigin = config.allowedOrigins.some((pattern) =>\n matchesAllowedOrigin(sourceOrigin, pattern),\n );\n\n if (!matchesRequest && !matchesConfiguredOrigin) {\n throw new ServerActionRequestError(\n \"INVALID_ORIGIN\",\n 403,\n \"Server action origin does not match the request origin\",\n );\n }\n\n if (fetchSite === \"cross-site\" && !matchesConfiguredOrigin) {\n throw new ServerActionRequestError(\n \"INVALID_ORIGIN\",\n 403,\n \"Cross-site server action request was rejected\",\n );\n }\n}\n\nexport async function prepareServerActionRequest(\n request: Request,\n config: ResolvedFarmServerActionsConfig,\n kind: ServerActionRequestKind,\n actionId?: string | null,\n): Promise<PreparedServerActionRequest> {\n validateServerActionRequest(request, config);\n\n if (kind === \"javascript\") {\n validateActionId(actionId);\n }\n\n const contentType = getSupportedContentType(request, kind);\n const bytes = await readBodyWithLimit(request, config.bodySizeLimit);\n\n if (kind === \"form\" || contentType === \"multipart/form-data\") {\n return {\n body: await parseFormData(request, bytes),\n contentType,\n };\n }\n\n return {\n body: new TextDecoder().decode(bytes),\n contentType,\n };\n}\n\nexport function createServerActionRequestErrorResponse(error: unknown): Response | null {\n if (!(error instanceof ServerActionRequestError)) {\n return null;\n }\n\n const headers = new Headers({\n \"cache-control\": \"no-store\",\n \"content-type\": \"text/plain; charset=utf-8\",\n \"x-content-type-options\": \"nosniff\",\n });\n if (error.status === 405) {\n headers.set(\"allow\", \"POST\");\n }\n\n return new Response(getPublicErrorMessage(error.status), {\n status: error.status,\n headers,\n });\n}\n\nexport function sanitizeServerActionError(_error: unknown): SanitizedServerActionError {\n return {\n name: \"ServerActionError\",\n message: \"Server function failed\",\n };\n}\n\nexport async function runWithServerActionRequest<T>(\n request: Request,\n callback: () => T | Promise<T>,\n): Promise<T> {\n throwIfAborted(request.signal);\n const context: ServerActionExecutionContext = {\n request,\n signal: request.signal,\n invalidations: new Set(),\n cacheTasks: new Set(),\n };\n\n return getServerActionStorage().run(context, async () => {\n try {\n const result = await callback();\n await Promise.all(context.cacheTasks);\n return result;\n } catch (error) {\n await Promise.allSettled(context.cacheTasks);\n throw error;\n }\n });\n}\n\nexport function getServerActionExecutionContext(): ServerActionExecutionContext | undefined {\n return getServerActionStorage().getStore();\n}\n\nexport function getServerActionSignal(): AbortSignal {\n return getServerActionExecutionContext()?.signal ?? getFallbackAbortController().signal;\n}\n\nexport function getServerActionInvalidations(): readonly string[] {\n return Array.from(getServerActionExecutionContext()?.invalidations ?? []);\n}\n\nsubscribeFarmCacheInvalidation((key) => {\n getServerActionExecutionContext()?.invalidations.add(key);\n});\n\nsubscribeFarmCacheTask((task) => {\n getServerActionExecutionContext()?.cacheTasks.add(task);\n});\n\nfunction getServerActionStorage(): AsyncLocalStorage<ServerActionExecutionContext> {\n const globalState = globalThis as GlobalWithServerActionStorage;\n if (!globalState[SERVER_ACTION_STORAGE_KEY]) {\n globalState[SERVER_ACTION_STORAGE_KEY] = new AsyncLocalStorage<ServerActionExecutionContext>();\n }\n return globalState[SERVER_ACTION_STORAGE_KEY]!;\n}\n\nfunction getFallbackAbortController(): AbortController {\n const globalState = globalThis as GlobalWithServerActionStorage;\n if (!globalState[FALLBACK_ABORT_CONTROLLER_KEY]) {\n globalState[FALLBACK_ABORT_CONTROLLER_KEY] = new AbortController();\n }\n return globalState[FALLBACK_ABORT_CONTROLLER_KEY]!;\n}\n\nfunction parseBodySizeLimit(value: number | string): number {\n if (typeof value === \"number\") {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new TypeError(\"serverActions.bodySizeLimit must be a positive safe integer\");\n }\n return value;\n }\n\n const match = value\n .trim()\n .toLowerCase()\n .match(/^(\\d+(?:\\.\\d+)?)\\s*(b|kb|mb|gb|kib|mib|gib)?$/);\n if (!match) {\n throw new TypeError(\n 'serverActions.bodySizeLimit must be bytes or a size string such as \"500kb\" or \"1mb\"',\n );\n }\n\n const amount = Number(match[1]);\n const unit = match[2] ?? \"b\";\n const multiplier: Record<string, number> = {\n b: 1,\n kb: 1_000,\n mb: 1_000_000,\n gb: 1_000_000_000,\n kib: 1_024,\n mib: 1_048_576,\n gib: 1_073_741_824,\n };\n const bytes = Math.floor(amount * multiplier[unit]);\n\n if (!Number.isSafeInteger(bytes) || bytes <= 0) {\n throw new TypeError(\"serverActions.bodySizeLimit must resolve to a positive safe integer\");\n }\n\n return bytes;\n}\n\nfunction normalizeAllowedOriginPattern(value: string): string {\n const pattern = value.trim().toLowerCase();\n if (!pattern) {\n throw new TypeError(\"serverActions.allowedOrigins cannot contain empty values\");\n }\n\n if (pattern.includes(\"*\")) {\n if (!/^(?:https?:\\/\\/)?\\*\\.[a-z0-9.-]+(?::\\d+)?$/.test(pattern)) {\n throw new TypeError(`Invalid serverActions.allowedOrigins pattern: ${JSON.stringify(value)}`);\n }\n return pattern;\n }\n\n if (pattern.includes(\"://\")) {\n let parsed: URL;\n try {\n parsed = new URL(pattern);\n } catch {\n throw new TypeError(`Invalid serverActions.allowedOrigins value: ${JSON.stringify(value)}`);\n }\n\n if (\n (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") ||\n parsed.username ||\n parsed.password ||\n parsed.pathname !== \"/\" ||\n parsed.search ||\n parsed.hash\n ) {\n throw new TypeError(\n `serverActions.allowedOrigins must contain origins without paths: ${JSON.stringify(value)}`,\n );\n }\n return parsed.origin;\n }\n\n if (/[/@?#]/.test(pattern)) {\n throw new TypeError(\n `serverActions.allowedOrigins must contain origins or hosts: ${JSON.stringify(value)}`,\n );\n }\n\n try {\n return new URL(`http://${pattern}`).host;\n } catch {\n throw new TypeError(`Invalid serverActions.allowedOrigins value: ${JSON.stringify(value)}`);\n }\n}\n\nfunction getRequestSourceOrigin(request: Request): string | null {\n const origin = request.headers.get(\"origin\")?.trim();\n if (origin) {\n return parseSourceOrigin(origin);\n }\n\n const referer = request.headers.get(\"referer\")?.trim();\n if (referer) {\n return parseSourceOrigin(referer);\n }\n\n return null;\n}\n\nfunction parseSourceOrigin(value: string): string {\n if (value === \"null\") {\n throw new ServerActionRequestError(\"INVALID_ORIGIN\", 403, \"Opaque origins are not allowed\");\n }\n\n try {\n const parsed = new URL(value);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"Unsupported protocol\");\n }\n return parsed.origin;\n } catch {\n throw new ServerActionRequestError(\"INVALID_ORIGIN\", 403, \"Invalid request origin\");\n }\n}\n\nfunction matchesHostHeader(sourceOrigin: string, request: Request): boolean {\n const host = request.headers.get(\"host\")?.trim().toLowerCase();\n if (!host) return false;\n\n try {\n const source = new URL(sourceOrigin);\n const target = new URL(request.url);\n return source.protocol === target.protocol && source.host.toLowerCase() === host;\n } catch {\n return false;\n }\n}\n\nfunction matchesAllowedOrigin(sourceOrigin: string, pattern: string): boolean {\n const source = new URL(sourceOrigin);\n if (!pattern.includes(\"*\")) {\n return pattern.includes(\"://\") ? source.origin === pattern : source.host === pattern;\n }\n\n const schemeEnd = pattern.indexOf(\"://\");\n const scheme = schemeEnd === -1 ? null : pattern.slice(0, schemeEnd + 1);\n const hostPattern = pattern.slice(schemeEnd === -1 ? 0 : schemeEnd + 3);\n const [wildcardHost, port] = splitHostAndPort(hostPattern);\n const baseHost = wildcardHost.slice(2);\n\n if (scheme && source.protocol !== scheme) return false;\n if (port && getEffectivePort(source) !== port) return false;\n if (!port && source.port) return false;\n\n return source.hostname.endsWith(`.${baseHost}`) && source.hostname !== baseHost;\n}\n\nfunction splitHostAndPort(value: string): [string, string | null] {\n const separator = value.lastIndexOf(\":\");\n if (separator === -1) return [value, null];\n return [value.slice(0, separator), value.slice(separator + 1)];\n}\n\nfunction getEffectivePort(url: URL): string {\n if (url.port) return url.port;\n if (url.protocol === \"https:\") return \"443\";\n if (url.protocol === \"http:\") return \"80\";\n return \"\";\n}\n\nfunction validateActionId(actionId?: string | null): asserts actionId is string {\n if (!actionId || actionId.length > 4096 || hasControlCharacters(actionId)) {\n throw new ServerActionRequestError(\"INVALID_ACTION_ID\", 400, \"Invalid server action id\");\n }\n}\n\nfunction hasControlCharacters(value: string): boolean {\n for (let index = 0; index < value.length; index++) {\n const code = value.charCodeAt(index);\n if (code <= 31 || code === 127) return true;\n }\n return false;\n}\n\nfunction getSupportedContentType(request: Request, kind: ServerActionRequestKind): string {\n const header = request.headers.get(\"content-type\")?.trim().toLowerCase();\n const contentType = header?.split(\";\", 1)[0]?.trim() ?? \"\";\n const supported = kind === \"form\" ? FORM_ACTION_CONTENT_TYPES : JAVASCRIPT_ACTION_CONTENT_TYPES;\n\n if (!supported.has(contentType)) {\n throw new ServerActionRequestError(\n \"UNSUPPORTED_CONTENT_TYPE\",\n 415,\n \"Unsupported server action content type\",\n );\n }\n\n return contentType;\n}\n\nasync function readBodyWithLimit(request: Request, limit: number): Promise<Uint8Array> {\n const contentLength = request.headers.get(\"content-length\")?.trim();\n if (contentLength) {\n if (!/^\\d+$/.test(contentLength)) {\n throw new ServerActionRequestError(\n \"INVALID_CONTENT_LENGTH\",\n 400,\n \"Invalid content-length header\",\n );\n }\n if (Number(contentLength) > limit) {\n throw new ServerActionRequestError(\"BODY_TOO_LARGE\", 413, \"Server action body is too large\");\n }\n }\n\n throwIfAborted(request.signal);\n if (!request.body) return new Uint8Array();\n\n const reader = request.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n const cancelBodyRead = () => {\n void reader.cancel(request.signal.reason).catch(() => {});\n };\n\n request.signal.addEventListener(\"abort\", cancelBodyRead, { once: true });\n\n try {\n while (true) {\n throwIfAborted(request.signal);\n const { done, value } = await reader.read();\n if (done) break;\n if (!value) continue;\n\n total += value.byteLength;\n if (total > limit) {\n await reader.cancel(\"Server action body is too large\");\n throw new ServerActionRequestError(\n \"BODY_TOO_LARGE\",\n 413,\n \"Server action body is too large\",\n );\n }\n chunks.push(value);\n }\n } catch (error) {\n if (request.signal.aborted) throwIfAborted(request.signal);\n throw error;\n } finally {\n request.signal.removeEventListener(\"abort\", cancelBodyRead);\n reader.releaseLock();\n }\n\n throwIfAborted(request.signal);\n const body = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return body;\n}\n\nasync function parseFormData(request: Request, bytes: Uint8Array): Promise<FormData> {\n const body = new ArrayBuffer(bytes.byteLength);\n new Uint8Array(body).set(bytes);\n const copy = new Request(request.url, {\n method: \"POST\",\n headers: request.headers,\n body,\n });\n\n try {\n return await copy.formData();\n } catch {\n throw new ServerActionRequestError(\"INVALID_BODY\", 400, \"Invalid server action form body\");\n }\n}\n\nfunction getPublicErrorMessage(status: number): string {\n switch (status) {\n case 400:\n return \"Bad Request\";\n case 403:\n return \"Forbidden\";\n case 405:\n return \"Method Not Allowed\";\n case 413:\n return \"Payload Too Large\";\n case 415:\n return \"Unsupported Media Type\";\n default:\n return \"Server Action Request Failed\";\n }\n}\n\nfunction throwIfAborted(signal: AbortSignal): void {\n if (!signal.aborted) return;\n if (signal.reason !== undefined) throw signal.reason;\n throw new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n","export type FarmCacheInvalidationListener = (key: string) => void;\nexport type FarmCacheTaskListener = (task: Promise<void>) => void;\n\nexport const FARM_CACHE_INVALIDATION_HEADER = \"x-farm-cache-invalidations\";\n\ntype FarmCacheInvalidationState = {\n listeners: Set<FarmCacheInvalidationListener>;\n taskListeners: Set<FarmCacheTaskListener>;\n};\n\nconst FARM_CACHE_INVALIDATION_STATE = Symbol.for(\"farm.cacheInvalidationState\");\nconst globalState = globalThis as typeof globalThis & {\n [FARM_CACHE_INVALIDATION_STATE]?: FarmCacheInvalidationState;\n};\n\nfunction getFarmCacheInvalidationState(): FarmCacheInvalidationState {\n return (globalState[FARM_CACHE_INVALIDATION_STATE] ??= {\n listeners: new Set(),\n taskListeners: new Set(),\n });\n}\n\nexport function notifyFarmCacheInvalidation(key: string): void {\n if (typeof key !== \"string\" || key.length === 0) return;\n\n for (const listener of getFarmCacheInvalidationState().listeners) {\n listener(key);\n }\n}\n\nexport function notifyFarmCacheTask(task: Promise<void>): void {\n for (const listener of getFarmCacheInvalidationState().taskListeners) {\n listener(task);\n }\n}\n\nexport function applyFarmCacheInvalidations(keys: unknown): void {\n if (!Array.isArray(keys)) return;\n\n for (const key of keys) {\n if (typeof key === \"string\") {\n notifyFarmCacheInvalidation(key);\n }\n }\n}\n\nexport function encodeFarmCacheInvalidations(keys: readonly string[]): string | null {\n const normalized = Array.from(\n new Set(keys.filter((key) => typeof key === \"string\" && key.length > 0)),\n );\n if (normalized.length === 0) return null;\n return encodeURIComponent(JSON.stringify(normalized));\n}\n\nexport function decodeFarmCacheInvalidations(value: string | null | undefined): readonly string[] {\n if (!value) return [];\n\n try {\n const parsed = JSON.parse(decodeURIComponent(value));\n return Array.isArray(parsed)\n ? Array.from(\n new Set(parsed.filter((key): key is string => typeof key === \"string\" && key.length > 0)),\n )\n : [];\n } catch {\n return [];\n }\n}\n\nexport function subscribeFarmCacheInvalidation(\n listener: FarmCacheInvalidationListener,\n): () => void {\n const state = getFarmCacheInvalidationState();\n state.listeners.add(listener);\n return () => state.listeners.delete(listener);\n}\n\nexport function subscribeFarmCacheTask(listener: FarmCacheTaskListener): () => void {\n const state = getFarmCacheInvalidationState();\n state.taskListeners.add(listener);\n return () => state.taskListeners.delete(listener);\n}\n","import { existsSync, readFileSync, realpathSync, statSync } from \"node:fs\";\nimport { mkdir, unlink } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\ntype EsbuildTransform = (typeof import(\"esbuild\"))[\"transform\"];\n\nexport type FarmLayerEntry = string;\n\nexport interface ResolvedFarmLayer {\n /** The value used in `extends`. */\n source: string;\n /** Stable name used by the `#layers/<name>` alias. */\n name: string;\n /** Absolute layer package or directory root. */\n root: string;\n /** Source directory relative to the layer root. */\n srcDir: string;\n /** Resolved layer config file when one exists. */\n configFile?: string;\n}\n\nexport interface FarmSourceRoot {\n name: string;\n root: string;\n srcDir: string;\n layer: boolean;\n}\n\nexport interface ResolveFarmLayersOptions {\n root: string;\n mode: \"development\" | \"production\";\n}\n\nexport interface FarmLayerResolution<TConfig extends Record<string, any>> {\n config: TConfig & {\n extends?: readonly FarmLayerEntry[];\n layers: ResolvedFarmLayer[];\n };\n layers: ResolvedFarmLayer[];\n}\n\nconst FARM_CORE_PACKAGE = \"@farm.js/core\";\nconst FARM_CONFIG_ENTRY = \"@farm.js/core/config\";\nconst FARM_CORE_REFERENCE_RE = /([\"'])@farm.js\\/core\\1/g;\nconst FARM_CONFIG_HELPER_IMPORT_RE =\n /(?:^|\\n)[\\t ]*import[\\t ]*\\{([^{}]*)\\}[\\t ]*from[\\t ]*([\"'])@farm.js\\/core\\2[\\t ]*;?[\\t ]*(?:\\n|$)/g;\nconst FARM_CONFIG_HELPER_SPECIFIER_RE =\n /^(?:defineConfig|defineFarmConfig)(?:\\s+as\\s+[$A-Z_a-z][$\\w]*)?$/;\n\nconst CONFIG_FILENAMES = [\n \"farm.config.ts\",\n \"farm.config.tsx\",\n \"farm.config.mts\",\n \"farm.config.cts\",\n \"farm.config.js\",\n \"farm.config.jsx\",\n \"farm.config.mjs\",\n \"farm.config.cjs\",\n \"config.ts\",\n \"config.tsx\",\n \"config.mts\",\n \"config.cts\",\n \"config.js\",\n \"config.jsx\",\n \"config.mjs\",\n \"config.cjs\",\n];\n\nconst LAYER_LOCAL_CONFIG_KEYS = new Set([\n \"root\",\n \"srcDir\",\n \"outDir\",\n \"distDir\",\n \"deploy\",\n \"output\",\n \"preset\",\n \"publicDir\",\n \"generateBuildId\",\n]);\n\ntype LoadedLayer = ResolvedFarmLayer & {\n config: Record<string, any>;\n};\n\nexport async function resolveFarmLayers<TConfig extends Record<string, any>>(\n projectConfig: TConfig,\n options: ResolveFarmLayersOptions,\n): Promise<FarmLayerResolution<TConfig>> {\n const projectRoot = path.resolve(options.root);\n const entries = normalizeLayerEntries(projectConfig.extends, \"project config\");\n\n if (entries.length === 0) {\n return {\n config: {\n ...projectConfig,\n layers: [],\n },\n layers: [],\n };\n }\n\n const loadedLayers: LoadedLayer[] = [];\n const visited = new Set<string>();\n const aliases = new Map<string, string>();\n\n const visit = async (\n source: string,\n ownerRoot: string,\n stack: Array<{ root: string; source: string }>,\n ): Promise<void> => {\n const resolvedSource = resolveLayerSource(source, ownerRoot);\n const cycleIndex = stack.findIndex((entry) => entry.root === resolvedSource.root);\n if (cycleIndex !== -1) {\n const cycle = [...stack.slice(cycleIndex).map((entry) => entry.source), source];\n throw new Error(`Farm layer cycle detected: ${cycle.join(\" -> \")}`);\n }\n if (visited.has(resolvedSource.root)) return;\n\n const configFile = findFarmConfigFile(resolvedSource.root, resolvedSource.configFile);\n const config = configFile\n ? await loadFarmConfigFile(configFile, {\n cacheRoot: projectRoot,\n root: resolvedSource.root,\n })\n : {};\n const nestedEntries = normalizeLayerEntries(config.extends, `layer ${JSON.stringify(source)}`);\n const nextStack = [...stack, { root: resolvedSource.root, source }];\n\n for (const nestedSource of nestedEntries) {\n await visit(nestedSource, resolvedSource.root, nextStack);\n }\n\n if (visited.has(resolvedSource.root)) return;\n\n const name = getLayerName(source, resolvedSource.root);\n const conflictingRoot = aliases.get(name);\n if (conflictingRoot && conflictingRoot !== resolvedSource.root) {\n throw new Error(\n `Farm layer alias \"#layers/${name}\" is ambiguous between ${conflictingRoot} and ${resolvedSource.root}`,\n );\n }\n aliases.set(name, resolvedSource.root);\n\n visited.add(resolvedSource.root);\n loadedLayers.push({\n source,\n name,\n root: resolvedSource.root,\n srcDir: normalizeLayerSrcDir(config.srcDir),\n configFile,\n config,\n });\n };\n\n for (const source of entries) {\n await visit(source, projectRoot, []);\n }\n\n let mergedConfig: Record<string, any> = {};\n for (const layer of loadedLayers) {\n mergedConfig = mergeFarmLayerConfig(mergedConfig, getLayerDefaults(layer.config));\n }\n mergedConfig = mergeFarmLayerConfig(mergedConfig, projectConfig);\n\n const layers = loadedLayers.map(({ config: _config, ...layer }) => layer);\n return {\n config: {\n ...mergedConfig,\n root: projectConfig.root,\n srcDir: projectConfig.srcDir,\n extends: projectConfig.extends,\n layers,\n } as unknown as FarmLayerResolution<TConfig>[\"config\"],\n layers,\n };\n}\n\nexport function getFarmSourceRoots(config: {\n root?: string;\n srcDir?: string;\n layers?: readonly ResolvedFarmLayer[];\n}): FarmSourceRoot[] {\n const roots: FarmSourceRoot[] = (config.layers ?? []).map((layer) => ({\n name: layer.name,\n root: layer.root,\n srcDir: layer.srcDir,\n layer: true,\n }));\n\n roots.push({\n name: \"project\",\n root: path.resolve(config.root || process.cwd()),\n srcDir: config.srcDir || \"src\",\n layer: false,\n });\n\n return roots;\n}\n\nexport function getFarmAppDirectories(config: {\n root?: string;\n srcDir?: string;\n layers?: readonly ResolvedFarmLayer[];\n}): string[] {\n return getFarmSourceRoots(config).map((source) => path.join(source.root, source.srcDir, \"app\"));\n}\n\nexport function getFarmLayerAliases(\n layers: readonly ResolvedFarmLayer[] | undefined,\n): Record<string, string> {\n return Object.fromEntries(\n (layers ?? []).map((layer) => [`#layers/${layer.name}`, path.join(layer.root, layer.srcDir)]),\n );\n}\n\nexport async function loadFarmConfigFile<TConfig = Record<string, any>>(\n configPath: string,\n options: { root: string; cacheRoot?: string },\n): Promise<TConfig> {\n const { build, transform } = await import(\"esbuild\");\n const cacheRoot = path.resolve(options.cacheRoot || options.root);\n const configCacheDir = path.join(cacheRoot, \".farm\", \".config-loader\");\n const configEntryChecks = new Map<string, Promise<boolean>>();\n await mkdir(configCacheDir, { recursive: true });\n\n const modulePath = path.join(\n configCacheDir,\n `farm-config-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`,\n );\n\n await build({\n absWorkingDir: path.resolve(options.root),\n entryPoints: [path.resolve(configPath)],\n outfile: modulePath,\n bundle: true,\n format: \"esm\",\n platform: \"node\",\n target: `node${process.versions.node.split(\".\")[0]}`,\n plugins: [\n {\n name: \"farm-config-package-resolution\",\n setup(pluginBuild) {\n pluginBuild.onResolve({ filter: /^@farm.js\\/core$/ }, async (args) => {\n if (\n args.pluginData?.farmConfigExternal ||\n args.kind !== \"import-statement\" ||\n !args.importer\n ) {\n return;\n }\n\n let configEntryCheck = configEntryChecks.get(args.importer);\n if (!configEntryCheck) {\n configEntryCheck = onlyImportsFarmConfigHelpers(args.importer, transform);\n configEntryChecks.set(args.importer, configEntryCheck);\n }\n if (!(await configEntryCheck)) return;\n\n const resolved = await pluginBuild.resolve(FARM_CONFIG_ENTRY, {\n importer: args.importer,\n kind: args.kind,\n namespace: args.namespace,\n resolveDir: args.resolveDir,\n pluginData: { farmConfigExternal: true },\n });\n if (resolved.errors.length > 0 || !resolved.path) return;\n\n return {\n path: resolved.path,\n external: true,\n warnings: resolved.warnings,\n };\n });\n\n pluginBuild.onResolve({ filter: /^[^./]/ }, async (args) => {\n if (args.pluginData?.farmConfigExternal) return;\n\n const resolved = await pluginBuild.resolve(args.path, {\n importer: args.importer,\n kind: args.kind,\n namespace: args.namespace,\n resolveDir: args.resolveDir,\n pluginData: { farmConfigExternal: true },\n });\n\n if (resolved.errors.length > 0 || !resolved.path) {\n return { path: args.path, external: true };\n }\n\n return {\n path: resolved.path,\n external: true,\n warnings: resolved.warnings,\n };\n });\n },\n },\n ],\n jsx: \"automatic\",\n logLevel: \"silent\",\n sourcemap: \"inline\",\n });\n\n const moduleUrl = `${pathToFileURL(modulePath).href}?t=${Date.now()}`;\n try {\n const loaded = await import(/* @vite-ignore */ moduleUrl);\n const config = loaded.default || loaded;\n if (!config || typeof config !== \"object\" || Array.isArray(config)) {\n throw new TypeError(`Farm config ${configPath} must export an object`);\n }\n return config as TConfig;\n } finally {\n await unlink(modulePath).catch(() => undefined);\n }\n}\n\nasync function onlyImportsFarmConfigHelpers(\n importer: string,\n transform: EsbuildTransform,\n): Promise<boolean> {\n try {\n const source = readFileSync(importer, \"utf8\");\n if (!source.includes(FARM_CORE_PACKAGE)) return false;\n\n const transformed = await transform(source, {\n format: \"esm\",\n jsx: \"automatic\",\n loader: getEsbuildLoader(importer),\n sourcefile: importer,\n });\n const references = [...transformed.code.matchAll(FARM_CORE_REFERENCE_RE)];\n if (references.length === 0) return false;\n\n const safeImportRanges: Array<{ start: number; end: number }> = [];\n for (const match of transformed.code.matchAll(FARM_CONFIG_HELPER_IMPORT_RE)) {\n const specifiers = match[1]\n .split(\",\")\n .map((specifier) => specifier.trim())\n .filter(Boolean);\n if (\n specifiers.length === 0 ||\n !specifiers.every((specifier) => FARM_CONFIG_HELPER_SPECIFIER_RE.test(specifier))\n ) {\n continue;\n }\n\n const start = match.index ?? 0;\n safeImportRanges.push({ start, end: start + match[0].length });\n }\n\n return references.every((reference) => {\n const index = reference.index ?? -1;\n return safeImportRanges.some((range) => index >= range.start && index < range.end);\n });\n } catch {\n // Unsupported syntax or non-file importers retain the existing package resolution path.\n return false;\n }\n}\n\nfunction getEsbuildLoader(file: string): \"js\" | \"jsx\" | \"ts\" | \"tsx\" {\n switch (path.extname(file)) {\n case \".ts\":\n case \".mts\":\n case \".cts\":\n return \"ts\";\n case \".tsx\":\n return \"tsx\";\n case \".jsx\":\n return \"jsx\";\n default:\n return \"js\";\n }\n}\n\nfunction normalizeLayerEntries(value: unknown, owner: string): string[] {\n if (value === undefined) return [];\n if (!Array.isArray(value)) {\n throw new TypeError(`${owner} \"extends\" must be an array of layer paths or package names`);\n }\n\n return value.map((entry, index) => {\n if (typeof entry !== \"string\" || entry.trim() === \"\") {\n throw new TypeError(`${owner} \"extends\" entry ${index} must be a non-empty string`);\n }\n return entry.trim();\n });\n}\n\nfunction resolveLayerSource(\n source: string,\n ownerRoot: string,\n): { root: string; configFile?: string } {\n if (isPathLayerSource(source)) {\n const target = source.startsWith(\"file:\")\n ? path.resolve(ownerRoot, source.slice(\"file:\".length))\n : path.resolve(ownerRoot, source);\n if (!existsSync(target)) {\n throw new Error(`Cannot resolve Farm layer ${JSON.stringify(source)} from ${ownerRoot}`);\n }\n\n const stats = statSync(target);\n const root = stats.isDirectory() ? target : path.dirname(target);\n return {\n root: normalizeRealPath(root),\n configFile: stats.isFile() ? normalizeRealPath(target) : undefined,\n };\n }\n\n const requireFromOwner = createRequire(path.join(ownerRoot, \"package.json\"));\n let packageJsonPath: string | undefined;\n try {\n packageJsonPath = requireFromOwner.resolve(`${source}/package.json`);\n } catch {\n // Packages with an exports map often hide package.json. Resolve their entry and walk upward.\n }\n\n if (packageJsonPath) {\n return { root: normalizeRealPath(path.dirname(packageJsonPath)) };\n }\n\n try {\n const entryPath = requireFromOwner.resolve(source);\n const packageRoot = findNearestPackageRoot(entryPath);\n if (packageRoot) return { root: normalizeRealPath(packageRoot) };\n } catch {\n // Use the common error below so local and package failures have the same shape.\n }\n\n throw new Error(`Cannot resolve Farm layer package ${JSON.stringify(source)} from ${ownerRoot}`);\n}\n\nfunction findNearestPackageRoot(entryPath: string): string | null {\n let current = statSync(entryPath).isDirectory() ? entryPath : path.dirname(entryPath);\n while (true) {\n if (existsSync(path.join(current, \"package.json\"))) return current;\n const parent = path.dirname(current);\n if (parent === current) return null;\n current = parent;\n }\n}\n\nfunction findFarmConfigFile(root: string, explicitPath?: string): string | undefined {\n if (explicitPath) return explicitPath;\n for (const fileName of CONFIG_FILENAMES) {\n const candidate = path.join(root, fileName);\n if (existsSync(candidate)) return candidate;\n }\n return undefined;\n}\n\nfunction getLayerName(source: string, root: string): string {\n if (!isPathLayerSource(source)) {\n const packageName = source.split(\"/\").filter(Boolean).pop();\n if (packageName) return sanitizeLayerName(packageName);\n }\n\n try {\n const packageJson = JSON.parse(readFileSync(path.join(root, \"package.json\"), \"utf8\"));\n if (typeof packageJson.name === \"string\") {\n return sanitizeLayerName(packageJson.name.split(\"/\").pop() || packageJson.name);\n }\n } catch {\n // A local layer does not need package metadata.\n }\n\n return sanitizeLayerName(path.basename(root));\n}\n\nfunction sanitizeLayerName(value: string): string {\n const name = value\n .trim()\n .replace(/[^a-zA-Z0-9_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n if (!name) throw new Error(`Cannot derive a name for Farm layer ${JSON.stringify(value)}`);\n return name;\n}\n\nfunction normalizeLayerSrcDir(value: unknown): string {\n if (value === undefined) return \"src\";\n if (typeof value !== \"string\" || value.trim() === \"\" || path.isAbsolute(value)) {\n throw new TypeError(\"A Farm layer srcDir must be a non-empty relative path\");\n }\n const normalized = path.normalize(value.trim());\n if (normalized === \"..\" || normalized.startsWith(`..${path.sep}`)) {\n throw new TypeError(\"A Farm layer srcDir cannot leave the layer root\");\n }\n return normalized;\n}\n\nfunction getLayerDefaults(config: Record<string, any>): Record<string, any> {\n return Object.fromEntries(\n Object.entries(config).filter(\n ([key, value]) =>\n key !== \"extends\" && value !== undefined && !LAYER_LOCAL_CONFIG_KEYS.has(key),\n ),\n );\n}\n\nfunction mergeFarmLayerConfig(\n base: Record<string, any>,\n override: Record<string, any>,\n): Record<string, any> {\n const output: Record<string, any> = { ...base };\n\n for (const [key, value] of Object.entries(override)) {\n if (value === undefined || key === \"layers\") continue;\n\n if (key === \"plugins\") {\n output[key] = [...toArray(output[key]), ...toArray(value)];\n continue;\n }\n\n if (key === \"middleware\" && output[key] !== undefined) {\n output[key] = [...toArray(output[key]), ...toArray(value)];\n continue;\n }\n\n if ((key === \"redirects\" || key === \"rewrites\" || key === \"headers\") && output[key]) {\n output[key] = mergeConfigListResolvers(output[key], value);\n continue;\n }\n\n if (isPlainObject(output[key]) && isPlainObject(value)) {\n output[key] = mergePlainObjects(output[key], value);\n continue;\n }\n\n output[key] = value;\n }\n\n return output;\n}\n\nfunction mergePlainObjects(base: Record<string, any>, override: Record<string, any>) {\n const output: Record<string, any> = { ...base };\n for (const [key, value] of Object.entries(override)) {\n if (value === undefined) continue;\n output[key] =\n isPlainObject(output[key]) && isPlainObject(value)\n ? mergePlainObjects(output[key], value)\n : value;\n }\n return output;\n}\n\nfunction mergeConfigListResolvers(base: unknown, override: unknown) {\n return async () => [...(await resolveConfigList(base)), ...(await resolveConfigList(override))];\n}\n\nasync function resolveConfigList(value: unknown): Promise<any[]> {\n const resolved = typeof value === \"function\" ? await value() : value;\n return toArray(resolved);\n}\n\nfunction toArray(value: unknown): any[] {\n if (value === undefined || value === null) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, any> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction isPathLayerSource(source: string): boolean {\n return (\n source.startsWith(\".\") ||\n source.startsWith(\"/\") ||\n source.startsWith(\"file:\") ||\n /^[a-zA-Z]:[\\\\/]/.test(source)\n );\n}\n\nfunction normalizeRealPath(value: string): string {\n return path.resolve(realpathSync(value));\n}\n","import type {\n FarmConfig as BaseFarmConfig,\n FarmMigrationCommand,\n FarmMigrationsConfig,\n FarmMigrationsUserConfig,\n ResolvedFarmMigrationsConfig,\n} from \"./types\";\nimport type { DocsConfig } from \"@farming-labs/docs\";\nimport type { FarmDocsResolvedConfig, FarmDocsUserConfig } from \"./docs/types\";\nimport type { FarmIntegrationsUserConfig } from \"./integrations\";\nimport type { FarmMarkdownResolvedConfig, FarmMarkdownUserConfig } from \"./markdown\";\nimport type { FarmObservabilityUserConfig } from \"./observability\";\nimport type { FarmMiddlewareConfig } from \"./middleware/types\";\nimport type { FarmPlugin } from \"./plugin\";\nimport type { FarmWorkflowsResolvedConfig, FarmWorkflowsUserConfig } from \"./workflows\";\nimport type { FarmCronResolvedConfig, FarmCronUserConfig } from \"./cron\";\nimport type { FarmEnvConfig, ResolvedFarmEnv } from \"./env\";\nimport type { UserConfig as ViteUserConfig } from \"vite\";\nimport { resolveIntegrationPlugins } from \"./integrations\";\nimport { resolveMarkdownConfig } from \"./markdown\";\nimport { resolveWorkflowsConfig } from \"./workflows\";\nimport { resolveCronConfig } from \"./cron\";\nimport { resolveEnv, setEnv } from \"./env\";\nimport {\n resolveMdxConfig,\n type FarmMdxResolvedConfig,\n type FarmMdxUserConfig,\n} from \"./app-markdown\";\nimport {\n normalizeRouteRules,\n routeRulesToHeaders,\n routeRulesToRedirects,\n type FarmRouteRules,\n} from \"./route-rules\";\nimport {\n resolveServerActionsConfig,\n type FarmServerActionsConfig,\n type ResolvedFarmServerActionsConfig,\n} from \"./server-action-security\";\nimport {\n loadFarmConfigFile,\n resolveFarmLayers,\n type FarmLayerEntry,\n type ResolvedFarmLayer,\n} from \"./layers\";\nimport path from \"path\";\nimport { normalizeFarmDeploymentId } from \"./deployment\";\nimport { resolveFarmDevtoolsConfig, type ResolvedFarmDevtoolsConfig } from \"./devtools-config\";\nimport {\n resolveFarmImageConfig,\n type FarmImageConfig,\n type ResolvedFarmImageConfig,\n} from \"./image-config\";\nimport { resolveFarmI18nConfig } from \"./i18n/config\";\nimport type { FarmI18nUserConfig, ResolvedFarmI18nConfig } from \"./i18n/types\";\nimport type { FarmCacheUserConfig } from \"./cache\";\n\nconst FARM_RESOLVED_CUSTOM_CONTEXT = Symbol.for(\"farm.resolvedCustomContext\");\n\nexport type {\n FarmDocsConfigInput,\n FarmDocsNavigationConfig,\n FarmDocsResolvedConfig,\n FarmDocsSidebarItem,\n FarmDocsUserConfig,\n} from \"./docs/types\";\nexport type {\n FarmMarkdownResolvedConfig,\n FarmMarkdownRouteInput,\n FarmMarkdownUserConfig,\n} from \"./markdown\";\nexport type { FarmMdxComponents, FarmMdxResolvedConfig, FarmMdxUserConfig } from \"./app-markdown\";\nexport type {\n FarmMigrationCommand,\n FarmMigrationsConfig,\n FarmMigrationsUserConfig,\n ResolvedFarmMigrationsConfig,\n} from \"./types\";\nexport type { FarmWorkflowsResolvedConfig, FarmWorkflowsUserConfig } from \"./workflows\";\nexport type { FarmCronJobConfig, FarmCronResolvedConfig, FarmCronUserConfig } from \"./cron\";\nexport type {\n FarmRouteRule,\n FarmRouteRuleCors,\n FarmRouteRuleRedirect,\n FarmRouteRuleRenderMode,\n FarmRouteRules,\n} from \"./route-rules\";\nexport type {\n FarmServerActionsConfig,\n ResolvedFarmServerActionsConfig,\n} from \"./server-action-security\";\nexport type { FarmLayerEntry, ResolvedFarmLayer } from \"./layers\";\nexport type {\n FarmDevtoolsConfig,\n FarmDevtoolsUserConfig,\n ResolvedFarmDevtoolsConfig,\n} from \"./devtools-config\";\nexport type {\n FarmImageConfig,\n FarmImageFormat,\n FarmImageLocalPattern,\n FarmImageProvider,\n FarmImageRemotePattern,\n ResolvedFarmImageConfig,\n} from \"./image-config\";\nexport type {\n FarmI18nCookieConfig,\n FarmI18nDetectionSignal,\n FarmI18nDirection,\n FarmI18nRouting,\n FarmI18nUserConfig,\n ResolvedFarmI18nConfig,\n} from \"./i18n/types\";\n\nexport interface RedirectConfig {\n source: string;\n destination: string;\n permanent?: boolean;\n statusCode?: number;\n}\n\nexport interface HeaderConfig {\n source: string;\n headers: Array<{\n key: string;\n value: string;\n }>;\n}\n\nexport interface RewriteConfig {\n source: string;\n destination: string;\n}\n\n/** @deprecated Use FarmImageConfig. */\nexport type ImageConfig = FarmImageConfig;\n\n/** @deprecated Use FarmI18nUserConfig. */\nexport type I18nConfig = FarmI18nUserConfig;\n\nexport interface OpenAPIConfig {\n enabled?: boolean;\n route?: string;\n title?: string;\n description?: string;\n version?: string;\n servers?: Array<{\n url: string;\n description?: string;\n }>;\n contact?: {\n name?: string;\n email?: string;\n url?: string;\n };\n license?: {\n name: string;\n url?: string;\n };\n}\n\nexport type MiddlewareConfig = FarmMiddlewareConfig;\n\nexport interface NotFoundConfig {\n /** Path to a custom 404 page component (e.g., \"./src/app/not-found.tsx\") */\n component?: string;\n}\n\nexport type FarmDeployTarget = \"vercel\" | \"cloudflare\" | \"netlify\" | \"node\" | string;\n\nexport interface FarmDeployConfig {\n /**\n * Deployment platform. When present, Farm picks the matching Nitro preset and\n * output directory unless explicitly overridden.\n */\n target?: FarmDeployTarget;\n /** Nitro preset override. Usually inferred from target. */\n preset?: BaseFarmConfig[\"preset\"];\n /** Deployable output directory, relative to project root unless absolute. */\n outputDir?: string;\n /** Alias for outputDir for terser config. */\n output?: string;\n /** Cloudflare Pages project name used by `farm deploy --cloudflare`. */\n projectName?: string;\n vercel?: {\n outputDirectory?: string;\n buildCommand?: string;\n installCommand?: string;\n framework?: string | null;\n };\n cloudflare?: {\n outputDir?: string;\n projectName?: string;\n };\n netlify?: {\n outputDir?: string;\n site?: string;\n };\n}\n\nexport interface ResolvedFarmDeployConfig extends Omit<FarmDeployConfig, \"output\"> {\n target?: FarmDeployTarget;\n preset: BaseFarmConfig[\"preset\"];\n outputDir: string;\n}\n\nexport interface FarmUserConfig extends Omit<BaseFarmConfig, \"vite\" | \"docs\" | \"env\" | \"layers\"> {\n /** Reusable Farm directories or installed packages, applied from left to right. */\n extends?: readonly FarmLayerEntry[];\n plugins?: FarmPlugin[];\n integrations?: FarmIntegrationsUserConfig;\n /** Shared application data, route, ISR, and PPR cache. */\n cache?: FarmCacheUserConfig;\n migrations?: FarmMigrationsUserConfig;\n /** Map portable cron schedules to ordinary GET API routes. */\n cron?: FarmCronUserConfig | FarmCronResolvedConfig | false;\n workflows?: FarmWorkflowsUserConfig | boolean;\n preset?: BaseFarmConfig[\"preset\"];\n deploy?: FarmDeployConfig;\n docs?: FarmDocsUserConfig;\n md?: FarmMarkdownUserConfig | boolean;\n mdx?: FarmMdxUserConfig;\n observability?: FarmObservabilityUserConfig;\n\n trailingSlash?: boolean;\n redirects?: () => Promise<RedirectConfig[]> | RedirectConfig[];\n rewrites?: () => Promise<RewriteConfig[]> | RewriteConfig[];\n headers?: () => Promise<HeaderConfig[]> | HeaderConfig[];\n\n images?: ImageConfig;\n publicDir?: string;\n\n i18n?: FarmI18nUserConfig | false;\n openapi?: OpenAPIConfig;\n\n middleware?: FarmMiddlewareConfig;\n routeRules?: FarmRouteRules;\n context?: BaseFarmConfig[\"context\"];\n serverActions?: FarmServerActionsConfig;\n /** Build identifier used to detect and recover from deployment version skew. */\n deploymentId?: string;\n\n notFound?: NotFoundConfig;\n\n output?: \"standalone\" | \"static\" | \"export\";\n distDir?: string;\n generateBuildId?: () => string | Promise<string>;\n compress?: boolean;\n\n devIndicators?: {\n buildActivity?: boolean;\n buildActivityPosition?: \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\";\n };\n\n serverRuntimeConfig?: Record<string, any>;\n publicRuntimeConfig?: Record<string, any>;\n\n env?: FarmEnvConfig<any, any>;\n\n typescript?: {\n tsconfigPath?: string;\n ignoreBuildErrors?: boolean;\n };\n\n vite?: ViteUserConfig | ((config: ViteUserConfig) => ViteUserConfig);\n\n [key: string]: any;\n}\n\nexport interface ResolvedFarmConfig extends Required<\n Omit<\n FarmUserConfig,\n | \"extends\"\n | \"plugins\"\n | \"vite\"\n | \"deploy\"\n | \"docs\"\n | \"md\"\n | \"mdx\"\n | \"migrations\"\n | \"cron\"\n | \"workflows\"\n | \"env\"\n | \"serverActions\"\n | \"devtools\"\n | \"images\"\n | \"i18n\"\n >\n> {\n /** @internal Tracks whether `context` came from user/layer config instead of the default noop. */\n [FARM_RESOLVED_CUSTOM_CONTEXT]?: boolean;\n extends: readonly FarmLayerEntry[];\n layers: ResolvedFarmLayer[];\n plugins: FarmPlugin[];\n vite: ViteUserConfig;\n deploy: ResolvedFarmDeployConfig;\n docs: FarmDocsResolvedConfig;\n md: FarmMarkdownResolvedConfig;\n mdx: FarmMdxResolvedConfig;\n migrations: ResolvedFarmMigrationsConfig;\n cron: FarmCronResolvedConfig;\n workflows: FarmWorkflowsResolvedConfig;\n env: ResolvedFarmEnv;\n serverActions: ResolvedFarmServerActionsConfig;\n devtools: ResolvedFarmDevtoolsConfig;\n images: ResolvedFarmImageConfig;\n i18n: ResolvedFarmI18nConfig;\n routeRules: FarmRouteRules;\n}\n\nexport function hasCustomFarmRouteContext(config: ResolvedFarmConfig): boolean {\n return config[FARM_RESOLVED_CUSTOM_CONTEXT] === true;\n}\n\nexport type FarmLayerConfig = Omit<\n FarmUserConfig,\n | \"root\"\n | \"outDir\"\n | \"distDir\"\n | \"deploy\"\n | \"output\"\n | \"preset\"\n | \"publicDir\"\n | \"generateBuildId\"\n | \"deploymentId\"\n>;\n\nexport { defineConfig, defineFarmConfig } from \"./config-entry\";\n\nexport function normalizeDeployTarget(target?: FarmDeployTarget): FarmDeployTarget | undefined {\n if (!target) return undefined;\n if (target === \"cloudflare-pages\" || target === \"cloudflare_pages\") return \"cloudflare\";\n if (target === \"node-server\" || target === \"nitro\") return \"node\";\n return target;\n}\n\nexport function getPresetForDeployTarget(\n target?: FarmDeployTarget,\n): BaseFarmConfig[\"preset\"] | undefined {\n switch (normalizeDeployTarget(target)) {\n case \"vercel\":\n return \"vercel\";\n case \"cloudflare\":\n return \"cloudflare-pages\";\n case \"netlify\":\n return \"netlify\";\n case \"node\":\n return \"node-server\";\n default:\n return undefined;\n }\n}\n\nexport function getDeployTargetForPreset(preset?: string): FarmDeployTarget | undefined {\n if (!preset) return undefined;\n if (preset === \"vercel\" || preset === \"vercel-edge\") return \"vercel\";\n if (preset === \"cloudflare\" || preset === \"cloudflare-pages\" || preset === \"cloudflare-module\") {\n return \"cloudflare\";\n }\n if (preset === \"netlify\" || preset === \"netlify-edge\") return \"netlify\";\n if (preset === \"node-server\") return \"node\";\n return undefined;\n}\n\nexport function getDefaultDeployOutputDir(\n target: FarmDeployTarget | undefined,\n preset: string | undefined,\n distDir: string,\n): string {\n const normalizedTarget = normalizeDeployTarget(target) || getDeployTargetForPreset(preset);\n if (normalizedTarget === \"vercel\") return \".vercel/output\";\n return `${distDir}/.output`;\n}\n\nexport function resolveDeployOutputPath(root: string, outputDir: string): string {\n return path.isAbsolute(outputDir) ? outputDir : path.join(root, outputDir);\n}\n\nexport function resolveDeployConfig(\n config: Pick<FarmUserConfig, \"deploy\" | \"preset\" | \"distDir\">,\n overrides: {\n target?: FarmDeployTarget;\n preset?: BaseFarmConfig[\"preset\"];\n outputDir?: string;\n } = {},\n): ResolvedFarmDeployConfig {\n const deploy = config.deploy || {};\n const distDir = config.distDir || \".farm\";\n const target = normalizeDeployTarget(overrides.target || deploy.target);\n const preset =\n overrides.preset ||\n deploy.preset ||\n config.preset ||\n getPresetForDeployTarget(target) ||\n \"node-server\";\n const resolvedTarget = target || getDeployTargetForPreset(preset);\n const platformOutput =\n resolvedTarget === \"vercel\"\n ? deploy.vercel?.outputDirectory\n : resolvedTarget === \"cloudflare\"\n ? deploy.cloudflare?.outputDir\n : resolvedTarget === \"netlify\"\n ? deploy.netlify?.outputDir\n : undefined;\n const outputDir =\n overrides.outputDir ||\n deploy.outputDir ||\n deploy.output ||\n platformOutput ||\n getDefaultDeployOutputDir(resolvedTarget, preset, distDir);\n\n return {\n ...deploy,\n target: resolvedTarget,\n preset,\n outputDir,\n };\n}\n\nexport function resolveMigrationsConfig(\n migrations: FarmMigrationsUserConfig | undefined,\n): ResolvedFarmMigrationsConfig {\n if (!migrations) return { commands: [] };\n if (Array.isArray(migrations)) return { commands: migrations };\n return { commands: migrations.commands || [] };\n}\n\nexport const DOCS_CONFIG_FILENAMES = [\n \"docs.config.ts\",\n \"docs.config.tsx\",\n \"docs.config.mts\",\n \"docs.config.cts\",\n \"docs.config.js\",\n \"docs.config.jsx\",\n \"docs.config.mjs\",\n \"docs.config.cjs\",\n \"docs.json\",\n];\n\nfunction normalizeDocsRoute(value: string | undefined, fallback = \"/docs\"): string {\n const raw = (value || fallback).trim();\n if (!raw || raw === \"/\") return \"/\";\n const normalized = raw\n .replace(/\\\\/g, \"/\")\n .replace(/\\/+/g, \"/\")\n .replace(/^\\/?/, \"/\")\n .replace(/\\/+$/, \"\");\n return normalized || \"/\";\n}\n\nfunction docsRouteToEntry(route: string): string {\n const entry = route.replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n return entry || \"docs\";\n}\n\nfunction normalizeDocsContentDir(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const normalized = value.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n return normalized || undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction cloneSerializable(value: unknown, seen = new WeakSet<object>()): any {\n if (value === null) return null;\n\n const valueType = typeof value;\n if (valueType === \"string\" || valueType === \"number\" || valueType === \"boolean\") {\n return value;\n }\n if (valueType === \"undefined\" || valueType === \"function\" || valueType === \"symbol\") {\n return undefined;\n }\n if (Array.isArray(value)) {\n return value.map((item) => cloneSerializable(item, seen)).filter((item) => item !== undefined);\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (isRecord(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n\n const output: Record<string, any> = {};\n for (const [key, nestedValue] of Object.entries(value)) {\n const clonedValue = cloneSerializable(nestedValue, seen);\n if (clonedValue !== undefined) {\n output[key] = clonedValue;\n }\n }\n return output;\n }\n\n return undefined;\n}\n\nfunction sanitizeDocsConfig(config: Partial<DocsConfig>): Partial<DocsConfig> {\n return cloneSerializable(config) || {};\n}\n\nexport async function findDocsConfigPath(\n rootDir: string,\n configPath?: string,\n): Promise<string | undefined> {\n const { existsSync } = await import(\"fs\");\n const root = path.resolve(rootDir || process.cwd());\n\n if (configPath) {\n const resolvedPath = path.isAbsolute(configPath) ? configPath : path.join(root, configPath);\n if (!existsSync(resolvedPath)) {\n throw new Error(`Could not find docs config at ${configPath}.`);\n }\n return path.resolve(resolvedPath);\n }\n\n for (const filename of DOCS_CONFIG_FILENAMES) {\n const resolvedPath = path.join(root, filename);\n if (existsSync(resolvedPath)) {\n return resolvedPath;\n }\n }\n\n return undefined;\n}\n\nexport async function loadDocsConfig(\n rootDir: string,\n configPath?: string,\n): Promise<{ config: Partial<DocsConfig>; configPath: string } | undefined> {\n const fs = await import(\"fs/promises\");\n const { pathToFileURL } = await import(\"url\");\n const root = path.resolve(rootDir || process.cwd());\n const resolvedPath = await findDocsConfigPath(root, configPath);\n\n if (!resolvedPath) return undefined;\n\n try {\n if (resolvedPath.endsWith(\".json\")) {\n const content = await fs.readFile(resolvedPath, \"utf8\");\n return { config: JSON.parse(content), configPath: resolvedPath };\n }\n\n const { build } = await import(\"esbuild\");\n const configCacheDir = path.join(root, \".farm\", \".config-loader\");\n await fs.mkdir(configCacheDir, { recursive: true });\n const modulePath = path.join(\n configCacheDir,\n `docs-config-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`,\n );\n\n await build({\n absWorkingDir: root,\n entryPoints: [resolvedPath],\n outfile: modulePath,\n bundle: true,\n format: \"esm\",\n platform: \"node\",\n target: `node${process.versions.node.split(\".\")[0]}`,\n packages: \"external\",\n jsx: \"automatic\",\n logLevel: \"silent\",\n sourcemap: \"inline\",\n });\n\n const moduleUrl = pathToFileURL(modulePath).href + `?t=${Date.now()}`;\n let importedConfig: any;\n\n try {\n importedConfig = await import(/* @vite-ignore */ moduleUrl);\n } finally {\n await fs.unlink(modulePath).catch(() => undefined);\n }\n\n return {\n config: importedConfig.default || importedConfig,\n configPath: resolvedPath,\n };\n } catch (error: any) {\n const relativePath = path.relative(root, resolvedPath) || resolvedPath;\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load docs config from ${relativePath}: ${message}`);\n }\n}\n\nexport async function resolveDocsConfig(\n userDocs: FarmDocsUserConfig | undefined,\n options: {\n root?: string;\n srcDir?: string;\n } = {},\n): Promise<FarmDocsResolvedConfig> {\n const root = options.root || process.cwd();\n\n if (userDocs === false) {\n return {\n enabled: false,\n entry: \"/docs\",\n config: { entry: \"docs\", docsPath: \"/docs\" },\n };\n }\n\n const docsOptions = isRecord(userDocs) ? userDocs : {};\n if (docsOptions.enabled === false) {\n return {\n enabled: false,\n entry: \"/docs\",\n config: { entry: \"docs\", docsPath: \"/docs\" },\n };\n }\n\n const loadedConfig = await loadDocsConfig(root, docsOptions.configPath);\n const hasExplicitDocsConfig = userDocs === true || isRecord(userDocs);\n\n if (!hasExplicitDocsConfig && !loadedConfig) {\n return {\n enabled: false,\n entry: \"/docs\",\n config: { entry: \"docs\", docsPath: \"/docs\" },\n };\n }\n\n const inlineDocsConfig = sanitizeDocsConfig(docsOptions.config || {});\n const directDocsConfig = sanitizeDocsConfig({\n ...docsOptions,\n enabled: undefined,\n config: undefined,\n configPath: undefined,\n } as Partial<DocsConfig>);\n const loadedDocsConfig = sanitizeDocsConfig(loadedConfig?.config || {});\n const mergedDocsConfig: Partial<DocsConfig> = {\n ...loadedDocsConfig,\n ...inlineDocsConfig,\n ...directDocsConfig,\n };\n\n const explicitRoute = typeof docsOptions.entry === \"string\" ? docsOptions.entry : undefined;\n const configuredDocsPath =\n typeof mergedDocsConfig.docsPath === \"string\" ? mergedDocsConfig.docsPath : undefined;\n const configuredEntry =\n typeof mergedDocsConfig.entry === \"string\" ? mergedDocsConfig.entry : undefined;\n const entryRoute = normalizeDocsRoute(\n configuredDocsPath || explicitRoute || (configuredEntry ? `/${configuredEntry}` : undefined),\n );\n const docsEntry =\n explicitRoute && explicitRoute.startsWith(\"/\")\n ? docsRouteToEntry(explicitRoute)\n : docsRouteToEntry(configuredEntry || entryRoute);\n const contentDir = normalizeDocsContentDir(docsOptions.contentDir || mergedDocsConfig.contentDir);\n\n return {\n enabled: true,\n entry: entryRoute,\n contentDir,\n configPath: loadedConfig?.configPath,\n config: {\n ...mergedDocsConfig,\n entry: docsEntry,\n docsPath: entryRoute,\n ...(contentDir ? { contentDir } : {}),\n },\n };\n}\n\nexport async function resolveConfig(\n userConfig: FarmUserConfig,\n mode: \"development\" | \"production\",\n): Promise<ResolvedFarmConfig> {\n const projectRoot = userConfig.root || process.cwd();\n const layerResolution = await resolveFarmLayers(userConfig, {\n root: projectRoot,\n mode,\n });\n userConfig = layerResolution.config;\n\n const redirects =\n typeof userConfig.redirects === \"function\"\n ? await userConfig.redirects()\n : userConfig.redirects || [];\n\n const rewrites =\n typeof userConfig.rewrites === \"function\"\n ? await userConfig.rewrites()\n : userConfig.rewrites || [];\n\n const headers =\n typeof userConfig.headers === \"function\"\n ? await userConfig.headers()\n : userConfig.headers || [];\n const routeRules = normalizeRouteRules(userConfig.routeRules);\n const routeRuleRedirects = routeRulesToRedirects(routeRules);\n const routeRuleHeaders = routeRulesToHeaders(routeRules);\n\n const deploy = resolveDeployConfig(userConfig);\n const root = userConfig.root || process.cwd();\n const srcDir = userConfig.srcDir || \"src\";\n const docs = await resolveDocsConfig(userConfig.docs, { root, srcDir });\n const md = resolveMarkdownConfig(userConfig.md);\n const mdx = resolveMdxConfig(userConfig.mdx);\n const env = resolveEnv(userConfig.env, process.env);\n setEnv(env);\n const generateBuildId = userConfig.generateBuildId || (() => `build-${Date.now()}`);\n const deploymentId = normalizeFarmDeploymentId(\n userConfig.deploymentId ||\n process.env.FARM_DEPLOYMENT_ID ||\n process.env.VERCEL_GIT_COMMIT_SHA ||\n process.env.CF_PAGES_COMMIT_SHA ||\n (mode === \"production\" ? await generateBuildId() : \"development\"),\n );\n\n const resolved: ResolvedFarmConfig = {\n [FARM_RESOLVED_CUSTOM_CONTEXT]: typeof userConfig.context === \"function\",\n root,\n srcDir,\n extends: userConfig.extends || [],\n layers: layerResolution.layers,\n outDir: userConfig.outDir || \"dist\",\n basePath: userConfig.basePath || \"/\",\n preset: deploy.preset || \"node-server\",\n deploy,\n docs,\n md,\n mdx,\n migrations: resolveMigrationsConfig(userConfig.migrations),\n cron: resolveCronConfig(userConfig.cron),\n workflows: resolveWorkflowsConfig(userConfig.workflows),\n observability: userConfig.observability ?? false,\n devtools: resolveFarmDevtoolsConfig(userConfig.devtools, mode),\n storage: userConfig.storage || {},\n cache: userConfig.cache || {},\n suppressLintOnLink: userConfig.suppressLintOnLink ?? false,\n experimental: {\n serverComponents: false,\n serverActions: false,\n ...userConfig.experimental,\n },\n plugins: [...resolveIntegrationPlugins(userConfig.integrations), ...(userConfig.plugins || [])],\n integrations: userConfig.integrations || {},\n trailingSlash: userConfig.trailingSlash ?? false,\n redirects: () => [...redirects, ...routeRuleRedirects],\n rewrites: () => rewrites,\n headers: () => [...headers, ...routeRuleHeaders],\n routeRules,\n images: resolveFarmImageConfig(userConfig.images),\n publicDir: userConfig.publicDir || \"public\",\n i18n: resolveFarmI18nConfig(userConfig.i18n, { root, mode }),\n openapi: {\n enabled: false,\n route: \"/docs/reference\",\n title: \"API Documentation\",\n description: \"Auto-generated API documentation\",\n version: \"1.0.0\",\n servers: [{ url: \"http://localhost:3000\", description: \"Development server\" }],\n ...userConfig.openapi,\n },\n middleware: userConfig.middleware || {},\n notFound: userConfig.notFound || {},\n context: userConfig.context || (() => undefined),\n serverActions: resolveServerActionsConfig(userConfig.serverActions),\n deploymentId,\n output: userConfig.output || \"standalone\",\n distDir: userConfig.distDir || \".farm\",\n generateBuildId,\n compress: userConfig.compress ?? true,\n devIndicators: {\n buildActivity: true,\n buildActivityPosition: \"bottom-right\",\n ...userConfig.devIndicators,\n },\n serverRuntimeConfig: userConfig.serverRuntimeConfig || {},\n publicRuntimeConfig: userConfig.publicRuntimeConfig || {},\n env,\n typescript: {\n tsconfigPath: \"tsconfig.json\",\n ignoreBuildErrors: false,\n ...userConfig.typescript,\n },\n vite: typeof userConfig.vite === \"function\" ? userConfig.vite({}) : userConfig.vite || {},\n };\n\n return resolved;\n}\n\nexport async function loadConfig(\n rootDir?: string,\n configPath?: string,\n mode = process.env.NODE_ENV === \"production\" ? \"production\" : \"development\",\n loadEnvironment?: (typeof import(\"vite\"))[\"loadEnv\"],\n): Promise<FarmUserConfig | undefined> {\n const { existsSync } = await import(\"fs\");\n const loadEnv = loadEnvironment || (await import(\"vite\")).loadEnv;\n\n const root = rootDir || process.cwd();\n const loadedEnv = loadEnv(mode, root, \"\");\n for (const [key, value] of Object.entries(loadedEnv)) {\n if (process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n const searchPaths = [\n configPath,\n \"farm.config.ts\",\n \"farm.config.mts\",\n \"farm.config.js\",\n \"farm.config.mjs\",\n \"config.ts\",\n \"config.mts\",\n \"config.js\",\n \"config.mjs\",\n ].filter(Boolean) as string[];\n\n for (const relativePath of searchPaths) {\n try {\n // Use path.join for proper path construction\n const absolutePath = relativePath.startsWith(\"/\")\n ? relativePath\n : path.join(root, relativePath);\n\n // Normalize the path to handle any issues\n const normalizedPath = path.resolve(absolutePath);\n\n // Check if file exists before trying to import\n if (!existsSync(normalizedPath)) {\n continue;\n }\n\n const loadedConfig = await loadFarmConfigFile<FarmUserConfig>(normalizedPath, { root });\n return loadedConfig.root === undefined ? { ...loadedConfig, root } : loadedConfig;\n } catch (error: any) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load config from ${relativePath}: ${message}`);\n }\n }\n return undefined;\n}\n","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 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\"].includes(method.toUpperCase());\n}\n","export const DEFAULT_FARM_DEVTOOLS_SHORTCUT = \"mod+shift+.\";\nexport const FARM_DEVTOOLS_PATH = \"/__farm/devtools\";\nexport const FARM_DEVTOOLS_LAUNCH_PARAM = \"__farm_devtools\";\n\nexport interface FarmDevtoolsConfig {\n /** Enable the development-only DevTools UI and runtime endpoints. */\n enabled?: boolean;\n /** Keyboard shortcut used to toggle DevTools, or false to disable the shortcut. */\n shortcut?: string | false;\n}\n\nexport type FarmDevtoolsUserConfig = boolean | FarmDevtoolsConfig;\n\nexport interface ResolvedFarmDevtoolsConfig {\n enabled: boolean;\n shortcut: string | false;\n}\n\nexport function resolveFarmDevtoolsConfig(\n config: FarmDevtoolsUserConfig | ResolvedFarmDevtoolsConfig | undefined,\n mode: \"development\" | \"production\" = \"development\",\n): ResolvedFarmDevtoolsConfig {\n if (mode !== \"development\" || config === false) {\n return { enabled: false, shortcut: false };\n }\n\n const options = config === true || config === undefined ? {} : config;\n const enabled = options.enabled ?? true;\n\n if (!enabled) {\n return { enabled: false, shortcut: false };\n }\n\n const shortcut =\n typeof options.shortcut === \"string\" && options.shortcut.trim()\n ? options.shortcut\n .toLowerCase()\n .split(\"+\")\n .map((part) => part.trim())\n .filter(Boolean)\n .join(\"+\")\n : options.shortcut === false\n ? false\n : DEFAULT_FARM_DEVTOOLS_SHORTCUT;\n\n return { enabled: true, shortcut };\n}\n","export const DEFAULT_FARM_IMAGE_PATH = \"/_farm/image\";\nexport const DEFAULT_FARM_IMAGE_DEVICE_SIZES = [\n 640, 750, 828, 1080, 1200, 1920, 2048, 3840,\n] as const;\nexport const DEFAULT_FARM_IMAGE_SIZES = [16, 32, 48, 64, 96, 128, 256, 384] as const;\nexport const DEFAULT_FARM_IMAGE_QUALITIES = [75] as const;\nexport const DEFAULT_FARM_IMAGE_FORMATS = [\"image/webp\"] as const;\n\nexport type FarmImageFormat = \"image/avif\" | \"image/webp\";\nexport type FarmImageProvider = \"auto\" | \"node\" | \"cloudflare\" | \"none\";\n\nexport interface FarmImageRemotePattern {\n protocol?: \"http\" | \"https\";\n hostname: string;\n port?: string;\n pathname?: string;\n search?: string;\n}\n\nexport interface FarmImageLocalPattern {\n pathname: string;\n search?: string;\n}\n\nexport interface FarmImageConfig {\n /** Runtime optimizer. Auto selects Cloudflare Images on Cloudflare and Sharp elsewhere. */\n provider?: FarmImageProvider;\n /** Public optimizer endpoint. */\n path?: string;\n /** @deprecated Prefer remotePatterns, which also restricts protocol, path, port, and query. */\n domains?: readonly string[];\n remotePatterns?: readonly FarmImageRemotePattern[];\n localPatterns?: readonly FarmImageLocalPattern[];\n deviceSizes?: readonly number[];\n imageSizes?: readonly number[];\n qualities?: readonly number[];\n formats?: readonly FarmImageFormat[];\n minimumCacheTTL?: number;\n maximumResponseBody?: number | string;\n maximumRedirects?: number;\n dangerouslyAllowSVG?: boolean;\n dangerouslyAllowLocalIP?: boolean;\n}\n\nexport interface ResolvedFarmImageConfig {\n provider: FarmImageProvider;\n path: string;\n domains: readonly string[];\n remotePatterns: readonly FarmImageRemotePattern[];\n localPatterns: readonly FarmImageLocalPattern[];\n deviceSizes: readonly number[];\n imageSizes: readonly number[];\n qualities: readonly number[];\n formats: readonly FarmImageFormat[];\n minimumCacheTTL: number;\n maximumResponseBody: number;\n maximumRedirects: number;\n dangerouslyAllowSVG: boolean;\n dangerouslyAllowLocalIP: boolean;\n}\n\nexport type PublicFarmImageConfig = Pick<\n ResolvedFarmImageConfig,\n \"provider\" | \"path\" | \"deviceSizes\" | \"imageSizes\" | \"qualities\" | \"formats\"\n>;\n\nconst SIZE_UNITS: Record<string, number> = {\n b: 1,\n kb: 1_000,\n mb: 1_000_000,\n gb: 1_000_000_000,\n kib: 1_024,\n mib: 1_048_576,\n gib: 1_073_741_824,\n};\n\nexport function resolveFarmImageConfig(\n config: FarmImageConfig | undefined,\n): ResolvedFarmImageConfig {\n const path = normalizeImagePath(config?.path ?? DEFAULT_FARM_IMAGE_PATH);\n const deviceSizes = normalizeIntegerList(\n config?.deviceSizes ?? DEFAULT_FARM_IMAGE_DEVICE_SIZES,\n \"images.deviceSizes\",\n );\n const imageSizes = normalizeIntegerList(\n config?.imageSizes ?? DEFAULT_FARM_IMAGE_SIZES,\n \"images.imageSizes\",\n );\n const qualities = normalizeIntegerList(\n config?.qualities ?? DEFAULT_FARM_IMAGE_QUALITIES,\n \"images.qualities\",\n 100,\n );\n const formats = [...new Set(config?.formats ?? DEFAULT_FARM_IMAGE_FORMATS)];\n\n if (formats.some((format) => format !== \"image/avif\" && format !== \"image/webp\")) {\n throw new TypeError('images.formats only supports \"image/avif\" and \"image/webp\"');\n }\n\n const minimumCacheTTL = normalizeNonNegativeInteger(\n config?.minimumCacheTTL ?? 60,\n \"images.minimumCacheTTL\",\n );\n const maximumRedirects = normalizeNonNegativeInteger(\n config?.maximumRedirects ?? 3,\n \"images.maximumRedirects\",\n );\n\n return Object.freeze({\n provider: config?.provider ?? \"auto\",\n path,\n domains: Object.freeze([\n ...new Set(\n (config?.domains ?? []).map((domain) => domain.trim().toLowerCase()).filter(Boolean),\n ),\n ]),\n remotePatterns: Object.freeze(\n (config?.remotePatterns ?? []).map((pattern) => normalizeRemotePattern(pattern)),\n ),\n localPatterns: Object.freeze(\n (config?.localPatterns ?? [{ pathname: \"/**\" }]).map((pattern) =>\n normalizeLocalPattern(pattern),\n ),\n ),\n deviceSizes: Object.freeze(deviceSizes),\n imageSizes: Object.freeze(imageSizes),\n qualities: Object.freeze(qualities),\n formats: Object.freeze(formats),\n minimumCacheTTL,\n maximumResponseBody: parseSize(\n config?.maximumResponseBody ?? \"10mb\",\n \"images.maximumResponseBody\",\n ),\n maximumRedirects,\n dangerouslyAllowSVG: config?.dangerouslyAllowSVG ?? false,\n dangerouslyAllowLocalIP: config?.dangerouslyAllowLocalIP ?? false,\n });\n}\n\nexport function getPublicFarmImageConfig(\n config: Pick<ResolvedFarmImageConfig, keyof PublicFarmImageConfig>,\n): PublicFarmImageConfig {\n return {\n provider: config.provider,\n path: config.path,\n deviceSizes: config.deviceSizes,\n imageSizes: config.imageSizes,\n qualities: config.qualities,\n formats: config.formats,\n };\n}\n\nfunction normalizeImagePath(value: string): string {\n const path = value.trim().replace(/\\/+$/, \"\") || \"/\";\n if (!path.startsWith(\"/\") || path.includes(\"?\") || path.includes(\"#\")) {\n throw new TypeError(\"images.path must be an absolute pathname without a query or hash\");\n }\n return path;\n}\n\nfunction normalizeIntegerList(values: readonly number[], name: string, max?: number): number[] {\n if (values.length === 0) {\n throw new TypeError(`${name} must contain at least one value`);\n }\n\n const normalized = [...new Set(values)].sort((left, right) => left - right);\n for (const value of normalized) {\n if (!Number.isSafeInteger(value) || value <= 0 || (max !== undefined && value > max)) {\n throw new TypeError(\n `${name} must contain positive integers${max ? ` no greater than ${max}` : \"\"}`,\n );\n }\n }\n return normalized;\n}\n\nfunction normalizeNonNegativeInteger(value: number, name: string): number {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new TypeError(`${name} must be a non-negative safe integer`);\n }\n return value;\n}\n\nfunction parseSize(value: number | string, name: string): number {\n if (typeof value === \"number\") {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new TypeError(`${name} must be a positive safe integer`);\n }\n return value;\n }\n\n const match = value\n .trim()\n .toLowerCase()\n .match(/^(\\d+(?:\\.\\d+)?)\\s*(b|kb|mb|gb|kib|mib|gib)$/);\n if (!match) {\n throw new TypeError(`${name} must be bytes or a size string such as \"5mb\"`);\n }\n\n const bytes = Number(match[1]) * SIZE_UNITS[match[2]];\n if (!Number.isSafeInteger(bytes) || bytes <= 0) {\n throw new TypeError(`${name} must resolve to a positive safe integer`);\n }\n return bytes;\n}\n\nfunction normalizeRemotePattern(pattern: FarmImageRemotePattern): FarmImageRemotePattern {\n const hostname = pattern.hostname.trim().toLowerCase();\n if (!hostname || hostname.includes(\"/\") || hostname.includes(\":\")) {\n throw new TypeError(\"images.remotePatterns[].hostname must be a hostname or wildcard hostname\");\n }\n if (pattern.pathname && !pattern.pathname.startsWith(\"/\")) {\n throw new TypeError(\"images.remotePatterns[].pathname must start with /\");\n }\n if (pattern.search && !pattern.search.startsWith(\"?\")) {\n throw new TypeError(\"images.remotePatterns[].search must start with ?\");\n }\n return Object.freeze({ ...pattern, hostname });\n}\n\nfunction normalizeLocalPattern(pattern: FarmImageLocalPattern): FarmImageLocalPattern {\n if (!pattern.pathname.startsWith(\"/\")) {\n throw new TypeError(\"images.localPatterns[].pathname must start with /\");\n }\n if (pattern.search && !pattern.search.startsWith(\"?\")) {\n throw new TypeError(\"images.localPatterns[].search must start with ?\");\n }\n return Object.freeze({ ...pattern });\n}\n","import path from \"node:path\";\nimport type {\n FarmI18nDetectionSignal,\n FarmI18nDirection,\n FarmI18nUserConfig,\n ResolvedFarmI18nConfig,\n} from \"./types\";\n\nexport const DEFAULT_FARM_I18N_COOKIE = \"farm_locale\";\nexport const DEFAULT_FARM_I18N_COOKIE_MAX_AGE = 60 * 60 * 24 * 365;\n\nconst DEFAULT_DETECTION: readonly FarmI18nDetectionSignal[] = [\"url\", \"cookie\", \"accept-language\"];\n\nexport function resolveFarmI18nConfig(\n input: FarmI18nUserConfig | false | undefined,\n options: { root?: string; mode?: \"development\" | \"production\" } = {},\n): ResolvedFarmI18nConfig {\n const root = options.root || process.cwd();\n const strictByDefault = options.mode === \"production\";\n\n if (!input) {\n return {\n enabled: false,\n locales: [\"en\"],\n defaultLocale: \"en\",\n messages: path.join(root, \"src/messages\"),\n routing: \"none\",\n detection: [],\n fallbackLocale: \"en\",\n strict: strictByDefault,\n cookie: {\n name: DEFAULT_FARM_I18N_COOKIE,\n maxAge: DEFAULT_FARM_I18N_COOKIE_MAX_AGE,\n path: \"/\",\n sameSite: \"lax\",\n secure: options.mode === \"production\",\n },\n direction: {},\n };\n }\n\n if (!Array.isArray(input.locales) || input.locales.length === 0) {\n throw new Error(\"i18n.locales must contain at least one locale.\");\n }\n\n const locales = input.locales.map(canonicalizeLocale);\n if (new Set(locales).size !== locales.length) {\n throw new Error(\"i18n.locales must not contain duplicate locales.\");\n }\n\n const defaultLocale = canonicalizeLocale(input.defaultLocale);\n if (!locales.includes(defaultLocale)) {\n throw new Error(`i18n.defaultLocale \"${defaultLocale}\" must be included in i18n.locales.`);\n }\n\n const fallbackLocale = canonicalizeLocale(input.fallbackLocale || defaultLocale);\n if (!locales.includes(fallbackLocale)) {\n throw new Error(`i18n.fallbackLocale \"${fallbackLocale}\" must be included in i18n.locales.`);\n }\n\n const detection = resolveDetection(input);\n const direction: Record<string, FarmI18nDirection> = {};\n for (const [rawLocale, value] of Object.entries(input.direction || {})) {\n const locale = canonicalizeLocale(rawLocale);\n if (!locales.includes(locale)) {\n throw new Error(`i18n.direction contains unknown locale \"${rawLocale}\".`);\n }\n if (value !== \"ltr\" && value !== \"rtl\") {\n throw new Error(`i18n.direction.${rawLocale} must be \"ltr\" or \"rtl\".`);\n }\n direction[locale] = value;\n }\n\n return {\n enabled: true,\n locales,\n defaultLocale,\n messages: path.resolve(root, input.messages || \"src/messages\"),\n routing: input.routing || \"prefix-except-default\",\n detection,\n fallbackLocale,\n strict: input.strict ?? strictByDefault,\n cookie: {\n name: input.cookie?.name?.trim() || DEFAULT_FARM_I18N_COOKIE,\n maxAge: normalizePositiveInteger(\n input.cookie?.maxAge,\n DEFAULT_FARM_I18N_COOKIE_MAX_AGE,\n \"i18n.cookie.maxAge\",\n ),\n path: input.cookie?.path || \"/\",\n sameSite: input.cookie?.sameSite || \"lax\",\n secure: input.cookie?.secure ?? options.mode === \"production\",\n },\n direction,\n };\n}\n\nexport function resolveFarmI18nMessagePath(\n config: Pick<ResolvedFarmI18nConfig, \"messages\">,\n locale: string,\n): string {\n return config.messages.includes(\"{locale}\")\n ? config.messages.split(\"{locale}\").join(locale)\n : path.join(config.messages, `${locale}.json`);\n}\n\nexport function canonicalizeLocale(locale: string): string {\n if (!locale || typeof locale !== \"string\") {\n throw new Error(\"Farm i18n locales must be non-empty strings.\");\n }\n\n try {\n return Intl.getCanonicalLocales(locale)[0]!;\n } catch {\n throw new Error(`Invalid i18n locale \"${locale}\".`);\n }\n}\n\nfunction resolveDetection(input: FarmI18nUserConfig): readonly FarmI18nDetectionSignal[] {\n if (input.detection === false || input.localeDetection === false) {\n return [\"url\"];\n }\n\n const detection = input.detection || DEFAULT_DETECTION;\n const allowed = new Set<FarmI18nDetectionSignal>([\"url\", \"cookie\", \"accept-language\"]);\n const unique: FarmI18nDetectionSignal[] = [];\n\n for (const signal of detection) {\n if (!allowed.has(signal)) {\n throw new Error(`Unsupported i18n detection signal \"${signal}\".`);\n }\n if (!unique.includes(signal)) unique.push(signal);\n }\n\n return unique;\n}\n\nfunction normalizePositiveInteger(\n value: number | undefined,\n fallback: number,\n name: string,\n): number {\n if (value === undefined) return fallback;\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(`${name} must be a positive integer.`);\n }\n return value;\n}\n","import type {\n build as viteBuild,\n createServer as createViteServer,\n loadEnv as viteLoadEnv,\n} from \"vite\";\n\nexport type FarmProductionViteBuilder = \"rollup\" | \"rolldown\";\n\nexport interface FarmProductionViteRuntime {\n build: typeof viteBuild;\n createServer: typeof createViteServer;\n loadEnv: typeof viteLoadEnv;\n builder: FarmProductionViteBuilder;\n}\n\nexport function canUseRolldownForRouteDiscovery(viteConfig: object | undefined): boolean {\n return !viteConfig || Object.keys(viteConfig).length === 0;\n}\n\nexport function supportsRolldownVite(nodeVersion = process.versions.node): boolean {\n const [major = 0, minor = 0] = nodeVersion.split(\".\").map(Number);\n return (major === 20 && minor >= 19) || major > 22 || (major === 22 && minor >= 12);\n}\n\nfunction requestedProductionViteBuilder(): FarmProductionViteBuilder | undefined {\n const requested = process.env.FARM_VITE_BUILDER?.trim().toLowerCase();\n if (!requested) return undefined;\n if (requested === \"rollup\" || requested === \"rolldown\") return requested;\n throw new Error('FARM_VITE_BUILDER must be either \"rolldown\" or \"rollup\"');\n}\n\nasync function loadRollupVite(): Promise<FarmProductionViteRuntime> {\n const runtime = await import(\"vite\");\n return {\n build: runtime.build,\n createServer: runtime.createServer,\n loadEnv: runtime.loadEnv,\n builder: \"rollup\",\n };\n}\n\n/**\n * Prefer Vite's Rolldown-powered production builder on supported Node releases.\n * Vite 5 remains the compatibility path for Node 18, --no-optional installs,\n * and projects that explicitly request Rollup.\n */\nexport async function loadFarmProductionVite(): Promise<FarmProductionViteRuntime> {\n const requested = requestedProductionViteBuilder();\n if (requested === \"rollup\" || !supportsRolldownVite()) {\n if (requested === \"rolldown\") {\n throw new Error(\n \"FARM_VITE_BUILDER=rolldown requires Node 20.19+, Node 22.12+, or a newer release\",\n );\n }\n return loadRollupVite();\n }\n\n try {\n const runtime = (await import(\"vite-rolldown\")) as unknown as typeof import(\"vite\");\n return {\n build: runtime.build,\n createServer: runtime.createServer,\n loadEnv: runtime.loadEnv,\n builder: \"rolldown\",\n };\n } catch (error) {\n if (requested === \"rolldown\") {\n const detail = error instanceof Error ? `: ${error.message}` : \"\";\n throw new Error(\n `FARM_VITE_BUILDER=rolldown was requested, but the optional Vite Rolldown runtime could not be loaded${detail}`,\n );\n }\n return loadRollupVite();\n }\n}\n","import type { RouteSegment, ParsedRoute } from \"./types\";\nimport path from \"path\";\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\n for (const part of pathParts) {\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?|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);\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\nexport function resolveAppPath(root: string, ...paths: string[]): string {\n return path.resolve(root, ...paths);\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 const result: Record<string, string | string[]> = {};\n\n for (const [key, value] of searchParams.entries()) {\n if (key in result) {\n const existing = result[key];\n if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n result[key] = [existing, value];\n }\n } else {\n result[key] = value;\n }\n }\n\n return result;\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":["memoryDriver","module","resolveDriver","globalState","path","globalState","env","path","response","resolveStorageRuntimeClient","createIntegrationOrm","path","env","env","globalState","path","path","path","path","import_node_path","path","isRecord","existsSync","path","pathToFileURL","env"]}
|
|
1
|
+
{"version":3,"sources":["../../src/storage/index.ts","../../src/integration-orm.ts","../../src/config-runtime.ts","../../src/integration-api.ts","../../src/request-context.ts","../../src/server/response.ts","../../src/integrations.ts","../../src/markdown.ts","../../src/workflows.ts","../../src/cron.ts","../../src/env.ts","../../src/app-markdown.ts","../../src/route-runtime.ts","../../src/route-rules.ts","../../src/server-action-security.ts","../../src/cache-invalidation.ts","../../src/layers.ts","../../src/config.ts","../../src/deployment.ts","../../src/devtools-config.ts","../../src/image-config.ts","../../src/i18n/config.ts","../../src/auth-config.ts","../../src/build/production-vite.ts","../../src/utils.ts"],"sourcesContent":["import { createStorage, prefixStorage, builtinDrivers, type BuiltinDriverName } from \"unstorage\";\nimport type { Driver, Storage } from \"unstorage\";\nimport type { Database } from \"db0\";\nimport memoryDriver from \"unstorage/drivers/memory\";\nimport type {\n FarmStorageClient,\n FarmStorageClientConfig,\n FarmStorageConfigObject,\n FarmStorageLocalDriverConfig,\n FarmStorageDatabaseConfig,\n FarmStorageDatabaseDriverMap,\n FarmStorageDatabaseDriverName,\n FarmStorageRuntimeClient,\n FarmStorageMountConfig,\n FarmStorageMounts,\n FarmStorageUserConfig,\n} from \"./types\";\n\nexport type {\n FarmStorageBuiltinDriverConfig,\n FarmStorageClient,\n FarmStorageClientConfig,\n FarmStorageConfigObject,\n FarmStorageCustomDriverConfig,\n FarmStorageDatabaseConfig,\n FarmStorageDatabaseDriverName,\n FarmStorageLocalDriverConfig,\n FarmStorageRuntimeClient,\n FarmStorageMountConfig,\n FarmStorageMounts,\n FarmStorageUserConfig,\n} from \"./types\";\nexport type {\n BuiltinDriverName,\n BuiltinDriverOptions,\n Driver,\n Storage,\n StorageMeta,\n StorageValue,\n TransactionOptions,\n} from \"unstorage\";\nexport type { ConnectorName, ConnectorOptions, Database } from \"db0\";\n\ntype DriverFactoryModule = {\n default: (options?: Record<string, any>) => Driver;\n};\n\ntype DriverResolver = () => Driver | Promise<Driver>;\ntype ModuleLoader = <T = any>(specifier: string) => Promise<T>;\n\nconst loadModule: ModuleLoader = (specifier) => import(/* @vite-ignore */ specifier);\n\nconst DATABASE_CONNECTORS: {\n [K in FarmStorageDatabaseDriverName]: {\n connector: FarmStorageDatabaseDriverMap[K];\n load: () => Promise<{ default: (options?: any) => any }>;\n };\n} = {\n sqlite: {\n connector: \"node-sqlite\",\n load: () => loadModule(\"db0/connectors/node-sqlite\"),\n },\n \"node-sqlite\": {\n connector: \"node-sqlite\",\n load: () => loadModule(\"db0/connectors/node-sqlite\"),\n },\n sqlite3: {\n connector: \"sqlite3\",\n load: () => loadModule(\"db0/connectors/sqlite3\"),\n },\n \"better-sqlite3\": {\n connector: \"better-sqlite3\",\n load: () => loadModule(\"db0/connectors/better-sqlite3\"),\n },\n postgres: {\n connector: \"postgresql\",\n load: () => loadModule(\"db0/connectors/postgresql\"),\n },\n postgresql: {\n connector: \"postgresql\",\n load: () => loadModule(\"db0/connectors/postgresql\"),\n },\n pg: {\n connector: \"postgresql\",\n load: () => loadModule(\"db0/connectors/postgresql\"),\n },\n mysql: {\n connector: \"mysql2\",\n load: () => loadModule(\"db0/connectors/mysql2\"),\n },\n mysql2: {\n connector: \"mysql2\",\n load: () => loadModule(\"db0/connectors/mysql2\"),\n },\n pglite: {\n connector: \"pglite\",\n load: () => loadModule(\"db0/connectors/pglite\"),\n },\n planetscale: {\n connector: \"planetscale\",\n load: () => loadModule(\"db0/connectors/planetscale\"),\n },\n libsql: {\n connector: \"libsql\",\n load: () => loadModule(\"db0/connectors/libsql/node\"),\n },\n \"libsql-node\": {\n connector: \"libsql-node\",\n load: () => loadModule(\"db0/connectors/libsql/node\"),\n },\n \"libsql-http\": {\n connector: \"libsql-http\",\n load: () => loadModule(\"db0/connectors/libsql/http\"),\n },\n};\n\nfunction createMemoryStorage(): Storage {\n return createStorage({\n driver: memoryDriver(),\n });\n}\n\nconst GLOBAL_STORAGE_KEY = Symbol.for(\"farmjs.storage.global\");\n\nfunction readGlobalStorage(): Storage | undefined {\n return (globalThis as unknown as Record<PropertyKey, Storage | undefined>)[GLOBAL_STORAGE_KEY];\n}\n\nfunction writeGlobalStorage(storage: Storage): Storage {\n (globalThis as unknown as Record<PropertyKey, Storage | undefined>)[GLOBAL_STORAGE_KEY] = storage;\n return storage;\n}\n\nfunction getActiveGlobalStorage(): Storage {\n const existing = readGlobalStorage();\n if (existing) {\n return existing;\n }\n return writeGlobalStorage(createMemoryStorage());\n}\n\nlet globalStorage = getActiveGlobalStorage();\n\nfunction normalizeMountKey(base?: string): string {\n return (base || \"\")\n .trim()\n .replace(/^[:/\\\\]+|[:/\\\\]+$/g, \"\")\n .replace(/[\\\\/]+/g, \":\");\n}\n\nfunction isDriverInstance(value: unknown): value is Driver {\n return (\n !!value &&\n typeof value === \"object\" &&\n typeof (value as Driver).getItem === \"function\" &&\n typeof (value as Driver).getKeys === \"function\"\n );\n}\n\nfunction isStorageInstance(value: unknown): value is Storage {\n return (\n !!value &&\n typeof value === \"object\" &&\n typeof (value as Storage).mount === \"function\" &&\n typeof (value as Storage).getMount === \"function\"\n );\n}\n\nfunction isStorageClient(value: unknown): value is FarmStorageClient {\n return (\n !!value &&\n typeof value === \"object\" &&\n (value as FarmStorageClient).kind === \"farm-storage-client\" &&\n typeof (value as FarmStorageClient).resolveDriver === \"function\" &&\n typeof (value as FarmStorageClient).createStorage === \"function\"\n );\n}\n\nfunction isDatabaseDriverName(name: string): name is FarmStorageDatabaseDriverName {\n return name in DATABASE_CONNECTORS;\n}\n\nfunction extractDriverOptions(config: FarmStorageClientConfig): Record<string, any> | undefined {\n const source = config as Record<string, any>;\n const {\n client: _client,\n driver: _driver,\n mounts: _mounts,\n options,\n tableName: _tableName,\n ...inlineOptions\n } = source;\n const hasInlineOptions = Object.keys(inlineOptions).length > 0;\n\n if (options && typeof options === \"object\" && !Array.isArray(options)) {\n return hasInlineOptions ? { ...inlineOptions, ...options } : options;\n }\n\n if (hasInlineOptions) {\n return inlineOptions;\n }\n\n return options;\n}\n\nasync function loadBuiltinDriver(\n name: BuiltinDriverName,\n options?: Record<string, any>,\n): Promise<Driver> {\n const modulePath = builtinDrivers[name];\n\n if (!modulePath) {\n throw new Error(`Unsupported storage driver \"${name}\".`);\n }\n\n const module = (await loadModule(modulePath)) as DriverFactoryModule;\n return module.default(options);\n}\n\nasync function loadDatabaseDriver(config: FarmStorageDatabaseConfig): Promise<Driver> {\n const connectorEntry = DATABASE_CONNECTORS[config.driver as FarmStorageDatabaseDriverName];\n const [{ createDatabase }, connectorModule, db0DriverModule] = await Promise.all([\n loadModule<typeof import(\"db0\")>(\"db0\"),\n connectorEntry.load(),\n loadModule<typeof import(\"unstorage/drivers/db0\")>(\"unstorage/drivers/db0\"),\n ]);\n\n const database = createDatabase(connectorModule.default(extractDriverOptions(config) || {}));\n return db0DriverModule.default({\n database,\n tableName: config.tableName,\n });\n}\n\nasync function resolveDriver(config?: FarmStorageMountConfig): Promise<Driver> {\n if (config && isStorageClient(config)) {\n return config.resolveDriver();\n }\n\n const driverInput = config?.driver ?? \"memory\";\n\n if (typeof driverInput === \"function\") {\n return await driverInput();\n }\n\n if (isDriverInstance(driverInput)) {\n return driverInput;\n }\n\n if (isDatabaseDriverName(driverInput)) {\n return loadDatabaseDriver(config as FarmStorageDatabaseConfig);\n }\n\n if (driverInput === \"local\") {\n return loadBuiltinDriver(\"fs-lite\", extractDriverOptions(config as FarmStorageMountConfig));\n }\n\n return loadBuiltinDriver(\n driverInput as BuiltinDriverName,\n extractDriverOptions(config as FarmStorageClientConfig),\n );\n}\n\nfunction createStorageClientFromResolver(resolveDriver: DriverResolver): FarmStorageClient {\n let driverPromise: Promise<Driver> | undefined;\n let storagePromise: Promise<Storage> | undefined;\n\n const ensureDriver = async () => {\n driverPromise ??= Promise.resolve(resolveDriver());\n return driverPromise;\n };\n\n const ensureStorage = async () => {\n storagePromise ??= ensureDriver().then((driver) =>\n createStorage({\n driver,\n }),\n );\n return storagePromise;\n };\n\n const target = {\n kind: \"farm-storage-client\" as const,\n ready: ensureStorage,\n createStorage: ensureStorage,\n resolveDriver: ensureDriver,\n };\n\n return new Proxy(target as FarmStorageClient, {\n get(currentTarget, prop, receiver) {\n if (prop === \"then\") {\n return undefined;\n }\n\n if (Reflect.has(currentTarget, prop)) {\n return Reflect.get(currentTarget, prop, receiver);\n }\n\n return (...args: any[]) =>\n ensureStorage().then(async (storage) => {\n const member = Reflect.get(storage as object, prop);\n\n if (typeof member !== \"function\") {\n return member;\n }\n\n const result = Reflect.apply(member, storage, args);\n\n if (prop === \"dispose\") {\n return Promise.resolve(result).finally(() => {\n storagePromise = undefined;\n });\n }\n\n return result;\n });\n },\n });\n}\n\nexport function defineStorageClient(resolveDriver: DriverResolver): FarmStorageClient {\n return createStorageClientFromResolver(resolveDriver);\n}\n\nexport function createStorageClient(config: FarmStorageClientConfig): FarmStorageClient {\n return defineStorageClient(() => resolveDriver(config));\n}\n\nexport function driverStorage(\n driver: Driver | (() => Driver | Promise<Driver>),\n): FarmStorageClient {\n return defineStorageClient(() => (typeof driver === \"function\" ? driver() : driver));\n}\n\nexport function databaseStorage(\n database: Database,\n options: { tableName?: string } = {},\n): FarmStorageClient {\n return defineStorageClient(async () => {\n const db0DriverModule =\n await loadModule<typeof import(\"unstorage/drivers/db0\")>(\"unstorage/drivers/db0\");\n return db0DriverModule.default({\n database,\n tableName: options.tableName,\n });\n });\n}\n\nexport function memoryStorage(): FarmStorageClient {\n return createStorageClient({ driver: \"memory\" });\n}\n\nexport function localStorage(options: Omit<FarmStorageLocalDriverConfig, \"driver\"> = {}) {\n return createStorageClient({\n driver: \"local\",\n ...options,\n });\n}\n\nexport function sqliteStorage(options: Omit<FarmStorageDatabaseConfig, \"driver\">) {\n return createStorageClient({\n driver: \"sqlite\",\n ...options,\n });\n}\n\nexport function mysqlStorage(options: Omit<FarmStorageDatabaseConfig, \"driver\">) {\n return createStorageClient({\n driver: \"mysql\",\n ...options,\n });\n}\n\nexport function mysql2Storage(options: Omit<FarmStorageDatabaseConfig, \"driver\">) {\n return mysqlStorage(options);\n}\n\nexport function postgresStorage(options: Omit<FarmStorageDatabaseConfig, \"driver\">) {\n return createStorageClient({\n driver: \"postgres\",\n ...options,\n });\n}\n\nexport function pgStorage(options: Omit<FarmStorageDatabaseConfig, \"driver\">) {\n return postgresStorage(options);\n}\n\nexport function pgliteStorage(options: Omit<FarmStorageDatabaseConfig, \"driver\">) {\n return createStorageClient({\n driver: \"pglite\",\n ...options,\n });\n}\n\nexport function planetscaleStorage(options: Omit<FarmStorageDatabaseConfig, \"driver\">) {\n return createStorageClient({\n driver: \"planetscale\",\n ...options,\n });\n}\n\nexport function libsqlStorage(options: Omit<FarmStorageDatabaseConfig, \"driver\">) {\n return createStorageClient({\n driver: \"libsql\",\n ...options,\n });\n}\n\nexport function redisStorage(\n options: Omit<Extract<FarmStorageClientConfig, { driver: \"redis\" }>, \"driver\">,\n) {\n return createStorageClient({\n driver: \"redis\",\n ...options,\n });\n}\n\nexport function s3Storage(\n options: Omit<Extract<FarmStorageClientConfig, { driver: \"s3\" }>, \"driver\">,\n) {\n return createStorageClient({\n driver: \"s3\",\n ...options,\n });\n}\n\nexport function mongodbStorage(\n options: Omit<Extract<FarmStorageClientConfig, { driver: \"mongodb\" }>, \"driver\">,\n) {\n return createStorageClient({\n driver: \"mongodb\",\n ...options,\n });\n}\n\nexport function upstashStorage(\n options: Omit<Extract<FarmStorageClientConfig, { driver: \"upstash\" }>, \"driver\">,\n) {\n return createStorageClient({\n driver: \"upstash\",\n ...options,\n });\n}\n\nexport function netlifyBlobsStorage(\n options: Omit<Extract<FarmStorageClientConfig, { driver: \"netlify-blobs\" }>, \"driver\">,\n) {\n return createStorageClient({\n driver: \"netlify-blobs\",\n ...options,\n });\n}\n\nexport function vercelKVStorage(\n options: Omit<Extract<FarmStorageClientConfig, { driver: \"vercel-kv\" }>, \"driver\">,\n) {\n return createStorageClient({\n driver: \"vercel-kv\",\n ...options,\n });\n}\n\nexport function vercelBlobStorage(\n options: Omit<Extract<FarmStorageClientConfig, { driver: \"vercel-blob\" }>, \"driver\">,\n) {\n return createStorageClient({\n driver: \"vercel-blob\",\n ...options,\n });\n}\n\nasync function mountNamespaces(storage: Storage, mounts?: FarmStorageMounts): Promise<void> {\n if (!mounts) {\n return;\n }\n\n for (const [base, config] of Object.entries(mounts)) {\n storage.mount(normalizeMountKey(base), await resolveDriver(config));\n }\n}\n\nexport async function createFarmStorage(config: FarmStorageUserConfig = {}): Promise<Storage> {\n if (isStorageInstance(config)) {\n return config;\n }\n\n if (isStorageClient(config)) {\n return config.createStorage();\n }\n\n const rootConfig = isStorageClient(config.client) ? config.client : config;\n const storage = createStorage({\n driver: await resolveDriver(rootConfig),\n });\n\n await mountNamespaces(storage, config.mounts);\n return storage;\n}\n\nexport async function resolveStorageRuntimeClient(\n config: FarmStorageUserConfig | undefined,\n): Promise<unknown | undefined> {\n if (!config || isStorageInstance(config) || isStorageClient(config)) {\n return undefined;\n }\n\n const client = config.client;\n if (!client || isStorageInstance(client) || isStorageClient(client)) {\n return undefined;\n }\n\n return typeof client === \"function\" ? await client() : client;\n}\n\nexport async function initStorage(config: FarmStorageUserConfig = {}): Promise<Storage> {\n globalStorage = getActiveGlobalStorage();\n const nextStorage = await createFarmStorage(config);\n const previousStorage = globalStorage;\n globalStorage = writeGlobalStorage(nextStorage);\n\n if (previousStorage !== nextStorage) {\n await previousStorage.dispose().catch(() => {});\n }\n\n return globalStorage;\n}\n\nexport function getStorage(namespace?: string): Storage {\n globalStorage = getActiveGlobalStorage();\n const base = normalizeMountKey(namespace);\n if (!base) {\n return globalStorage;\n }\n\n const namespaced = prefixStorage(globalStorage, base);\n return {\n ...namespaced,\n async clear() {\n const keys = await namespaced.getKeys();\n await Promise.all(keys.map((key) => namespaced.removeItem(key)));\n },\n } as Storage;\n}\n\nexport async function disposeStorage(): Promise<void> {\n globalStorage = getActiveGlobalStorage();\n const previousStorage = globalStorage;\n globalStorage = writeGlobalStorage(createMemoryStorage());\n await previousStorage.dispose().catch(() => {});\n}\n","import type {\n AnyFieldBuilder,\n AnyModelDefinition,\n FieldBuilder,\n JsonValue,\n ModelDefinition,\n OrmClient,\n SchemaDefinition,\n SchemaModels,\n} from \"@farming-labs/orm\";\nimport type {\n FarmIntegrationSchema,\n FarmIntegrationSchemaField,\n FarmIntegrationSchemaModel,\n} from \"./integrations\";\nimport { resolveStorageRuntimeClient } from \"./storage\";\nimport type { FarmStorageUserConfig } from \"./storage/types\";\nimport type { FarmConfig } from \"./types\";\n\ntype RuntimeClientFactory<TClient> = () => TClient | Promise<TClient>;\n\nexport type FarmIntegrationOrmSchema = SchemaDefinition<Record<string, AnyModelDefinition>>;\n\nexport type FarmIntegrationOrmClient<TSchema extends FarmIntegrationOrmSchema> = OrmClient<TSchema>;\n\ntype FarmIntegrationOrmFieldKind<TField extends FarmIntegrationSchemaField> = TField[\"type\"] extends\n | \"id\"\n | \"uuid\"\n ? \"id\"\n : TField[\"type\"] extends \"text\"\n ? \"string\"\n : TField[\"type\"] extends \"number\"\n ? \"decimal\"\n : Extract<TField[\"type\"], \"string\" | \"boolean\" | \"integer\" | \"datetime\" | \"json\" | \"enum\">;\n\ntype FarmIntegrationOrmFieldNullable<TField extends FarmIntegrationSchemaField> = TField extends {\n nullable: true;\n}\n ? true\n : TField extends { required: false }\n ? true\n : false;\n\ntype FarmIntegrationOrmEnumValue<TField extends FarmIntegrationSchemaField> = TField extends {\n values: readonly (infer TValue extends string)[];\n}\n ? TValue\n : string;\n\ntype FarmIntegrationOrmFieldValue<TField extends FarmIntegrationSchemaField> =\n TField[\"type\"] extends \"id\" | \"uuid\" | \"string\" | \"text\"\n ? string\n : TField[\"type\"] extends \"boolean\"\n ? boolean\n : TField[\"type\"] extends \"integer\"\n ? number\n : TField[\"type\"] extends \"number\"\n ? string\n : TField[\"type\"] extends \"datetime\"\n ? Date\n : TField[\"type\"] extends \"json\"\n ? JsonValue\n : TField[\"type\"] extends \"enum\"\n ? FarmIntegrationOrmEnumValue<TField>\n : never;\n\nexport type InferFarmIntegrationOrmField<TField extends FarmIntegrationSchemaField> = FieldBuilder<\n FarmIntegrationOrmFieldKind<TField>,\n FarmIntegrationOrmFieldNullable<TField>,\n FarmIntegrationOrmFieldValue<TField>\n>;\n\nexport type InferFarmIntegrationOrmFields<TModel extends FarmIntegrationSchemaModel> = {\n [TFieldKey in keyof TModel[\"fields\"] & string]: InferFarmIntegrationOrmField<\n Extract<TModel[\"fields\"][TFieldKey], FarmIntegrationSchemaField>\n >;\n};\n\nexport type InferFarmIntegrationOrmSchema<TSchema extends FarmIntegrationSchema> =\n SchemaDefinition<{\n [TModelKey in keyof TSchema[\"models\"] & string]: ModelDefinition<\n InferFarmIntegrationOrmFields<\n Extract<TSchema[\"models\"][TModelKey], FarmIntegrationSchemaModel>\n >,\n {}\n >;\n }>;\n\nexport type InferFarmIntegrationOrmClient<TSchema extends FarmIntegrationSchema | undefined> =\n TSchema extends FarmIntegrationSchema ? OrmClient<InferFarmIntegrationOrmSchema<TSchema>> : never;\n\nexport interface CreateIntegrationOrmOptions<\n TClient = unknown,\n TSchema extends FarmIntegrationSchema = FarmIntegrationSchema,\n> {\n schema: TSchema;\n config?: Pick<FarmConfig, \"storage\">;\n storage?: FarmStorageUserConfig;\n client?: TClient | RuntimeClientFactory<TClient>;\n}\n\nexport async function createIntegrationOrm<\n TClient = unknown,\n TSchema extends FarmIntegrationSchema = FarmIntegrationSchema,\n>(\n options: CreateIntegrationOrmOptions<TClient, TSchema>,\n): Promise<InferFarmIntegrationOrmClient<TSchema>> {\n const [schema, client] = await Promise.all([\n farmIntegrationSchemaToOrmSchema(options.schema),\n resolveIntegrationOrmRuntimeClient(options),\n ]);\n\n if (!client) {\n throw new Error(\n \"Schema-backed integration storage requires a runtime client at farm.config storage.client.\",\n );\n }\n\n const { createOrmFromRuntime } = await import(\"@farming-labs/orm-runtime\");\n return createOrmFromRuntime({\n schema,\n client,\n }) as Promise<InferFarmIntegrationOrmClient<TSchema>>;\n}\n\nexport async function resolveIntegrationOrmRuntimeClient<TClient = unknown>(\n options: Omit<CreateIntegrationOrmOptions<TClient>, \"schema\">,\n): Promise<TClient | unknown | undefined> {\n if (options.client !== undefined) {\n return typeof options.client === \"function\"\n ? await (options.client as RuntimeClientFactory<TClient>)()\n : options.client;\n }\n\n return resolveStorageRuntimeClient(options.storage ?? options.config?.storage);\n}\n\nexport async function farmIntegrationSchemaToOrmSchema(\n schema: FarmIntegrationSchema,\n): Promise<FarmIntegrationOrmSchema> {\n const orm = await import(\"@farming-labs/orm\");\n const models: Record<string, AnyModelDefinition> = {};\n\n for (const [modelKey, modelSchema] of Object.entries(schema.models)) {\n models[modelKey] = orm.model({\n table: modelSchema.name ?? modelKey,\n fields: createOrmModelFields(orm, modelSchema),\n constraints: createOrmModelConstraints(modelSchema),\n description: modelSchema.description,\n }) as AnyModelDefinition;\n }\n\n return orm.defineSchema(models) as FarmIntegrationOrmSchema;\n}\n\nfunction createOrmModelFields(\n orm: typeof import(\"@farming-labs/orm\"),\n modelSchema: FarmIntegrationSchemaModel,\n): Record<string, AnyFieldBuilder> {\n return Object.fromEntries(\n Object.entries(modelSchema.fields).map(([fieldKey, fieldSchema]) => [\n fieldKey,\n createOrmField(orm, fieldKey, fieldSchema),\n ]),\n );\n}\n\nfunction createOrmField(\n orm: typeof import(\"@farming-labs/orm\"),\n fieldKey: string,\n field: FarmIntegrationSchemaField,\n): AnyFieldBuilder {\n let builder = createOrmFieldBuilder(orm, fieldKey, field) as AnyFieldBuilder;\n\n if (field.unique) {\n builder = builder.unique();\n }\n\n if (field.nullable || field.required === false) {\n builder = builder.nullable();\n }\n\n if (field.default !== undefined) {\n builder =\n field.type === \"datetime\" && field.default === \"now\"\n ? builder.defaultNow()\n : builder.default(field.default as never);\n }\n\n if (field.reference) {\n builder = builder.references(`${field.reference.model}.${field.reference.field}`);\n }\n\n if (field.name && field.name !== fieldKey) {\n builder = builder.map(field.name);\n }\n\n if (field.description) {\n builder = builder.describe(field.description);\n }\n\n return builder;\n}\n\nfunction createOrmFieldBuilder(\n orm: typeof import(\"@farming-labs/orm\"),\n fieldKey: string,\n field: FarmIntegrationSchemaField,\n): AnyFieldBuilder {\n switch (field.type) {\n case \"id\":\n case \"uuid\":\n return orm.id();\n case \"string\":\n case \"text\":\n return orm.string();\n case \"boolean\":\n return orm.boolean();\n case \"integer\":\n return orm.integer();\n case \"number\":\n return orm.decimal();\n case \"datetime\":\n return orm.datetime();\n case \"json\":\n return orm.json();\n case \"enum\": {\n if (!field.values?.length) {\n throw new Error(`Integration schema enum field \"${fieldKey}\" must define values.`);\n }\n\n return orm.enumeration(field.values as readonly [string, ...string[]]);\n }\n default:\n throw new Error(\n `Unsupported integration schema field type \"${field.type}\" for \"${fieldKey}\".`,\n );\n }\n}\n\nfunction createOrmModelConstraints(modelSchema: FarmIntegrationSchemaModel) {\n const unique: Array<readonly [string, ...string[]]> = [];\n const indexes: Array<readonly [string, ...string[]]> = [];\n\n for (const constraint of modelSchema.constraints ?? []) {\n if (!constraint.fields.length) {\n continue;\n }\n\n const fields = constraint.fields as readonly [string, ...string[]];\n if (constraint.type === \"unique\") {\n unique.push(fields);\n } else {\n indexes.push(fields);\n }\n }\n\n return {\n unique,\n indexes,\n };\n}\n\nexport type IntegrationOrmModelNames<TSchema extends FarmIntegrationOrmSchema> =\n keyof SchemaModels<TSchema> & string;\n","export { loadConfig, resolveConfig, resolveDeployConfig } from \"./config\";\nexport { loadFarmProductionVite } from \"./build/production-vite\";\nexport type { FarmProductionViteRuntime } from \"./build/production-vite\";\nexport { logger } from \"./utils\";\n","export type FarmIntegrationAPIMethod =\n | \"GET\"\n | \"POST\"\n | \"PUT\"\n | \"PATCH\"\n | \"DELETE\"\n | \"OPTIONS\"\n | \"HEAD\";\n\nexport type FarmIntegrationAPIBodyFormat = \"json\" | \"form\" | \"none\";\nexport type FarmIntegrationAPIResponseFormat = \"json\" | \"text\" | \"response\";\n\nexport interface FarmIntegrationAPIOperation<\n TBody = never,\n TQuery = never,\n TResponse = unknown,\n TServer extends boolean = false,\n TMethod extends FarmIntegrationAPIMethod = FarmIntegrationAPIMethod,\n> {\n readonly kind: \"farm-integration-api-operation\";\n path: string;\n method: TMethod;\n bodyFormat?: FarmIntegrationAPIBodyFormat;\n responseFormat?: FarmIntegrationAPIResponseFormat;\n headers?: Record<string, string>;\n credentials?: RequestCredentials;\n isServer?: TServer;\n __pathless?: boolean;\n __types?: {\n body: TBody;\n query: TQuery;\n response: TResponse;\n };\n}\n\nexport type FarmIntegrationAPI = {\n [key: string]: FarmIntegrationAPI | FarmIntegrationAPIOperation<any, any, any, any, any>;\n};\n\nexport type FarmIntegrationRouteOperationCarrier<\n TPath extends string = string,\n TOperation extends FarmIntegrationAPIOperation<any, any, any, any, any> =\n FarmIntegrationAPIOperation<any, any, any, any, any>,\n> = {\n path: TPath;\n __operation: TOperation;\n};\n\ntype IntegrationAPIBuilderOptions<TServer extends boolean = false> = Omit<\n FarmIntegrationAPIOperation<any, any, any, TServer>,\n \"kind\" | \"method\" | \"path\" | \"__pathless\" | \"__types\"\n>;\n\nexport function defineIntegrationAPIOperation<\n TBody = never,\n TQuery = never,\n TResponse = unknown,\n TServer extends boolean = false,\n TMethod extends FarmIntegrationAPIMethod = FarmIntegrationAPIMethod,\n>(\n operation: Omit<\n FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, TMethod>,\n \"kind\" | \"__types\"\n >,\n): FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, TMethod> {\n return {\n kind: \"farm-integration-api-operation\",\n ...operation,\n };\n}\n\nexport function defineIntegrationAPI<TAPI extends FarmIntegrationAPI>(api: TAPI): TAPI {\n return api;\n}\n\nfunction operation<\n TBody = never,\n TQuery = never,\n TResponse = unknown,\n TServer extends boolean = false,\n TMethod extends FarmIntegrationAPIMethod = FarmIntegrationAPIMethod,\n>(\n method: TMethod,\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n): FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, TMethod> {\n const hasExplicitPath = typeof pathOrOptions === \"string\";\n const path = hasExplicitPath ? pathOrOptions : \"\";\n const options = (\n hasExplicitPath\n ? maybeOptions\n : {\n ...maybeOptions,\n ...pathOrOptions,\n }\n ) as IntegrationAPIBuilderOptions<TServer>;\n\n return defineIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, TMethod>({\n path,\n method,\n __pathless: !hasExplicitPath,\n ...options,\n });\n}\n\nfunction get<TResponse = unknown, TServer extends boolean = false>(\n path: string,\n options?: IntegrationAPIBuilderOptions<TServer>,\n): FarmIntegrationAPIOperation<never, never, TResponse, TServer, \"GET\">;\nfunction get<TQuery = never, TResponse = unknown, TServer extends boolean = false>(\n path: string,\n options?: IntegrationAPIBuilderOptions<TServer>,\n): FarmIntegrationAPIOperation<never, TQuery, TResponse, TServer, \"GET\">;\nfunction get<TResponse = unknown, TServer extends boolean = false>(\n options?: IntegrationAPIBuilderOptions<TServer>,\n): FarmIntegrationAPIOperation<never, never, TResponse, TServer, \"GET\">;\nfunction get<TQuery = never, TResponse = unknown, TServer extends boolean = false>(\n options?: IntegrationAPIBuilderOptions<TServer>,\n): FarmIntegrationAPIOperation<never, TQuery, TResponse, TServer, \"GET\">;\nfunction get(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<boolean>,\n maybeOptions: IntegrationAPIBuilderOptions<boolean> = {} as IntegrationAPIBuilderOptions<boolean>,\n) {\n return operation<never, any, any, boolean>(\"GET\", pathOrOptions, maybeOptions);\n}\n\nfunction isOperation(value: unknown): value is FarmIntegrationAPIOperation<any, any, any, any> {\n return (\n !!value &&\n typeof value === \"object\" &&\n (value as FarmIntegrationAPIOperation<any, any, any, any>).kind ===\n \"farm-integration-api-operation\"\n );\n}\n\nfunction bindRoutePath<TAPI extends FarmIntegrationAPI>(path: string, api: TAPI): TAPI {\n const entries = Object.entries(api as Record<string, unknown>).map(([key, value]) => {\n if (isOperation(value)) {\n return [\n key,\n {\n ...value,\n path,\n __pathless: false,\n },\n ];\n }\n\n if (value && typeof value === \"object\") {\n return [key, bindRoutePath(path, value as FarmIntegrationAPI)];\n }\n\n return [key, value];\n });\n\n return Object.fromEntries(entries) as TAPI;\n}\n\ntype RouteOperationsToAPI<\n TOperations extends readonly FarmIntegrationAPIOperation<any, any, any, any, any>[],\n> = {\n [TMethod in Lowercase<TOperations[number][\"method\"] & string>]: Extract<\n TOperations[number],\n { method: Uppercase<TMethod> }\n >;\n};\n\ntype StripRouteClientPrefix<TPath extends string> = TPath extends `/api/${string}/${infer TRest}`\n ? TRest\n : TPath extends `/${string}/${infer TRest}`\n ? TRest\n : TPath extends `/${infer TRest}`\n ? TRest\n : TPath;\n\ntype NormalizeRouteSegment<TSegment extends string> = TSegment extends `[...${infer TName}]`\n ? TName\n : TSegment extends `[${infer TName}]`\n ? TName\n : TSegment extends `${infer TName}(${string}`\n ? TName\n : CamelCaseRouteSegment<TSegment>;\n\ntype CamelCaseRouteSegment<TSegment extends string> =\n TSegment extends `${infer THead}-${infer TTail}`\n ? `${THead}${Capitalize<CamelCaseRouteSegment<TTail>>}`\n : TSegment;\n\ntype RouteNamespaceFromPath<\n TPath extends string,\n TOperation extends FarmIntegrationAPIOperation<any, any, any, any, any>,\n> = TPath extends `${infer THead}/${infer TTail}`\n ? {\n [TKey in NormalizeRouteSegment<THead>]: RouteNamespaceFromPath<TTail, TOperation>;\n }\n : {\n [TKey in NormalizeRouteSegment<TPath>]: {\n [TMethod in Lowercase<TOperation[\"method\"] & string>]: TOperation;\n };\n };\n\ntype UnionToIntersection<TUnion> = (\n TUnion extends unknown ? (value: TUnion) => void : never\n) extends (value: infer TIntersection) => void\n ? TIntersection\n : never;\n\ntype ExpandRecursively<TValue> = TValue extends (...args: any[]) => any\n ? TValue\n : TValue extends object\n ? { [TKey in keyof TValue]: ExpandRecursively<TValue[TKey]> }\n : TValue;\n\ntype RoutesToAPI<TRoutes extends readonly FarmIntegrationRouteOperationCarrier<string, any>[]> =\n ExpandRecursively<\n UnionToIntersection<\n TRoutes[number] extends FarmIntegrationRouteOperationCarrier<infer TPath, infer TOperation>\n ? RouteNamespaceFromPath<StripRouteClientPrefix<TPath>, TOperation>\n : never\n >\n >;\n\nexport type InferIntegrationAPIFromRoutes<\n TRoutes extends readonly FarmIntegrationRouteOperationCarrier<string, any>[],\n> = RoutesToAPI<TRoutes>;\n\nfunction route<TAPI extends FarmIntegrationAPI>(path: string, definition: TAPI): TAPI;\nfunction route<TOperations extends readonly FarmIntegrationAPIOperation<any, any, any, any, any>[]>(\n path: string,\n ...operations: TOperations\n): RouteOperationsToAPI<TOperations>;\nfunction route(\n path: string,\n definitionOrOperation: FarmIntegrationAPI | FarmIntegrationAPIOperation<any, any, any, any, any>,\n ...operations: readonly FarmIntegrationAPIOperation<any, any, any, any, any>[]\n) {\n if (isOperation(definitionOrOperation)) {\n const allOperations = [definitionOrOperation, ...operations];\n return Object.fromEntries(\n allOperations.map((operation) => [\n operation.method.toLowerCase(),\n {\n ...operation,\n path,\n __pathless: false,\n },\n ]),\n );\n }\n\n return bindRoutePath(path, definitionOrOperation as FarmIntegrationAPI);\n}\n\nfunction normalizeRouteSegment(segment: string): string {\n if (!segment) {\n return \"index\";\n }\n\n if (segment.startsWith(\"[...\") && segment.endsWith(\"]\")) {\n return segment.slice(4, -1) || \"index\";\n }\n\n if (segment.startsWith(\"[\") && segment.endsWith(\"]\")) {\n return segment.slice(1, -1) || \"index\";\n }\n\n const matcherIndex = segment.indexOf(\"(\");\n if (matcherIndex > 0) {\n return segment.slice(0, matcherIndex);\n }\n\n return camelCaseRouteSegment(segment);\n}\n\nfunction camelCaseRouteSegment(segment: string): string {\n return segment.replace(/-([a-zA-Z0-9])/g, (_match, value: string) => value.toUpperCase());\n}\n\nfunction getRouteClientSegments(path: string): string[] {\n const segments = path.split(\"/\").filter(Boolean);\n if (segments.length === 0) {\n return [\"index\"];\n }\n\n const stripped =\n segments[0] === \"api\" && segments.length > 2\n ? segments.slice(2)\n : segments.length > 1\n ? segments.slice(1)\n : [segments[segments.length - 1]];\n\n return stripped.map(normalizeRouteSegment).filter(Boolean);\n}\n\nfunction setRouteOperation(\n target: Record<string, unknown>,\n pathSegments: string[],\n operation: FarmIntegrationAPIOperation<any, any, any, any, any>,\n) {\n const [head, ...tail] = pathSegments;\n if (!head) {\n return;\n }\n\n if (tail.length === 0) {\n const leaf = ((target[head] as Record<string, unknown> | undefined) || {}) as Record<\n string,\n unknown\n >;\n leaf[operation.method.toLowerCase()] = {\n ...operation,\n path: operation.path,\n __pathless: false,\n };\n target[head] = leaf;\n return;\n }\n\n const branch = ((target[head] as Record<string, unknown> | undefined) || {}) as Record<\n string,\n unknown\n >;\n target[head] = branch;\n setRouteOperation(branch, tail, operation);\n}\n\nfunction fromRoutes<TRoutes extends readonly FarmIntegrationRouteOperationCarrier<string, any>[]>(\n routes: TRoutes,\n): RoutesToAPI<TRoutes> {\n const definition: Record<string, unknown> = {};\n\n for (const route of routes) {\n if (!isOperation(route.__operation)) {\n continue;\n }\n\n setRouteOperation(definition, getRouteClientSegments(route.path), {\n ...route.__operation,\n path: route.path,\n __pathless: false,\n });\n }\n\n return definition as RoutesToAPI<TRoutes>;\n}\n\nexport const api = {\n get,\n route,\n fromRoutes,\n post<TBody = never, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n ): FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, \"POST\"> {\n return operation<TBody, TQuery, TResponse, TServer, \"POST\">(\"POST\", pathOrOptions, {\n bodyFormat: \"json\",\n ...(typeof pathOrOptions === \"string\" ? maybeOptions : pathOrOptions),\n });\n },\n put<TBody = never, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n ): FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, \"PUT\"> {\n return operation<TBody, TQuery, TResponse, TServer, \"PUT\">(\"PUT\", pathOrOptions, {\n bodyFormat: \"json\",\n ...(typeof pathOrOptions === \"string\" ? maybeOptions : pathOrOptions),\n });\n },\n patch<TBody = never, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n ): FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, \"PATCH\"> {\n return operation<TBody, TQuery, TResponse, TServer, \"PATCH\">(\"PATCH\", pathOrOptions, {\n bodyFormat: \"json\",\n ...(typeof pathOrOptions === \"string\" ? maybeOptions : pathOrOptions),\n });\n },\n delete<TBody = never, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n ): FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, \"DELETE\"> {\n return operation<TBody, TQuery, TResponse, TServer, \"DELETE\">(\"DELETE\", pathOrOptions, {\n bodyFormat: \"json\",\n ...(typeof pathOrOptions === \"string\" ? maybeOptions : pathOrOptions),\n });\n },\n options<TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n ): FarmIntegrationAPIOperation<never, TQuery, TResponse, TServer, \"OPTIONS\"> {\n return operation<never, TQuery, TResponse, TServer, \"OPTIONS\">(\n \"OPTIONS\",\n pathOrOptions,\n maybeOptions,\n );\n },\n head<TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n ): FarmIntegrationAPIOperation<never, TQuery, TResponse, TServer, \"HEAD\"> {\n return operation<never, TQuery, TResponse, TServer, \"HEAD\">(\n \"HEAD\",\n pathOrOptions,\n maybeOptions,\n );\n },\n form: {\n post<TBody = never, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n ): FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, \"POST\"> {\n return operation<TBody, TQuery, TResponse, TServer, \"POST\">(\"POST\", pathOrOptions, {\n bodyFormat: \"form\",\n ...(typeof pathOrOptions === \"string\" ? maybeOptions : pathOrOptions),\n });\n },\n put<TBody = never, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n ): FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, \"PUT\"> {\n return operation<TBody, TQuery, TResponse, TServer, \"PUT\">(\"PUT\", pathOrOptions, {\n bodyFormat: \"form\",\n ...(typeof pathOrOptions === \"string\" ? maybeOptions : pathOrOptions),\n });\n },\n patch<TBody = never, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n ): FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, \"PATCH\"> {\n return operation<TBody, TQuery, TResponse, TServer, \"PATCH\">(\"PATCH\", pathOrOptions, {\n bodyFormat: \"form\",\n ...(typeof pathOrOptions === \"string\" ? maybeOptions : pathOrOptions),\n });\n },\n delete<TBody = never, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n pathOrOptions?: string | IntegrationAPIBuilderOptions<TServer>,\n maybeOptions: IntegrationAPIBuilderOptions<TServer> = {} as IntegrationAPIBuilderOptions<TServer>,\n ): FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, \"DELETE\"> {\n return operation<TBody, TQuery, TResponse, TServer, \"DELETE\">(\"DELETE\", pathOrOptions, {\n bodyFormat: \"form\",\n ...(typeof pathOrOptions === \"string\" ? maybeOptions : pathOrOptions),\n });\n },\n },\n};\n\nexport const endpoint = api;\n","type RequestContextCarrier = object;\n\nexport interface SetRequestContextOptions {\n exposeToPage?: boolean;\n}\n\nexport interface RequestContextSnapshotOptions {\n exposedOnly?: boolean;\n}\n\ninterface RequestContextBucket {\n privateData: Map<string, any>;\n exposedData: Map<string, any>;\n}\n\nconst REQUEST_CONTEXT_STORE_KEY = Symbol.for(\"farm.requestContextStore\");\n\ntype GlobalWithRequestContextStore = typeof globalThis & {\n [REQUEST_CONTEXT_STORE_KEY]?: WeakMap<RequestContextCarrier, RequestContextBucket>;\n};\n\nfunction getRequestContextStore() {\n const globalState = globalThis as GlobalWithRequestContextStore;\n if (!globalState[REQUEST_CONTEXT_STORE_KEY]) {\n globalState[REQUEST_CONTEXT_STORE_KEY] = new WeakMap<\n RequestContextCarrier,\n RequestContextBucket\n >();\n }\n\n return globalState[REQUEST_CONTEXT_STORE_KEY]!;\n}\n\nfunction getBucket(target: RequestContextCarrier): RequestContextBucket {\n const requestContextStore = getRequestContextStore();\n let bucket = requestContextStore.get(target);\n if (!bucket) {\n bucket = {\n privateData: new Map<string, any>(),\n exposedData: new Map<string, any>(),\n };\n requestContextStore.set(target, bucket);\n }\n return bucket;\n}\n\nexport function setRequestContext(\n target: RequestContextCarrier,\n key: string,\n value: any,\n options: SetRequestContextOptions = {},\n): void {\n const bucket = getBucket(target);\n bucket.privateData.set(key, value);\n if (options.exposeToPage) {\n bucket.exposedData.set(key, value);\n }\n}\n\nexport function getRequestContext<T = any>(\n target: RequestContextCarrier,\n key: string,\n): T | undefined {\n const requestContextStore = getRequestContextStore();\n const bucket = requestContextStore.get(target);\n return bucket?.privateData.get(key) as T | undefined;\n}\n\nexport function hasRequestContext(target: RequestContextCarrier, key: string): boolean {\n const requestContextStore = getRequestContextStore();\n const bucket = requestContextStore.get(target);\n return bucket?.privateData.has(key) ?? false;\n}\n\nexport function deleteRequestContext(target: RequestContextCarrier, key: string): boolean {\n const requestContextStore = getRequestContextStore();\n const bucket = requestContextStore.get(target);\n if (!bucket) return false;\n const removedPrivate = bucket.privateData.delete(key);\n bucket.exposedData.delete(key);\n return removedPrivate;\n}\n\nexport function clearRequestContext(target: RequestContextCarrier): void {\n const requestContextStore = getRequestContextStore();\n const bucket = requestContextStore.get(target);\n if (!bucket) return;\n bucket.privateData.clear();\n bucket.exposedData.clear();\n}\n\nexport function getRequestContextSnapshot(\n target: RequestContextCarrier,\n options: RequestContextSnapshotOptions = {},\n): Map<string, any> {\n const requestContextStore = getRequestContextStore();\n const bucket = requestContextStore.get(target);\n if (!bucket) return new Map<string, any>();\n if (options.exposedOnly) {\n return new Map(bucket.exposedData);\n }\n return new Map(bucket.privateData);\n}\n","import { once } from \"node:events\";\nimport type { ServerResponse } from \"node:http\";\n\nexport async function sendWebResponse(res: ServerResponse, response: Response): Promise<void> {\n res.statusCode = response.status;\n\n const responseHeaders = response.headers as Headers & {\n getSetCookie?: () => string[];\n };\n const setCookies = responseHeaders.getSetCookie?.() || [];\n if (setCookies.length > 0) {\n res.setHeader(\"Set-Cookie\", setCookies);\n }\n\n response.headers.forEach((value, key) => {\n if (key.toLowerCase() === \"set-cookie\" && setCookies.length > 0) {\n return;\n }\n res.setHeader(key, value);\n });\n\n if (!response.body) {\n res.end();\n return;\n }\n\n if (typeof res.write !== \"function\") {\n const body = await response.arrayBuffer();\n res.end(Buffer.from(body));\n return;\n }\n\n const reader = response.body.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n if (!value || value.byteLength === 0) {\n continue;\n }\n\n if (!res.write(value)) {\n await once(res, \"drain\");\n }\n }\n\n res.end();\n } catch (error) {\n if (!res.writableEnded) {\n const responseError = error instanceof Error ? error : new Error(String(error));\n if (typeof res.destroy === \"function\") {\n res.destroy(responseError);\n } else {\n res.end();\n }\n }\n throw error;\n } finally {\n reader.releaseLock();\n }\n}\n","import type { ComponentType, ReactNode } from \"react\";\nimport { api as integrationApi, defineIntegrationAPIOperation } from \"./integration-api\";\nimport type {\n FarmIntegrationAPI,\n FarmIntegrationAPIBodyFormat,\n FarmIntegrationAPIMethod,\n FarmIntegrationAPIOperation,\n FarmIntegrationAPIResponseFormat,\n FarmIntegrationRouteOperationCarrier,\n InferIntegrationAPIFromRoutes,\n} from \"./integration-api\";\nimport type { InferFarmIntegrationOrmClient } from \"./integration-orm\";\nimport type { FarmPlugin, FarmPluginContext, FarmRequestStore } from \"./plugin\";\nimport {\n clearRequestContext,\n deleteRequestContext,\n getRequestContext,\n getRequestContextSnapshot,\n hasRequestContext,\n setRequestContext,\n} from \"./request-context\";\nimport { sendWebResponse } from \"./server/response\";\nimport type { FarmRequest } from \"./types\";\n\nexport { api, defineIntegrationAPI, defineIntegrationAPIOperation } from \"./integration-api\";\nexport type {\n FarmIntegrationAPI,\n FarmIntegrationAPIBodyFormat,\n FarmIntegrationAPIMethod,\n FarmIntegrationAPIOperation,\n FarmIntegrationAPIResponseFormat,\n} from \"./integration-api\";\n\nexport type FarmIntegrationCategory = \"auth\" | \"payment\" | \"monitoring\" | \"logging\" | (string & {});\n\n/** @deprecated Use FarmIntegrationCategory instead. */\nexport type FarmIntegrationSlot = FarmIntegrationCategory;\n\nexport type FarmIntegrationRouteParamValue = string | string[];\nexport type FarmIntegrationRouteParams = Record<string, FarmIntegrationRouteParamValue>;\nexport type FarmIntegrationRouteMethod =\n | FarmIntegrationAPIMethod\n | Lowercase<FarmIntegrationAPIMethod>\n | \"ALL\"\n | \"all\";\nexport type FarmIntegrationRouteInputSource = \"body\" | \"query\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type FarmIntegrationValidationPathSegment =\n | PropertyKey\n | {\n readonly key: PropertyKey;\n };\n\nexport interface FarmIntegrationRouteInput<TBody = unknown, TQuery = unknown> {\n body?: TBody;\n query?: TQuery;\n}\n\nexport interface FarmIntegrationValidationIssue {\n source: FarmIntegrationRouteInputSource;\n path?: readonly (string | number)[];\n code?: string;\n message: string;\n}\n\nexport interface FarmIntegrationValidationErrorLike {\n issues?: readonly {\n path?: readonly FarmIntegrationValidationPathSegment[];\n code?: string;\n message?: string;\n }[];\n message?: string;\n}\n\nexport type FarmIntegrationValidationResult<TValue> =\n | {\n success: true;\n data: TValue;\n }\n | {\n success: false;\n error: FarmIntegrationValidationErrorLike;\n };\n\nexport type FarmIntegrationStandardValidationResult<TValue> =\n | {\n value: TValue;\n }\n | {\n issues: readonly {\n path?: readonly FarmIntegrationValidationPathSegment[];\n code?: string;\n message: string;\n }[];\n };\n\nexport interface FarmIntegrationInputSchema<TValue = unknown> {\n _output?: TValue;\n parse?(value: unknown): MaybePromise<TValue>;\n safeParse?(value: unknown): MaybePromise<FarmIntegrationValidationResult<TValue>>;\n safeParseAsync?(value: unknown): Promise<FarmIntegrationValidationResult<TValue>>;\n \"~standard\"?: {\n validate(value: unknown): MaybePromise<FarmIntegrationStandardValidationResult<TValue>>;\n types?: {\n output: TValue;\n };\n };\n}\n\nexport interface FarmIntegrationRouteInputSchemas<TBody = unknown, TQuery = unknown> {\n body?: FarmIntegrationInputSchema<TBody>;\n query?: FarmIntegrationInputSchema<TQuery>;\n}\n\n/** @deprecated Use `FarmRequestStore` and access it through `ctx.req`. */\nexport type FarmIntegrationRequestContextStore = FarmRequestStore;\n\nexport const FARM_INTEGRATION_INTERNAL_DISPATCH_CONTEXT_KEY = \"farm.integration.internalDispatch\";\n\nexport type FarmIntegrationRouteDb<TSchema extends FarmIntegrationSchema | undefined> =\n InferFarmIntegrationOrmClient<TSchema>;\n\nexport interface FarmIntegrationRouteStorageArgs<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n getClient(): Promise<unknown | undefined>;\n getOrm(): Promise<FarmIntegrationRouteDb<TSchema>>;\n}\n\nexport interface FarmIntegrationRouteArgs<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n db: FarmIntegrationRouteDb<TSchema>;\n getDb(): Promise<FarmIntegrationRouteDb<TSchema>>;\n storage: FarmIntegrationRouteStorageArgs<TSchema>;\n}\n\nexport interface FarmIntegrationConfigContext<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n key: string;\n integration: FarmIntegration<TSchema, any>;\n appConfig: FarmPluginContext[\"config\"];\n /** Alias for appConfig. */\n config: FarmPluginContext[\"config\"];\n args: FarmIntegrationRouteArgs<TSchema>;\n env: Record<string, string | undefined>;\n isDev: boolean;\n isProd: boolean;\n}\n\nexport interface FarmIntegrationConfigDefinition<\n TConfig = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n schema?: FarmIntegrationInputSchema<TConfig>;\n env?: Record<string, string | readonly string[]>;\n defaults?:\n | Partial<TConfig>\n | ((context: FarmIntegrationConfigContext<TSchema>) => MaybePromise<Partial<TConfig>>);\n input?:\n | Partial<TConfig>\n | ((context: FarmIntegrationConfigContext<TSchema>) => MaybePromise<Partial<TConfig>>);\n resolve?(\n context: FarmIntegrationConfigContext<TSchema>,\n ): MaybePromise<TConfig | Partial<TConfig> | undefined>;\n}\n\nexport type FarmIntegrationConfigInput<\n TConfig = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = FarmIntegrationInputSchema<TConfig> | FarmIntegrationConfigDefinition<TConfig, TSchema>;\n\nexport type FarmIntegrationLifecycleLogLevel = \"info\" | \"warn\" | \"error\";\n\nexport interface FarmIntegrationLifecycleLogger {\n info(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n error(message: string, meta?: Record<string, unknown>): void;\n}\n\nexport interface FarmIntegrationLifecycleContext<\n TConfig = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> extends FarmIntegrationConfigContext<TSchema> {\n integration: FarmIntegration<TSchema, TConfig>;\n integrationConfig: TConfig;\n log: FarmIntegrationLifecycleLogger;\n reason?: string;\n cleanup(callback?: () => MaybePromise<void>): Promise<void>;\n}\n\nexport type FarmIntegrationLifecycleHook<\n TConfig = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = (context: FarmIntegrationLifecycleContext<TConfig, TSchema>) => MaybePromise<void>;\n\n/**\n * Small per-call integration metadata. Values received over HTTP are\n * client-controlled and should be validated before authorization decisions.\n */\nexport type FarmIntegrationData = Record<string, unknown>;\n\nexport interface FarmIntegrationHandlerContext<\n TBody = unknown,\n TQuery = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n request: Request;\n requestId: string;\n url: URL;\n pathname: string;\n method: string;\n params: FarmIntegrationRouteParams;\n input: FarmIntegrationRouteInput<TBody, TQuery>;\n args: FarmIntegrationRouteArgs<TSchema>;\n data: FarmIntegrationData;\n integration: {\n category: FarmIntegrationCategory;\n /** @deprecated Use category instead. */\n slot: FarmIntegrationCategory;\n type: string;\n instance: unknown;\n };\n route: {\n kind: \"route\" | \"middleware\";\n path: string;\n methods: readonly string[];\n };\n req: FarmRequestStore;\n /** @deprecated Use `req` instead. */\n requestContext: FarmRequestStore;\n config: FarmPluginContext[\"config\"];\n isDev: boolean;\n isProd: boolean;\n}\n\nexport interface FarmIntegrationRouteHookContext<\n TBody = unknown,\n TQuery = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> extends FarmIntegrationHandlerContext<TBody, TQuery, TSchema> {\n response?: Response;\n}\n\nexport type FarmIntegrationRouteHook<\n TBody = unknown,\n TQuery = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = {\n bivarianceHack(\n request: Request,\n context: FarmIntegrationRouteHookContext<TBody, TQuery, TSchema>,\n ): Promise<Response | void> | Response | void;\n}[\"bivarianceHack\"];\n\nexport interface FarmIntegrationRoute<\n TBody = unknown,\n TQuery = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n path: string;\n method?: FarmIntegrationRouteMethod;\n methods?: readonly FarmIntegrationRouteMethod[];\n middleware?: readonly FarmIntegrationRouteMiddleware<TSchema>[];\n before?: readonly FarmIntegrationRouteHook<TBody, TQuery, TSchema>[];\n after?: readonly FarmIntegrationRouteHook<TBody, TQuery, TSchema>[];\n rawBody?: boolean;\n bodyFormat?: FarmIntegrationAPIBodyFormat;\n body?: FarmIntegrationInputSchema<TBody>;\n query?: FarmIntegrationInputSchema<TQuery>;\n input?: FarmIntegrationRouteInputSchemas<TBody, TQuery>;\n handler(\n request: Request,\n context: FarmIntegrationHandlerContext<TBody, TQuery, TSchema>,\n ): Promise<Response> | Response;\n}\n\nexport interface FarmTypedIntegrationRoute<\n TPath extends string = string,\n TBody = never,\n TQuery = never,\n TResponse = unknown,\n TServer extends boolean = false,\n TMethod extends FarmIntegrationAPIMethod = FarmIntegrationAPIMethod,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> extends FarmIntegrationRoute<TBody, TQuery, TSchema> {\n path: TPath;\n method: TMethod;\n __operation: FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, TMethod>;\n}\n\nexport interface FarmIntegrationRouteMiddleware<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n handler(\n request: Request,\n context: FarmIntegrationHandlerContext<unknown, unknown, TSchema>,\n ): Promise<Response | void> | Response | void;\n}\n\nexport interface FarmIntegrationMiddleware<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n matcher?: string | string[];\n handler(\n request: Request,\n context: FarmIntegrationHandlerContext<unknown, unknown, TSchema>,\n ): Promise<Response | void> | Response | void;\n}\n\nexport interface FarmIntegrationProviderProps {\n children: ReactNode;\n}\n\nexport interface FarmIntegrationProvider {\n name: string;\n type: string;\n props?: Record<string, unknown>;\n component?: ComponentType<FarmIntegrationProviderProps>;\n}\n\nexport interface FarmIntegrationDocumentNavigation {\n matcher: string | readonly string[];\n}\n\nexport type FarmIntegrationSchemaFieldType =\n | \"id\"\n | \"uuid\"\n | \"string\"\n | \"text\"\n | \"boolean\"\n | \"integer\"\n | \"number\"\n | \"datetime\"\n | \"json\"\n | \"enum\";\n\nexport interface FarmIntegrationSchemaReference {\n model: string;\n field: string;\n relation?: \"belongsTo\" | \"hasOne\" | \"hasMany\";\n onDelete?: \"cascade\" | \"restrict\" | \"setNull\" | \"noAction\";\n enforced?: \"db\" | \"app\" | \"none\";\n}\n\nexport interface FarmIntegrationSchemaField {\n type: FarmIntegrationSchemaFieldType;\n name?: string;\n description?: string;\n required?: boolean;\n nullable?: boolean;\n primaryKey?: boolean;\n unique?: boolean;\n index?: boolean;\n list?: boolean;\n default?: unknown;\n values?: readonly string[];\n reference?: FarmIntegrationSchemaReference;\n meta?: Record<string, unknown>;\n}\n\nexport interface FarmIntegrationSchemaConstraint {\n type: \"unique\" | \"index\";\n fields: readonly string[];\n name?: string;\n meta?: Record<string, unknown>;\n}\n\nexport interface FarmIntegrationSchemaModel {\n name?: string;\n description?: string;\n fields: Record<string, FarmIntegrationSchemaField>;\n constraints?: readonly FarmIntegrationSchemaConstraint[];\n meta?: Record<string, unknown>;\n}\n\nexport interface FarmIntegrationSchemaModelExtension {\n name?: string;\n description?: string;\n fields?: Record<string, FarmIntegrationSchemaField>;\n constraints?: readonly FarmIntegrationSchemaConstraint[];\n meta?: Record<string, unknown>;\n}\n\nexport interface FarmIntegrationSchemaModelOverride {\n name?: string;\n description?: string;\n fields?: Record<string, Partial<FarmIntegrationSchemaField>>;\n constraints?: readonly FarmIntegrationSchemaConstraint[];\n meta?: Record<string, unknown>;\n}\n\nexport interface FarmIntegrationSchema {\n models: Record<string, FarmIntegrationSchemaModel>;\n meta?: Record<string, unknown>;\n extend?: Record<string, FarmIntegrationSchemaModelExtension>;\n override?: Record<string, FarmIntegrationSchemaModelOverride>;\n}\n\nexport function defineIntegrationSchema<TSchema extends FarmIntegrationSchema>(\n schema: TSchema,\n): TSchema {\n return schema;\n}\n\nexport type FarmIntegrationLogPhase =\n | \"registered\"\n | \"validate\"\n | \"setup\"\n | \"ready\"\n | \"dispose\"\n | \"request:start\"\n | \"request:end\"\n | \"request:error\";\n\nexport interface FarmIntegrationLogEvent {\n category: FarmIntegrationCategory;\n /** @deprecated Use category instead. */\n slot: FarmIntegrationCategory;\n type: string;\n phase: FarmIntegrationLogPhase;\n route?: {\n kind: \"route\" | \"middleware\";\n path: string;\n methods: readonly string[];\n };\n requestId?: string;\n request?: Request;\n response?: Response;\n error?: unknown;\n durationMs?: number;\n level?: FarmIntegrationLifecycleLogLevel;\n message?: string;\n meta?: Record<string, unknown>;\n context: Map<string, unknown>;\n}\n\nexport type FarmIntegrationLogger = (event: FarmIntegrationLogEvent) => void | Promise<void>;\n\nexport interface FarmIntegration<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n TConfig = unknown,\n> {\n readonly kind: \"farm-integration\";\n category: FarmIntegrationCategory;\n /** @deprecated Use category instead. */\n slot?: FarmIntegrationCategory;\n type: string;\n instance: unknown;\n /** Set to false when a platform adapter owns this integration's production routes. */\n serverRuntime?: boolean;\n api?: FarmIntegrationAPI;\n schema?: TSchema;\n config?: FarmIntegrationConfigInput<TConfig, TSchema>;\n validate?: FarmIntegrationLifecycleHook<TConfig, TSchema>;\n setup?: FarmIntegrationLifecycleHook<TConfig, TSchema>;\n ready?: FarmIntegrationLifecycleHook<TConfig, TSchema>;\n dispose?: FarmIntegrationLifecycleHook<TConfig, TSchema>;\n log?: FarmIntegrationLogger;\n routes?: readonly FarmIntegrationRoute<any, any, TSchema>[];\n endpoints?: FarmIntegrationEndpoints<TSchema>;\n middleware?: readonly FarmIntegrationMiddleware<TSchema>[];\n providers?: readonly FarmIntegrationProvider[];\n documentNavigations?: readonly FarmIntegrationDocumentNavigation[];\n plugins?: readonly FarmPlugin[];\n}\n\nexport type FarmIntegrationsUserConfig = Record<string, FarmIntegration<any, any> | undefined>;\n\nconst FARM_INTEGRATION_PLUGIN_SERVER_RUNTIME = Symbol.for(\n \"@farm.js/core/integration-plugin-server-runtime\",\n);\n\n/** @internal Identifies lifecycle plugins owned by platform-managed integrations. */\nexport function getFarmIntegrationPluginServerRuntime(plugin: FarmPlugin): boolean | undefined {\n const value = (plugin as FarmPlugin & Record<symbol, unknown>)[\n FARM_INTEGRATION_PLUGIN_SERVER_RUNTIME\n ];\n return typeof value === \"boolean\" ? value : undefined;\n}\n\ntype IntegrationRouteBuilderOptions<\n TBody,\n TQuery,\n TServer extends boolean,\n TSchema extends FarmIntegrationSchema | undefined,\n> = {\n middleware?: readonly FarmIntegrationRouteMiddleware<TSchema>[];\n before?: readonly FarmIntegrationRouteHook<TBody, TQuery, TSchema>[];\n after?: readonly FarmIntegrationRouteHook<TBody, TQuery, TSchema>[];\n rawBody?: boolean;\n headers?: Record<string, string>;\n credentials?: RequestCredentials;\n bodyFormat?: FarmIntegrationAPIBodyFormat;\n responseFormat?: FarmIntegrationAPIResponseFormat;\n isServer?: TServer;\n body?: FarmIntegrationInputSchema<TBody>;\n query?: FarmIntegrationInputSchema<TQuery>;\n input?: FarmIntegrationRouteInputSchemas<TBody, TQuery>;\n handler(\n request: Request,\n context: FarmIntegrationHandlerContext<TBody, TQuery, TSchema>,\n ): Promise<Response> | Response;\n};\n\nfunction defineTypedIntegrationRoute<\n TPath extends string,\n TBody,\n TQuery,\n TResponse,\n TServer extends boolean,\n TMethod extends FarmIntegrationAPIMethod,\n TSchema extends FarmIntegrationSchema | undefined,\n>(\n method: TMethod,\n path: TPath,\n input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>,\n): FarmTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, TMethod, TSchema> {\n return {\n path,\n method,\n middleware: input.middleware,\n before: input.before,\n after: input.after,\n rawBody: input.rawBody,\n bodyFormat: input.bodyFormat,\n input: normalizeIntegrationRouteInputSchemas(input),\n handler: input.handler,\n __operation: defineIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, TMethod>({\n path,\n method,\n bodyFormat: input.bodyFormat,\n responseFormat: input.responseFormat,\n headers: input.headers,\n credentials: input.credentials,\n isServer: input.isServer,\n }),\n };\n}\n\nexport interface FarmIntegrationRouteFactory<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n get<TPath extends string, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n path: TPath,\n input: Omit<IntegrationRouteBuilderOptions<never, TQuery, TServer, TSchema>, \"bodyFormat\">,\n ): FarmTypedIntegrationRoute<TPath, never, TQuery, TResponse, TServer, \"GET\", TSchema>;\n post<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>,\n ): FarmTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, \"POST\", TSchema>;\n put<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>,\n ): FarmTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, \"PUT\", TSchema>;\n patch<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>,\n ): FarmTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, \"PATCH\", TSchema>;\n delete<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>,\n ): FarmTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, \"DELETE\", TSchema>;\n options<\n TPath extends string,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: Omit<IntegrationRouteBuilderOptions<never, TQuery, TServer, TSchema>, \"bodyFormat\">,\n ): FarmTypedIntegrationRoute<TPath, never, TQuery, TResponse, TServer, \"OPTIONS\", TSchema>;\n head<TPath extends string, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n path: TPath,\n input: Omit<IntegrationRouteBuilderOptions<never, TQuery, TServer, TSchema>, \"bodyFormat\">,\n ): FarmTypedIntegrationRoute<TPath, never, TQuery, TResponse, TServer, \"HEAD\", TSchema>;\n}\n\nexport interface FarmIntegrationRoutesFactoryContext<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n route: FarmIntegrationRouteFactory<TSchema>;\n integrationRoute: FarmIntegrationRouteFactory<TSchema>;\n}\n\nexport type FarmIntegrationRoutesFactory<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = (\n context: FarmIntegrationRoutesFactoryContext<TSchema>,\n) => readonly FarmIntegrationRoute<any, any, TSchema>[];\n\nexport type FarmIntegrationEndpointValue<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> =\n | FarmIntegrationRoute<any, any, TSchema>\n | readonly FarmIntegrationEndpointValue<TSchema>[]\n | {\n readonly [key: string]: FarmIntegrationEndpointValue<TSchema> | undefined;\n };\n\nexport type FarmIntegrationEndpoints<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = {\n readonly [key: string]: FarmIntegrationEndpointValue<TSchema> | undefined;\n};\n\nexport interface FarmIntegrationEndpointsFactoryContext<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> extends FarmIntegrationRoutesFactoryContext<TSchema> {\n endpoint: FarmIntegrationRouteFactory<TSchema>;\n}\n\nexport type FarmIntegrationEndpointsFactory<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = (context: FarmIntegrationEndpointsFactoryContext<TSchema>) => FarmIntegrationEndpoints<TSchema>;\n\nfunction createIntegrationRouteFactory<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n>(): FarmIntegrationRouteFactory<TSchema> {\n return {\n get<TPath extends string, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n path: TPath,\n input: Omit<IntegrationRouteBuilderOptions<never, TQuery, TServer, TSchema>, \"bodyFormat\">,\n ) {\n return defineTypedIntegrationRoute<TPath, never, TQuery, TResponse, TServer, \"GET\", TSchema>(\n \"GET\",\n path,\n input,\n );\n },\n post<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(path: TPath, input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>) {\n return defineTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, \"POST\", TSchema>(\n \"POST\",\n path,\n {\n bodyFormat: \"json\",\n ...input,\n },\n );\n },\n put<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(path: TPath, input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>) {\n return defineTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, \"PUT\", TSchema>(\n \"PUT\",\n path,\n {\n bodyFormat: \"json\",\n ...input,\n },\n );\n },\n patch<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(path: TPath, input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>) {\n return defineTypedIntegrationRoute<\n TPath,\n TBody,\n TQuery,\n TResponse,\n TServer,\n \"PATCH\",\n TSchema\n >(\"PATCH\", path, {\n bodyFormat: \"json\",\n ...input,\n });\n },\n delete<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(path: TPath, input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>) {\n return defineTypedIntegrationRoute<\n TPath,\n TBody,\n TQuery,\n TResponse,\n TServer,\n \"DELETE\",\n TSchema\n >(\"DELETE\", path, {\n bodyFormat: \"json\",\n ...input,\n });\n },\n options<\n TPath extends string,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: Omit<IntegrationRouteBuilderOptions<never, TQuery, TServer, TSchema>, \"bodyFormat\">,\n ) {\n return defineTypedIntegrationRoute<\n TPath,\n never,\n TQuery,\n TResponse,\n TServer,\n \"OPTIONS\",\n TSchema\n >(\"OPTIONS\", path, input);\n },\n head<\n TPath extends string,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: Omit<IntegrationRouteBuilderOptions<never, TQuery, TServer, TSchema>, \"bodyFormat\">,\n ) {\n return defineTypedIntegrationRoute<TPath, never, TQuery, TResponse, TServer, \"HEAD\", TSchema>(\n \"HEAD\",\n path,\n input,\n );\n },\n };\n}\n\nexport function createIntegrationRoute<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n>(_schema?: TSchema): FarmIntegrationRouteFactory<TSchema> {\n return createIntegrationRouteFactory<TSchema>();\n}\n\nexport const integrationRoute = createIntegrationRouteFactory<undefined>();\n\ntype RegisteredIntegrationRuntime = {\n integration: FarmIntegration;\n config: FarmPluginContext[\"config\"];\n isDev: boolean;\n isProd: boolean;\n};\n\nconst INTEGRATION_RUNTIME_REGISTRY_KEY = Symbol.for(\"farm.integrationRuntimeRegistry\");\nconst INTEGRATION_REQUEST_DISPATCHER_KEY = Symbol.for(\"farm.integrationRequestDispatcher\");\n\ntype IntegrationRequestDispatcher = (\n runtime: RegisteredIntegrationRuntime,\n request: Request,\n options?: { currentRequest?: Request },\n) => Promise<Response | null>;\n\ntype GlobalWithIntegrationRuntimeRegistry = typeof globalThis & {\n [INTEGRATION_RUNTIME_REGISTRY_KEY]?: Map<string, RegisteredIntegrationRuntime>;\n [INTEGRATION_REQUEST_DISPATCHER_KEY]?: IntegrationRequestDispatcher;\n};\n\nfunction getIntegrationRuntimeRegistry() {\n const globalState = globalThis as GlobalWithIntegrationRuntimeRegistry;\n if (!globalState[INTEGRATION_RUNTIME_REGISTRY_KEY]) {\n globalState[INTEGRATION_RUNTIME_REGISTRY_KEY] = new Map<string, RegisteredIntegrationRuntime>();\n }\n\n return globalState[INTEGRATION_RUNTIME_REGISTRY_KEY]!;\n}\n\ntype FarmIntegrationRoutesInput<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = readonly FarmIntegrationRoute<any, any, TSchema>[] | FarmIntegrationRoutesFactory<TSchema>;\n\ntype FarmIntegrationEndpointsInput<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = FarmIntegrationEndpoints<TSchema> | FarmIntegrationEndpointsFactory<TSchema>;\n\ntype FarmIntegrationInput<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n TConfig = unknown,\n> = Omit<\n FarmIntegration<TSchema, TConfig>,\n \"kind\" | \"category\" | \"slot\" | \"config\" | \"routes\" | \"endpoints\"\n> & {\n config?: FarmIntegrationConfigInput<TConfig, TSchema>;\n routes?: FarmIntegrationRoutesInput<TSchema>;\n endpoints?: FarmIntegrationEndpointsInput<TSchema>;\n} & (\n | {\n category: FarmIntegrationCategory;\n slot?: FarmIntegrationCategory;\n }\n | {\n category?: FarmIntegrationCategory;\n slot: FarmIntegrationCategory;\n }\n );\n\ntype FarmIntegrationCategoryInput =\n | {\n category: FarmIntegrationCategory;\n slot?: FarmIntegrationCategory;\n }\n | {\n category?: FarmIntegrationCategory;\n slot: FarmIntegrationCategory;\n };\n\ntype FarmIntegrationShapeForInference = FarmIntegrationCategoryInput & {\n api?: FarmIntegrationAPI;\n schema?: FarmIntegrationSchema;\n config?: unknown;\n routes?: unknown;\n endpoints?: unknown;\n};\n\ntype ExtractIntegrationSchema<TIntegration> = TIntegration extends {\n schema: infer TSchema extends FarmIntegrationSchema;\n}\n ? TSchema\n : undefined;\n\ntype ResolveIntegrationRoutesInput<TRoutes, TSchema extends FarmIntegrationSchema | undefined> =\n TRoutes extends FarmIntegrationRoutesFactory<TSchema> ? ReturnType<TRoutes> : TRoutes;\n\ntype ResolveIntegrationEndpointsInput<\n TEndpoints,\n TSchema extends FarmIntegrationSchema | undefined,\n> =\n TEndpoints extends FarmIntegrationEndpointsFactory<TSchema> ? ReturnType<TEndpoints> : TEndpoints;\n\ntype ExtractIntegrationRoutesFromRoutesInput<\n TRoutes,\n TSchema extends FarmIntegrationSchema | undefined,\n> =\n ResolveIntegrationRoutesInput<TRoutes, TSchema> extends readonly (infer TRoute)[]\n ? TRoute\n : never;\n\ntype ExtractIntegrationRoutesFromEndpointValue<TValue> =\n TValue extends FarmIntegrationRouteOperationCarrier<string, any>\n ? TValue\n : TValue extends readonly (infer TItem)[]\n ? ExtractIntegrationRoutesFromEndpointValue<TItem>\n : TValue extends object\n ? ExtractIntegrationRoutesFromEndpointValue<TValue[keyof TValue]>\n : never;\n\ntype ExtractIntegrationRoutesFromEndpointsInput<\n TEndpoints,\n TSchema extends FarmIntegrationSchema | undefined,\n> = ExtractIntegrationRoutesFromEndpointValue<\n ResolveIntegrationEndpointsInput<TEndpoints, TSchema>\n>;\n\ntype ExtractIntegrationRouteUnion<TIntegration, TSchema extends FarmIntegrationSchema | undefined> =\n | (TIntegration extends { routes: infer TRoutes }\n ? ExtractIntegrationRoutesFromRoutesInput<TRoutes, TSchema>\n : never)\n | (TIntegration extends { endpoints: infer TEndpoints }\n ? ExtractIntegrationRoutesFromEndpointsInput<TEndpoints, TSchema>\n : never);\n\ntype ExtractDefinedIntegrationRoutes<\n TIntegration,\n TSchema extends FarmIntegrationSchema | undefined,\n> = [ExtractIntegrationRouteUnion<TIntegration, TSchema>] extends [never]\n ? undefined\n : readonly ExtractIntegrationRouteUnion<TIntegration, TSchema>[];\n\ntype ExtractDefinedIntegrationEndpoints<\n TIntegration,\n TSchema extends FarmIntegrationSchema | undefined,\n> = TIntegration extends { endpoints: infer TEndpoints }\n ? ResolveIntegrationEndpointsInput<TEndpoints, TSchema>\n : undefined;\n\ntype ExtractIntegrationAPIRoutes<\n TIntegration,\n TSchema extends FarmIntegrationSchema | undefined,\n> = Extract<\n ExtractIntegrationRouteUnion<TIntegration, TSchema>,\n FarmIntegrationRouteOperationCarrier<string, any>\n>;\n\ntype ExtractIntegrationCategory<TIntegration extends FarmIntegrationCategoryInput> =\n TIntegration extends {\n category: infer TCategory extends FarmIntegrationCategory;\n }\n ? TCategory\n : TIntegration extends { slot: infer TSlot extends FarmIntegrationCategory }\n ? TSlot\n : FarmIntegrationCategory;\n\ntype ExtractDerivedIntegrationAPI<\n TIntegration extends FarmIntegrationShapeForInference,\n TSchema extends FarmIntegrationSchema | undefined = ExtractIntegrationSchema<TIntegration>,\n> = TIntegration extends { api: infer TAPI extends FarmIntegrationAPI }\n ? TAPI\n : [ExtractIntegrationAPIRoutes<TIntegration, TSchema>] extends [never]\n ? FarmIntegrationAPI | undefined\n : InferIntegrationAPIFromRoutes<readonly ExtractIntegrationAPIRoutes<TIntegration, TSchema>[]>;\n\nexport type DefinedIntegration<\n TIntegration extends FarmIntegrationShapeForInference,\n TSchema extends FarmIntegrationSchema | undefined = ExtractIntegrationSchema<TIntegration>,\n> = Omit<TIntegration, \"kind\" | \"category\" | \"slot\" | \"api\" | \"routes\" | \"endpoints\"> & {\n readonly kind: \"farm-integration\";\n category: ExtractIntegrationCategory<TIntegration>;\n slot: ExtractIntegrationCategory<TIntegration>;\n routes: ExtractDefinedIntegrationRoutes<TIntegration, TSchema>;\n endpoints: ExtractDefinedIntegrationEndpoints<TIntegration, TSchema>;\n api: ExtractDerivedIntegrationAPI<TIntegration, TSchema>;\n};\n\nfunction isIntegrationEndpointRoute(value: unknown): value is FarmIntegrationRoute {\n return (\n !!value &&\n typeof value === \"object\" &&\n typeof (value as { path?: unknown }).path === \"string\" &&\n typeof (value as { handler?: unknown }).handler === \"function\"\n );\n}\n\nfunction flattenIntegrationEndpoints(\n endpoints: FarmIntegrationEndpointValue | FarmIntegrationEndpoints | undefined,\n): FarmIntegrationRoute[] {\n if (!endpoints) {\n return [];\n }\n\n if (Array.isArray(endpoints)) {\n return endpoints.flatMap((endpoint) => flattenIntegrationEndpoints(endpoint));\n }\n\n if (isIntegrationEndpointRoute(endpoints)) {\n return [endpoints];\n }\n\n if (typeof endpoints === \"object\") {\n return Object.values(endpoints).flatMap((endpoint) => flattenIntegrationEndpoints(endpoint));\n }\n\n return [];\n}\n\nexport function defineIntegration<\n const TSchema extends FarmIntegrationSchema | undefined,\n const TConfig,\n TIntegration extends FarmIntegrationInput<TSchema, TConfig>,\n>(\n integration: TIntegration & FarmIntegrationInput<TSchema, TConfig>,\n): DefinedIntegration<TIntegration, TSchema>;\nexport function defineIntegration<\n const TSchema extends FarmIntegrationSchema | undefined,\n const TConfig,\n TIntegration extends FarmIntegrationInput<TSchema, TConfig>,\n>(\n integration: TIntegration & FarmIntegrationInput<TSchema, TConfig>,\n): DefinedIntegration<TIntegration, TSchema> {\n const category = integration.category ?? integration.slot;\n\n if (!category) {\n throw new Error(\"Integration category is required.\");\n }\n\n if (integration.category && integration.slot && integration.category !== integration.slot) {\n throw new Error(\"Integration category and slot must match when both are provided.\");\n }\n\n const routeFactory = createIntegrationRoute(integration.schema);\n const routes =\n typeof integration.routes === \"function\"\n ? integration.routes({\n route: routeFactory,\n integrationRoute: routeFactory,\n })\n : integration.routes;\n const endpoints =\n typeof integration.endpoints === \"function\"\n ? integration.endpoints({\n endpoint: routeFactory,\n route: routeFactory,\n integrationRoute: routeFactory,\n })\n : integration.endpoints;\n const endpointRoutes = flattenIntegrationEndpoints(endpoints);\n const allRoutes =\n routes?.length || endpointRoutes.length\n ? ([...(routes || []), ...endpointRoutes] as readonly FarmIntegrationRoute[])\n : undefined;\n\n const derivedApi =\n integration.api ||\n (allRoutes?.length\n ? integrationApi.fromRoutes(\n allRoutes as unknown as ReadonlyArray<{\n path: string;\n __operation: FarmIntegrationAPIOperation<any, any, any, any, any>;\n }>,\n )\n : undefined);\n\n return {\n kind: \"farm-integration\",\n ...integration,\n endpoints,\n routes: allRoutes,\n api: derivedApi,\n category,\n slot: category,\n } as unknown as DefinedIntegration<TIntegration, TSchema>;\n}\n\nexport function isFarmIntegration(value: unknown): value is FarmIntegration {\n return (\n !!value && typeof value === \"object\" && (value as FarmIntegration).kind === \"farm-integration\"\n );\n}\n\nexport function resolveIntegrationPlugins(\n integrations: FarmIntegrationsUserConfig | undefined,\n): FarmPlugin[] {\n if (!integrations) {\n return [];\n }\n\n const plugins: FarmPlugin[] = [];\n for (const [key, integration] of Object.entries(integrations)) {\n if (!integration || !isFarmIntegration(integration)) {\n continue;\n }\n\n plugins.push(createIntegrationPlugin(key, integration));\n\n if (integration.plugins?.length) {\n plugins.push(...integration.plugins);\n }\n }\n\n return plugins;\n}\n\nexport function getIntegrationProviders(\n integrations: FarmIntegrationsUserConfig | undefined,\n): Array<Pick<FarmIntegrationProvider, \"name\" | \"type\" | \"props\">> {\n if (!integrations) {\n return [];\n }\n\n const providers: Array<Pick<FarmIntegrationProvider, \"name\" | \"type\" | \"props\">> = [];\n for (const integration of Object.values(integrations)) {\n if (!integration || !isFarmIntegration(integration) || !integration.providers?.length) {\n continue;\n }\n\n for (const provider of integration.providers) {\n providers.push({\n name: provider.name,\n type: provider.type,\n props: provider.props,\n });\n }\n }\n\n return providers;\n}\n\nexport function getIntegrationDocumentNavigationMatchers(\n integrations: FarmIntegrationsUserConfig | undefined,\n): string[] {\n if (!integrations) {\n return [];\n }\n\n const matchers: string[] = [];\n for (const integration of Object.values(integrations)) {\n if (\n !integration ||\n !isFarmIntegration(integration) ||\n !integration.documentNavigations?.length\n ) {\n continue;\n }\n\n for (const navigation of integration.documentNavigations) {\n const items = Array.isArray(navigation.matcher) ? navigation.matcher : [navigation.matcher];\n\n for (const item of items) {\n matchers.push(item);\n }\n }\n }\n\n return matchers;\n}\n\nexport function getIntegrationSchemas(\n integrations: FarmIntegrationsUserConfig | undefined,\n): Record<string, FarmIntegrationSchema> {\n if (!integrations) {\n return {};\n }\n\n const schemaEntries = Object.entries(integrations)\n .map(([key, integration]) => {\n const schema = integration && isFarmIntegration(integration) ? integration.schema : undefined;\n return schema ? ([key, schema] as const) : null;\n })\n .filter((value): value is readonly [string, FarmIntegrationSchema] => value !== null);\n\n return Object.fromEntries(schemaEntries);\n}\n\nexport function getRegisteredIntegrationRuntime(\n key: string,\n): RegisteredIntegrationRuntime | undefined {\n return getIntegrationRuntimeRegistry().get(key);\n}\n\nexport function getRegisteredIntegrations(): Record<string, FarmIntegration> {\n return Object.fromEntries(\n Array.from(getIntegrationRuntimeRegistry().entries()).map(([key, runtime]) => [\n key,\n runtime.integration,\n ]),\n );\n}\n\nexport function getRegisteredIntegrationSchemas(): Record<string, FarmIntegrationSchema> {\n return getIntegrationSchemas(getRegisteredIntegrations());\n}\n\nexport function matchIntegrationRoute(\n integrations: FarmIntegrationsUserConfig | undefined,\n input: {\n pathname: string;\n method?: string;\n },\n): {\n key: string;\n integration: FarmIntegration;\n route: {\n path: string;\n methods: readonly string[];\n };\n params: FarmIntegrationRouteParams;\n} | null {\n if (!integrations) {\n return null;\n }\n\n for (const [key, integration] of Object.entries(integrations)) {\n if (!integration || !isFarmIntegration(integration)) {\n continue;\n }\n\n const routes = normalizeIntegrationRoutes(integration.routes || []);\n\n for (const route of routes) {\n if (!matchesMethod(route.methods, input.method)) {\n continue;\n }\n\n const params = extractPathParams(route.path, input.pathname);\n if (!params) {\n continue;\n }\n\n return {\n key,\n integration,\n route: {\n path: route.path,\n methods: route.methods,\n },\n params,\n };\n }\n }\n\n return null;\n}\n\nexport function matchRegisteredIntegrationRoute(input: { pathname: string; method?: string }): {\n key: string;\n integration: FarmIntegration;\n route: {\n path: string;\n methods: readonly string[];\n };\n params: FarmIntegrationRouteParams;\n} | null {\n return matchIntegrationRoute(getRegisteredIntegrations(), input);\n}\n\nfunction createClientSafeIntegrationAPI(\n api: FarmIntegrationAPI | undefined,\n): FarmIntegrationAPI | undefined {\n if (!api) {\n return undefined;\n }\n\n const entries = Object.entries(api as Record<string, unknown>).map(([key, value]) => {\n if (\n value &&\n typeof value === \"object\" &&\n (value as FarmIntegrationAPIOperation<any, any, any, any, any>).kind ===\n \"farm-integration-api-operation\"\n ) {\n const operation = value as FarmIntegrationAPIOperation<any, any, any, any, any>;\n return [\n key,\n defineIntegrationAPIOperation({\n path: operation.path,\n method: operation.method,\n bodyFormat: operation.bodyFormat,\n responseFormat: operation.responseFormat,\n credentials: operation.credentials,\n isServer: operation.isServer,\n }),\n ];\n }\n\n if (value && typeof value === \"object\") {\n return [key, createClientSafeIntegrationAPI(value as FarmIntegrationAPI)];\n }\n\n return [key, value];\n });\n\n return Object.fromEntries(entries) as FarmIntegrationAPI;\n}\n\nexport function getRegisteredIntegrationAPIManifest(): Record<string, FarmIntegrationAPI> {\n const manifestEntries = Object.entries(getRegisteredIntegrations())\n .map(([key, integration]) => {\n const api = createClientSafeIntegrationAPI(integration.api);\n return api ? ([key, api] as const) : null;\n })\n .filter((value): value is readonly [string, FarmIntegrationAPI] => value !== null);\n\n return Object.fromEntries(manifestEntries);\n}\n\ntype IntegrationLifecycleCleanup = () => MaybePromise<void>;\n\nfunction getIntegrationRuntimeEnv(): Record<string, string | undefined> {\n return typeof process !== \"undefined\" ? process.env : {};\n}\n\nfunction isIntegrationConfigDefinition(\n value: unknown,\n): value is FarmIntegrationConfigDefinition<unknown> {\n return (\n !!value &&\n typeof value === \"object\" &&\n (\"schema\" in value ||\n \"env\" in value ||\n \"defaults\" in value ||\n \"input\" in value ||\n \"resolve\" in value)\n );\n}\n\nfunction mergeIntegrationConfigValue(current: unknown, next: unknown): unknown {\n if (next === undefined) {\n return current;\n }\n\n if (isPlainIntegrationConfigObject(current) && isPlainIntegrationConfigObject(next)) {\n return {\n ...current,\n ...next,\n };\n }\n\n return next;\n}\n\nfunction isPlainIntegrationConfigObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nasync function resolveIntegrationConfigPart<TValue>(\n value: TValue | ((context: FarmIntegrationConfigContext) => MaybePromise<TValue>) | undefined,\n context: FarmIntegrationConfigContext,\n): Promise<TValue | undefined> {\n if (typeof value === \"function\") {\n return (value as (context: FarmIntegrationConfigContext) => MaybePromise<TValue>)(context);\n }\n\n return value;\n}\n\nfunction resolveIntegrationEnvConfig(\n env: Record<string, string | readonly string[]> | undefined,\n): Record<string, string> | undefined {\n if (!env) {\n return undefined;\n }\n\n const runtimeEnv = getIntegrationRuntimeEnv();\n const config: Record<string, string> = {};\n\n for (const [key, names] of Object.entries(env)) {\n const envNames = Array.isArray(names) ? names : [names];\n const value = envNames.map((name) => runtimeEnv[name]).find((entry) => entry !== undefined);\n if (value !== undefined) {\n config[key] = value;\n }\n }\n\n return config;\n}\n\nasync function parseIntegrationConfigSchema<TConfig>(\n integration: FarmIntegration<any, any>,\n schema: FarmIntegrationInputSchema<TConfig>,\n value: unknown,\n): Promise<TConfig> {\n const parser = schema.safeParseAsync || schema.safeParse;\n if (parser) {\n const result = await parser.call(schema, value);\n if (result.success) {\n return result.data;\n }\n\n throw createIntegrationConfigValidationError(integration, result.error);\n }\n\n if (schema[\"~standard\"]?.validate) {\n const result = await schema[\"~standard\"].validate(value);\n if (\"value\" in result) {\n return result.value;\n }\n\n throw createIntegrationConfigValidationError(integration, {\n issues: result.issues,\n });\n }\n\n if (schema.parse) {\n try {\n return await schema.parse(value);\n } catch (error) {\n throw createIntegrationConfigValidationError(\n integration,\n normalizeIntegrationValidationError(error),\n );\n }\n }\n\n throw new Error(\n `Integration \"${integration.type}\" config schema must expose safeParse, safeParseAsync, parse, or ~standard.validate.`,\n );\n}\n\nfunction createIntegrationConfigValidationError(\n integration: FarmIntegration<any, any>,\n error: FarmIntegrationValidationErrorLike,\n) {\n const issues =\n Array.isArray(error.issues) && error.issues.length > 0\n ? error.issues\n .map((issue) => {\n const normalizedPath = normalizeIntegrationValidationPath(issue.path);\n const path = normalizedPath.length ? `${normalizedPath.join(\".\")}: ` : \"\";\n return `${path}${issue.message || \"Invalid config\"}`;\n })\n .join(\"; \")\n : error.message || \"Invalid config\";\n\n return new Error(`Integration \"${integration.type}\" config validation failed: ${issues}`);\n}\n\nasync function resolveIntegrationConfig<TConfig>(\n integration: FarmIntegration<any, TConfig>,\n context: FarmIntegrationConfigContext,\n): Promise<TConfig> {\n const config = integration.config;\n if (!config) {\n return undefined as TConfig;\n }\n\n if (!isIntegrationConfigDefinition(config)) {\n return parseIntegrationConfigSchema(integration, config, {});\n }\n\n let value: unknown = {};\n value = mergeIntegrationConfigValue(\n value,\n await resolveIntegrationConfigPart(config.defaults, context),\n );\n value = mergeIntegrationConfigValue(value, resolveIntegrationEnvConfig(config.env));\n value = mergeIntegrationConfigValue(\n value,\n await resolveIntegrationConfigPart(config.input, context),\n );\n value = mergeIntegrationConfigValue(value, await config.resolve?.(context));\n\n return config.schema\n ? parseIntegrationConfigSchema(integration, config.schema, value)\n : (value as TConfig);\n}\n\nfunction createIntegrationLifecycleLogger(\n integration: FarmIntegration<any, any>,\n phase: FarmIntegrationLogPhase,\n): FarmIntegrationLifecycleLogger {\n const write = (\n level: FarmIntegrationLifecycleLogLevel,\n message: string,\n meta?: Record<string, unknown>,\n ) => {\n if (!integration.log) {\n return;\n }\n\n void Promise.resolve(\n integration.log({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase,\n level,\n message,\n meta,\n context: new Map(),\n }),\n ).catch(() => {});\n };\n\n return {\n info(message, meta) {\n write(\"info\", message, meta);\n },\n warn(message, meta) {\n write(\"warn\", message, meta);\n },\n error(message, meta) {\n write(\"error\", message, meta);\n },\n };\n}\n\nconst INTEGRATION_DATA_HEADER = \"x-farm-integration-data\";\nconst INTEGRATION_DATA_HEADER_MAX_LENGTH = 16 * 1024;\nconst BLOCKED_INTEGRATION_DATA_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nfunction isFarmIntegrationData(value: unknown): value is FarmIntegrationData {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isPlainIntegrationDataObject(value: unknown): value is Record<string, unknown> {\n if (!isFarmIntegrationData(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction sanitizeIntegrationDataValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => sanitizeIntegrationDataValue(item));\n }\n\n if (!isPlainIntegrationDataObject(value)) {\n return value;\n }\n\n const sanitized: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n if (BLOCKED_INTEGRATION_DATA_KEYS.has(key)) {\n continue;\n }\n\n sanitized[key] = sanitizeIntegrationDataValue(item);\n }\n\n return sanitized;\n}\n\nfunction normalizeIntegrationData(value: FarmIntegrationData | undefined): FarmIntegrationData {\n if (!isFarmIntegrationData(value)) {\n return {};\n }\n\n const sanitized = sanitizeIntegrationDataValue(value);\n return isFarmIntegrationData(sanitized) ? sanitized : {};\n}\n\nfunction getIntegrationDataHeaderByteLength(value: string): number {\n return new TextEncoder().encode(value).byteLength;\n}\n\nfunction parseIntegrationDataHeader(request: Request): FarmIntegrationData {\n const raw = request.headers.get(INTEGRATION_DATA_HEADER);\n if (!raw) {\n return {};\n }\n\n if (getIntegrationDataHeaderByteLength(raw) > INTEGRATION_DATA_HEADER_MAX_LENGTH) {\n return {};\n }\n\n try {\n const value = JSON.parse(raw);\n return normalizeIntegrationData(value);\n } catch {\n return {};\n }\n}\n\nfunction resolveIntegrationData(request: Request, data?: FarmIntegrationData): FarmIntegrationData {\n return {\n ...parseIntegrationDataHeader(request),\n ...normalizeIntegrationData(data),\n };\n}\n\nfunction createIntegrationPlugin(integrationKey: string, integration: FarmIntegration): FarmPlugin {\n const routes = normalizeIntegrationRoutes(integration.routes || []);\n const middleware = [...(integration.middleware || [])];\n const cleanupCallbacks: IntegrationLifecycleCleanup[] = [];\n let integrationConfigPromise: Promise<unknown> | undefined;\n\n const runCleanup = async () => {\n const callbacks = cleanupCallbacks.splice(0).reverse();\n for (const callback of callbacks) {\n await callback();\n }\n };\n\n const createLifecycleContext = async (\n context: FarmPluginContext,\n phase: FarmIntegrationLogPhase,\n options: { reason?: string } = {},\n ): Promise<FarmIntegrationLifecycleContext> => {\n const args = createIntegrationRouteArgs({\n integration,\n config: context.config,\n });\n const configContext: FarmIntegrationConfigContext = {\n key: integrationKey,\n integration,\n appConfig: context.config,\n config: context.config,\n args,\n env: getIntegrationRuntimeEnv(),\n isDev: context.isDev,\n isProd: context.isProd,\n };\n integrationConfigPromise ??= resolveIntegrationConfig(integration, configContext);\n\n return {\n ...configContext,\n integrationConfig: await integrationConfigPromise,\n log: createIntegrationLifecycleLogger(integration, phase),\n reason: options.reason,\n async cleanup(callback) {\n if (callback) {\n cleanupCallbacks.push(callback);\n return;\n }\n\n await runCleanup();\n },\n };\n };\n\n const plugin: FarmPlugin = {\n name: `farm:integration:${integration.category}:${integration.type}`,\n enforce: \"pre\",\n\n async init(context) {\n getIntegrationRuntimeRegistry().set(integrationKey, {\n integration,\n config: context.config,\n isDev: context.isDev,\n isProd: context.isProd,\n });\n\n await createLifecycleContext(context, \"validate\");\n\n if (integration.validate) {\n await integration.validate(await createLifecycleContext(context, \"validate\"));\n }\n\n if (integration.setup) {\n await integration.setup(await createLifecycleContext(context, \"setup\"));\n }\n\n if (!integration.log) {\n return;\n }\n\n for (const route of routes) {\n await integration.log({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"registered\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n context: new Map(),\n });\n }\n\n for (const entry of middleware) {\n await integration.log({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"registered\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n context: new Map(),\n });\n }\n },\n\n async ready(context) {\n if (integration.ready) {\n await integration.ready(await createLifecycleContext(context, \"ready\"));\n }\n },\n\n async shutdown(payload, context) {\n try {\n if (integration.dispose) {\n await integration.dispose(\n await createLifecycleContext(context, \"dispose\", {\n reason: payload.reason,\n }),\n );\n }\n } finally {\n await runCleanup();\n }\n },\n\n async beforeRequest(req, res, context) {\n const fullUrl = `http://${req.headers.host || \"localhost\"}${req.url || \"/\"}`;\n const url = new URL(fullUrl);\n const pathname = url.pathname;\n const requestId = getRequestId(req);\n let bodyLoaded = false;\n let requestBody: Buffer | undefined;\n\n const getRequestBody = async () => {\n if (!bodyLoaded) {\n bodyLoaded = true;\n if (req.method && req.method !== \"GET\" && req.method !== \"HEAD\") {\n requestBody = await readRequestBody(req);\n }\n }\n\n return requestBody;\n };\n\n const createHandlerRequest = async () => {\n return createWebRequest(req, fullUrl, await getRequestBody());\n };\n\n for (const entry of middleware) {\n const params = resolveMatcherParams(entry.matcher, pathname);\n if (!params) {\n continue;\n }\n\n const request = await createHandlerRequest();\n const handlerContext = createIntegrationHandlerContext({\n integration,\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n rawRequest: req,\n params,\n pathname,\n requestId,\n pluginContext: context,\n });\n const startedAt = Date.now();\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:start\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n requestId,\n context: handlerContext.req.snapshot(),\n });\n\n try {\n const response = await entry.handler(request, handlerContext);\n if (response) {\n await sendWebResponse(res, response);\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return;\n }\n\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n } catch (error) {\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:error\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n requestId,\n durationMs: Date.now() - startedAt,\n error,\n context: handlerContext.req.snapshot(),\n });\n throw error;\n }\n }\n\n for (const route of routes) {\n const params = matchesMethod(route.methods, req.method)\n ? extractPathParams(route.path, pathname)\n : null;\n if (!params) {\n continue;\n }\n\n const request = await createHandlerRequest();\n const handlerContext = createIntegrationHandlerContext({\n integration,\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n rawRequest: req,\n params,\n pathname,\n requestId,\n pluginContext: context,\n });\n const startedAt = Date.now();\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:start\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n requestId,\n context: handlerContext.req.snapshot(),\n });\n\n try {\n const validation = await validateIntegrationRouteInput(route, request, url);\n if (!validation.success) {\n await sendWebResponse(res, validation.response);\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response: validation.response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return;\n }\n handlerContext.input = validation.input;\n\n for (const middlewareEntry of route.middleware || []) {\n const middlewareResponse = await middlewareEntry.handler(request, handlerContext);\n if (middlewareResponse) {\n await sendWebResponse(res, middlewareResponse);\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response: middlewareResponse,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return;\n }\n }\n\n const beforeResponse = await runIntegrationRouteBeforeHooks(\n route,\n request,\n handlerContext,\n );\n if (beforeResponse) {\n const response = await runIntegrationRouteAfterHooks(\n route,\n request,\n handlerContext,\n beforeResponse,\n );\n await sendWebResponse(res, response);\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return;\n }\n\n const handlerResponse = await route.handler(request, handlerContext);\n const response = await runIntegrationRouteAfterHooks(\n route,\n request,\n handlerContext,\n handlerResponse,\n );\n await sendWebResponse(res, response);\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return;\n } catch (error) {\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:error\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n requestId,\n durationMs: Date.now() - startedAt,\n error,\n context: handlerContext.req.snapshot(),\n });\n throw error;\n }\n }\n },\n };\n\n Object.defineProperty(plugin, FARM_INTEGRATION_PLUGIN_SERVER_RUNTIME, {\n value: integration.serverRuntime !== false,\n });\n\n return plugin;\n}\n\nfunction createIntegrationHandlerContext(input: {\n integration: FarmIntegration;\n route: FarmIntegrationHandlerContext[\"route\"];\n request: Request;\n rawRequest: FarmRequest;\n params: FarmIntegrationRouteParams;\n pathname: string;\n requestId: string;\n pluginContext: FarmPluginContext;\n}): FarmIntegrationHandlerContext {\n const req = createIntegrationRequestContextStore(\n input.rawRequest,\n input.request,\n input.pluginContext,\n );\n\n return {\n request: input.request,\n requestId: input.requestId,\n url: new URL(input.request.url),\n pathname: input.pathname,\n method: input.request.method,\n params: input.params,\n input: {},\n args: createIntegrationRouteArgs({\n integration: input.integration,\n config: input.pluginContext.config,\n }),\n data: resolveIntegrationData(input.request),\n integration: {\n category: input.integration.category,\n slot: input.integration.category,\n type: input.integration.type,\n instance: input.integration.instance,\n },\n route: input.route,\n req,\n requestContext: req,\n config: input.pluginContext.config,\n isDev: input.pluginContext.isDev,\n isProd: input.pluginContext.isProd,\n };\n}\n\ntype NormalizedIntegrationRoute = Omit<FarmIntegrationRoute, \"method\" | \"methods\"> & {\n methods: readonly string[];\n __operation?: FarmIntegrationAPIOperation<any, any, any, any, any>;\n};\n\nfunction normalizeIntegrationRoutes(\n routes: readonly FarmIntegrationRoute[],\n): NormalizedIntegrationRoute[] {\n return routes.map((route) => ({\n ...route,\n methods: normalizeIntegrationRouteMethods(route),\n input: normalizeIntegrationRouteInputSchemas(route),\n }));\n}\n\nfunction normalizeIntegrationRouteMethods(route: Pick<FarmIntegrationRoute, \"method\" | \"methods\">) {\n const input =\n route.methods && route.methods.length > 0\n ? [...route.methods]\n : route.method\n ? [route.method]\n : [\"ALL\"];\n\n return input.map((method) => String(method).toUpperCase());\n}\n\nfunction normalizeIntegrationRouteInputSchemas<TBody, TQuery>(\n route: Pick<FarmIntegrationRoute<TBody, TQuery>, \"body\" | \"query\" | \"input\">,\n): FarmIntegrationRouteInputSchemas<TBody, TQuery> | undefined {\n const input: FarmIntegrationRouteInputSchemas<TBody, TQuery> = {\n ...route.input,\n };\n\n if (route.body) {\n input.body = route.body;\n }\n\n if (route.query) {\n input.query = route.query;\n }\n\n return input.body || input.query ? input : undefined;\n}\n\ntype IntegrationRouteInputValidationResult =\n | {\n success: true;\n input: FarmIntegrationRouteInput;\n }\n | {\n success: false;\n response: Response;\n };\n\nasync function validateIntegrationRouteInput(\n route: NormalizedIntegrationRoute,\n request: Request,\n url: URL,\n): Promise<IntegrationRouteInputValidationResult> {\n const schemas = route.input;\n if (!schemas?.body && !schemas?.query) {\n return {\n success: true,\n input: {},\n };\n }\n\n const input: FarmIntegrationRouteInput = {};\n const issues: FarmIntegrationValidationIssue[] = [];\n\n if (schemas.query) {\n const queryResult = await parseIntegrationInputSchema(\n \"query\",\n schemas.query,\n createQueryInput(url.searchParams),\n );\n if (queryResult.success) {\n input.query = queryResult.data;\n } else {\n issues.push(...queryResult.issues);\n }\n }\n\n if (schemas.body) {\n const bodyInput = await readIntegrationValidationBody(\n request,\n getIntegrationRouteBodyFormat(route),\n );\n\n if (bodyInput.success) {\n const bodyResult = await parseIntegrationInputSchema(\"body\", schemas.body, bodyInput.data);\n if (bodyResult.success) {\n input.body = bodyResult.data;\n } else {\n issues.push(...bodyResult.issues);\n }\n } else {\n issues.push(bodyInput.issue);\n }\n }\n\n if (issues.length > 0) {\n return {\n success: false,\n response: createIntegrationValidationResponse(issues),\n };\n }\n\n return {\n success: true,\n input,\n };\n}\n\nasync function parseIntegrationInputSchema<TValue>(\n source: FarmIntegrationRouteInputSource,\n schema: FarmIntegrationInputSchema<TValue>,\n value: unknown,\n): Promise<\n | {\n success: true;\n data: TValue;\n }\n | {\n success: false;\n issues: FarmIntegrationValidationIssue[];\n }\n> {\n const parser = schema.safeParseAsync || schema.safeParse;\n if (parser) {\n const result = await parser.call(schema, value);\n if (result.success) {\n return {\n success: true,\n data: result.data,\n };\n }\n\n return {\n success: false,\n issues: normalizeIntegrationValidationIssues(source, result.error),\n };\n }\n\n if (schema[\"~standard\"]?.validate) {\n const result = await schema[\"~standard\"].validate(value);\n if (\"value\" in result) {\n return {\n success: true,\n data: result.value,\n };\n }\n\n return {\n success: false,\n issues: normalizeIntegrationValidationIssues(source, {\n issues: result.issues,\n }),\n };\n }\n\n if (schema.parse) {\n try {\n return {\n success: true,\n data: await schema.parse(value),\n };\n } catch (error) {\n return {\n success: false,\n issues: normalizeIntegrationValidationIssues(\n source,\n normalizeIntegrationValidationError(error),\n ),\n };\n }\n }\n\n return {\n success: false,\n issues: [\n {\n source,\n message:\n \"Input schema must expose safeParse, safeParseAsync, parse, or ~standard.validate.\",\n },\n ],\n };\n}\n\nfunction createIntegrationValidationResponse(issues: readonly FarmIntegrationValidationIssue[]) {\n return Response.json(\n {\n error: \"Integration route input validation failed\",\n issues,\n },\n {\n status: 400,\n },\n );\n}\n\nfunction normalizeIntegrationValidationIssues(\n source: FarmIntegrationRouteInputSource,\n error: FarmIntegrationValidationErrorLike,\n): FarmIntegrationValidationIssue[] {\n if (Array.isArray(error.issues) && error.issues.length > 0) {\n return error.issues.map((issue) => ({\n source,\n path: normalizeIntegrationValidationPath(issue.path),\n code: issue.code,\n message: issue.message || \"Invalid input\",\n }));\n }\n\n return [\n {\n source,\n path: [],\n message: error.message || \"Invalid input\",\n },\n ];\n}\n\nfunction normalizeIntegrationValidationPath(\n path: readonly FarmIntegrationValidationPathSegment[] | undefined,\n): (string | number)[] {\n return (path || []).map((segment) => {\n const key =\n typeof segment === \"object\" && segment !== null && \"key\" in segment ? segment.key : segment;\n return typeof key === \"symbol\" ? key.description || key.toString() : key;\n });\n}\n\nfunction normalizeIntegrationValidationError(error: unknown): FarmIntegrationValidationErrorLike {\n if (error && typeof error === \"object\") {\n return error as FarmIntegrationValidationErrorLike;\n }\n\n return {\n message: error instanceof Error ? error.message : String(error || \"Invalid input\"),\n };\n}\n\nasync function readIntegrationValidationBody(\n request: Request,\n format: FarmIntegrationAPIBodyFormat,\n): Promise<\n | {\n success: true;\n data: unknown;\n }\n | {\n success: false;\n issue: FarmIntegrationValidationIssue;\n }\n> {\n if (request.method === \"GET\" || request.method === \"HEAD\" || format === \"none\") {\n return {\n success: true,\n data: undefined,\n };\n }\n\n try {\n if (format === \"form\") {\n return {\n success: true,\n data: createFormInput(await request.clone().formData()),\n };\n }\n\n const text = await request.clone().text();\n if (text.trim().length === 0) {\n return {\n success: true,\n data: undefined,\n };\n }\n\n return {\n success: true,\n data: JSON.parse(text),\n };\n } catch (error) {\n return {\n success: false,\n issue: {\n source: \"body\",\n path: [],\n message:\n format === \"json\"\n ? \"Expected a valid JSON request body.\"\n : error instanceof Error && error.message\n ? error.message\n : \"Could not parse request body.\",\n },\n };\n }\n}\n\nfunction getIntegrationRouteBodyFormat(route: NormalizedIntegrationRoute) {\n return route.bodyFormat || route.__operation?.bodyFormat || \"json\";\n}\n\nfunction createIntegrationRouteArgs(input: {\n integration: FarmIntegration;\n config: FarmPluginContext[\"config\"];\n}): FarmIntegrationRouteArgs {\n let clientPromise: Promise<unknown | undefined> | undefined;\n let ormPromise: Promise<unknown> | undefined;\n\n const getClient = () => {\n clientPromise ??= import(\"./storage\").then(({ resolveStorageRuntimeClient }) =>\n resolveStorageRuntimeClient(input.config.storage),\n );\n return clientPromise;\n };\n\n const getOrm = () => {\n if (!input.integration.schema) {\n throw new Error(\n `Integration \"${input.integration.type}\" does not define a schema for ctx.args.db.`,\n );\n }\n\n ormPromise ??= import(\"./integration-orm\").then(({ createIntegrationOrm }) =>\n createIntegrationOrm({\n schema: input.integration.schema!,\n config: input.config,\n }),\n );\n return ormPromise;\n };\n\n return {\n db: createLazyIntegrationOrmClient(getOrm) as never,\n getDb: getOrm as never,\n storage: {\n getClient,\n getOrm: getOrm as never,\n },\n };\n}\n\nfunction createLazyIntegrationOrmClient(resolveOrm: () => Promise<unknown>) {\n const modelProxyCache = new Map<PropertyKey, unknown>();\n\n return new Proxy(\n {},\n {\n get(_target, prop) {\n if (prop === \"then\") {\n return undefined;\n }\n\n if (prop === \"transaction\" || prop === \"batch\") {\n return async (...args: unknown[]) => {\n const orm = (await resolveOrm()) as Record<PropertyKey, unknown>;\n const member = orm[prop];\n if (typeof member !== \"function\") {\n throw new Error(`Integration ORM does not expose \"${String(prop)}\".`);\n }\n return member.apply(orm, args);\n };\n }\n\n if (prop === \"$driver\") {\n return undefined;\n }\n\n if (!modelProxyCache.has(prop)) {\n modelProxyCache.set(prop, createLazyIntegrationOrmModel(resolveOrm, prop));\n }\n\n return modelProxyCache.get(prop);\n },\n },\n );\n}\n\nfunction createLazyIntegrationOrmModel(resolveOrm: () => Promise<unknown>, modelName: PropertyKey) {\n return new Proxy(\n {},\n {\n get(_target, prop) {\n if (prop === \"then\") {\n return undefined;\n }\n\n return async (...args: unknown[]) => {\n const orm = (await resolveOrm()) as Record<PropertyKey, Record<PropertyKey, unknown>>;\n const model = orm[modelName];\n const member = model?.[prop];\n if (typeof member !== \"function\") {\n throw new Error(\n `Integration ORM model \"${String(modelName)}\" does not expose \"${String(prop)}\".`,\n );\n }\n return member.apply(model, args);\n };\n },\n },\n );\n}\n\nasync function runIntegrationRouteBeforeHooks(\n route: NormalizedIntegrationRoute,\n request: Request,\n context: FarmIntegrationHandlerContext,\n): Promise<Response | undefined> {\n const hookContext = context as FarmIntegrationRouteHookContext;\n hookContext.response = undefined;\n\n for (const hook of route.before || []) {\n const response = await hook(request, hookContext);\n if (response) {\n hookContext.response = response;\n return response;\n }\n\n if (hookContext.response) {\n return hookContext.response;\n }\n }\n\n return undefined;\n}\n\nasync function runIntegrationRouteAfterHooks(\n route: NormalizedIntegrationRoute,\n request: Request,\n context: FarmIntegrationHandlerContext,\n response: Response,\n): Promise<Response> {\n const hookContext = context as FarmIntegrationRouteHookContext;\n let currentResponse = response;\n\n for (const hook of route.after || []) {\n hookContext.response = currentResponse;\n const nextResponse = await hook(request, hookContext);\n currentResponse = nextResponse || hookContext.response || currentResponse;\n }\n\n hookContext.response = currentResponse;\n return currentResponse;\n}\n\nfunction createQueryInput(searchParams: URLSearchParams): Record<string, string | string[]> {\n const input: Record<string, string | string[]> = {};\n searchParams.forEach((value, key) => {\n const existing = input[key];\n if (existing === undefined) {\n input[key] = value;\n return;\n }\n\n input[key] = Array.isArray(existing) ? [...existing, value] : [existing, value];\n });\n return input;\n}\n\nfunction createFormInput(\n formData: FormData,\n): Record<string, FormDataEntryValue | FormDataEntryValue[]> {\n const input: Record<string, FormDataEntryValue | FormDataEntryValue[]> = {};\n formData.forEach((value, key) => {\n const existing = input[key];\n if (existing === undefined) {\n input[key] = value;\n return;\n }\n\n input[key] = Array.isArray(existing) ? [...existing, value] : [existing, value];\n });\n return input;\n}\n\nexport async function dispatchIntegrationRequest(\n runtime: RegisteredIntegrationRuntime,\n request: Request,\n options: {\n currentRequest?: Request;\n data?: FarmIntegrationData;\n internal?: boolean;\n } = {},\n): Promise<Response | null> {\n const integration = runtime.integration;\n const url = new URL(request.url);\n const pathname = url.pathname;\n const requestId =\n request.headers.get(\"x-request-id\") ||\n options.currentRequest?.headers.get(\"x-request-id\") ||\n String(Date.now());\n const routes = normalizeIntegrationRoutes(integration.routes || []);\n const middleware = [...(integration.middleware || [])];\n\n for (const entry of middleware) {\n const params = resolveMatcherParams(entry.matcher, pathname);\n if (!params) {\n continue;\n }\n\n const handlerContext = createServerIntegrationHandlerContext({\n runtime,\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n params,\n pathname,\n requestId,\n currentRequest: options.currentRequest,\n data: options.data,\n internal: options.internal === true,\n });\n const startedAt = Date.now();\n\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:start\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n requestId,\n context: handlerContext.req.snapshot(),\n });\n\n try {\n const response = await entry.handler(request, handlerContext);\n if (response) {\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return response;\n }\n\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n } catch (error) {\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:error\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n requestId,\n durationMs: Date.now() - startedAt,\n error,\n context: handlerContext.req.snapshot(),\n });\n throw error;\n }\n }\n\n for (const route of routes) {\n const params = matchesMethod(route.methods, request.method)\n ? extractPathParams(route.path, pathname)\n : null;\n if (!params) {\n continue;\n }\n\n const handlerContext = createServerIntegrationHandlerContext({\n runtime,\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n params,\n pathname,\n requestId,\n currentRequest: options.currentRequest,\n data: options.data,\n internal: options.internal === true,\n });\n const startedAt = Date.now();\n\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:start\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n requestId,\n context: handlerContext.req.snapshot(),\n });\n\n try {\n const validation = await validateIntegrationRouteInput(route, request, url);\n if (!validation.success) {\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response: validation.response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return validation.response;\n }\n handlerContext.input = validation.input;\n\n for (const middlewareEntry of route.middleware || []) {\n const middlewareResponse = await middlewareEntry.handler(request, handlerContext);\n if (middlewareResponse) {\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response: middlewareResponse,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return middlewareResponse;\n }\n }\n\n const beforeResponse = await runIntegrationRouteBeforeHooks(route, request, handlerContext);\n if (beforeResponse) {\n const response = await runIntegrationRouteAfterHooks(\n route,\n request,\n handlerContext,\n beforeResponse,\n );\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return response;\n }\n\n const handlerResponse = await route.handler(request, handlerContext);\n const response = await runIntegrationRouteAfterHooks(\n route,\n request,\n handlerContext,\n handlerResponse,\n );\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return response;\n } catch (error) {\n await integration.log?.({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:error\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n requestId,\n durationMs: Date.now() - startedAt,\n error,\n context: handlerContext.req.snapshot(),\n });\n throw error;\n }\n }\n\n return null;\n}\n\n(globalThis as GlobalWithIntegrationRuntimeRegistry)[INTEGRATION_REQUEST_DISPATCHER_KEY] =\n dispatchIntegrationRequest;\n\nfunction createIntegrationRequestContextStore(\n rawRequest: FarmRequest,\n request: Request,\n pluginContext: FarmPluginContext,\n): FarmIntegrationRequestContextStore {\n return {\n get(key) {\n const requestValue = pluginContext.requestContext.get(request, key);\n if (requestValue !== undefined) {\n return requestValue;\n }\n\n return pluginContext.requestContext.get(rawRequest, key);\n },\n set(key, value, options) {\n pluginContext.requestContext.set(rawRequest, key, value, options);\n pluginContext.requestContext.set(request, key, value, options);\n },\n has(key) {\n return (\n pluginContext.requestContext.has(request, key) ||\n pluginContext.requestContext.has(rawRequest, key)\n );\n },\n delete(key) {\n const deletedRequest = pluginContext.requestContext.delete(request, key);\n const deletedRaw = pluginContext.requestContext.delete(rawRequest, key);\n return deletedRequest || deletedRaw;\n },\n clear() {\n pluginContext.requestContext.clear(rawRequest);\n pluginContext.requestContext.clear(request);\n },\n snapshot(options) {\n const merged = pluginContext.requestContext.getAll(rawRequest, options);\n const requestSnapshot = pluginContext.requestContext.getAll(request, options);\n for (const [key, value] of requestSnapshot) {\n merged.set(key, value);\n }\n return merged;\n },\n };\n}\n\nfunction createServerIntegrationHandlerContext(input: {\n runtime: RegisteredIntegrationRuntime;\n route: FarmIntegrationHandlerContext[\"route\"];\n request: Request;\n params: FarmIntegrationRouteParams;\n pathname: string;\n requestId: string;\n currentRequest?: Request;\n data?: FarmIntegrationData;\n internal?: boolean;\n}): FarmIntegrationHandlerContext {\n const req = createServerIntegrationRequestContextStore(input.request, input.currentRequest);\n\n if (input.internal) {\n req.set(FARM_INTEGRATION_INTERNAL_DISPATCH_CONTEXT_KEY, true);\n }\n\n return {\n request: input.request,\n requestId: input.requestId,\n url: new URL(input.request.url),\n pathname: input.pathname,\n method: input.request.method,\n params: input.params,\n input: {},\n args: createIntegrationRouteArgs({\n integration: input.runtime.integration,\n config: input.runtime.config,\n }),\n data: resolveIntegrationData(input.request, input.data),\n integration: {\n category: input.runtime.integration.category,\n slot: input.runtime.integration.category,\n type: input.runtime.integration.type,\n instance: input.runtime.integration.instance,\n },\n route: input.route,\n req,\n requestContext: req,\n config: input.runtime.config,\n isDev: input.runtime.isDev,\n isProd: input.runtime.isProd,\n };\n}\n\nfunction createServerIntegrationRequestContextStore(\n request: Request,\n currentRequest?: Request,\n): FarmIntegrationRequestContextStore {\n return {\n get(key) {\n const requestValue = getRequestContext(request, key);\n if (requestValue !== undefined) {\n return requestValue;\n }\n\n if (currentRequest) {\n return getRequestContext(currentRequest, key);\n }\n\n return undefined;\n },\n set(key, value, options) {\n setRequestContext(request, key, value, options);\n if (currentRequest) {\n setRequestContext(currentRequest, key, value, options);\n }\n },\n has(key) {\n return (\n hasRequestContext(request, key) ||\n (!!currentRequest && hasRequestContext(currentRequest, key))\n );\n },\n delete(key) {\n const deletedRequest = deleteRequestContext(request, key);\n const deletedCurrent = currentRequest ? deleteRequestContext(currentRequest, key) : false;\n return deletedRequest || deletedCurrent;\n },\n clear() {\n clearRequestContext(request);\n if (currentRequest) {\n clearRequestContext(currentRequest);\n }\n },\n snapshot(options) {\n const merged = currentRequest\n ? getRequestContextSnapshot(currentRequest, options)\n : new Map<string, unknown>();\n const requestSnapshot = getRequestContextSnapshot(request, options);\n for (const [key, value] of requestSnapshot) {\n merged.set(key, value);\n }\n return merged;\n },\n };\n}\n\nfunction createWebRequest(req: FarmRequest, fullUrl: string, body?: Buffer): Request {\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value == null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n headers.append(key, item);\n }\n continue;\n }\n\n headers.set(key, value);\n }\n\n return new Request(fullUrl, {\n method: req.method,\n headers,\n body: body as BodyInit | undefined,\n });\n}\n\nfunction matchesMethod(methods: readonly string[], method: string | undefined): boolean {\n if (!method) {\n return false;\n }\n\n return methods.some((item) => item.toUpperCase() === method.toUpperCase());\n}\n\nfunction matchesMatcher(\n matcher: string | readonly string[] | undefined,\n pathname: string,\n): boolean {\n return resolveMatcherParams(matcher, pathname) !== null;\n}\n\nfunction resolveMatcherParams(\n matcher: string | readonly string[] | undefined,\n pathname: string,\n): FarmIntegrationRouteParams | null {\n if (!matcher) {\n return {};\n }\n\n const list = Array.isArray(matcher) ? matcher : [matcher];\n for (const item of list) {\n if (item === \"/(.*)\" || item === \"*\") {\n return {};\n }\n if (item.endsWith(\"(.*)\")) {\n const prefix = item.slice(0, -4);\n if (pathname === prefix || pathname.startsWith(`${prefix}/`)) {\n return {};\n }\n continue;\n }\n const params = extractPathParams(item, pathname);\n if (params) {\n return params;\n }\n }\n\n return null;\n}\n\nfunction matchesPath(pattern: string, pathname: string): boolean {\n return extractPathParams(pattern, pathname) !== null;\n}\n\nfunction extractPathParams(pattern: string, pathname: string): FarmIntegrationRouteParams | null {\n const routeSegments = splitPath(pattern);\n const pathSegments = splitPath(pathname);\n const params: FarmIntegrationRouteParams = {};\n\n let routeIndex = 0;\n let pathIndex = 0;\n\n while (routeIndex < routeSegments.length && pathIndex < pathSegments.length) {\n const routeSegment = routeSegments[routeIndex];\n const pathSegment = pathSegments[pathIndex];\n\n if (isCatchAllSegment(routeSegment)) {\n params[getSegmentParamName(routeSegment)] = pathSegments\n .slice(pathIndex)\n .map((segment) => decodeURIComponent(segment));\n return params;\n }\n\n if (isDynamicSegment(routeSegment)) {\n params[getSegmentParamName(routeSegment)] = decodeURIComponent(pathSegment);\n routeIndex += 1;\n pathIndex += 1;\n continue;\n }\n\n if (routeSegment !== pathSegment) {\n return null;\n }\n\n routeIndex += 1;\n pathIndex += 1;\n }\n\n if (routeIndex === routeSegments.length && pathIndex === pathSegments.length) {\n return params;\n }\n\n if (routeIndex === routeSegments.length - 1 && isCatchAllSegment(routeSegments[routeIndex])) {\n params[getSegmentParamName(routeSegments[routeIndex])] = [];\n return params;\n }\n\n return null;\n}\n\nfunction splitPath(value: string): string[] {\n return value.split(\"/\").filter(Boolean);\n}\n\nfunction isDynamicSegment(segment: string): boolean {\n return segment.startsWith(\"[\") && segment.endsWith(\"]\");\n}\n\nfunction isCatchAllSegment(segment: string): boolean {\n return segment.startsWith(\"[...\") && segment.endsWith(\"]\");\n}\n\nfunction getSegmentParamName(segment: string): string {\n if (isCatchAllSegment(segment)) {\n return segment.slice(4, -1);\n }\n\n return segment.slice(1, -1);\n}\n\nfunction getRequestId(req: FarmRequest): string {\n const headerValue = req.headers[\"x-request-id\"];\n if (Array.isArray(headerValue)) {\n return headerValue[0] || String(Date.now());\n }\n return headerValue || String(Date.now());\n}\n\nasync function readRequestBody(req: FarmRequest): Promise<Buffer> {\n return await new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk) => {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n req.on(\"end\", () => {\n resolve(Buffer.concat(chunks));\n });\n req.on(\"error\", reject);\n });\n}\n\nfunction normalizeMatcher(matcher: string | readonly string[] | undefined): string {\n if (!matcher) {\n return \"/(.*)\";\n }\n return typeof matcher === \"string\" ? matcher : matcher.join(\", \");\n}\n","export type FarmMarkdownRouteInput =\n | string\n | {\n route: string;\n title?: string;\n cache?: number | false;\n };\n\nexport interface FarmMarkdownUserConfig {\n /**\n * Enable generated markdown representations for React pages.\n * @default true\n */\n enabled?: boolean;\n /**\n * Routes that may expose generated markdown. Every page is exposed by default.\n */\n expose?: boolean | FarmMarkdownRouteInput[];\n /** @deprecated Use `expose`. */\n routes?: FarmMarkdownRouteInput[];\n cache?: number | false;\n includeMetadata?: boolean;\n}\n\nexport interface FarmMarkdownResolvedRoute {\n route: string;\n title?: string;\n cache?: number | false;\n}\n\nexport interface FarmMarkdownResolvedConfig {\n enabled: boolean;\n expose: true | FarmMarkdownResolvedRoute[];\n cache: number | false;\n includeMetadata: boolean;\n}\n\nexport interface FarmMarkdownMirrorTarget {\n pathname: string;\n route: FarmMarkdownResolvedRoute | null;\n}\n\nexport interface ResolveMarkdownMirrorTargetOptions {\n accept?: string | null;\n}\n\nexport interface CreateMarkdownMirrorResponseOptions {\n request: Request;\n config?: FarmMarkdownResolvedConfig;\n routeExists?: (pathname: string) => boolean;\n renderPage: (request: Request) => Response | Promise<Response>;\n}\n\nexport interface ApplyMarkdownNegotiationHeadersOptions {\n config?: FarmMarkdownResolvedConfig;\n pathname: string;\n}\n\nexport function resolveMarkdownConfig(\n config: FarmMarkdownUserConfig | boolean | undefined,\n): FarmMarkdownResolvedConfig {\n if (config === false) {\n return {\n enabled: false,\n expose: [],\n cache: false,\n includeMetadata: true,\n };\n }\n\n if (config === true || config === undefined) {\n return {\n enabled: true,\n expose: true,\n cache: false,\n includeMetadata: true,\n };\n }\n\n const exposeInput = config.expose ?? config.routes ?? true;\n const expose =\n exposeInput === true\n ? true\n : Array.isArray(exposeInput)\n ? exposeInput.map(normalizeMarkdownRouteInput)\n : [];\n\n return {\n enabled: config.enabled !== false && (expose === true || expose.length > 0),\n expose,\n cache: config.cache ?? false,\n includeMetadata: config.includeMetadata ?? true,\n };\n}\n\nexport function resolveMarkdownMirrorTarget(\n config: FarmMarkdownResolvedConfig | undefined,\n pathname: string,\n options: ResolveMarkdownMirrorTargetOptions = {},\n): FarmMarkdownMirrorTarget | null {\n const hasMarkdownExtension = pathname.toLowerCase().endsWith(\".md\");\n if (!config?.enabled || (!hasMarkdownExtension && !requestAcceptsMarkdown(options.accept))) {\n return null;\n }\n\n const targetPathname = normalizeMarkdownRoute(\n hasMarkdownExtension ? pathname.slice(0, -\".md\".length) || \"/\" : pathname,\n );\n const route = findExposedMarkdownRoute(config, targetPathname);\n if (!route && config.expose !== true) {\n return null;\n }\n\n return {\n pathname: targetPathname,\n route,\n };\n}\n\nexport async function createMarkdownMirrorResponse(\n options: CreateMarkdownMirrorResponseOptions,\n): Promise<Response | null> {\n if (options.request.method !== \"GET\" && options.request.method !== \"HEAD\") {\n return null;\n }\n\n const requestUrl = new URL(options.request.url);\n const hasMarkdownExtension = requestUrl.pathname.toLowerCase().endsWith(\".md\");\n const target = resolveMarkdownMirrorTarget(options.config, requestUrl.pathname, {\n accept: options.request.headers.get(\"accept\"),\n });\n if (!target) {\n return null;\n }\n\n if (options.routeExists && !options.routeExists(target.pathname)) {\n return null;\n }\n\n const pageUrl = new URL(options.request.url);\n pageUrl.pathname = target.pathname;\n const headers = new Headers(options.request.headers);\n headers.set(\"accept\", \"text/html\");\n\n const pageResponse = await options.renderPage(\n new Request(pageUrl, {\n method: \"GET\",\n headers,\n }),\n );\n\n if (!isHtmlResponse(pageResponse)) {\n return null;\n }\n\n const html = await pageResponse.text();\n const markdown = htmlToMarkdown(html, {\n title: target.route?.title,\n includeMetadata: options.config?.includeMetadata ?? true,\n sourcePath: target.pathname,\n });\n const headersOut = new Headers({\n \"Content-Type\": \"text/markdown; charset=utf-8\",\n \"Content-Location\": target.pathname === \"/\" ? \"/index.md\" : `${target.pathname}.md`,\n \"X-Farm-Markdown-Route\": target.pathname,\n });\n if (!hasMarkdownExtension) {\n headersOut.set(\"Vary\", \"Accept\");\n }\n const cache = target.route?.cache ?? options.config?.cache ?? false;\n headersOut.set(\"Cache-Control\", createMarkdownCacheHeader(cache));\n\n return new Response(options.request.method === \"HEAD\" ? null : markdown, {\n status: pageResponse.status,\n headers: headersOut,\n });\n}\n\nexport function applyMarkdownNegotiationHeaders(\n response: Response,\n options: ApplyMarkdownNegotiationHeadersOptions,\n): Response {\n if (!isHtmlResponse(response)) {\n return response;\n }\n\n const target = resolveMarkdownMirrorTarget(options.config, options.pathname, {\n accept: \"text/markdown\",\n });\n if (!target) {\n return response;\n }\n\n const alternatePath = getMarkdownAlternatePath(target.pathname);\n const headers = new Headers(response.headers);\n appendHeaderToken(headers, \"Vary\", \"Accept\");\n headers.append(\"Link\", `<${alternatePath}>; rel=\"alternate\"; type=\"text/markdown\"`);\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n\nexport function htmlToMarkdown(\n html: string,\n options: {\n title?: string;\n sourcePath?: string;\n includeMetadata?: boolean;\n } = {},\n): string {\n const title = options.title ?? extractHtmlTitle(html);\n let source = extractHtmlBody(html)\n .replace(/<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/<style\\b[^>]*>[\\s\\S]*?<\\/style>/gi, \"\")\n .replace(/<noscript\\b[^>]*>[\\s\\S]*?<\\/noscript>/gi, \"\")\n .replace(/<!--[\\s\\S]*?-->/g, \"\");\n\n source = source.replace(/<pre\\b[^>]*><code\\b[^>]*>([\\s\\S]*?)<\\/code><\\/pre>/gi, (_, code) => {\n return `\\n\\n\\`\\`\\`\\n${decodeHtml(stripTags(code)).trim()}\\n\\`\\`\\`\\n\\n`;\n });\n source = source.replace(/<pre\\b[^>]*>([\\s\\S]*?)<\\/pre>/gi, (_, code) => {\n return `\\n\\n\\`\\`\\`\\n${decodeHtml(stripTags(code)).trim()}\\n\\`\\`\\`\\n\\n`;\n });\n source = source.replace(/<h([1-6])\\b[^>]*>([\\s\\S]*?)<\\/h\\1>/gi, (_, level, content) => {\n return `\\n\\n${\"#\".repeat(Number(level))} ${toInlineMarkdown(content).trim()}\\n\\n`;\n });\n source = source.replace(/<p\\b[^>]*>([\\s\\S]*?)<\\/p>/gi, (_, content) => {\n return `\\n\\n${toInlineMarkdown(content).trim()}\\n\\n`;\n });\n source = source.replace(/<blockquote\\b[^>]*>([\\s\\S]*?)<\\/blockquote>/gi, (_, content) => {\n const quote = htmlToMarkdown(content, { includeMetadata: false })\n .split(\"\\n\")\n .filter((line) => line.trim().length > 0)\n .map((line) => `> ${line}`)\n .join(\"\\n\");\n return `\\n\\n${quote}\\n\\n`;\n });\n source = source.replace(/<li\\b[^>]*>([\\s\\S]*?)<\\/li>/gi, (_, content) => {\n return `\\n- ${toInlineMarkdown(content).trim()}`;\n });\n source = source\n .replace(/<\\/?(ul|ol|main|section|article|header|footer|nav|aside|div)\\b[^>]*>/gi, \"\\n\")\n .replace(/<br\\s*\\/?>/gi, \"\\n\")\n .replace(/<hr\\s*\\/?>/gi, \"\\n\\n---\\n\\n\");\n\n let markdown = stripTags(source)\n .split(\"\\n\")\n .map((line) => line.replace(/[ \\t]+$/g, \"\"))\n .join(\"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n\n if (options.includeMetadata !== false) {\n const metadata: string[] = [];\n if (title && !markdown.startsWith(\"# \")) {\n metadata.push(`# ${title}`);\n }\n if (options.sourcePath) {\n metadata.push(`Source: ${options.sourcePath}`);\n }\n if (metadata.length) {\n markdown = `${metadata.join(\"\\n\\n\")}${markdown ? `\\n\\n${markdown}` : \"\"}`;\n }\n }\n\n return `${markdown}\\n`;\n}\n\nfunction normalizeMarkdownRouteInput(input: FarmMarkdownRouteInput): FarmMarkdownResolvedRoute {\n if (typeof input === \"string\") {\n return {\n route: normalizeMarkdownRoute(input),\n };\n }\n\n return {\n ...input,\n route: normalizeMarkdownRoute(input.route),\n };\n}\n\nfunction normalizeMarkdownRoute(route: string): string {\n const withoutMarkdownExtension = route.toLowerCase().endsWith(\".md\") ? route.slice(0, -3) : route;\n const withSlash = withoutMarkdownExtension.startsWith(\"/\")\n ? withoutMarkdownExtension\n : `/${withoutMarkdownExtension}`;\n const normalized = withSlash.replace(/\\/+/g, \"/\").replace(/\\/$/g, \"\");\n return normalized === \"\" || normalized === \"/index\" ? \"/\" : normalized;\n}\n\nexport function requestAcceptsMarkdown(accept: string | null | undefined): boolean {\n if (!accept) {\n return false;\n }\n\n return accept.split(\",\").some((entry) => {\n const [mediaType, ...parameters] = entry\n .trim()\n .toLowerCase()\n .split(\";\")\n .map((part) => part.trim());\n if (mediaType !== \"text/markdown\") {\n return false;\n }\n\n const quality = parameters.find((parameter) => parameter.startsWith(\"q=\"));\n return quality === undefined || Number(quality.slice(2)) > 0;\n });\n}\n\nfunction getMarkdownAlternatePath(pathname: string): string {\n return pathname === \"/\" ? \"/index.md\" : `${pathname}.md`;\n}\n\nfunction appendHeaderToken(headers: Headers, name: string, token: string): void {\n const current = headers.get(name);\n if (!current) {\n headers.set(name, token);\n return;\n }\n\n const tokens = current.split(\",\").map((value) => value.trim().toLowerCase());\n if (!tokens.includes(token.toLowerCase())) {\n headers.set(name, `${current}, ${token}`);\n }\n}\n\nfunction findExposedMarkdownRoute(\n config: FarmMarkdownResolvedConfig,\n pathname: string,\n): FarmMarkdownResolvedRoute | null {\n if (config.expose === true) {\n return null;\n }\n\n return config.expose.find((route) => routeMatches(route.route, pathname)) ?? null;\n}\n\nfunction routeMatches(pattern: string, pathname: string): boolean {\n if (pattern === pathname) {\n return true;\n }\n\n const escaped = pattern\n .split(\"/\")\n .map((segment) => {\n if (/^\\[\\.\\.\\.[^\\]]+\\]$/.test(segment)) {\n return \".*\";\n }\n if (/^\\[[^\\]]+\\]$/.test(segment)) {\n return \"[^/]+\";\n }\n return segment.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n })\n .join(\"/\");\n\n return new RegExp(`^${escaped}$`).test(pathname);\n}\n\nfunction isHtmlResponse(response: Response): boolean {\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n return contentType.includes(\"text/html\");\n}\n\nfunction createMarkdownCacheHeader(cache: number | false): string {\n if (cache === false || cache <= 0) {\n return \"no-store\";\n }\n\n return `public, max-age=${cache}, s-maxage=${cache}`;\n}\n\nfunction extractHtmlTitle(html: string): string | undefined {\n const match = html.match(/<title\\b[^>]*>([\\s\\S]*?)<\\/title>/i);\n return match ? decodeHtml(stripTags(match[1])).trim() : undefined;\n}\n\nfunction extractHtmlBody(html: string): string {\n const rootMatch = html.match(\n /<div\\b[^>]*id=[\"']root[\"'][^>]*>([\\s\\S]*?)<\\/div>\\s*(?:<script|<\\/body>|$)/i,\n );\n const bodyMatch = html.match(/<body\\b[^>]*>([\\s\\S]*?)<\\/body>/i);\n const body = rootMatch ? rootMatch[1] : bodyMatch ? bodyMatch[1] : html;\n return extractFirstElementContent(body, [\"main\", \"article\"]) ?? body;\n}\n\nfunction extractFirstElementContent(html: string, tagNames: string[]): string | undefined {\n for (const tagName of tagNames) {\n const match = html.match(new RegExp(`<${tagName}\\\\b[^>]*>([\\\\s\\\\S]*?)<\\\\/${tagName}>`, \"i\"));\n if (match) {\n return match[1];\n }\n }\n\n return undefined;\n}\n\nfunction toInlineMarkdown(html: string): string {\n let source = html\n .replace(/<a\\b[^>]*href=[\"']([^\"']+)[\"'][^>]*>([\\s\\S]*?)<\\/a>/gi, (_, href, text) => {\n const label: string = toInlineMarkdown(text).trim() || href;\n return `[${label}](${decodeHtml(href)})`;\n })\n .replace(\n /<img\\b[^>]*src=[\"']([^\"']+)[\"'][^>]*alt=[\"']([^\"']*)[\"'][^>]*\\/?>/gi,\n (_, src, alt) => {\n return `})`;\n },\n )\n .replace(/<strong\\b[^>]*>([\\s\\S]*?)<\\/strong>/gi, (_, content) => {\n return `**${toInlineMarkdown(content).trim()}**`;\n })\n .replace(/<b\\b[^>]*>([\\s\\S]*?)<\\/b>/gi, (_, content) => {\n return `**${toInlineMarkdown(content).trim()}**`;\n })\n .replace(/<em\\b[^>]*>([\\s\\S]*?)<\\/em>/gi, (_, content) => {\n return `_${toInlineMarkdown(content).trim()}_`;\n })\n .replace(/<i\\b[^>]*>([\\s\\S]*?)<\\/i>/gi, (_, content) => {\n return `_${toInlineMarkdown(content).trim()}_`;\n })\n .replace(/<code\\b[^>]*>([\\s\\S]*?)<\\/code>/gi, (_, content) => {\n return `\\`${decodeHtml(stripTags(content)).trim()}\\``;\n })\n .replace(/<br\\s*\\/?>/gi, \"\\n\");\n\n source = stripTags(source);\n return decodeHtml(source).replace(/\\s+/g, \" \");\n}\n\nfunction stripTags(input: string): string {\n return input.replace(/<[^>]+>/g, \"\");\n}\n\nfunction decodeHtml(input: string): string {\n return input\n .replace(/ /g, \" \")\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&#x([0-9a-f]+);/gi, (_, code) => String.fromCodePoint(Number.parseInt(code, 16)))\n .replace(/&#(\\d+);/g, (_, code) => String.fromCodePoint(Number.parseInt(code, 10)));\n}\n","export type FarmWorkflowSchedule = string | string[];\n\nexport interface FarmWorkflowsUserConfig {\n /** Enable or disable Farm workflow discovery. Enabled by default. */\n enabled?: boolean;\n /** Directory or directories to scan for workflow modules. */\n dir?: string | string[];\n /** Alias for dir. */\n dirs?: string[];\n /** HTTP route used for manual and URL-based cron invocation. */\n route?: string;\n /** Environment variable that stores the optional runner secret. */\n secretEnv?: string;\n /** Inline runner secret. Prefer secretEnv for deployed apps. */\n secret?: string;\n}\n\nexport interface FarmWorkflowsResolvedConfig {\n enabled: boolean;\n dirs: string[];\n route: string;\n secretEnv: string;\n secret?: string;\n}\n\nexport interface FarmWorkflowLogger {\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n}\n\nexport interface FarmWorkflowRunContext<TPayload = unknown> {\n id: string;\n name: string;\n payload: TPayload;\n scheduledTime?: number | string;\n request?: Request;\n event?: unknown;\n env: Record<string, string | undefined>;\n data: Map<string, unknown>;\n log: FarmWorkflowLogger;\n}\n\nexport interface FarmWorkflowDefinition<TPayload = unknown, TResult = unknown> {\n kind?: \"farm-workflow\";\n id?: string;\n description?: string;\n schedule?: FarmWorkflowSchedule;\n timezone?: string;\n run: (ctx: FarmWorkflowRunContext<TPayload>) => TResult | Promise<TResult>;\n}\n\nexport interface FarmCronDefinition<\n TPayload = unknown,\n TResult = unknown,\n> extends FarmWorkflowDefinition<TPayload, TResult> {\n schedule: FarmWorkflowSchedule;\n}\n\nexport interface FarmDiscoveredWorkflow {\n id: string;\n filePath: string;\n description?: string;\n schedule: string[];\n timezone?: string;\n routePath: string;\n}\n\nexport interface PreparedFarmWorkflows {\n workflows: FarmDiscoveredWorkflow[];\n tasks: Record<string, { handler: string; description: string }>;\n scheduledTasks: Record<string, string | string[]>;\n handlerPath?: string;\n manifestPath?: string;\n}\n\nexport interface FarmWorkflowHTTPHandlerOptions {\n workflows: FarmDiscoveredWorkflow[];\n config: FarmWorkflowsResolvedConfig;\n loadModule: (workflow: FarmDiscoveredWorkflow) => Promise<Record<string, any>>;\n}\n\nexport const DEFAULT_FARM_WORKFLOW_DIRS = [\"src/jobs\", \"src/workflows\", \"src/cron\"];\nexport const DEFAULT_FARM_WORKFLOW_ROUTE = \"/api/_farm/workflows\";\nexport const DEFAULT_FARM_WORKFLOW_SECRET_ENV = \"CRON_SECRET\";\n\nexport function defineWorkflow<const TPayload = unknown, TResult = unknown>(\n definition: FarmWorkflowDefinition<TPayload, TResult>,\n): FarmWorkflowDefinition<TPayload, TResult> {\n return {\n ...definition,\n kind: \"farm-workflow\",\n };\n}\n\nexport function defineTask<const TPayload = unknown, TResult = unknown>(\n definition: FarmWorkflowDefinition<TPayload, TResult>,\n): FarmWorkflowDefinition<TPayload, TResult> {\n return defineWorkflow(definition);\n}\n\n/**\n * @deprecated Configure `cron` in `farm.config.ts` and point it at an API route.\n */\nexport function defineCron<const TPayload = unknown, TResult = unknown>(\n definition: FarmCronDefinition<TPayload, TResult>,\n): FarmCronDefinition<TPayload, TResult> {\n return {\n ...definition,\n kind: \"farm-workflow\",\n };\n}\n\nexport function resolveWorkflowsConfig(\n workflows: FarmWorkflowsUserConfig | boolean | undefined,\n): FarmWorkflowsResolvedConfig {\n if (workflows === false) {\n return {\n enabled: false,\n dirs: [...DEFAULT_FARM_WORKFLOW_DIRS],\n route: DEFAULT_FARM_WORKFLOW_ROUTE,\n secretEnv: DEFAULT_FARM_WORKFLOW_SECRET_ENV,\n };\n }\n\n const options = workflows && typeof workflows === \"object\" ? workflows : {};\n const dirs = normalizeWorkflowDirs(options);\n\n return {\n enabled: options.enabled ?? true,\n dirs,\n route: normalizeWorkflowRoute(options.route || DEFAULT_FARM_WORKFLOW_ROUTE),\n secretEnv: options.secretEnv || DEFAULT_FARM_WORKFLOW_SECRET_ENV,\n secret: options.secret,\n };\n}\n\nexport async function discoverFarmWorkflows(\n config: {\n root?: string;\n workflows?: FarmWorkflowsResolvedConfig | FarmWorkflowsUserConfig | boolean;\n },\n options: {\n loadModule?: (filePath: string) => Promise<Record<string, any>>;\n } = {},\n): Promise<FarmDiscoveredWorkflow[]> {\n const workflowConfig = isResolvedWorkflowConfig(config.workflows)\n ? config.workflows\n : resolveWorkflowsConfig(config.workflows);\n if (!workflowConfig.enabled) return [];\n\n const root = config.root || process.cwd();\n const files = await findWorkflowFiles(root, workflowConfig.dirs);\n const workflows: FarmDiscoveredWorkflow[] = [];\n const seenIds = new Map<string, string>();\n\n for (const filePath of files) {\n const module = options.loadModule\n ? await options.loadModule(filePath)\n : await loadWorkflowModule(filePath, root);\n const definition = resolveWorkflowDefinition(module);\n if (!definition) continue;\n\n const id = normalizeWorkflowId(definition.id || workflowIdFromFile(root, filePath));\n const previousPath = seenIds.get(id);\n if (previousPath) {\n throw new Error(\n `Duplicate Farm workflow id \"${id}\" found in ${relativePath(root, previousPath)} and ${relativePath(root, filePath)}.`,\n );\n }\n seenIds.set(id, filePath);\n\n workflows.push({\n id,\n filePath,\n description: definition.description,\n schedule: normalizeSchedule(definition.schedule),\n timezone: definition.timezone,\n routePath: joinRoute(workflowConfig.route, encodeURIComponent(id)),\n });\n }\n\n return workflows;\n}\n\nexport function createFarmWorkflowRequestHandler(options: FarmWorkflowHTTPHandlerOptions) {\n const workflowsById = new Map(options.workflows.map((workflow) => [workflow.id, workflow]));\n\n return async function handleFarmWorkflowRequest(request: Request): Promise<Response | null> {\n const url = new URL(request.url);\n const route = normalizeWorkflowRoute(options.config.route);\n if (url.pathname !== route && !url.pathname.startsWith(`${route}/`)) {\n return null;\n }\n\n if (url.pathname === route) {\n const secretError = verifyWorkflowSecret(request, options.config);\n if (secretError) return secretError;\n\n return Response.json({\n workflows: options.workflows.map(toWorkflowMetadata),\n });\n }\n\n const id = decodeURIComponent(url.pathname.slice(route.length + 1));\n const workflow = workflowsById.get(id);\n if (!workflow) {\n return Response.json({ error: `Workflow \"${id}\" was not found.` }, { status: 404 });\n }\n\n const secretError = verifyWorkflowSecret(request, options.config);\n if (secretError) return secretError;\n\n const payload = await readWorkflowPayload(request);\n const module = await options.loadModule(workflow);\n const result = await runFarmWorkflowModule(module, {\n id: workflow.id,\n name: workflow.id,\n payload,\n request,\n scheduledTime: readScheduledTime(payload),\n });\n\n return Response.json({\n id: workflow.id,\n ok: true,\n result: result ?? null,\n });\n };\n}\n\nexport async function runFarmWorkflowModule(\n module: Record<string, any>,\n context: {\n id: string;\n name?: string;\n payload?: unknown;\n scheduledTime?: number | string;\n request?: Request;\n event?: unknown;\n env?: Record<string, string | undefined>;\n },\n): Promise<unknown> {\n const definition = resolveWorkflowDefinition(module);\n if (!definition) {\n throw new Error(`Farm workflow \"${context.id}\" does not export a workflow definition.`);\n }\n\n return await definition.run({\n id: context.id,\n name: context.name || context.id,\n payload: context.payload,\n scheduledTime: context.scheduledTime,\n request: context.request,\n event: context.event,\n env: context.env || process.env,\n data: new Map<string, unknown>(),\n log: console,\n });\n}\n\nexport async function prepareFarmWorkflowsForNitro(config: {\n root?: string;\n distDir?: string;\n workflows?: FarmWorkflowsResolvedConfig | FarmWorkflowsUserConfig | boolean;\n}): Promise<PreparedFarmWorkflows> {\n const workflowConfig = isResolvedWorkflowConfig(config.workflows)\n ? config.workflows\n : resolveWorkflowsConfig(config.workflows);\n const workflows = await discoverFarmWorkflows({\n root: config.root,\n workflows: workflowConfig,\n });\n\n if (workflows.length === 0) {\n return {\n workflows,\n tasks: {},\n scheduledTasks: {},\n };\n }\n\n const root = config.root || process.cwd();\n const distDir = config.distDir || \".farm\";\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const generatedDir = path.join(root, distDir, \".nitro\", \"farm-workflows\");\n await fs.mkdir(generatedDir, { recursive: true });\n\n const tasks: PreparedFarmWorkflows[\"tasks\"] = {};\n const scheduledTasks = createScheduledTasks(workflows);\n\n for (const workflow of workflows) {\n const wrapperPath = path.join(generatedDir, `${safeFileName(workflow.id)}.mjs`);\n await fs.writeFile(wrapperPath, createNitroTaskWrapper(workflow), \"utf8\");\n tasks[workflow.id] = {\n handler: wrapperPath,\n description: workflow.description || `Farm workflow ${workflow.id}`,\n };\n }\n\n const handlerPath = path.join(generatedDir, \"http-handler.mjs\");\n await fs.writeFile(\n handlerPath,\n createNitroWorkflowHTTPHandler(workflowConfig, workflows),\n \"utf8\",\n );\n\n const manifestPath = path.join(generatedDir, \"manifest.json\");\n await fs.writeFile(\n manifestPath,\n JSON.stringify(\n {\n route: workflowConfig.route,\n secretEnv: workflowConfig.secretEnv,\n trigger: {\n method: \"GET\",\n authorization: `Bearer $${workflowConfig.secretEnv}`,\n },\n workflows: workflows.map(toWorkflowMetadata),\n },\n null,\n 2,\n ),\n \"utf8\",\n );\n\n return {\n workflows,\n tasks,\n scheduledTasks,\n handlerPath,\n manifestPath,\n };\n}\n\nexport function createFarmWorkflowVercelCrons(\n workflows: FarmDiscoveredWorkflow[],\n): Array<{ path: string; schedule: string }> {\n return workflows.flatMap((workflow) =>\n workflow.schedule.map((schedule) => ({\n path: workflow.routePath,\n schedule,\n })),\n );\n}\n\nexport function applyFarmWorkflowVercelCrons(\n vercelConfig: Record<string, any>,\n workflows: FarmDiscoveredWorkflow[],\n): Record<string, any> {\n const crons = createFarmWorkflowVercelCrons(workflows);\n if (crons.length === 0) return vercelConfig;\n\n const existingCrons = Array.isArray(vercelConfig.crons) ? vercelConfig.crons : [];\n const seen = new Set(existingCrons.map((cron) => `${cron.path}:${cron.schedule}`));\n const nextCrons = [...existingCrons];\n for (const cron of crons) {\n const key = `${cron.path}:${cron.schedule}`;\n if (seen.has(key)) continue;\n seen.add(key);\n nextCrons.push(cron);\n }\n return {\n ...vercelConfig,\n crons: nextCrons,\n };\n}\n\nfunction isResolvedWorkflowConfig(value: unknown): value is FarmWorkflowsResolvedConfig {\n return (\n !!value &&\n typeof value === \"object\" &&\n \"dirs\" in value &&\n Array.isArray((value as FarmWorkflowsResolvedConfig).dirs) &&\n typeof (value as FarmWorkflowsResolvedConfig).route === \"string\"\n );\n}\n\nfunction normalizeWorkflowDirs(options: FarmWorkflowsUserConfig): string[] {\n const rawDirs =\n options.dirs ||\n (Array.isArray(options.dir) ? options.dir : options.dir ? [options.dir] : undefined);\n const dirs = rawDirs && rawDirs.length > 0 ? rawDirs : DEFAULT_FARM_WORKFLOW_DIRS;\n return [...new Set(dirs.map((dir) => trimSlashes(dir)).filter(Boolean))];\n}\n\nfunction normalizeWorkflowRoute(route: string): string {\n const trimmed = route.trim();\n if (!trimmed || trimmed === \"/\") return DEFAULT_FARM_WORKFLOW_ROUTE;\n return `/${trimSlashes(trimmed)}`;\n}\n\nfunction normalizeWorkflowId(id: string): string {\n const normalized = id\n .replace(/\\\\/g, \"/\")\n .replace(/\\.(tsx?|jsx?|mjs|cjs)$/, \"\")\n .replace(/\\/index$/, \"\")\n .replace(/[^a-zA-Z0-9._/-]+/g, \"-\")\n .replace(/^\\/+|\\/+$/g, \"\")\n .replace(/\\/+/g, \"/\");\n return normalized || \"workflow\";\n}\n\nfunction normalizeSchedule(schedule: FarmWorkflowSchedule | undefined): string[] {\n if (!schedule) return [];\n return (Array.isArray(schedule) ? schedule : [schedule])\n .map((value) => value.trim())\n .filter(Boolean);\n}\n\nfunction resolveWorkflowDefinition(\n module: Record<string, any>,\n): FarmWorkflowDefinition | FarmCronDefinition | null {\n const candidates = [module.default, module.workflow, module.cron, module.task, module.job];\n for (const candidate of candidates) {\n if (candidate && typeof candidate === \"object\" && typeof candidate.run === \"function\") {\n return candidate as FarmWorkflowDefinition;\n }\n }\n return null;\n}\n\nasync function findWorkflowFiles(root: string, dirs: string[]): Promise<string[]> {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const files: string[] = [];\n\n for (const dir of dirs) {\n const absoluteDir = path.isAbsolute(dir) ? dir : path.join(root, dir);\n if (!(await pathExists(absoluteDir))) continue;\n await walkWorkflowDir(absoluteDir, files);\n }\n\n return files.sort();\n}\n\nasync function walkWorkflowDir(dir: string, files: string[]): Promise<void> {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const filePath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (entry.name === \"node_modules\" || entry.name.startsWith(\".\")) continue;\n await walkWorkflowDir(filePath, files);\n continue;\n }\n if (isWorkflowFile(entry.name)) {\n files.push(filePath);\n }\n }\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n const fs = await import(\"fs/promises\");\n return fs\n .access(filePath)\n .then(() => true)\n .catch(() => false);\n}\n\nfunction isWorkflowFile(fileName: string): boolean {\n return /\\.(?:ts|tsx|js|jsx|mjs|cjs)$/.test(fileName) && !/\\.d\\.[cm]?ts$/.test(fileName);\n}\n\nasync function loadWorkflowModule(filePath: string, root: string): Promise<Record<string, any>> {\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n const { pathToFileURL } = await import(\"url\");\n const { build } = await import(\"esbuild\");\n const outDir = path.join(root, \".farm\", \".workflow-loader\");\n await fs.mkdir(outDir, { recursive: true });\n const outfile = path.join(\n outDir,\n `workflow-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`,\n );\n\n await build({\n absWorkingDir: root,\n entryPoints: [filePath],\n outfile,\n bundle: true,\n format: \"esm\",\n platform: \"node\",\n target: `node${process.versions.node.split(\".\")[0]}`,\n packages: \"external\",\n external: [\"@farm.js/core\", \"@farm.js/core/*\", \"nitro\", \"nitro/*\"],\n jsx: \"automatic\",\n logLevel: \"silent\",\n sourcemap: \"inline\",\n });\n\n try {\n return await import(/* @vite-ignore */ `${pathToFileURL(outfile).href}?t=${Date.now()}`);\n } finally {\n await fs.unlink(outfile).catch(() => undefined);\n }\n}\n\nfunction workflowIdFromFile(root: string, filePath: string): string {\n const normalizedRoot = root.replace(/\\\\/g, \"/\");\n const normalizedFile = filePath.replace(/\\\\/g, \"/\");\n const relative = normalizedFile.startsWith(`${normalizedRoot}/`)\n ? normalizedFile.slice(normalizedRoot.length + 1)\n : normalizedFile;\n return normalizeWorkflowId(\n relative.replace(/^src\\/(?:jobs|workflows|cron)\\//, \"\").replace(/\\.(tsx?|jsx?|mjs|cjs)$/, \"\"),\n );\n}\n\nfunction createScheduledTasks(\n workflows: FarmDiscoveredWorkflow[],\n): Record<string, string | string[]> {\n const scheduleMap = new Map<string, string[]>();\n for (const workflow of workflows) {\n for (const schedule of workflow.schedule) {\n const taskIds = scheduleMap.get(schedule) || [];\n taskIds.push(workflow.id);\n scheduleMap.set(schedule, taskIds);\n }\n }\n\n return Object.fromEntries(\n [...scheduleMap.entries()].map(([schedule, taskIds]) => [\n schedule,\n taskIds.length === 1 ? taskIds[0] : taskIds,\n ]),\n );\n}\n\nfunction createNitroTaskWrapper(workflow: FarmDiscoveredWorkflow): string {\n const normalizedPath = workflow.filePath.replace(/\\\\/g, \"/\");\n return `\nimport { defineTask } from \"nitro/runtime\";\nimport { runFarmWorkflowModule } from \"@farm.js/core/workflows\";\nimport * as workflowModule from ${JSON.stringify(normalizedPath)};\n\nexport default defineTask({\n meta: {\n description: ${JSON.stringify(workflow.description || `Farm workflow ${workflow.id}`)}\n },\n async run(event) {\n const payload = event?.payload || {};\n const env = event?.context?.cloudflare?.env || event?.context?.env || process.env;\n return await runFarmWorkflowModule(workflowModule, {\n id: ${JSON.stringify(workflow.id)},\n name: event?.name || ${JSON.stringify(workflow.id)},\n payload,\n scheduledTime: payload.scheduledTime,\n request: event?.context?.request,\n event,\n env\n });\n }\n});\n`.trim();\n}\n\nfunction createNitroWorkflowHTTPHandler(\n config: FarmWorkflowsResolvedConfig,\n workflows: FarmDiscoveredWorkflow[],\n): string {\n return `\nimport { H3 } from \"h3\";\nimport { runTask } from \"nitro/runtime\";\n\nconst route = ${JSON.stringify(config.route)};\nconst secretEnv = ${JSON.stringify(config.secretEnv)};\nconst inlineSecret = ${JSON.stringify(config.secret || \"\")};\nconst workflows = ${JSON.stringify(workflows.map(toWorkflowMetadata))};\nconst workflowIds = new Set(workflows.map((workflow) => workflow.id));\n\nfunction json(value, status = 200) {\n return new Response(JSON.stringify(value), {\n status,\n headers: { \"content-type\": \"application/json\" }\n });\n}\n\nfunction getHeader(event, name) {\n return event.req.headers.get(name);\n}\n\nfunction getSecret() {\n return inlineSecret || process.env[secretEnv] || \"\";\n}\n\nfunction verifySecret(event) {\n const secret = getSecret();\n if (!secret) return null;\n const authorization = getHeader(event, \"authorization\") || \"\";\n const headerSecret = getHeader(event, \"x-farm-workflow-secret\") || \"\";\n const querySecret = event.url.searchParams.get(\"secret\") || \"\";\n const bearer = authorization.startsWith(\"Bearer \") ? authorization.slice(7) : \"\";\n if (headerSecret === secret || querySecret === secret || bearer === secret) return null;\n return json({ error: \"Unauthorized workflow request.\" }, 401);\n}\n\nasync function readPayload(event) {\n if (event.req.method === \"GET\" || event.req.method === \"HEAD\") {\n const payload = Object.fromEntries(event.url.searchParams.entries());\n delete payload.secret;\n return payload;\n }\n return await event.req.json().catch(() => ({}));\n}\n\nexport default new H3()\n .get(route, (event) => {\n const unauthorized = verifySecret(event);\n if (unauthorized) return unauthorized;\n return { workflows };\n })\n .all(route + \"/:id\", async (event) => {\n const id = decodeURIComponent(event.context.params?.id || \"\");\n if (!workflowIds.has(id)) {\n return json({ error: \"Workflow \" + id + \" was not found.\" }, 404);\n }\n\n const unauthorized = verifySecret(event);\n if (unauthorized) return unauthorized;\n\n const payload = await readPayload(event);\n const result = await runTask(id, {\n payload,\n context: {\n source: \"http\",\n request: event.req,\n route,\n url: event.url.href,\n method: event.req.method\n }\n });\n return {\n id,\n ok: true,\n result: result ?? null\n };\n });\n`.trim();\n}\n\nfunction toWorkflowMetadata(workflow: FarmDiscoveredWorkflow) {\n return {\n id: workflow.id,\n description: workflow.description || null,\n schedule: workflow.schedule,\n timezone: workflow.timezone || null,\n path: workflow.routePath,\n };\n}\n\nasync function readWorkflowPayload(request: Request): Promise<unknown> {\n const url = new URL(request.url);\n if (request.method === \"GET\" || request.method === \"HEAD\") {\n const payload = Object.fromEntries(url.searchParams.entries());\n delete payload.secret;\n return payload;\n }\n\n const contentType = request.headers.get(\"content-type\") || \"\";\n if (contentType.includes(\"application/json\")) {\n return await request.json().catch(() => ({}));\n }\n\n const text = await request.text().catch(() => \"\");\n return text ? { text } : {};\n}\n\nfunction readScheduledTime(payload: unknown): number | string | undefined {\n return payload && typeof payload === \"object\" && \"scheduledTime\" in payload\n ? (payload as { scheduledTime?: number | string }).scheduledTime\n : undefined;\n}\n\nfunction verifyWorkflowSecret(\n request: Request,\n config: FarmWorkflowsResolvedConfig,\n): Response | null {\n const secret = config.secret || process.env[config.secretEnv] || \"\";\n if (!secret) return null;\n\n const url = new URL(request.url);\n const authorization = request.headers.get(\"authorization\") || \"\";\n const bearer = authorization.startsWith(\"Bearer \") ? authorization.slice(7) : \"\";\n const headerSecret = request.headers.get(\"x-farm-workflow-secret\") || \"\";\n const querySecret = url.searchParams.get(\"secret\") || \"\";\n if (bearer === secret || headerSecret === secret || querySecret === secret) return null;\n\n return Response.json({ error: \"Unauthorized workflow request.\" }, { status: 401 });\n}\n\nfunction joinRoute(...parts: string[]): string {\n return `/${parts\n .map((part) => trimSlashes(part))\n .filter(Boolean)\n .join(\"/\")}`;\n}\n\nfunction trimSlashes(value: string): string {\n return value.replace(/^\\/+|\\/+$/g, \"\");\n}\n\nfunction safeFileName(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"-\") || \"workflow\";\n}\n\nfunction relativePath(root: string, filePath: string): string {\n return filePath.replace(/\\\\/g, \"/\").replace(`${root.replace(/\\\\/g, \"/\")}/`, \"\");\n}\n","export type FarmCronSchedule = string | string[];\n\nexport interface FarmCronJobConfig {\n /** Portable five-field cron expression, or a list of expressions. */\n schedule: FarmCronSchedule;\n /** Farm API route invoked with GET when the schedule fires. */\n path: string;\n /** Human-readable purpose shown by local tooling and deployment manifests. */\n description?: string;\n /** Disable this schedule without removing its configuration. */\n enabled?: boolean;\n}\n\nexport type FarmCronUserConfig = Record<string, FarmCronJobConfig>;\n\nexport interface FarmCronJob {\n name: string;\n schedule: string[];\n path: string;\n description?: string;\n}\n\nexport interface FarmCronResolvedConfig {\n enabled: boolean;\n secretEnv: typeof DEFAULT_FARM_CRON_SECRET_ENV;\n jobs: FarmCronJob[];\n}\n\nexport interface PreparedFarmCron {\n jobs: FarmCronJob[];\n tasks: Record<string, { handler: string; description: string }>;\n scheduledTasks: Record<string, string | string[]>;\n manifestPath?: string;\n}\n\nexport interface FarmCronRouteOptions {\n /** Environment variable containing the bearer token. */\n secretEnv?: string;\n /** Inline token, primarily useful in tests. Environment variables are preferred. */\n secret?: string;\n /** Allow a production route without a secret. Defaults to false. */\n allowUnsecured?: boolean;\n}\n\nexport interface FarmCronCloudflareConfig {\n deployConfig: true;\n wrangler: {\n triggers: {\n crons: string[];\n };\n };\n}\n\nexport const DEFAULT_FARM_CRON_SECRET_ENV = \"CRON_SECRET\";\nexport const FARM_CRON_MANIFEST = \"cron-manifest.json\";\n\nconst CRON_FIELD_RANGES = [\n [0, 59, \"minute\"],\n [0, 23, \"hour\"],\n [1, 31, \"day of month\"],\n [1, 12, \"month\"],\n [0, 6, \"day of week\"],\n] as const;\n\nexport function resolveCronConfig(\n cron: FarmCronResolvedConfig | FarmCronUserConfig | false | undefined,\n): FarmCronResolvedConfig {\n if (isResolvedCronConfig(cron)) return cron;\n if (!cron) {\n return {\n enabled: false,\n secretEnv: DEFAULT_FARM_CRON_SECRET_ENV,\n jobs: [],\n };\n }\n\n const jobs: FarmCronJob[] = [];\n for (const [name, job] of Object.entries(cron)) {\n if (!job || typeof job !== \"object\" || Array.isArray(job)) {\n throw new TypeError(`Farm cron ${JSON.stringify(name)} must be a configuration object.`);\n }\n if (job.enabled === false) continue;\n jobs.push(normalizeCronJob(name, job));\n }\n\n return {\n enabled: jobs.length > 0,\n secretEnv: DEFAULT_FARM_CRON_SECRET_ENV,\n jobs,\n };\n}\n\nexport async function prepareFarmCronForNitro(config: {\n root?: string;\n distDir?: string;\n cron?: FarmCronResolvedConfig | FarmCronUserConfig | false;\n}): Promise<PreparedFarmCron> {\n const cron = isResolvedCronConfig(config.cron) ? config.cron : resolveCronConfig(config.cron);\n const root = config.root || process.cwd();\n const distDir = config.distDir || \".farm\";\n const fs = await import(\"node:fs/promises\");\n const path = await import(\"node:path\");\n const manifestPath = path.join(root, distDir, FARM_CRON_MANIFEST);\n const generatedDir = path.join(root, distDir, \".nitro\", \"farm-cron\");\n\n if (!cron.enabled) {\n await Promise.all([\n fs.rm(manifestPath, { force: true }),\n fs.rm(generatedDir, { recursive: true, force: true }),\n ]);\n return {\n jobs: [],\n tasks: {},\n scheduledTasks: {},\n };\n }\n\n await fs.rm(generatedDir, { recursive: true, force: true });\n await fs.mkdir(generatedDir, { recursive: true });\n\n const tasks: PreparedFarmCron[\"tasks\"] = {};\n for (const job of cron.jobs) {\n const taskName = getFarmCronTaskName(job.name);\n const wrapperPath = path.join(generatedDir, `${safeFileName(job.name)}.mjs`);\n await fs.writeFile(wrapperPath, createNitroCronTaskWrapper(job, cron.secretEnv), \"utf8\");\n tasks[taskName] = {\n handler: wrapperPath,\n description: job.description || `Farm cron ${job.name}`,\n };\n }\n\n const manifest = createFarmCronManifest(cron);\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, \"utf8\");\n\n return {\n jobs: cron.jobs,\n tasks,\n scheduledTasks: createCronScheduledTasks(cron.jobs),\n manifestPath,\n };\n}\n\nexport function createFarmCronManifest(cron: FarmCronResolvedConfig) {\n return {\n schemaVersion: 1,\n secretEnv: cron.secretEnv,\n jobs: cron.jobs.map((job) => ({\n name: job.name,\n schedule: job.schedule,\n path: job.path,\n description: job.description || null,\n })),\n };\n}\n\nexport function createFarmCronVercelCrons(\n jobs: FarmCronJob[],\n): Array<{ path: string; schedule: string }> {\n return jobs.flatMap((job) =>\n job.schedule.map((schedule) => ({\n path: job.path,\n schedule,\n })),\n );\n}\n\nexport function applyFarmCronVercelCrons(\n vercelConfig: Record<string, any>,\n jobs: FarmCronJob[],\n): Record<string, any> {\n const existingCrons = Array.isArray(vercelConfig.crons) ? vercelConfig.crons : [];\n const seen = new Set(existingCrons.map((cron) => `${cron.path}:${cron.schedule}`));\n const crons = [...existingCrons];\n\n for (const cron of createFarmCronVercelCrons(jobs)) {\n const key = `${cron.path}:${cron.schedule}`;\n if (seen.has(key)) continue;\n seen.add(key);\n crons.push(cron);\n }\n\n return crons.length > 0 ? { ...vercelConfig, crons } : vercelConfig;\n}\n\nexport function createFarmCronCloudflareTriggers(jobs: FarmCronJob[]): string[] {\n return [...new Set(jobs.flatMap((job) => job.schedule))];\n}\n\nexport function createFarmCronCloudflareConfig(\n jobs: FarmCronJob[],\n): FarmCronCloudflareConfig | undefined {\n const crons = createFarmCronCloudflareTriggers(jobs);\n if (crons.length === 0) return undefined;\n\n return {\n deployConfig: true,\n wrangler: {\n triggers: { crons },\n },\n };\n}\n\nexport function mergeScheduledTasks(\n ...maps: Array<Record<string, string | string[]> | undefined>\n): Record<string, string | string[]> {\n const merged = new Map<string, string[]>();\n\n for (const map of maps) {\n for (const [schedule, taskNames] of Object.entries(map || {})) {\n const current = merged.get(schedule) || [];\n for (const taskName of Array.isArray(taskNames) ? taskNames : [taskNames]) {\n if (!current.includes(taskName)) current.push(taskName);\n }\n merged.set(schedule, current);\n }\n }\n\n return Object.fromEntries(\n [...merged].map(([schedule, taskNames]) => [\n schedule,\n taskNames.length === 1 ? taskNames[0] : taskNames,\n ]),\n );\n}\n\nexport function isCronRequestAuthorized(\n request: Request,\n options: FarmCronRouteOptions = {},\n): boolean {\n const secretEnv = options.secretEnv || DEFAULT_FARM_CRON_SECRET_ENV;\n const secret = options.secret || readEnvironmentValue(secretEnv);\n if (!secret) {\n return (\n options.allowUnsecured === true ||\n (!getFarmRuntimeBindings() && readEnvironmentValue(\"NODE_ENV\") !== \"production\")\n );\n }\n\n const authorization = request.headers.get(\"authorization\") || \"\";\n const bearer = authorization.startsWith(\"Bearer \") ? authorization.slice(7) : \"\";\n return bearer === secret || request.headers.get(\"x-farm-cron-secret\") === secret;\n}\n\nexport function cronRoute<TArgs extends unknown[], TResult>(\n handler: (request: Request, ...args: TArgs) => TResult,\n options: FarmCronRouteOptions = {},\n): (request: Request, ...args: TArgs) => TResult | Promise<Response> {\n return (request, ...args) => {\n if (!isCronRequestAuthorized(request, options)) {\n return Promise.resolve(\n Response.json({ error: \"Unauthorized cron request.\" }, { status: 401 }),\n );\n }\n return handler(request, ...args);\n };\n}\n\nfunction normalizeCronJob(name: string, job: FarmCronJobConfig): FarmCronJob {\n if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(name)) {\n throw new TypeError(\n `Farm cron name ${JSON.stringify(name)} must start with a letter or number and contain only letters, numbers, dots, underscores, or hyphens.`,\n );\n }\n if (!job || typeof job !== \"object\" || Array.isArray(job)) {\n throw new TypeError(`Farm cron ${JSON.stringify(name)} must be a configuration object.`);\n }\n\n const path = normalizeCronPath(name, job.path);\n const rawSchedule = Array.isArray(job.schedule) ? job.schedule : [job.schedule];\n const schedule = [...new Set(rawSchedule.map((value) => normalizeCronExpression(name, value)))];\n if (schedule.length === 0) {\n throw new TypeError(`Farm cron ${JSON.stringify(name)} must define at least one schedule.`);\n }\n\n return {\n name,\n schedule,\n path,\n description: job.description?.trim() || undefined,\n };\n}\n\nfunction normalizeCronPath(name: string, value: unknown): string {\n if (typeof value !== \"string\" || !value.trim().startsWith(\"/\")) {\n throw new TypeError(`Farm cron ${JSON.stringify(name)} path must start with \"/\".`);\n }\n\n const path = value.trim();\n if (path.startsWith(\"//\") || path.includes(\"?\") || path.includes(\"#\")) {\n throw new TypeError(\n `Farm cron ${JSON.stringify(name)} path must be an application pathname without a host, query, or hash.`,\n );\n }\n return path.length > 1 ? path.replace(/\\/+$/, \"\") : path;\n}\n\nfunction normalizeCronExpression(name: string, value: unknown): string {\n if (typeof value !== \"string\") {\n throw new TypeError(`Farm cron ${JSON.stringify(name)} schedule must be a string.`);\n }\n\n const expression = value.trim().replace(/\\s+/g, \" \");\n const fields = expression.split(\" \");\n if (fields.length !== CRON_FIELD_RANGES.length) {\n throw new TypeError(\n `Farm cron ${JSON.stringify(name)} schedule ${JSON.stringify(expression)} must use five fields: minute hour day-of-month month day-of-week.`,\n );\n }\n\n fields.forEach((field, index) => {\n const [minimum, maximum, label] = CRON_FIELD_RANGES[index];\n validateCronField(name, expression, field, minimum, maximum, label);\n });\n if (fields[2] !== \"*\" && fields[4] !== \"*\") {\n throw new TypeError(\n `Farm cron ${JSON.stringify(name)} schedule ${JSON.stringify(expression)} cannot constrain both day-of-month and day-of-week.`,\n );\n }\n return expression;\n}\n\nfunction validateCronField(\n name: string,\n expression: string,\n field: string,\n minimum: number,\n maximum: number,\n label: string,\n): void {\n for (const segment of field.split(\",\")) {\n const [range, stepText, ...extra] = segment.split(\"/\");\n if (!range || extra.length > 0 || (stepText !== undefined && !isIntegerInRange(stepText, 1))) {\n throwInvalidCronField(name, expression, label);\n }\n\n if (range === \"*\") continue;\n const bounds = range.split(\"-\");\n if (bounds.length > 2 || !bounds.every((value) => isIntegerInRange(value, minimum, maximum))) {\n throwInvalidCronField(name, expression, label);\n }\n if (bounds.length === 2 && Number(bounds[0]) > Number(bounds[1])) {\n throwInvalidCronField(name, expression, label);\n }\n }\n}\n\nfunction isIntegerInRange(value: string, minimum: number, maximum = Number.MAX_SAFE_INTEGER) {\n if (!/^\\d+$/.test(value)) return false;\n const parsed = Number(value);\n return parsed >= minimum && parsed <= maximum;\n}\n\nfunction throwInvalidCronField(name: string, expression: string, label: string): never {\n throw new TypeError(\n `Farm cron ${JSON.stringify(name)} schedule ${JSON.stringify(expression)} has an invalid ${label} field.`,\n );\n}\n\nfunction isResolvedCronConfig(value: unknown): value is FarmCronResolvedConfig {\n return (\n !!value &&\n typeof value === \"object\" &&\n \"enabled\" in value &&\n typeof (value as FarmCronResolvedConfig).enabled === \"boolean\" &&\n \"jobs\" in value &&\n Array.isArray((value as FarmCronResolvedConfig).jobs) &&\n \"secretEnv\" in value\n );\n}\n\nfunction createCronScheduledTasks(jobs: FarmCronJob[]): Record<string, string | string[]> {\n const scheduledTasks: Record<string, string | string[]> = {};\n for (const job of jobs) {\n const taskName = getFarmCronTaskName(job.name);\n for (const schedule of job.schedule) {\n scheduledTasks[schedule] = mergeTaskNames(scheduledTasks[schedule], taskName);\n }\n }\n return scheduledTasks;\n}\n\nfunction mergeTaskNames(\n current: string | string[] | undefined,\n taskName: string,\n): string | string[] {\n if (!current) return taskName;\n const names = Array.isArray(current) ? current : [current];\n return names.includes(taskName) ? names : [...names, taskName];\n}\n\nfunction getFarmCronTaskName(name: string): string {\n return `farm:cron:${name}`;\n}\n\nfunction createNitroCronTaskWrapper(job: FarmCronJob, secretEnv: string): string {\n return `\nimport { defineTask, useNitroApp } from \"nitro/runtime\";\n\nconst name = ${JSON.stringify(job.name)};\nconst path = ${JSON.stringify(job.path)};\nconst secretEnv = ${JSON.stringify(secretEnv)};\n\nfunction readSecret(event) {\n const runtimeEnv = event?.context?.cloudflare?.env || event?.context?.env || {};\n return runtimeEnv[secretEnv] || (typeof process !== \"undefined\" ? process.env?.[secretEnv] : \"\") || \"\";\n}\n\nexport default defineTask({\n meta: {\n name: ${JSON.stringify(getFarmCronTaskName(job.name))},\n description: ${JSON.stringify(job.description || `Farm cron ${job.name}`)}\n },\n async run(event) {\n const headers = new Headers({\n \"x-farm-cron-name\": name,\n \"x-farm-cron-scheduled-at\": String(event?.payload?.scheduledTime || Date.now())\n });\n const secret = readSecret(event);\n if (secret) headers.set(\"authorization\", \"Bearer \" + secret);\n\n const response = await useNitroApp().fetch(path, { method: \"GET\", headers });\n const contentType = response.headers.get(\"content-type\") || \"\";\n const body = response.status === 204\n ? null\n : contentType.includes(\"application/json\")\n ? await response.json().catch(() => null)\n : await response.text();\n\n if (!response.ok) {\n const detail = typeof body === \"string\" ? body : JSON.stringify(body);\n throw new Error(\n \"Farm cron \" + JSON.stringify(name) + \" received \" + response.status +\n \" from \" + path + (detail ? \": \" + detail : \"\")\n );\n }\n\n return { result: body };\n }\n});\n`.trim();\n}\n\nfunction readEnvironmentValue(name: string): string | undefined {\n const runtimeValue = getFarmRuntimeBindings()?.[name];\n if (typeof runtimeValue === \"string\") return runtimeValue;\n return typeof process !== \"undefined\" ? process.env?.[name] : undefined;\n}\n\nfunction getFarmRuntimeBindings(): Record<string, unknown> | undefined {\n const runtimeBindings = (\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","export interface EnvSchema<TOutput = unknown> {\n parse(value: unknown): TOutput;\n}\n\nexport type EnvParser<TOutput = unknown> =\n | EnvSchema<TOutput>\n | ((value: string | undefined, context: { key: string; scope: \"server\" | \"public\" }) => TOutput);\n\nexport type EnvShape = Record<string, EnvParser<any>>;\n\nexport type InferEnvParser<TParser> =\n TParser extends EnvSchema<infer TOutput>\n ? TOutput\n : TParser extends (value: string | undefined, context: any) => infer TOutput\n ? TOutput\n : never;\n\nexport type InferEnvShape<TShape> = TShape extends EnvShape\n ? { [K in keyof TShape]: InferEnvParser<TShape[K]> }\n : {};\n\nexport interface FarmEnvConfig<\n TServer extends EnvShape = EnvShape,\n TPublic extends EnvShape = EnvShape,\n> {\n server?: TServer;\n public?: TPublic;\n}\n\nexport interface ResolvedFarmEnv<\n TServer extends Record<string, any> = Record<string, unknown>,\n TPublic extends Record<string, any> = Record<string, unknown>,\n> {\n server: TServer;\n public: TPublic;\n}\n\nexport type InferEnv<TConfig> =\n TConfig extends FarmEnvConfig<infer TServer, infer TPublic>\n ? ResolvedFarmEnv<InferEnvShape<TServer>, InferEnvShape<TPublic>>\n : ResolvedFarmEnv;\n\n/**\n * Augmented by generated src/farm.d.ts for project-specific autocomplete.\n */\nexport interface FarmEnvTypes {}\n\nexport type FarmServerEnv = FarmEnvTypes extends { server: infer TServer }\n ? TServer extends Record<string, any>\n ? TServer\n : Record<string, unknown>\n : Record<string, unknown>;\n\nexport type FarmPublicEnv = FarmEnvTypes extends { public: infer TPublic }\n ? TPublic extends Record<string, any>\n ? TPublic\n : Record<string, unknown>\n : Record<string, unknown>;\n\nexport type FarmTypedEnv = ResolvedFarmEnv<FarmServerEnv, FarmPublicEnv>;\n\ndeclare const __FARM_PUBLIC_ENV__: Record<string, unknown> | undefined;\ndeclare const __FARM_ENV__: ResolvedFarmEnv | undefined;\n\nconst FARM_ENV_SYMBOL = Symbol.for(\"farm.env\");\nconst farmEnvGlobal = globalThis as typeof globalThis & {\n [FARM_ENV_SYMBOL]?: ResolvedFarmEnv;\n};\nlet currentEnv: ResolvedFarmEnv = getInitialEnv();\n\nexport function resolveEnv<TConfig extends FarmEnvConfig<any, any> | undefined>(\n config: TConfig,\n source: Record<string, string | undefined> = getProcessEnv(),\n): InferEnv<NonNullable<TConfig>> {\n const resolved = {\n server: resolveEnvScope(config?.server, source, \"server\"),\n public: resolveEnvScope(config?.public, source, \"public\"),\n } as InferEnv<NonNullable<TConfig>>;\n\n return resolved;\n}\n\nexport function setEnv(env: ResolvedFarmEnv): void {\n currentEnv = normalizeResolvedEnv(env);\n if (typeof window === \"undefined\") {\n farmEnvGlobal[FARM_ENV_SYMBOL] = currentEnv;\n }\n}\n\nexport function getResolvedEnv<TEnv extends ResolvedFarmEnv = FarmTypedEnv>(): TEnv {\n return getCurrentEnv() as TEnv;\n}\n\nexport function getEnv<TServer extends Record<string, any> = FarmServerEnv>(): TServer;\nexport function getEnv<TKey extends Extract<keyof FarmServerEnv, string>>(\n key: TKey,\n): FarmServerEnv[TKey];\nexport function getEnv(key?: string): unknown {\n assertServerEnvAccess();\n if (key === undefined) {\n return getCurrentEnv().server;\n }\n\n return getCurrentEnv().server[key];\n}\n\nexport function getPublicEnv<TPublic extends Record<string, any> = FarmPublicEnv>(): TPublic;\nexport function getPublicEnv<TKey extends Extract<keyof FarmPublicEnv, string>>(\n key: TKey,\n): FarmPublicEnv[TKey];\nexport function getPublicEnv(key?: string): unknown {\n if (key === undefined) {\n return getCurrentEnv().public;\n }\n\n return getCurrentEnv().public[key];\n}\n\nexport const env = createEnvProxy(\"server\") as FarmServerEnv;\nexport const serverEnv = env;\nexport const publicEnv = createEnvProxy(\"public\") as FarmPublicEnv;\n\nfunction resolveEnvScope(\n shape: EnvShape | undefined,\n source: Record<string, string | undefined>,\n scope: \"server\" | \"public\",\n): Record<string, unknown> {\n if (!shape) {\n return {};\n }\n\n const resolved: Record<string, unknown> = {};\n\n for (const [key, parser] of Object.entries(shape)) {\n try {\n resolved[key] = parseEnvValue(parser, source[key], key, scope);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid ${scope} env \"${key}\": ${message}`);\n }\n }\n\n return resolved;\n}\n\nfunction parseEnvValue(\n parser: EnvParser<any>,\n value: string | undefined,\n key: string,\n scope: \"server\" | \"public\",\n): unknown {\n if (typeof parser === \"function\") {\n return parser(value, { key, scope });\n }\n\n if (parser && typeof parser.parse === \"function\") {\n return parser.parse(value);\n }\n\n throw new Error(\"expected a parser function or schema with parse()\");\n}\n\nfunction createEnvProxy(scope: \"server\" | \"public\"): Record<string, unknown> {\n return new Proxy(\n {},\n {\n get(_target, property) {\n if (typeof property === \"symbol\") {\n return undefined;\n }\n\n const env = getEnvScope(scope);\n return env[property];\n },\n ownKeys() {\n return Reflect.ownKeys(getEnvScope(scope));\n },\n getOwnPropertyDescriptor(_target, property) {\n const env = getEnvScope(scope);\n if (!(property in env)) {\n return undefined;\n }\n\n return {\n enumerable: true,\n configurable: true,\n value: env[property as keyof typeof env],\n };\n },\n has(_target, property) {\n return property in getEnvScope(scope);\n },\n },\n );\n}\n\nfunction getEnvScope(scope: \"server\" | \"public\"): Record<string, unknown> {\n if (scope === \"server\") {\n assertServerEnvAccess();\n }\n\n return getCurrentEnv()[scope] || {};\n}\n\nfunction assertServerEnvAccess(): void {\n if (typeof window !== \"undefined\") {\n throw new Error(\"Farm server env is not available in the browser. Use publicEnv.\");\n }\n}\n\nfunction getInitialEnv(): ResolvedFarmEnv {\n const injectedEnv = getInjectedEnv();\n if (injectedEnv) {\n return injectedEnv;\n }\n\n if (typeof window === \"undefined\" && farmEnvGlobal[FARM_ENV_SYMBOL]) {\n return normalizeResolvedEnv(farmEnvGlobal[FARM_ENV_SYMBOL]);\n }\n\n return {\n server: {},\n public: getInjectedPublicEnv(),\n };\n}\n\nfunction getCurrentEnv(): ResolvedFarmEnv {\n if (typeof window === \"undefined\" && farmEnvGlobal[FARM_ENV_SYMBOL]) {\n return farmEnvGlobal[FARM_ENV_SYMBOL];\n }\n\n return currentEnv;\n}\n\nfunction getInjectedEnv(): ResolvedFarmEnv | null {\n try {\n if (typeof __FARM_ENV__ !== \"undefined\" && __FARM_ENV__) {\n return normalizeResolvedEnv(__FARM_ENV__);\n }\n } catch {\n // The compile-time global is only defined in Farm server bundles.\n }\n\n return null;\n}\n\nfunction getInjectedPublicEnv(): Record<string, unknown> {\n try {\n if (typeof __FARM_PUBLIC_ENV__ !== \"undefined\" && __FARM_PUBLIC_ENV__) {\n return __FARM_PUBLIC_ENV__;\n }\n } catch {\n // The compile-time global is only defined in Farm browser bundles.\n }\n\n return {};\n}\n\nfunction normalizeResolvedEnv(env: ResolvedFarmEnv): ResolvedFarmEnv {\n return {\n server: isRecord(env.server) ? env.server : {},\n public: isRecord(env.public) ? env.public : {},\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction getProcessEnv(): Record<string, string | undefined> {\n if (typeof process !== \"undefined\" && process.env) {\n return process.env;\n }\n\n return {};\n}\n","import React from \"react\";\nimport { readFile } from \"fs/promises\";\nimport path from \"path\";\nimport { pathToFileURL } from \"url\";\nimport type { Metadata, RouteModule } from \"./types\";\nimport { requestAcceptsMarkdown } from \"./markdown\";\n\nexport type FarmMdxComponent = React.ComponentType<any> | keyof React.JSX.IntrinsicElements;\nexport type FarmMdxComponents = Record<string, FarmMdxComponent>;\n\nexport interface FarmMdxUserConfig {\n /**\n * Component map or module path that exports `components` or a default component map.\n * Relative paths resolve from the project root.\n */\n components?: string | FarmMdxComponents;\n /**\n * Serve source-authored markdown pages at `/route.md`.\n * Enabled by default for `page.md` and `page.mdx`.\n */\n markdownRoutes?: boolean;\n /**\n * Class name used for the wrapper around rendered markdown content.\n */\n className?: string;\n}\n\nexport interface FarmMdxResolvedConfig {\n components?: string | FarmMdxComponents;\n markdownRoutes: boolean;\n className: string;\n}\n\nexport interface FarmMarkdownPageSource {\n source: string;\n filePath: string;\n}\n\nexport interface FarmMarkdownPageModuleInput extends FarmMarkdownPageSource {\n components?: FarmMdxComponents;\n config?: FarmMdxResolvedConfig;\n}\n\nexport function resolveMdxConfig(config: FarmMdxUserConfig | undefined): FarmMdxResolvedConfig {\n return {\n components: config?.components,\n markdownRoutes: config?.markdownRoutes ?? true,\n className: config?.className ?? \"farm-markdown\",\n };\n}\n\nexport function isFarmMarkdownPageFile(filePath: string): boolean {\n return /(^|[/\\\\])page\\.mdx?$/i.test(filePath);\n}\n\nexport function normalizeFarmMarkdownRoutePath(pathname: string): string {\n const withoutExtension = pathname.replace(/\\.md$/i, \"\");\n const normalized = withoutExtension.startsWith(\"/\") ? withoutExtension : `/${withoutExtension}`;\n return normalized === \"/index\" ? \"/\" : normalized.replace(/\\/+$/g, \"\") || \"/\";\n}\n\nexport function parseMarkdownFrontmatter(source: string): {\n frontmatter: Record<string, string>;\n body: string;\n} {\n if (!source.startsWith(\"---\")) {\n return { frontmatter: {}, body: source };\n }\n\n const endIndex = source.indexOf(\"\\n---\", 3);\n if (endIndex === -1) {\n return { frontmatter: {}, body: source };\n }\n\n const frontmatterSource = source.slice(3, endIndex).trim();\n const closingFenceEnd = endIndex + \"\\n---\".length;\n const bodyStart =\n source.slice(closingFenceEnd, closingFenceEnd + 2) === \"\\r\\n\"\n ? closingFenceEnd + 2\n : source[closingFenceEnd] === \"\\n\"\n ? closingFenceEnd + 1\n : closingFenceEnd;\n const body = source.slice(bodyStart);\n const frontmatter: Record<string, string> = {};\n\n for (const line of frontmatterSource.split(/\\r?\\n/)) {\n const separator = line.indexOf(\":\");\n if (separator === -1) continue;\n const key = line.slice(0, separator).trim();\n const value = line\n .slice(separator + 1)\n .trim()\n .replace(/^[\"']|[\"']$/g, \"\");\n if (key && value) frontmatter[key] = value;\n }\n\n return { frontmatter, body };\n}\n\nexport function titleFromMarkdown(body: string, fallback?: string): string | undefined {\n return body.match(/^#\\s+(.+)$/m)?.[1]?.trim() || fallback;\n}\n\nexport function createMarkdownMetadata(\n source: string,\n filePath: string,\n): (Metadata & Record<string, any>) | undefined {\n const { frontmatter, body } = parseMarkdownFrontmatter(source);\n const routeTitle = titleFromMarkdown(body);\n const title = frontmatter.title || routeTitle;\n const description = frontmatter.description;\n\n if (!title && !description) {\n return undefined;\n }\n\n return {\n ...(title ? { title } : {}),\n ...(description ? { description } : {}),\n source: filePath,\n };\n}\n\nasync function evaluateMdxSource(source: string, filePath: string) {\n const [{ evaluate }, runtime, remarkGfmModule] = await Promise.all([\n import(\"@mdx-js/mdx\"),\n import(\"react/jsx-runtime\"),\n import(\"remark-gfm\"),\n ]);\n const remarkGfm = remarkGfmModule.default;\n\n return evaluate(source, {\n ...runtime,\n baseUrl: pathToFileURL(filePath),\n remarkPlugins: [remarkGfm],\n });\n}\n\nexport function createFarmMarkdownRouteModule(\n input: FarmMarkdownPageModuleInput,\n): RouteModule & { source: string } {\n const { body } = parseMarkdownFrontmatter(input.source);\n const components = input.components || {};\n const className = input.config?.className || \"farm-markdown\";\n let evaluatedPromise: Promise<{ default: React.ComponentType<any> }> | undefined;\n\n const loadContent = async () => {\n evaluatedPromise ??= evaluateMdxSource(body, input.filePath) as Promise<{\n default: React.ComponentType<any>;\n }>;\n return evaluatedPromise;\n };\n\n async function FarmMarkdownPage(props: any) {\n const evaluated = await loadContent();\n const MDXContent = evaluated.default;\n return React.createElement(\n \"article\",\n { className, \"data-farm-markdown-page\": \"\" },\n React.createElement(MDXContent, {\n ...props,\n components: {\n ...components,\n ...props?.components,\n },\n }),\n );\n }\n\n return {\n default: FarmMarkdownPage as unknown as RouteModule[\"default\"],\n metadata: createMarkdownMetadata(input.source, input.filePath),\n source: input.source,\n };\n}\n\nexport async function createFarmMarkdownRouteModuleFromFile(\n filePath: string,\n options: {\n components?: FarmMdxComponents;\n config?: FarmMdxResolvedConfig;\n } = {},\n) {\n const source = await readFile(filePath, \"utf8\");\n return createFarmMarkdownRouteModule({\n source,\n filePath,\n components: options.components,\n config: options.config,\n });\n}\n\nexport async function loadFarmMdxComponents(\n config: FarmMdxResolvedConfig | undefined,\n options: {\n root: string;\n loadModule?: (modulePath: string) => Promise<unknown>;\n },\n): Promise<FarmMdxComponents> {\n const configured = config?.components;\n if (!configured) {\n return {};\n }\n\n if (typeof configured !== \"string\") {\n return configured;\n }\n\n const modulePath = path.isAbsolute(configured) ? configured : path.join(options.root, configured);\n const mod = options.loadModule\n ? await options.loadModule(modulePath)\n : await import(pathToFileURL(modulePath).href);\n const maybeModule = mod as {\n components?: FarmMdxComponents;\n default?: FarmMdxComponents;\n };\n\n return maybeModule.components || maybeModule.default || {};\n}\n\nexport async function createFarmMarkdownSourceResponse(options: {\n request: Request;\n config?: FarmMdxResolvedConfig;\n resolveSource: (\n pathname: string,\n ) => Promise<FarmMarkdownPageSource | null> | FarmMarkdownPageSource | null;\n}): Promise<Response | null> {\n if (options.request.method !== \"GET\" && options.request.method !== \"HEAD\") {\n return null;\n }\n if (options.config?.markdownRoutes === false) {\n return null;\n }\n\n const url = new URL(options.request.url);\n const hasMarkdownExtension = url.pathname.toLowerCase().endsWith(\".md\");\n if (!hasMarkdownExtension && !requestAcceptsMarkdown(options.request.headers.get(\"accept\"))) {\n return null;\n }\n\n const targetPathname = normalizeFarmMarkdownRoutePath(url.pathname);\n const source = await options.resolveSource(targetPathname);\n if (!source) {\n return null;\n }\n\n const headers = new Headers({\n \"Content-Type\": \"text/markdown; charset=utf-8\",\n \"Content-Location\": targetPathname === \"/\" ? \"/index.md\" : `${targetPathname}.md`,\n \"Cache-Control\": \"public, s-maxage=60, stale-while-revalidate=300\",\n \"X-Farm-Markdown-Route\": targetPathname,\n \"X-Farm-Markdown-Source\": source.filePath,\n });\n if (!hasMarkdownExtension) {\n headers.set(\"Vary\", \"Accept\");\n }\n\n return new Response(options.request.method === \"HEAD\" ? null : source.source, {\n status: 200,\n headers,\n });\n}\n","export type FarmRouteRuntime = \"auto\" | \"node\" | \"edge\";\nexport type FarmRouteRegions = \"auto\" | readonly string[];\nexport type FarmRouteMaxDuration = \"auto\" | number;\n\n/** Portable execution controls shared by file, programmatic, and config routes. */\nexport interface FarmRouteRuntimeConfig {\n runtime?: FarmRouteRuntime;\n regions?: FarmRouteRegions;\n maxDuration?: FarmRouteMaxDuration;\n}\n\nexport interface ResolvedFarmRouteRuntimeConfig {\n runtime: FarmRouteRuntime;\n regions?: string[];\n maxDuration?: number;\n}\n\nexport type FarmRouteRuntimeEntryKind = \"page\" | \"api\" | \"rule\";\nexport type FarmRouteRenderingMode = \"static\" | \"dynamic\";\n\nexport interface FarmRouteRuntimeManifestEntry extends ResolvedFarmRouteRuntimeConfig {\n kind: FarmRouteRuntimeEntryKind;\n pattern: string;\n rendering: FarmRouteRenderingMode;\n source?: string;\n}\n\nexport interface FarmRouteRuntimeManifest {\n version: 1;\n routes: FarmRouteRuntimeManifestEntry[];\n}\n\nexport function normalizeFarmRouteRuntimeConfig(\n value: FarmRouteRuntimeConfig | null | undefined,\n source = \"Route configuration\",\n): FarmRouteRuntimeConfig {\n if (!value) return {};\n\n const normalized: FarmRouteRuntimeConfig = {};\n\n if (value.runtime !== undefined) {\n if (value.runtime !== \"auto\" && value.runtime !== \"node\" && value.runtime !== \"edge\") {\n throw new TypeError(`${source} runtime must be \"auto\", \"node\", or \"edge\"`);\n }\n normalized.runtime = value.runtime;\n }\n\n if (value.regions !== undefined) {\n if (value.regions === \"auto\") {\n normalized.regions = \"auto\";\n } else {\n if (!Array.isArray(value.regions) || value.regions.length === 0) {\n throw new TypeError(`${source} regions must be \"auto\" or a non-empty string array`);\n }\n\n const regions = Array.from(\n new Set(\n value.regions.map((region) => {\n if (\n typeof region !== \"string\" ||\n !region.trim() ||\n /[\\u0000-\\u001f\\u007f]/.test(region)\n ) {\n throw new TypeError(`${source} regions must contain non-empty region identifiers`);\n }\n return region.trim();\n }),\n ),\n );\n\n normalized.regions = regions;\n }\n }\n\n if (value.maxDuration !== undefined) {\n if (value.maxDuration === \"auto\") {\n normalized.maxDuration = \"auto\";\n } else if (\n typeof value.maxDuration !== \"number\" ||\n !Number.isInteger(value.maxDuration) ||\n value.maxDuration <= 0\n ) {\n throw new TypeError(`${source} maxDuration must be \"auto\" or a positive integer in seconds`);\n } else {\n normalized.maxDuration = value.maxDuration;\n }\n }\n\n return normalized;\n}\n\n/** Merge from lowest to highest precedence. Explicit \"auto\" values reset inherited hints. */\nexport function mergeFarmRouteRuntimeConfigs(\n ...configs: Array<FarmRouteRuntimeConfig | null | undefined>\n): FarmRouteRuntimeConfig {\n const merged: FarmRouteRuntimeConfig = {};\n\n for (const config of configs) {\n if (!config) continue;\n if (config.runtime !== undefined) merged.runtime = config.runtime;\n if (config.regions !== undefined) merged.regions = config.regions;\n if (config.maxDuration !== undefined) merged.maxDuration = config.maxDuration;\n }\n\n return merged;\n}\n\nexport function resolveFarmRouteRuntimeConfig(\n config: FarmRouteRuntimeConfig | null | undefined,\n source?: string,\n): ResolvedFarmRouteRuntimeConfig {\n const normalized = normalizeFarmRouteRuntimeConfig(config, source);\n\n return {\n runtime: normalized.runtime ?? \"auto\",\n ...(normalized.regions && normalized.regions !== \"auto\"\n ? { regions: [...normalized.regions] }\n : {}),\n ...(typeof normalized.maxDuration === \"number\" ? { maxDuration: normalized.maxDuration } : {}),\n };\n}\n\nexport function hasFarmRouteRuntimeControls(\n config: FarmRouteRuntimeConfig | null | undefined,\n): boolean {\n return Boolean(\n config &&\n (config.runtime !== undefined ||\n config.regions !== undefined ||\n config.maxDuration !== undefined),\n );\n}\n\nexport function getFarmRouteRuntimeConfig(value: unknown): FarmRouteRuntimeConfig {\n if (!value || typeof value !== \"object\") return {};\n const route = value as FarmRouteRuntimeConfig;\n return {\n ...(route.runtime !== undefined ? { runtime: route.runtime } : {}),\n ...(route.regions !== undefined ? { regions: route.regions } : {}),\n ...(route.maxDuration !== undefined ? { maxDuration: route.maxDuration } : {}),\n };\n}\n\nexport function createFarmRouteRuntimeKey(config: ResolvedFarmRouteRuntimeConfig): string {\n return JSON.stringify({\n runtime: config.runtime,\n regions: config.regions || null,\n maxDuration: config.maxDuration || null,\n });\n}\n\n/** Resolve matching route rules from broadest to most specific. */\nexport function resolveFarmRouteRuleRuntimeConfig(\n pathname: string,\n routeRules: Record<string, FarmRouteRuntimeConfig> | null | undefined,\n): FarmRouteRuntimeConfig {\n if (!routeRules) return {};\n\n const matches = Object.entries(routeRules)\n .filter(\n ([pattern, rule]) =>\n hasFarmRouteRuntimeControls(rule) && farmRouteRuleMatches(pattern, pathname),\n )\n .sort(([left], [right]) => compareFarmRouteRuleSpecificity(left, right));\n\n return mergeFarmRouteRuntimeConfigs(...matches.map(([, rule]) => rule));\n}\n\nexport function farmRouteRuleMatches(pattern: string, pathname: string): boolean {\n const normalizedPattern = normalizeRoutePattern(pattern);\n const normalizedPathname = normalizeRoutePattern(pathname);\n if (normalizedPattern === normalizedPathname) return true;\n\n const expression = normalizedPattern\n .split(\"/\")\n .filter(Boolean)\n .map((segment) => {\n if (segment === \"**\") return \".*\";\n if (segment === \"*\") return \"[^/]+\";\n if (/^\\[\\[\\.\\.\\..+\\]\\]$/.test(segment)) return \".*\";\n if (/^\\[\\.\\.\\..+\\]$/.test(segment)) return \".+\";\n if (/^\\[.+\\]$/.test(segment) || /^:.+$/.test(segment)) return \"[^/]+\";\n return escapeRegExp(segment);\n })\n .join(\"/\");\n\n return new RegExp(`^/${expression}/?$`).test(normalizedPathname);\n}\n\nfunction compareFarmRouteRuleSpecificity(left: string, right: string): number {\n const leftScore = getFarmRouteRuleSpecificity(left);\n const rightScore = getFarmRouteRuleSpecificity(right);\n return leftScore - rightScore || left.localeCompare(right);\n}\n\nfunction getFarmRouteRuleSpecificity(pattern: string): number {\n return normalizeRoutePattern(pattern)\n .split(\"/\")\n .filter(Boolean)\n .reduce((score, segment) => {\n if (segment === \"**\" || segment.startsWith(\"[[...\")) return score + 1;\n if (segment === \"*\" || segment.startsWith(\"[...\")) return score + 10;\n if (/^\\[.+\\]$/.test(segment) || /^:.+$/.test(segment)) return score + 50;\n return score + 100;\n }, 0);\n}\n\nfunction normalizeRoutePattern(value: string): string {\n const withSlash = value.trim().startsWith(\"/\") ? value.trim() : `/${value.trim()}`;\n return withSlash.length > 1 ? withSlash.replace(/\\/+$/, \"\") : withSlash;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import type { HeaderConfig, RedirectConfig } from \"./config\";\nimport type { FarmRouteRuntimeConfig } from \"./route-runtime\";\nimport { normalizeFarmRouteRuntimeConfig } from \"./route-runtime\";\n\nexport type FarmRouteRuleRenderMode = \"static\" | \"dynamic\";\n\nexport type FarmRouteRuleRedirect =\n | string\n | {\n to: string;\n statusCode?: number;\n permanent?: boolean;\n };\n\nexport type FarmRouteRuleCors =\n | boolean\n | {\n origin?: string;\n methods?: string | readonly string[];\n headers?: string | readonly string[];\n };\n\nexport interface FarmRouteRule extends FarmRouteRuntimeConfig {\n prerender?: boolean;\n render?: FarmRouteRuleRenderMode;\n ssr?: boolean;\n swr?: boolean | number;\n isr?: boolean | number;\n cors?: FarmRouteRuleCors;\n headers?: Record<string, string>;\n redirect?: FarmRouteRuleRedirect;\n}\n\nexport type FarmRouteRules = Record<string, FarmRouteRule>;\n\nexport function normalizeRouteRules(routeRules: FarmRouteRules | undefined): FarmRouteRules {\n if (!routeRules) return {};\n\n const normalized: FarmRouteRules = {};\n for (const [source, rule] of Object.entries(routeRules)) {\n if (!source || !rule) continue;\n const normalizedSource = normalizeRuleSource(source);\n normalized[normalizedSource] = {\n ...rule,\n ...normalizeFarmRouteRuntimeConfig(rule, `Route rule \"${normalizedSource}\"`),\n };\n }\n return normalized;\n}\n\nexport function routeRulesToRedirects(routeRules: FarmRouteRules): RedirectConfig[] {\n return Object.entries(routeRules)\n .filter((entry): entry is [string, FarmRouteRule & { redirect: FarmRouteRuleRedirect }] =>\n Boolean(entry[1].redirect),\n )\n .map(([source, rule]) => {\n const redirect = typeof rule.redirect === \"string\" ? { to: rule.redirect } : rule.redirect;\n return {\n source,\n destination: redirect.to,\n permanent: redirect.permanent,\n statusCode: redirect.statusCode ?? (redirect.permanent === true ? 308 : undefined),\n };\n });\n}\n\nexport function routeRulesToHeaders(routeRules: FarmRouteRules): HeaderConfig[] {\n const configs: HeaderConfig[] = [];\n\n for (const [source, rule] of Object.entries(routeRules)) {\n const headers = {\n ...normalizeCorsHeaders(rule.cors),\n ...rule.headers,\n };\n\n const entries = Object.entries(headers);\n if (entries.length === 0) continue;\n\n configs.push({\n source,\n headers: entries.map(([key, value]) => ({ key, value })),\n });\n }\n\n return configs;\n}\n\nexport function routeRulesToNitroRouteRules(routeRules: FarmRouteRules): Record<string, any> {\n const nitroRules: Record<string, any> = {};\n\n for (const [source, rule] of Object.entries(routeRules)) {\n const nitroRule: Record<string, any> = { ...rule };\n\n if (rule.render === \"static\") {\n nitroRule.prerender = true;\n } else if (rule.render === \"dynamic\") {\n nitroRule.prerender = false;\n }\n\n if (rule.redirect && typeof rule.redirect !== \"string\") {\n nitroRule.redirect = rule.redirect.to;\n if (rule.redirect.statusCode) {\n nitroRule.statusCode = rule.redirect.statusCode;\n }\n }\n\n if (rule.cors) {\n nitroRule.cors = true;\n nitroRule.headers = {\n ...normalizeCorsHeaders(rule.cors),\n ...rule.headers,\n };\n }\n\n delete nitroRule.render;\n delete nitroRule.runtime;\n delete nitroRule.regions;\n delete nitroRule.maxDuration;\n nitroRules[source] = nitroRule;\n }\n\n return nitroRules;\n}\n\nfunction normalizeCorsHeaders(cors: FarmRouteRuleCors | undefined): Record<string, string> {\n if (!cors) return {};\n\n if (cors === true) {\n return {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"*\",\n \"Access-Control-Allow-Headers\": \"*\",\n };\n }\n\n return {\n \"Access-Control-Allow-Origin\": cors.origin ?? \"*\",\n \"Access-Control-Allow-Methods\": normalizeList(cors.methods) ?? \"*\",\n \"Access-Control-Allow-Headers\": normalizeList(cors.headers) ?? \"*\",\n };\n}\n\nfunction normalizeList(value: string | readonly string[] | undefined): string | undefined {\n if (!value || typeof value === \"string\") return value;\n return value.join(\", \");\n}\n\nfunction normalizeRuleSource(source: string): string {\n const trimmed = source.trim();\n if (!trimmed) return \"/\";\n return trimmed.startsWith(\"/\") ? trimmed : `/${trimmed}`;\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { subscribeFarmCacheInvalidation, subscribeFarmCacheTask } from \"./cache-invalidation\";\n\nexport const DEFAULT_SERVER_ACTION_BODY_SIZE_LIMIT = 1_000_000;\n\nexport interface FarmServerActionsConfig {\n /** Additional trusted origins or host patterns, such as https://app.example.com. */\n allowedOrigins?: readonly string[];\n /** Maximum encoded request body size in bytes or as a size string such as \"1mb\". */\n bodySizeLimit?: number | string;\n}\n\nexport interface ResolvedFarmServerActionsConfig {\n allowedOrigins: readonly string[];\n bodySizeLimit: number;\n}\n\nexport type ServerActionRequestKind = \"javascript\" | \"form\";\n\nexport interface PreparedServerActionRequest {\n body: string | FormData;\n contentType: string;\n}\n\nexport type SanitizedServerActionError = {\n name: \"ServerActionError\";\n message: \"Server function failed\";\n};\n\ntype ServerActionRequestErrorCode =\n | \"BODY_TOO_LARGE\"\n | \"INVALID_ACTION_ID\"\n | \"INVALID_BODY\"\n | \"INVALID_CONTENT_LENGTH\"\n | \"INVALID_METHOD\"\n | \"INVALID_ORIGIN\"\n | \"MISSING_ORIGIN\"\n | \"UNSUPPORTED_CONTENT_TYPE\";\n\nexport class ServerActionRequestError extends Error {\n readonly code: ServerActionRequestErrorCode;\n readonly status: number;\n\n constructor(code: ServerActionRequestErrorCode, status: number, message: string) {\n super(message);\n this.name = \"ServerActionRequestError\";\n this.code = code;\n this.status = status;\n }\n}\n\ntype ServerActionExecutionContext = {\n request: Request;\n signal: AbortSignal;\n invalidations: Set<string>;\n cacheTasks: Set<Promise<void>>;\n};\n\nconst SERVER_ACTION_STORAGE_KEY = Symbol.for(\"farm.serverActionStorage\");\nconst FALLBACK_ABORT_CONTROLLER_KEY = Symbol.for(\"farm.serverActionFallbackAbortController\");\nconst FORM_ACTION_CONTENT_TYPES = new Set([\n \"application/x-www-form-urlencoded\",\n \"multipart/form-data\",\n]);\nconst JAVASCRIPT_ACTION_CONTENT_TYPES = new Set([\n \"application/octet-stream\",\n \"application/x-www-form-urlencoded\",\n \"multipart/form-data\",\n \"text/plain\",\n]);\n\ntype GlobalWithServerActionStorage = typeof globalThis & {\n [SERVER_ACTION_STORAGE_KEY]?: AsyncLocalStorage<ServerActionExecutionContext>;\n [FALLBACK_ABORT_CONTROLLER_KEY]?: AbortController;\n};\n\nexport function resolveServerActionsConfig(\n config: FarmServerActionsConfig | undefined,\n): ResolvedFarmServerActionsConfig {\n const allowedOrigins = (config?.allowedOrigins ?? []).map(normalizeAllowedOriginPattern);\n const bodySizeLimit = parseBodySizeLimit(\n config?.bodySizeLimit ?? DEFAULT_SERVER_ACTION_BODY_SIZE_LIMIT,\n );\n\n return Object.freeze({\n allowedOrigins: Object.freeze(allowedOrigins),\n bodySizeLimit,\n });\n}\n\nexport function validateServerActionRequest(\n request: Request,\n config: ResolvedFarmServerActionsConfig,\n): void {\n if (request.method.toUpperCase() !== \"POST\") {\n throw new ServerActionRequestError(\n \"INVALID_METHOD\",\n 405,\n \"Server actions only accept POST requests\",\n );\n }\n\n const requestUrl = new URL(request.url);\n const sourceOrigin = getRequestSourceOrigin(request);\n const fetchSite = request.headers.get(\"sec-fetch-site\")?.trim().toLowerCase();\n\n if (!sourceOrigin) {\n if (fetchSite !== \"same-origin\") {\n throw new ServerActionRequestError(\n \"MISSING_ORIGIN\",\n 403,\n \"Server action request is missing same-origin metadata\",\n );\n }\n return;\n }\n\n const matchesRequest =\n sourceOrigin === requestUrl.origin || matchesHostHeader(sourceOrigin, request);\n const matchesConfiguredOrigin = config.allowedOrigins.some((pattern) =>\n matchesAllowedOrigin(sourceOrigin, pattern),\n );\n\n if (!matchesRequest && !matchesConfiguredOrigin) {\n throw new ServerActionRequestError(\n \"INVALID_ORIGIN\",\n 403,\n \"Server action origin does not match the request origin\",\n );\n }\n\n if (fetchSite === \"cross-site\" && !matchesConfiguredOrigin) {\n throw new ServerActionRequestError(\n \"INVALID_ORIGIN\",\n 403,\n \"Cross-site server action request was rejected\",\n );\n }\n}\n\nexport async function prepareServerActionRequest(\n request: Request,\n config: ResolvedFarmServerActionsConfig,\n kind: ServerActionRequestKind,\n actionId?: string | null,\n): Promise<PreparedServerActionRequest> {\n validateServerActionRequest(request, config);\n\n if (kind === \"javascript\") {\n validateActionId(actionId);\n }\n\n const contentType = getSupportedContentType(request, kind);\n const bytes = await readBodyWithLimit(request, config.bodySizeLimit);\n\n if (kind === \"form\" || contentType === \"multipart/form-data\") {\n return {\n body: await parseFormData(request, bytes),\n contentType,\n };\n }\n\n return {\n body: new TextDecoder().decode(bytes),\n contentType,\n };\n}\n\nexport function createServerActionRequestErrorResponse(error: unknown): Response | null {\n if (!(error instanceof ServerActionRequestError)) {\n return null;\n }\n\n const headers = new Headers({\n \"cache-control\": \"no-store\",\n \"content-type\": \"text/plain; charset=utf-8\",\n \"x-content-type-options\": \"nosniff\",\n });\n if (error.status === 405) {\n headers.set(\"allow\", \"POST\");\n }\n\n return new Response(getPublicErrorMessage(error.status), {\n status: error.status,\n headers,\n });\n}\n\nexport function sanitizeServerActionError(_error: unknown): SanitizedServerActionError {\n return {\n name: \"ServerActionError\",\n message: \"Server function failed\",\n };\n}\n\nexport async function runWithServerActionRequest<T>(\n request: Request,\n callback: () => T | Promise<T>,\n): Promise<T> {\n throwIfAborted(request.signal);\n const context: ServerActionExecutionContext = {\n request,\n signal: request.signal,\n invalidations: new Set(),\n cacheTasks: new Set(),\n };\n\n return getServerActionStorage().run(context, async () => {\n try {\n const result = await callback();\n await Promise.all(context.cacheTasks);\n return result;\n } catch (error) {\n await Promise.allSettled(context.cacheTasks);\n throw error;\n }\n });\n}\n\nexport function getServerActionExecutionContext(): ServerActionExecutionContext | undefined {\n return getServerActionStorage().getStore();\n}\n\nexport function getServerActionSignal(): AbortSignal {\n return getServerActionExecutionContext()?.signal ?? getFallbackAbortController().signal;\n}\n\nexport function getServerActionInvalidations(): readonly string[] {\n return Array.from(getServerActionExecutionContext()?.invalidations ?? []);\n}\n\nsubscribeFarmCacheInvalidation((key) => {\n getServerActionExecutionContext()?.invalidations.add(key);\n});\n\nsubscribeFarmCacheTask((task) => {\n getServerActionExecutionContext()?.cacheTasks.add(task);\n});\n\nfunction getServerActionStorage(): AsyncLocalStorage<ServerActionExecutionContext> {\n const globalState = globalThis as GlobalWithServerActionStorage;\n if (!globalState[SERVER_ACTION_STORAGE_KEY]) {\n globalState[SERVER_ACTION_STORAGE_KEY] = new AsyncLocalStorage<ServerActionExecutionContext>();\n }\n return globalState[SERVER_ACTION_STORAGE_KEY]!;\n}\n\nfunction getFallbackAbortController(): AbortController {\n const globalState = globalThis as GlobalWithServerActionStorage;\n if (!globalState[FALLBACK_ABORT_CONTROLLER_KEY]) {\n globalState[FALLBACK_ABORT_CONTROLLER_KEY] = new AbortController();\n }\n return globalState[FALLBACK_ABORT_CONTROLLER_KEY]!;\n}\n\nfunction parseBodySizeLimit(value: number | string): number {\n if (typeof value === \"number\") {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new TypeError(\"serverActions.bodySizeLimit must be a positive safe integer\");\n }\n return value;\n }\n\n const match = value\n .trim()\n .toLowerCase()\n .match(/^(\\d+(?:\\.\\d+)?)\\s*(b|kb|mb|gb|kib|mib|gib)?$/);\n if (!match) {\n throw new TypeError(\n 'serverActions.bodySizeLimit must be bytes or a size string such as \"500kb\" or \"1mb\"',\n );\n }\n\n const amount = Number(match[1]);\n const unit = match[2] ?? \"b\";\n const multiplier: Record<string, number> = {\n b: 1,\n kb: 1_000,\n mb: 1_000_000,\n gb: 1_000_000_000,\n kib: 1_024,\n mib: 1_048_576,\n gib: 1_073_741_824,\n };\n const bytes = Math.floor(amount * multiplier[unit]);\n\n if (!Number.isSafeInteger(bytes) || bytes <= 0) {\n throw new TypeError(\"serverActions.bodySizeLimit must resolve to a positive safe integer\");\n }\n\n return bytes;\n}\n\nfunction normalizeAllowedOriginPattern(value: string): string {\n const pattern = value.trim().toLowerCase();\n if (!pattern) {\n throw new TypeError(\"serverActions.allowedOrigins cannot contain empty values\");\n }\n\n if (pattern.includes(\"*\")) {\n if (!/^(?:https?:\\/\\/)?\\*\\.[a-z0-9.-]+(?::\\d+)?$/.test(pattern)) {\n throw new TypeError(`Invalid serverActions.allowedOrigins pattern: ${JSON.stringify(value)}`);\n }\n return pattern;\n }\n\n if (pattern.includes(\"://\")) {\n let parsed: URL;\n try {\n parsed = new URL(pattern);\n } catch {\n throw new TypeError(`Invalid serverActions.allowedOrigins value: ${JSON.stringify(value)}`);\n }\n\n if (\n (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") ||\n parsed.username ||\n parsed.password ||\n parsed.pathname !== \"/\" ||\n parsed.search ||\n parsed.hash\n ) {\n throw new TypeError(\n `serverActions.allowedOrigins must contain origins without paths: ${JSON.stringify(value)}`,\n );\n }\n return parsed.origin;\n }\n\n if (/[/@?#]/.test(pattern)) {\n throw new TypeError(\n `serverActions.allowedOrigins must contain origins or hosts: ${JSON.stringify(value)}`,\n );\n }\n\n try {\n return new URL(`http://${pattern}`).host;\n } catch {\n throw new TypeError(`Invalid serverActions.allowedOrigins value: ${JSON.stringify(value)}`);\n }\n}\n\nfunction getRequestSourceOrigin(request: Request): string | null {\n const origin = request.headers.get(\"origin\")?.trim();\n if (origin) {\n return parseSourceOrigin(origin);\n }\n\n const referer = request.headers.get(\"referer\")?.trim();\n if (referer) {\n return parseSourceOrigin(referer);\n }\n\n return null;\n}\n\nfunction parseSourceOrigin(value: string): string {\n if (value === \"null\") {\n throw new ServerActionRequestError(\"INVALID_ORIGIN\", 403, \"Opaque origins are not allowed\");\n }\n\n try {\n const parsed = new URL(value);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"Unsupported protocol\");\n }\n return parsed.origin;\n } catch {\n throw new ServerActionRequestError(\"INVALID_ORIGIN\", 403, \"Invalid request origin\");\n }\n}\n\nfunction matchesHostHeader(sourceOrigin: string, request: Request): boolean {\n const host = request.headers.get(\"host\")?.trim().toLowerCase();\n if (!host) return false;\n\n try {\n const source = new URL(sourceOrigin);\n const target = new URL(request.url);\n return source.protocol === target.protocol && source.host.toLowerCase() === host;\n } catch {\n return false;\n }\n}\n\nfunction matchesAllowedOrigin(sourceOrigin: string, pattern: string): boolean {\n const source = new URL(sourceOrigin);\n if (!pattern.includes(\"*\")) {\n return pattern.includes(\"://\") ? source.origin === pattern : source.host === pattern;\n }\n\n const schemeEnd = pattern.indexOf(\"://\");\n const scheme = schemeEnd === -1 ? null : pattern.slice(0, schemeEnd + 1);\n const hostPattern = pattern.slice(schemeEnd === -1 ? 0 : schemeEnd + 3);\n const [wildcardHost, port] = splitHostAndPort(hostPattern);\n const baseHost = wildcardHost.slice(2);\n\n if (scheme && source.protocol !== scheme) return false;\n if (port && getEffectivePort(source) !== port) return false;\n if (!port && source.port) return false;\n\n return source.hostname.endsWith(`.${baseHost}`) && source.hostname !== baseHost;\n}\n\nfunction splitHostAndPort(value: string): [string, string | null] {\n const separator = value.lastIndexOf(\":\");\n if (separator === -1) return [value, null];\n return [value.slice(0, separator), value.slice(separator + 1)];\n}\n\nfunction getEffectivePort(url: URL): string {\n if (url.port) return url.port;\n if (url.protocol === \"https:\") return \"443\";\n if (url.protocol === \"http:\") return \"80\";\n return \"\";\n}\n\nfunction validateActionId(actionId?: string | null): asserts actionId is string {\n if (!actionId || actionId.length > 4096 || hasControlCharacters(actionId)) {\n throw new ServerActionRequestError(\"INVALID_ACTION_ID\", 400, \"Invalid server action id\");\n }\n}\n\nfunction hasControlCharacters(value: string): boolean {\n for (let index = 0; index < value.length; index++) {\n const code = value.charCodeAt(index);\n if (code <= 31 || code === 127) return true;\n }\n return false;\n}\n\nfunction getSupportedContentType(request: Request, kind: ServerActionRequestKind): string {\n const header = request.headers.get(\"content-type\")?.trim().toLowerCase();\n const contentType = header?.split(\";\", 1)[0]?.trim() ?? \"\";\n const supported = kind === \"form\" ? FORM_ACTION_CONTENT_TYPES : JAVASCRIPT_ACTION_CONTENT_TYPES;\n\n if (!supported.has(contentType)) {\n throw new ServerActionRequestError(\n \"UNSUPPORTED_CONTENT_TYPE\",\n 415,\n \"Unsupported server action content type\",\n );\n }\n\n return contentType;\n}\n\nasync function readBodyWithLimit(request: Request, limit: number): Promise<Uint8Array> {\n const contentLength = request.headers.get(\"content-length\")?.trim();\n if (contentLength) {\n if (!/^\\d+$/.test(contentLength)) {\n throw new ServerActionRequestError(\n \"INVALID_CONTENT_LENGTH\",\n 400,\n \"Invalid content-length header\",\n );\n }\n if (Number(contentLength) > limit) {\n throw new ServerActionRequestError(\"BODY_TOO_LARGE\", 413, \"Server action body is too large\");\n }\n }\n\n throwIfAborted(request.signal);\n if (!request.body) return new Uint8Array();\n\n const reader = request.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n const cancelBodyRead = () => {\n void reader.cancel(request.signal.reason).catch(() => {});\n };\n\n request.signal.addEventListener(\"abort\", cancelBodyRead, { once: true });\n\n try {\n while (true) {\n throwIfAborted(request.signal);\n const { done, value } = await reader.read();\n if (done) break;\n if (!value) continue;\n\n total += value.byteLength;\n if (total > limit) {\n await reader.cancel(\"Server action body is too large\");\n throw new ServerActionRequestError(\n \"BODY_TOO_LARGE\",\n 413,\n \"Server action body is too large\",\n );\n }\n chunks.push(value);\n }\n } catch (error) {\n if (request.signal.aborted) throwIfAborted(request.signal);\n throw error;\n } finally {\n request.signal.removeEventListener(\"abort\", cancelBodyRead);\n reader.releaseLock();\n }\n\n throwIfAborted(request.signal);\n const body = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return body;\n}\n\nasync function parseFormData(request: Request, bytes: Uint8Array): Promise<FormData> {\n const body = new ArrayBuffer(bytes.byteLength);\n new Uint8Array(body).set(bytes);\n const copy = new Request(request.url, {\n method: \"POST\",\n headers: request.headers,\n body,\n });\n\n try {\n return await copy.formData();\n } catch {\n throw new ServerActionRequestError(\"INVALID_BODY\", 400, \"Invalid server action form body\");\n }\n}\n\nfunction getPublicErrorMessage(status: number): string {\n switch (status) {\n case 400:\n return \"Bad Request\";\n case 403:\n return \"Forbidden\";\n case 405:\n return \"Method Not Allowed\";\n case 413:\n return \"Payload Too Large\";\n case 415:\n return \"Unsupported Media Type\";\n default:\n return \"Server Action Request Failed\";\n }\n}\n\nfunction throwIfAborted(signal: AbortSignal): void {\n if (!signal.aborted) return;\n if (signal.reason !== undefined) throw signal.reason;\n throw new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n","export type FarmCacheInvalidationListener = (key: string) => void;\nexport type FarmCacheTaskListener = (task: Promise<void>) => void;\n\nexport const FARM_CACHE_INVALIDATION_HEADER = \"x-farm-cache-invalidations\";\n\ntype FarmCacheInvalidationState = {\n listeners: Set<FarmCacheInvalidationListener>;\n taskListeners: Set<FarmCacheTaskListener>;\n};\n\nconst FARM_CACHE_INVALIDATION_STATE = Symbol.for(\"farm.cacheInvalidationState\");\nconst globalState = globalThis as typeof globalThis & {\n [FARM_CACHE_INVALIDATION_STATE]?: FarmCacheInvalidationState;\n};\n\nfunction getFarmCacheInvalidationState(): FarmCacheInvalidationState {\n return (globalState[FARM_CACHE_INVALIDATION_STATE] ??= {\n listeners: new Set(),\n taskListeners: new Set(),\n });\n}\n\nexport function notifyFarmCacheInvalidation(key: string): void {\n if (typeof key !== \"string\" || key.length === 0) return;\n\n for (const listener of getFarmCacheInvalidationState().listeners) {\n listener(key);\n }\n}\n\nexport function notifyFarmCacheTask(task: Promise<void>): void {\n for (const listener of getFarmCacheInvalidationState().taskListeners) {\n listener(task);\n }\n}\n\nexport function applyFarmCacheInvalidations(keys: unknown): void {\n if (!Array.isArray(keys)) return;\n\n for (const key of keys) {\n if (typeof key === \"string\") {\n notifyFarmCacheInvalidation(key);\n }\n }\n}\n\nexport function encodeFarmCacheInvalidations(keys: readonly string[]): string | null {\n const normalized = Array.from(\n new Set(keys.filter((key) => typeof key === \"string\" && key.length > 0)),\n );\n if (normalized.length === 0) return null;\n return encodeURIComponent(JSON.stringify(normalized));\n}\n\nexport function decodeFarmCacheInvalidations(value: string | null | undefined): readonly string[] {\n if (!value) return [];\n\n try {\n const parsed = JSON.parse(decodeURIComponent(value));\n return Array.isArray(parsed)\n ? Array.from(\n new Set(parsed.filter((key): key is string => typeof key === \"string\" && key.length > 0)),\n )\n : [];\n } catch {\n return [];\n }\n}\n\nexport function subscribeFarmCacheInvalidation(\n listener: FarmCacheInvalidationListener,\n): () => void {\n const state = getFarmCacheInvalidationState();\n state.listeners.add(listener);\n return () => state.listeners.delete(listener);\n}\n\nexport function subscribeFarmCacheTask(listener: FarmCacheTaskListener): () => void {\n const state = getFarmCacheInvalidationState();\n state.taskListeners.add(listener);\n return () => state.taskListeners.delete(listener);\n}\n","import { existsSync, readFileSync, realpathSync, statSync } from \"node:fs\";\nimport { mkdir, unlink } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\ntype EsbuildTransform = (typeof import(\"esbuild\"))[\"transform\"];\n\nexport type FarmLayerEntry = string;\n\nexport interface ResolvedFarmLayer {\n /** The value used in `extends`. */\n source: string;\n /** Stable name used by the `#layers/<name>` alias. */\n name: string;\n /** Absolute layer package or directory root. */\n root: string;\n /** Source directory relative to the layer root. */\n srcDir: string;\n /** Resolved layer config file when one exists. */\n configFile?: string;\n}\n\nexport interface FarmSourceRoot {\n name: string;\n root: string;\n srcDir: string;\n layer: boolean;\n}\n\nexport interface ResolveFarmLayersOptions {\n root: string;\n mode: \"development\" | \"production\";\n}\n\nexport interface FarmLayerResolution<TConfig extends Record<string, any>> {\n config: TConfig & {\n extends?: readonly FarmLayerEntry[];\n layers: ResolvedFarmLayer[];\n };\n layers: ResolvedFarmLayer[];\n}\n\nconst FARM_CORE_PACKAGE = \"@farm.js/core\";\nconst FARM_CONFIG_ENTRY = \"@farm.js/core/config\";\nconst FARM_CORE_REFERENCE_RE = /([\"'])@farm.js\\/core\\1/g;\nconst FARM_CONFIG_HELPER_IMPORT_RE =\n /(?:^|\\n)[\\t ]*import[\\t ]*\\{([^{}]*)\\}[\\t ]*from[\\t ]*([\"'])@farm.js\\/core\\2[\\t ]*;?[\\t ]*(?:\\n|$)/g;\nconst FARM_CONFIG_HELPER_SPECIFIER_RE =\n /^(?:defineConfig|defineFarmConfig)(?:\\s+as\\s+[$A-Z_a-z][$\\w]*)?$/;\n\nconst CONFIG_FILENAMES = [\n \"farm.config.ts\",\n \"farm.config.tsx\",\n \"farm.config.mts\",\n \"farm.config.cts\",\n \"farm.config.js\",\n \"farm.config.jsx\",\n \"farm.config.mjs\",\n \"farm.config.cjs\",\n \"config.ts\",\n \"config.tsx\",\n \"config.mts\",\n \"config.cts\",\n \"config.js\",\n \"config.jsx\",\n \"config.mjs\",\n \"config.cjs\",\n];\n\nconst LAYER_LOCAL_CONFIG_KEYS = new Set([\n \"root\",\n \"srcDir\",\n \"outDir\",\n \"distDir\",\n \"deploy\",\n \"output\",\n \"preset\",\n \"publicDir\",\n \"generateBuildId\",\n]);\n\ntype LoadedLayer = ResolvedFarmLayer & {\n config: Record<string, any>;\n};\n\nexport async function resolveFarmLayers<TConfig extends Record<string, any>>(\n projectConfig: TConfig,\n options: ResolveFarmLayersOptions,\n): Promise<FarmLayerResolution<TConfig>> {\n const projectRoot = path.resolve(options.root);\n const entries = normalizeLayerEntries(projectConfig.extends, \"project config\");\n\n if (entries.length === 0) {\n return {\n config: {\n ...projectConfig,\n layers: [],\n },\n layers: [],\n };\n }\n\n const loadedLayers: LoadedLayer[] = [];\n const visited = new Set<string>();\n const aliases = new Map<string, string>();\n\n const visit = async (\n source: string,\n ownerRoot: string,\n stack: Array<{ root: string; source: string }>,\n ): Promise<void> => {\n const resolvedSource = resolveLayerSource(source, ownerRoot);\n const cycleIndex = stack.findIndex((entry) => entry.root === resolvedSource.root);\n if (cycleIndex !== -1) {\n const cycle = [...stack.slice(cycleIndex).map((entry) => entry.source), source];\n throw new Error(`Farm layer cycle detected: ${cycle.join(\" -> \")}`);\n }\n if (visited.has(resolvedSource.root)) return;\n\n const configFile = findFarmConfigFile(resolvedSource.root, resolvedSource.configFile);\n const config = configFile\n ? await loadFarmConfigFile(configFile, {\n cacheRoot: projectRoot,\n root: resolvedSource.root,\n })\n : {};\n const nestedEntries = normalizeLayerEntries(config.extends, `layer ${JSON.stringify(source)}`);\n const nextStack = [...stack, { root: resolvedSource.root, source }];\n\n for (const nestedSource of nestedEntries) {\n await visit(nestedSource, resolvedSource.root, nextStack);\n }\n\n if (visited.has(resolvedSource.root)) return;\n\n const name = getLayerName(source, resolvedSource.root);\n const conflictingRoot = aliases.get(name);\n if (conflictingRoot && conflictingRoot !== resolvedSource.root) {\n throw new Error(\n `Farm layer alias \"#layers/${name}\" is ambiguous between ${conflictingRoot} and ${resolvedSource.root}`,\n );\n }\n aliases.set(name, resolvedSource.root);\n\n visited.add(resolvedSource.root);\n loadedLayers.push({\n source,\n name,\n root: resolvedSource.root,\n srcDir: normalizeLayerSrcDir(config.srcDir),\n configFile,\n config,\n });\n };\n\n for (const source of entries) {\n await visit(source, projectRoot, []);\n }\n\n let mergedConfig: Record<string, any> = {};\n for (const layer of loadedLayers) {\n mergedConfig = mergeFarmLayerConfig(mergedConfig, getLayerDefaults(layer.config));\n }\n mergedConfig = mergeFarmLayerConfig(mergedConfig, projectConfig);\n\n const layers = loadedLayers.map(({ config: _config, ...layer }) => layer);\n return {\n config: {\n ...mergedConfig,\n root: projectConfig.root,\n srcDir: projectConfig.srcDir,\n extends: projectConfig.extends,\n layers,\n } as unknown as FarmLayerResolution<TConfig>[\"config\"],\n layers,\n };\n}\n\nexport function getFarmSourceRoots(config: {\n root?: string;\n srcDir?: string;\n layers?: readonly ResolvedFarmLayer[];\n}): FarmSourceRoot[] {\n const roots: FarmSourceRoot[] = (config.layers ?? []).map((layer) => ({\n name: layer.name,\n root: layer.root,\n srcDir: layer.srcDir,\n layer: true,\n }));\n\n roots.push({\n name: \"project\",\n root: path.resolve(config.root || process.cwd()),\n srcDir: config.srcDir || \"src\",\n layer: false,\n });\n\n return roots;\n}\n\nexport function getFarmAppDirectories(config: {\n root?: string;\n srcDir?: string;\n layers?: readonly ResolvedFarmLayer[];\n}): string[] {\n return getFarmSourceRoots(config).map((source) => path.join(source.root, source.srcDir, \"app\"));\n}\n\nexport function getFarmLayerAliases(\n layers: readonly ResolvedFarmLayer[] | undefined,\n): Record<string, string> {\n return Object.fromEntries(\n (layers ?? []).map((layer) => [`#layers/${layer.name}`, path.join(layer.root, layer.srcDir)]),\n );\n}\n\nexport async function loadFarmConfigFile<TConfig = Record<string, any>>(\n configPath: string,\n options: { root: string; cacheRoot?: string },\n): Promise<TConfig> {\n const { build, transform } = await import(\"esbuild\");\n const cacheRoot = path.resolve(options.cacheRoot || options.root);\n const configCacheDir = path.join(cacheRoot, \".farm\", \".config-loader\");\n const configEntryChecks = new Map<string, Promise<boolean>>();\n await mkdir(configCacheDir, { recursive: true });\n\n const modulePath = path.join(\n configCacheDir,\n `farm-config-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`,\n );\n\n await build({\n absWorkingDir: path.resolve(options.root),\n entryPoints: [path.resolve(configPath)],\n outfile: modulePath,\n bundle: true,\n format: \"esm\",\n platform: \"node\",\n target: `node${process.versions.node.split(\".\")[0]}`,\n plugins: [\n {\n name: \"farm-config-package-resolution\",\n setup(pluginBuild) {\n pluginBuild.onResolve({ filter: /^@farm.js\\/core$/ }, async (args) => {\n if (\n args.pluginData?.farmConfigExternal ||\n args.kind !== \"import-statement\" ||\n !args.importer\n ) {\n return;\n }\n\n let configEntryCheck = configEntryChecks.get(args.importer);\n if (!configEntryCheck) {\n configEntryCheck = onlyImportsFarmConfigHelpers(args.importer, transform);\n configEntryChecks.set(args.importer, configEntryCheck);\n }\n if (!(await configEntryCheck)) return;\n\n const resolved = await pluginBuild.resolve(FARM_CONFIG_ENTRY, {\n importer: args.importer,\n kind: args.kind,\n namespace: args.namespace,\n resolveDir: args.resolveDir,\n pluginData: { farmConfigExternal: true },\n });\n if (resolved.errors.length > 0 || !resolved.path) return;\n\n return {\n path: resolved.path,\n external: true,\n warnings: resolved.warnings,\n };\n });\n\n pluginBuild.onResolve({ filter: /^[^./]/ }, async (args) => {\n if (args.pluginData?.farmConfigExternal) return;\n\n const resolved = await pluginBuild.resolve(args.path, {\n importer: args.importer,\n kind: args.kind,\n namespace: args.namespace,\n resolveDir: args.resolveDir,\n pluginData: { farmConfigExternal: true },\n });\n\n if (resolved.errors.length > 0 || !resolved.path) {\n return { path: args.path, external: true };\n }\n\n return {\n path: resolved.path,\n external: true,\n warnings: resolved.warnings,\n };\n });\n },\n },\n ],\n jsx: \"automatic\",\n logLevel: \"silent\",\n sourcemap: \"inline\",\n });\n\n const moduleUrl = `${pathToFileURL(modulePath).href}?t=${Date.now()}`;\n try {\n const loaded = await import(/* @vite-ignore */ moduleUrl);\n const config = loaded.default || loaded;\n if (!config || typeof config !== \"object\" || Array.isArray(config)) {\n throw new TypeError(`Farm config ${configPath} must export an object`);\n }\n return config as TConfig;\n } finally {\n await unlink(modulePath).catch(() => undefined);\n }\n}\n\nasync function onlyImportsFarmConfigHelpers(\n importer: string,\n transform: EsbuildTransform,\n): Promise<boolean> {\n try {\n const source = readFileSync(importer, \"utf8\");\n if (!source.includes(FARM_CORE_PACKAGE)) return false;\n\n const transformed = await transform(source, {\n format: \"esm\",\n jsx: \"automatic\",\n loader: getEsbuildLoader(importer),\n sourcefile: importer,\n });\n const references = [...transformed.code.matchAll(FARM_CORE_REFERENCE_RE)];\n if (references.length === 0) return false;\n\n const safeImportRanges: Array<{ start: number; end: number }> = [];\n for (const match of transformed.code.matchAll(FARM_CONFIG_HELPER_IMPORT_RE)) {\n const specifiers = match[1]\n .split(\",\")\n .map((specifier) => specifier.trim())\n .filter(Boolean);\n if (\n specifiers.length === 0 ||\n !specifiers.every((specifier) => FARM_CONFIG_HELPER_SPECIFIER_RE.test(specifier))\n ) {\n continue;\n }\n\n const start = match.index ?? 0;\n safeImportRanges.push({ start, end: start + match[0].length });\n }\n\n return references.every((reference) => {\n const index = reference.index ?? -1;\n return safeImportRanges.some((range) => index >= range.start && index < range.end);\n });\n } catch {\n // Unsupported syntax or non-file importers retain the existing package resolution path.\n return false;\n }\n}\n\nfunction getEsbuildLoader(file: string): \"js\" | \"jsx\" | \"ts\" | \"tsx\" {\n switch (path.extname(file)) {\n case \".ts\":\n case \".mts\":\n case \".cts\":\n return \"ts\";\n case \".tsx\":\n return \"tsx\";\n case \".jsx\":\n return \"jsx\";\n default:\n return \"js\";\n }\n}\n\nfunction normalizeLayerEntries(value: unknown, owner: string): string[] {\n if (value === undefined) return [];\n if (!Array.isArray(value)) {\n throw new TypeError(`${owner} \"extends\" must be an array of layer paths or package names`);\n }\n\n return value.map((entry, index) => {\n if (typeof entry !== \"string\" || entry.trim() === \"\") {\n throw new TypeError(`${owner} \"extends\" entry ${index} must be a non-empty string`);\n }\n return entry.trim();\n });\n}\n\nfunction resolveLayerSource(\n source: string,\n ownerRoot: string,\n): { root: string; configFile?: string } {\n if (isPathLayerSource(source)) {\n const target = source.startsWith(\"file:\")\n ? path.resolve(ownerRoot, source.slice(\"file:\".length))\n : path.resolve(ownerRoot, source);\n if (!existsSync(target)) {\n throw new Error(`Cannot resolve Farm layer ${JSON.stringify(source)} from ${ownerRoot}`);\n }\n\n const stats = statSync(target);\n const root = stats.isDirectory() ? target : path.dirname(target);\n return {\n root: normalizeRealPath(root),\n configFile: stats.isFile() ? normalizeRealPath(target) : undefined,\n };\n }\n\n const requireFromOwner = createRequire(path.join(ownerRoot, \"package.json\"));\n let packageJsonPath: string | undefined;\n try {\n packageJsonPath = requireFromOwner.resolve(`${source}/package.json`);\n } catch {\n // Packages with an exports map often hide package.json. Resolve their entry and walk upward.\n }\n\n if (packageJsonPath) {\n return { root: normalizeRealPath(path.dirname(packageJsonPath)) };\n }\n\n try {\n const entryPath = requireFromOwner.resolve(source);\n const packageRoot = findNearestPackageRoot(entryPath);\n if (packageRoot) return { root: normalizeRealPath(packageRoot) };\n } catch {\n // Use the common error below so local and package failures have the same shape.\n }\n\n throw new Error(`Cannot resolve Farm layer package ${JSON.stringify(source)} from ${ownerRoot}`);\n}\n\nfunction findNearestPackageRoot(entryPath: string): string | null {\n let current = statSync(entryPath).isDirectory() ? entryPath : path.dirname(entryPath);\n while (true) {\n if (existsSync(path.join(current, \"package.json\"))) return current;\n const parent = path.dirname(current);\n if (parent === current) return null;\n current = parent;\n }\n}\n\nfunction findFarmConfigFile(root: string, explicitPath?: string): string | undefined {\n if (explicitPath) return explicitPath;\n for (const fileName of CONFIG_FILENAMES) {\n const candidate = path.join(root, fileName);\n if (existsSync(candidate)) return candidate;\n }\n return undefined;\n}\n\nfunction getLayerName(source: string, root: string): string {\n if (!isPathLayerSource(source)) {\n const packageName = source.split(\"/\").filter(Boolean).pop();\n if (packageName) return sanitizeLayerName(packageName);\n }\n\n try {\n const packageJson = JSON.parse(readFileSync(path.join(root, \"package.json\"), \"utf8\"));\n if (typeof packageJson.name === \"string\") {\n return sanitizeLayerName(packageJson.name.split(\"/\").pop() || packageJson.name);\n }\n } catch {\n // A local layer does not need package metadata.\n }\n\n return sanitizeLayerName(path.basename(root));\n}\n\nfunction sanitizeLayerName(value: string): string {\n const name = value\n .trim()\n .replace(/[^a-zA-Z0-9_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n if (!name) throw new Error(`Cannot derive a name for Farm layer ${JSON.stringify(value)}`);\n return name;\n}\n\nfunction normalizeLayerSrcDir(value: unknown): string {\n if (value === undefined) return \"src\";\n if (typeof value !== \"string\" || value.trim() === \"\" || path.isAbsolute(value)) {\n throw new TypeError(\"A Farm layer srcDir must be a non-empty relative path\");\n }\n const normalized = path.normalize(value.trim());\n if (normalized === \"..\" || normalized.startsWith(`..${path.sep}`)) {\n throw new TypeError(\"A Farm layer srcDir cannot leave the layer root\");\n }\n return normalized;\n}\n\nfunction getLayerDefaults(config: Record<string, any>): Record<string, any> {\n return Object.fromEntries(\n Object.entries(config).filter(\n ([key, value]) =>\n key !== \"extends\" && value !== undefined && !LAYER_LOCAL_CONFIG_KEYS.has(key),\n ),\n );\n}\n\nfunction mergeFarmLayerConfig(\n base: Record<string, any>,\n override: Record<string, any>,\n): Record<string, any> {\n const output: Record<string, any> = { ...base };\n\n for (const [key, value] of Object.entries(override)) {\n if (value === undefined || key === \"layers\") continue;\n\n if (key === \"plugins\") {\n output[key] = [...toArray(output[key]), ...toArray(value)];\n continue;\n }\n\n if (key === \"middleware\" && output[key] !== undefined) {\n output[key] = [...toArray(output[key]), ...toArray(value)];\n continue;\n }\n\n if ((key === \"redirects\" || key === \"rewrites\" || key === \"headers\") && output[key]) {\n output[key] = mergeConfigListResolvers(output[key], value);\n continue;\n }\n\n if (isPlainObject(output[key]) && isPlainObject(value)) {\n output[key] = mergePlainObjects(output[key], value);\n continue;\n }\n\n output[key] = value;\n }\n\n return output;\n}\n\nfunction mergePlainObjects(base: Record<string, any>, override: Record<string, any>) {\n const output: Record<string, any> = { ...base };\n for (const [key, value] of Object.entries(override)) {\n if (value === undefined) continue;\n output[key] =\n isPlainObject(output[key]) && isPlainObject(value)\n ? mergePlainObjects(output[key], value)\n : value;\n }\n return output;\n}\n\nfunction mergeConfigListResolvers(base: unknown, override: unknown) {\n return async () => [...(await resolveConfigList(base)), ...(await resolveConfigList(override))];\n}\n\nasync function resolveConfigList(value: unknown): Promise<any[]> {\n const resolved = typeof value === \"function\" ? await value() : value;\n return toArray(resolved);\n}\n\nfunction toArray(value: unknown): any[] {\n if (value === undefined || value === null) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, any> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction isPathLayerSource(source: string): boolean {\n return (\n source.startsWith(\".\") ||\n source.startsWith(\"/\") ||\n source.startsWith(\"file:\") ||\n /^[a-zA-Z]:[\\\\/]/.test(source)\n );\n}\n\nfunction normalizeRealPath(value: string): string {\n return path.resolve(realpathSync(value));\n}\n","import type {\n FarmConfig as BaseFarmConfig,\n FarmMigrationCommand,\n FarmMigrationsConfig,\n FarmMigrationsUserConfig,\n ResolvedFarmMigrationsConfig,\n} from \"./types\";\nimport type { DocsConfig } from \"@farming-labs/docs\";\nimport type { FarmDocsResolvedConfig, FarmDocsUserConfig } from \"./docs/types\";\nimport type { FarmIntegrationsUserConfig } from \"./integrations\";\nimport type { FarmMarkdownResolvedConfig, FarmMarkdownUserConfig } from \"./markdown\";\nimport type { FarmObservabilityUserConfig } from \"./observability\";\nimport type { FarmMiddlewareConfig } from \"./middleware/types\";\nimport type { FarmPlugin } from \"./plugin\";\nimport type { FarmWorkflowsResolvedConfig, FarmWorkflowsUserConfig } from \"./workflows\";\nimport type { FarmCronResolvedConfig, FarmCronUserConfig } from \"./cron\";\nimport type { FarmEnvConfig, ResolvedFarmEnv } from \"./env\";\nimport type { UserConfig as ViteUserConfig } from \"vite\";\nimport { resolveIntegrationPlugins } from \"./integrations\";\nimport { resolveMarkdownConfig } from \"./markdown\";\nimport { resolveWorkflowsConfig } from \"./workflows\";\nimport { resolveCronConfig } from \"./cron\";\nimport { resolveEnv, setEnv } from \"./env\";\nimport {\n resolveMdxConfig,\n type FarmMdxResolvedConfig,\n type FarmMdxUserConfig,\n} from \"./app-markdown\";\nimport {\n normalizeRouteRules,\n routeRulesToHeaders,\n routeRulesToRedirects,\n type FarmRouteRules,\n} from \"./route-rules\";\nimport {\n resolveServerActionsConfig,\n type FarmServerActionsConfig,\n type ResolvedFarmServerActionsConfig,\n} from \"./server-action-security\";\nimport {\n loadFarmConfigFile,\n resolveFarmLayers,\n type FarmLayerEntry,\n type ResolvedFarmLayer,\n} from \"./layers\";\nimport path from \"path\";\nimport { normalizeFarmDeploymentId } from \"./deployment\";\nimport { resolveFarmDevtoolsConfig, type ResolvedFarmDevtoolsConfig } from \"./devtools-config\";\nimport {\n resolveFarmImageConfig,\n type FarmImageConfig,\n type ResolvedFarmImageConfig,\n} from \"./image-config\";\nimport { resolveFarmI18nConfig } from \"./i18n/config\";\nimport type { FarmI18nUserConfig, ResolvedFarmI18nConfig } from \"./i18n/types\";\nimport type { FarmCacheUserConfig } from \"./cache\";\nimport {\n resolveFarmAuthConfig,\n resolveFarmAuthIntegration,\n type FarmAuthUserConfig,\n type ResolvedFarmAuthConfig,\n} from \"./auth-config\";\n\nconst FARM_RESOLVED_CUSTOM_CONTEXT = Symbol.for(\"farm.resolvedCustomContext\");\n\nexport type {\n FarmDocsConfigInput,\n FarmDocsNavigationConfig,\n FarmDocsResolvedConfig,\n FarmDocsSidebarItem,\n FarmDocsUserConfig,\n} from \"./docs/types\";\nexport type {\n FarmMarkdownResolvedConfig,\n FarmMarkdownRouteInput,\n FarmMarkdownUserConfig,\n} from \"./markdown\";\nexport type { FarmMdxComponents, FarmMdxResolvedConfig, FarmMdxUserConfig } from \"./app-markdown\";\nexport type {\n FarmMigrationCommand,\n FarmMigrationsConfig,\n FarmMigrationsUserConfig,\n ResolvedFarmMigrationsConfig,\n} from \"./types\";\nexport type { FarmWorkflowsResolvedConfig, FarmWorkflowsUserConfig } from \"./workflows\";\nexport type { FarmCronJobConfig, FarmCronResolvedConfig, FarmCronUserConfig } from \"./cron\";\nexport type {\n FarmRouteRule,\n FarmRouteRuleCors,\n FarmRouteRuleRedirect,\n FarmRouteRuleRenderMode,\n FarmRouteRules,\n} from \"./route-rules\";\nexport type {\n FarmServerActionsConfig,\n ResolvedFarmServerActionsConfig,\n} from \"./server-action-security\";\nexport type { FarmLayerEntry, ResolvedFarmLayer } from \"./layers\";\nexport type {\n FarmDevtoolsConfig,\n FarmDevtoolsUserConfig,\n ResolvedFarmDevtoolsConfig,\n} from \"./devtools-config\";\nexport type {\n FarmImageConfig,\n FarmImageFormat,\n FarmImageLocalPattern,\n FarmImageProvider,\n FarmImageRemotePattern,\n ResolvedFarmImageConfig,\n} from \"./image-config\";\nexport type {\n FarmI18nCookieConfig,\n FarmI18nDetectionSignal,\n FarmI18nDirection,\n FarmI18nRouting,\n FarmI18nUserConfig,\n ResolvedFarmI18nConfig,\n} from \"./i18n/types\";\nexport type {\n FarmAuthConfig,\n FarmAuthDatabaseConfig,\n FarmAuthEmailAndPasswordConfig,\n FarmAuthSessionConfig,\n FarmAuthUserConfig,\n ResolvedFarmAuthConfig,\n} from \"./auth-config\";\n\nexport interface RedirectConfig {\n source: string;\n destination: string;\n permanent?: boolean;\n statusCode?: number;\n}\n\nexport interface HeaderConfig {\n source: string;\n headers: Array<{\n key: string;\n value: string;\n }>;\n}\n\nexport interface RewriteConfig {\n source: string;\n destination: string;\n}\n\n/** @deprecated Use FarmImageConfig. */\nexport type ImageConfig = FarmImageConfig;\n\n/** @deprecated Use FarmI18nUserConfig. */\nexport type I18nConfig = FarmI18nUserConfig;\n\nexport interface OpenAPIConfig {\n enabled?: boolean;\n route?: string;\n title?: string;\n description?: string;\n version?: string;\n servers?: Array<{\n url: string;\n description?: string;\n }>;\n contact?: {\n name?: string;\n email?: string;\n url?: string;\n };\n license?: {\n name: string;\n url?: string;\n };\n}\n\nexport type MiddlewareConfig = FarmMiddlewareConfig;\n\nexport interface NotFoundConfig {\n /** Path to a custom 404 page component (e.g., \"./src/app/not-found.tsx\") */\n component?: string;\n}\n\nexport type FarmDeployTarget = \"vercel\" | \"cloudflare\" | \"netlify\" | \"node\" | string;\n\nexport interface FarmDeployConfig {\n /**\n * Deployment platform. When present, Farm picks the matching Nitro preset and\n * output directory unless explicitly overridden.\n */\n target?: FarmDeployTarget;\n /** Nitro preset override. Usually inferred from target. */\n preset?: BaseFarmConfig[\"preset\"];\n /** Deployable output directory, relative to project root unless absolute. */\n outputDir?: string;\n /** Alias for outputDir for terser config. */\n output?: string;\n /** Cloudflare Pages project name used by `farm deploy --cloudflare`. */\n projectName?: string;\n vercel?: {\n outputDirectory?: string;\n buildCommand?: string;\n installCommand?: string;\n framework?: string | null;\n };\n cloudflare?: {\n outputDir?: string;\n projectName?: string;\n };\n netlify?: {\n outputDir?: string;\n site?: string;\n };\n}\n\nexport interface ResolvedFarmDeployConfig extends Omit<FarmDeployConfig, \"output\"> {\n target?: FarmDeployTarget;\n preset: BaseFarmConfig[\"preset\"];\n outputDir: string;\n}\n\nexport interface FarmUserConfig extends Omit<BaseFarmConfig, \"vite\" | \"docs\" | \"env\" | \"layers\"> {\n /** Reusable Farm directories or installed packages, applied from left to right. */\n extends?: readonly FarmLayerEntry[];\n plugins?: FarmPlugin[];\n integrations?: FarmIntegrationsUserConfig;\n /**\n * Farm-native authentication. `true` enables email/password auth with\n * server helpers from `@farm.js/auth/server` and React APIs from\n * `@farm.js/auth/client`.\n */\n auth?: FarmAuthUserConfig;\n /** Shared application data, route, ISR, and PPR cache. */\n cache?: FarmCacheUserConfig;\n migrations?: FarmMigrationsUserConfig;\n /** Map portable cron schedules to ordinary GET API routes. */\n cron?: FarmCronUserConfig | FarmCronResolvedConfig | false;\n workflows?: FarmWorkflowsUserConfig | boolean;\n preset?: BaseFarmConfig[\"preset\"];\n deploy?: FarmDeployConfig;\n docs?: FarmDocsUserConfig;\n md?: FarmMarkdownUserConfig | boolean;\n mdx?: FarmMdxUserConfig;\n observability?: FarmObservabilityUserConfig;\n\n trailingSlash?: boolean;\n redirects?: () => Promise<RedirectConfig[]> | RedirectConfig[];\n rewrites?: () => Promise<RewriteConfig[]> | RewriteConfig[];\n headers?: () => Promise<HeaderConfig[]> | HeaderConfig[];\n\n images?: ImageConfig;\n publicDir?: string;\n\n i18n?: FarmI18nUserConfig | false;\n openapi?: OpenAPIConfig;\n\n middleware?: FarmMiddlewareConfig;\n routeRules?: FarmRouteRules;\n context?: BaseFarmConfig[\"context\"];\n serverActions?: FarmServerActionsConfig;\n /** Build identifier used to detect and recover from deployment version skew. */\n deploymentId?: string;\n\n notFound?: NotFoundConfig;\n\n output?: \"standalone\" | \"static\" | \"export\";\n distDir?: string;\n generateBuildId?: () => string | Promise<string>;\n compress?: boolean;\n\n devIndicators?: {\n buildActivity?: boolean;\n buildActivityPosition?: \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\";\n };\n\n serverRuntimeConfig?: Record<string, any>;\n publicRuntimeConfig?: Record<string, any>;\n\n env?: FarmEnvConfig<any, any>;\n\n typescript?: {\n tsconfigPath?: string;\n ignoreBuildErrors?: boolean;\n };\n\n vite?: ViteUserConfig | ((config: ViteUserConfig) => ViteUserConfig);\n\n [key: string]: any;\n}\n\nexport interface ResolvedFarmConfig extends Required<\n Omit<\n FarmUserConfig,\n | \"extends\"\n | \"plugins\"\n | \"vite\"\n | \"deploy\"\n | \"docs\"\n | \"md\"\n | \"mdx\"\n | \"migrations\"\n | \"cron\"\n | \"workflows\"\n | \"env\"\n | \"serverActions\"\n | \"devtools\"\n | \"images\"\n | \"i18n\"\n | \"auth\"\n >\n> {\n /** @internal Tracks whether `context` came from user/layer config instead of the default noop. */\n [FARM_RESOLVED_CUSTOM_CONTEXT]?: boolean;\n extends: readonly FarmLayerEntry[];\n layers: ResolvedFarmLayer[];\n plugins: FarmPlugin[];\n vite: ViteUserConfig;\n deploy: ResolvedFarmDeployConfig;\n docs: FarmDocsResolvedConfig;\n md: FarmMarkdownResolvedConfig;\n mdx: FarmMdxResolvedConfig;\n migrations: ResolvedFarmMigrationsConfig;\n cron: FarmCronResolvedConfig;\n workflows: FarmWorkflowsResolvedConfig;\n env: ResolvedFarmEnv;\n serverActions: ResolvedFarmServerActionsConfig;\n devtools: ResolvedFarmDevtoolsConfig;\n images: ResolvedFarmImageConfig;\n i18n: ResolvedFarmI18nConfig;\n auth: ResolvedFarmAuthConfig;\n routeRules: FarmRouteRules;\n}\n\nexport function hasCustomFarmRouteContext(config: ResolvedFarmConfig): boolean {\n return config[FARM_RESOLVED_CUSTOM_CONTEXT] === true;\n}\n\nexport type FarmLayerConfig = Omit<\n FarmUserConfig,\n | \"root\"\n | \"outDir\"\n | \"distDir\"\n | \"deploy\"\n | \"output\"\n | \"preset\"\n | \"publicDir\"\n | \"generateBuildId\"\n | \"deploymentId\"\n>;\n\nexport { defineConfig, defineFarmConfig } from \"./config-entry\";\n\nexport function normalizeDeployTarget(target?: FarmDeployTarget): FarmDeployTarget | undefined {\n if (!target) return undefined;\n if (target === \"cloudflare-pages\" || target === \"cloudflare_pages\") return \"cloudflare\";\n if (target === \"node-server\" || target === \"nitro\") return \"node\";\n return target;\n}\n\nexport function getPresetForDeployTarget(\n target?: FarmDeployTarget,\n): BaseFarmConfig[\"preset\"] | undefined {\n switch (normalizeDeployTarget(target)) {\n case \"vercel\":\n return \"vercel\";\n case \"cloudflare\":\n return \"cloudflare-pages\";\n case \"netlify\":\n return \"netlify\";\n case \"node\":\n return \"node-server\";\n default:\n return undefined;\n }\n}\n\nexport function getDeployTargetForPreset(preset?: string): FarmDeployTarget | undefined {\n if (!preset) return undefined;\n if (preset === \"vercel\" || preset === \"vercel-edge\") return \"vercel\";\n if (preset === \"cloudflare\" || preset === \"cloudflare-pages\" || preset === \"cloudflare-module\") {\n return \"cloudflare\";\n }\n if (preset === \"netlify\" || preset === \"netlify-edge\") return \"netlify\";\n if (preset === \"node-server\") return \"node\";\n return undefined;\n}\n\nexport function getDefaultDeployOutputDir(\n target: FarmDeployTarget | undefined,\n preset: string | undefined,\n distDir: string,\n): string {\n const normalizedTarget = normalizeDeployTarget(target) || getDeployTargetForPreset(preset);\n if (normalizedTarget === \"vercel\") return \".vercel/output\";\n return `${distDir}/.output`;\n}\n\nexport function resolveDeployOutputPath(root: string, outputDir: string): string {\n return path.isAbsolute(outputDir) ? outputDir : path.join(root, outputDir);\n}\n\nexport function resolveDeployConfig(\n config: Pick<FarmUserConfig, \"deploy\" | \"preset\" | \"distDir\">,\n overrides: {\n target?: FarmDeployTarget;\n preset?: BaseFarmConfig[\"preset\"];\n outputDir?: string;\n } = {},\n): ResolvedFarmDeployConfig {\n const deploy = config.deploy || {};\n const distDir = config.distDir || \".farm\";\n const target = normalizeDeployTarget(overrides.target || deploy.target);\n const preset =\n overrides.preset ||\n deploy.preset ||\n config.preset ||\n getPresetForDeployTarget(target) ||\n \"node-server\";\n const resolvedTarget = target || getDeployTargetForPreset(preset);\n const platformOutput =\n resolvedTarget === \"vercel\"\n ? deploy.vercel?.outputDirectory\n : resolvedTarget === \"cloudflare\"\n ? deploy.cloudflare?.outputDir\n : resolvedTarget === \"netlify\"\n ? deploy.netlify?.outputDir\n : undefined;\n const outputDir =\n overrides.outputDir ||\n deploy.outputDir ||\n deploy.output ||\n platformOutput ||\n getDefaultDeployOutputDir(resolvedTarget, preset, distDir);\n\n return {\n ...deploy,\n target: resolvedTarget,\n preset,\n outputDir,\n };\n}\n\nexport function resolveMigrationsConfig(\n migrations: FarmMigrationsUserConfig | undefined,\n): ResolvedFarmMigrationsConfig {\n if (!migrations) return { commands: [] };\n if (Array.isArray(migrations)) return { commands: migrations };\n return { commands: migrations.commands || [] };\n}\n\nexport const DOCS_CONFIG_FILENAMES = [\n \"docs.config.ts\",\n \"docs.config.tsx\",\n \"docs.config.mts\",\n \"docs.config.cts\",\n \"docs.config.js\",\n \"docs.config.jsx\",\n \"docs.config.mjs\",\n \"docs.config.cjs\",\n \"docs.json\",\n];\n\nfunction normalizeDocsRoute(value: string | undefined, fallback = \"/docs\"): string {\n const raw = (value || fallback).trim();\n if (!raw || raw === \"/\") return \"/\";\n const normalized = raw\n .replace(/\\\\/g, \"/\")\n .replace(/\\/+/g, \"/\")\n .replace(/^\\/?/, \"/\")\n .replace(/\\/+$/, \"\");\n return normalized || \"/\";\n}\n\nfunction docsRouteToEntry(route: string): string {\n const entry = route.replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n return entry || \"docs\";\n}\n\nfunction normalizeDocsContentDir(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const normalized = value.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n return normalized || undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction cloneSerializable(value: unknown, seen = new WeakSet<object>()): any {\n if (value === null) return null;\n\n const valueType = typeof value;\n if (valueType === \"string\" || valueType === \"number\" || valueType === \"boolean\") {\n return value;\n }\n if (valueType === \"undefined\" || valueType === \"function\" || valueType === \"symbol\") {\n return undefined;\n }\n if (Array.isArray(value)) {\n return value.map((item) => cloneSerializable(item, seen)).filter((item) => item !== undefined);\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (isRecord(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n\n const output: Record<string, any> = {};\n for (const [key, nestedValue] of Object.entries(value)) {\n const clonedValue = cloneSerializable(nestedValue, seen);\n if (clonedValue !== undefined) {\n output[key] = clonedValue;\n }\n }\n return output;\n }\n\n return undefined;\n}\n\nfunction sanitizeDocsConfig(config: Partial<DocsConfig>): Partial<DocsConfig> {\n return cloneSerializable(config) || {};\n}\n\nexport async function findDocsConfigPath(\n rootDir: string,\n configPath?: string,\n): Promise<string | undefined> {\n const { existsSync } = await import(\"fs\");\n const root = path.resolve(rootDir || process.cwd());\n\n if (configPath) {\n const resolvedPath = path.isAbsolute(configPath) ? configPath : path.join(root, configPath);\n if (!existsSync(resolvedPath)) {\n throw new Error(`Could not find docs config at ${configPath}.`);\n }\n return path.resolve(resolvedPath);\n }\n\n for (const filename of DOCS_CONFIG_FILENAMES) {\n const resolvedPath = path.join(root, filename);\n if (existsSync(resolvedPath)) {\n return resolvedPath;\n }\n }\n\n return undefined;\n}\n\nexport async function loadDocsConfig(\n rootDir: string,\n configPath?: string,\n): Promise<{ config: Partial<DocsConfig>; configPath: string } | undefined> {\n const fs = await import(\"fs/promises\");\n const { pathToFileURL } = await import(\"url\");\n const root = path.resolve(rootDir || process.cwd());\n const resolvedPath = await findDocsConfigPath(root, configPath);\n\n if (!resolvedPath) return undefined;\n\n try {\n if (resolvedPath.endsWith(\".json\")) {\n const content = await fs.readFile(resolvedPath, \"utf8\");\n return { config: JSON.parse(content), configPath: resolvedPath };\n }\n\n const { build } = await import(\"esbuild\");\n const configCacheDir = path.join(root, \".farm\", \".config-loader\");\n await fs.mkdir(configCacheDir, { recursive: true });\n const modulePath = path.join(\n configCacheDir,\n `docs-config-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`,\n );\n\n await build({\n absWorkingDir: root,\n entryPoints: [resolvedPath],\n outfile: modulePath,\n bundle: true,\n format: \"esm\",\n platform: \"node\",\n target: `node${process.versions.node.split(\".\")[0]}`,\n packages: \"external\",\n jsx: \"automatic\",\n logLevel: \"silent\",\n sourcemap: \"inline\",\n });\n\n const moduleUrl = pathToFileURL(modulePath).href + `?t=${Date.now()}`;\n let importedConfig: any;\n\n try {\n importedConfig = await import(/* @vite-ignore */ moduleUrl);\n } finally {\n await fs.unlink(modulePath).catch(() => undefined);\n }\n\n return {\n config: importedConfig.default || importedConfig,\n configPath: resolvedPath,\n };\n } catch (error: any) {\n const relativePath = path.relative(root, resolvedPath) || resolvedPath;\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load docs config from ${relativePath}: ${message}`);\n }\n}\n\nexport async function resolveDocsConfig(\n userDocs: FarmDocsUserConfig | undefined,\n options: {\n root?: string;\n srcDir?: string;\n } = {},\n): Promise<FarmDocsResolvedConfig> {\n const root = options.root || process.cwd();\n\n if (userDocs === false) {\n return {\n enabled: false,\n entry: \"/docs\",\n config: { entry: \"docs\", docsPath: \"/docs\" },\n };\n }\n\n const docsOptions = isRecord(userDocs) ? userDocs : {};\n if (docsOptions.enabled === false) {\n return {\n enabled: false,\n entry: \"/docs\",\n config: { entry: \"docs\", docsPath: \"/docs\" },\n };\n }\n\n const loadedConfig = await loadDocsConfig(root, docsOptions.configPath);\n const hasExplicitDocsConfig = userDocs === true || isRecord(userDocs);\n\n if (!hasExplicitDocsConfig && !loadedConfig) {\n return {\n enabled: false,\n entry: \"/docs\",\n config: { entry: \"docs\", docsPath: \"/docs\" },\n };\n }\n\n const inlineDocsConfig = sanitizeDocsConfig(docsOptions.config || {});\n const directDocsConfig = sanitizeDocsConfig({\n ...docsOptions,\n enabled: undefined,\n config: undefined,\n configPath: undefined,\n } as Partial<DocsConfig>);\n const loadedDocsConfig = sanitizeDocsConfig(loadedConfig?.config || {});\n const mergedDocsConfig: Partial<DocsConfig> = {\n ...loadedDocsConfig,\n ...inlineDocsConfig,\n ...directDocsConfig,\n };\n\n const explicitRoute = typeof docsOptions.entry === \"string\" ? docsOptions.entry : undefined;\n const configuredDocsPath =\n typeof mergedDocsConfig.docsPath === \"string\" ? mergedDocsConfig.docsPath : undefined;\n const configuredEntry =\n typeof mergedDocsConfig.entry === \"string\" ? mergedDocsConfig.entry : undefined;\n const entryRoute = normalizeDocsRoute(\n configuredDocsPath || explicitRoute || (configuredEntry ? `/${configuredEntry}` : undefined),\n );\n const docsEntry =\n explicitRoute && explicitRoute.startsWith(\"/\")\n ? docsRouteToEntry(explicitRoute)\n : docsRouteToEntry(configuredEntry || entryRoute);\n const contentDir = normalizeDocsContentDir(docsOptions.contentDir || mergedDocsConfig.contentDir);\n\n return {\n enabled: true,\n entry: entryRoute,\n contentDir,\n configPath: loadedConfig?.configPath,\n config: {\n ...mergedDocsConfig,\n entry: docsEntry,\n docsPath: entryRoute,\n ...(contentDir ? { contentDir } : {}),\n },\n };\n}\n\nexport async function resolveConfig(\n userConfig: FarmUserConfig,\n mode: \"development\" | \"production\",\n): Promise<ResolvedFarmConfig> {\n const projectRoot = userConfig.root || process.cwd();\n const layerResolution = await resolveFarmLayers(userConfig, {\n root: projectRoot,\n mode,\n });\n userConfig = layerResolution.config;\n\n const redirects =\n typeof userConfig.redirects === \"function\"\n ? await userConfig.redirects()\n : userConfig.redirects || [];\n\n const rewrites =\n typeof userConfig.rewrites === \"function\"\n ? await userConfig.rewrites()\n : userConfig.rewrites || [];\n\n const headers =\n typeof userConfig.headers === \"function\"\n ? await userConfig.headers()\n : userConfig.headers || [];\n const routeRules = normalizeRouteRules(userConfig.routeRules);\n const routeRuleRedirects = routeRulesToRedirects(routeRules);\n const routeRuleHeaders = routeRulesToHeaders(routeRules);\n\n const deploy = resolveDeployConfig(userConfig);\n const root = userConfig.root || process.cwd();\n const srcDir = userConfig.srcDir || \"src\";\n const docs = await resolveDocsConfig(userConfig.docs, { root, srcDir });\n const md = resolveMarkdownConfig(userConfig.md);\n const mdx = resolveMdxConfig(userConfig.mdx);\n const env = resolveEnv(userConfig.env, process.env);\n setEnv(env);\n const auth = resolveFarmAuthConfig(userConfig.auth);\n if (auth.enabled && userConfig.integrations?.auth) {\n throw new Error(\n \"Choose either the top-level `auth` config or `integrations.auth`; they cannot both own the auth route.\",\n );\n }\n const nativeAuthIntegration = await resolveFarmAuthIntegration(auth, {\n root,\n mode,\n });\n const integrations = nativeAuthIntegration\n ? { ...userConfig.integrations, auth: nativeAuthIntegration }\n : userConfig.integrations || {};\n const generateBuildId = userConfig.generateBuildId || (() => `build-${Date.now()}`);\n const deploymentId = normalizeFarmDeploymentId(\n userConfig.deploymentId ||\n process.env.FARM_DEPLOYMENT_ID ||\n process.env.VERCEL_GIT_COMMIT_SHA ||\n process.env.CF_PAGES_COMMIT_SHA ||\n (mode === \"production\" ? await generateBuildId() : \"development\"),\n );\n\n const resolved: ResolvedFarmConfig = {\n [FARM_RESOLVED_CUSTOM_CONTEXT]: typeof userConfig.context === \"function\",\n root,\n srcDir,\n extends: userConfig.extends || [],\n layers: layerResolution.layers,\n outDir: userConfig.outDir || \"dist\",\n basePath: userConfig.basePath || \"/\",\n preset: deploy.preset || \"node-server\",\n deploy,\n docs,\n md,\n mdx,\n migrations: resolveMigrationsConfig(userConfig.migrations),\n cron: resolveCronConfig(userConfig.cron),\n workflows: resolveWorkflowsConfig(userConfig.workflows),\n observability: userConfig.observability ?? false,\n devtools: resolveFarmDevtoolsConfig(userConfig.devtools, mode),\n storage: userConfig.storage || {},\n cache: userConfig.cache || {},\n auth,\n suppressLintOnLink: userConfig.suppressLintOnLink ?? false,\n experimental: {\n serverComponents: false,\n serverActions: false,\n ...userConfig.experimental,\n },\n plugins: [...resolveIntegrationPlugins(integrations), ...(userConfig.plugins || [])],\n integrations,\n trailingSlash: userConfig.trailingSlash ?? false,\n redirects: () => [...redirects, ...routeRuleRedirects],\n rewrites: () => rewrites,\n headers: () => [...headers, ...routeRuleHeaders],\n routeRules,\n images: resolveFarmImageConfig(userConfig.images),\n publicDir: userConfig.publicDir || \"public\",\n i18n: resolveFarmI18nConfig(userConfig.i18n, { root, mode }),\n openapi: {\n enabled: false,\n route: \"/docs/reference\",\n title: \"API Documentation\",\n description: \"Auto-generated API documentation\",\n version: \"1.0.0\",\n servers: [{ url: \"http://localhost:3000\", description: \"Development server\" }],\n ...userConfig.openapi,\n },\n middleware: userConfig.middleware || {},\n notFound: userConfig.notFound || {},\n context: userConfig.context || (() => undefined),\n serverActions: resolveServerActionsConfig(userConfig.serverActions),\n deploymentId,\n output: userConfig.output || \"standalone\",\n distDir: userConfig.distDir || \".farm\",\n generateBuildId,\n compress: userConfig.compress ?? true,\n devIndicators: {\n buildActivity: true,\n buildActivityPosition: \"bottom-right\",\n ...userConfig.devIndicators,\n },\n serverRuntimeConfig: userConfig.serverRuntimeConfig || {},\n publicRuntimeConfig: userConfig.publicRuntimeConfig || {},\n env,\n typescript: {\n tsconfigPath: \"tsconfig.json\",\n ignoreBuildErrors: false,\n ...userConfig.typescript,\n },\n vite: typeof userConfig.vite === \"function\" ? userConfig.vite({}) : userConfig.vite || {},\n };\n\n return resolved;\n}\n\nexport async function loadConfig(\n rootDir?: string,\n configPath?: string,\n mode = process.env.NODE_ENV === \"production\" ? \"production\" : \"development\",\n loadEnvironment?: (typeof import(\"vite\"))[\"loadEnv\"],\n): Promise<FarmUserConfig | undefined> {\n const { existsSync } = await import(\"fs\");\n const loadEnv = loadEnvironment || (await import(\"vite\")).loadEnv;\n\n const root = rootDir || process.cwd();\n const loadedEnv = loadEnv(mode, root, \"\");\n for (const [key, value] of Object.entries(loadedEnv)) {\n if (process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n const searchPaths = [\n configPath,\n \"farm.config.ts\",\n \"farm.config.mts\",\n \"farm.config.js\",\n \"farm.config.mjs\",\n \"config.ts\",\n \"config.mts\",\n \"config.js\",\n \"config.mjs\",\n ].filter(Boolean) as string[];\n\n for (const relativePath of searchPaths) {\n try {\n // Use path.join for proper path construction\n const absolutePath = relativePath.startsWith(\"/\")\n ? relativePath\n : path.join(root, relativePath);\n\n // Normalize the path to handle any issues\n const normalizedPath = path.resolve(absolutePath);\n\n // Check if file exists before trying to import\n if (!existsSync(normalizedPath)) {\n continue;\n }\n\n const loadedConfig = await loadFarmConfigFile<FarmUserConfig>(normalizedPath, { root });\n return loadedConfig.root === undefined ? { ...loadedConfig, root } : loadedConfig;\n } catch (error: any) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load config from ${relativePath}: ${message}`);\n }\n }\n return undefined;\n}\n","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 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\"].includes(method.toUpperCase());\n}\n","export const DEFAULT_FARM_DEVTOOLS_SHORTCUT = \"mod+shift+.\";\nexport const FARM_DEVTOOLS_PATH = \"/__farm/devtools\";\nexport const FARM_DEVTOOLS_LAUNCH_PARAM = \"__farm_devtools\";\n\nexport interface FarmDevtoolsConfig {\n /** Enable the development-only DevTools UI and runtime endpoints. */\n enabled?: boolean;\n /** Keyboard shortcut used to toggle DevTools, or false to disable the shortcut. */\n shortcut?: string | false;\n}\n\nexport type FarmDevtoolsUserConfig = boolean | FarmDevtoolsConfig;\n\nexport interface ResolvedFarmDevtoolsConfig {\n enabled: boolean;\n shortcut: string | false;\n}\n\nexport function resolveFarmDevtoolsConfig(\n config: FarmDevtoolsUserConfig | ResolvedFarmDevtoolsConfig | undefined,\n mode: \"development\" | \"production\" = \"development\",\n): ResolvedFarmDevtoolsConfig {\n if (mode !== \"development\" || config === false) {\n return { enabled: false, shortcut: false };\n }\n\n const options = config === true || config === undefined ? {} : config;\n const enabled = options.enabled ?? true;\n\n if (!enabled) {\n return { enabled: false, shortcut: false };\n }\n\n const shortcut =\n typeof options.shortcut === \"string\" && options.shortcut.trim()\n ? options.shortcut\n .toLowerCase()\n .split(\"+\")\n .map((part) => part.trim())\n .filter(Boolean)\n .join(\"+\")\n : options.shortcut === false\n ? false\n : DEFAULT_FARM_DEVTOOLS_SHORTCUT;\n\n return { enabled: true, shortcut };\n}\n","export const DEFAULT_FARM_IMAGE_PATH = \"/_farm/image\";\nexport const DEFAULT_FARM_IMAGE_DEVICE_SIZES = [\n 640, 750, 828, 1080, 1200, 1920, 2048, 3840,\n] as const;\nexport const DEFAULT_FARM_IMAGE_SIZES = [16, 32, 48, 64, 96, 128, 256, 384] as const;\nexport const DEFAULT_FARM_IMAGE_QUALITIES = [75] as const;\nexport const DEFAULT_FARM_IMAGE_FORMATS = [\"image/webp\"] as const;\n\nexport type FarmImageFormat = \"image/avif\" | \"image/webp\";\nexport type FarmImageProvider = \"auto\" | \"node\" | \"cloudflare\" | \"none\";\n\nexport interface FarmImageRemotePattern {\n protocol?: \"http\" | \"https\";\n hostname: string;\n port?: string;\n pathname?: string;\n search?: string;\n}\n\nexport interface FarmImageLocalPattern {\n pathname: string;\n search?: string;\n}\n\nexport interface FarmImageConfig {\n /** Runtime optimizer. Auto selects Cloudflare Images on Cloudflare and Sharp elsewhere. */\n provider?: FarmImageProvider;\n /** Public optimizer endpoint. */\n path?: string;\n /** @deprecated Prefer remotePatterns, which also restricts protocol, path, port, and query. */\n domains?: readonly string[];\n remotePatterns?: readonly FarmImageRemotePattern[];\n localPatterns?: readonly FarmImageLocalPattern[];\n deviceSizes?: readonly number[];\n imageSizes?: readonly number[];\n qualities?: readonly number[];\n formats?: readonly FarmImageFormat[];\n minimumCacheTTL?: number;\n maximumResponseBody?: number | string;\n maximumRedirects?: number;\n dangerouslyAllowSVG?: boolean;\n dangerouslyAllowLocalIP?: boolean;\n}\n\nexport interface ResolvedFarmImageConfig {\n provider: FarmImageProvider;\n path: string;\n domains: readonly string[];\n remotePatterns: readonly FarmImageRemotePattern[];\n localPatterns: readonly FarmImageLocalPattern[];\n deviceSizes: readonly number[];\n imageSizes: readonly number[];\n qualities: readonly number[];\n formats: readonly FarmImageFormat[];\n minimumCacheTTL: number;\n maximumResponseBody: number;\n maximumRedirects: number;\n dangerouslyAllowSVG: boolean;\n dangerouslyAllowLocalIP: boolean;\n}\n\nexport type PublicFarmImageConfig = Pick<\n ResolvedFarmImageConfig,\n \"provider\" | \"path\" | \"deviceSizes\" | \"imageSizes\" | \"qualities\" | \"formats\"\n>;\n\nconst SIZE_UNITS: Record<string, number> = {\n b: 1,\n kb: 1_000,\n mb: 1_000_000,\n gb: 1_000_000_000,\n kib: 1_024,\n mib: 1_048_576,\n gib: 1_073_741_824,\n};\n\nexport function resolveFarmImageConfig(\n config: FarmImageConfig | undefined,\n): ResolvedFarmImageConfig {\n const path = normalizeImagePath(config?.path ?? DEFAULT_FARM_IMAGE_PATH);\n const deviceSizes = normalizeIntegerList(\n config?.deviceSizes ?? DEFAULT_FARM_IMAGE_DEVICE_SIZES,\n \"images.deviceSizes\",\n );\n const imageSizes = normalizeIntegerList(\n config?.imageSizes ?? DEFAULT_FARM_IMAGE_SIZES,\n \"images.imageSizes\",\n );\n const qualities = normalizeIntegerList(\n config?.qualities ?? DEFAULT_FARM_IMAGE_QUALITIES,\n \"images.qualities\",\n 100,\n );\n const formats = [...new Set(config?.formats ?? DEFAULT_FARM_IMAGE_FORMATS)];\n\n if (formats.some((format) => format !== \"image/avif\" && format !== \"image/webp\")) {\n throw new TypeError('images.formats only supports \"image/avif\" and \"image/webp\"');\n }\n\n const minimumCacheTTL = normalizeNonNegativeInteger(\n config?.minimumCacheTTL ?? 60,\n \"images.minimumCacheTTL\",\n );\n const maximumRedirects = normalizeNonNegativeInteger(\n config?.maximumRedirects ?? 3,\n \"images.maximumRedirects\",\n );\n\n return Object.freeze({\n provider: config?.provider ?? \"auto\",\n path,\n domains: Object.freeze([\n ...new Set(\n (config?.domains ?? []).map((domain) => domain.trim().toLowerCase()).filter(Boolean),\n ),\n ]),\n remotePatterns: Object.freeze(\n (config?.remotePatterns ?? []).map((pattern) => normalizeRemotePattern(pattern)),\n ),\n localPatterns: Object.freeze(\n (config?.localPatterns ?? [{ pathname: \"/**\" }]).map((pattern) =>\n normalizeLocalPattern(pattern),\n ),\n ),\n deviceSizes: Object.freeze(deviceSizes),\n imageSizes: Object.freeze(imageSizes),\n qualities: Object.freeze(qualities),\n formats: Object.freeze(formats),\n minimumCacheTTL,\n maximumResponseBody: parseSize(\n config?.maximumResponseBody ?? \"10mb\",\n \"images.maximumResponseBody\",\n ),\n maximumRedirects,\n dangerouslyAllowSVG: config?.dangerouslyAllowSVG ?? false,\n dangerouslyAllowLocalIP: config?.dangerouslyAllowLocalIP ?? false,\n });\n}\n\nexport function getPublicFarmImageConfig(\n config: Pick<ResolvedFarmImageConfig, keyof PublicFarmImageConfig>,\n): PublicFarmImageConfig {\n return {\n provider: config.provider,\n path: config.path,\n deviceSizes: config.deviceSizes,\n imageSizes: config.imageSizes,\n qualities: config.qualities,\n formats: config.formats,\n };\n}\n\nfunction normalizeImagePath(value: string): string {\n const path = value.trim().replace(/\\/+$/, \"\") || \"/\";\n if (!path.startsWith(\"/\") || path.includes(\"?\") || path.includes(\"#\")) {\n throw new TypeError(\"images.path must be an absolute pathname without a query or hash\");\n }\n return path;\n}\n\nfunction normalizeIntegerList(values: readonly number[], name: string, max?: number): number[] {\n if (values.length === 0) {\n throw new TypeError(`${name} must contain at least one value`);\n }\n\n const normalized = [...new Set(values)].sort((left, right) => left - right);\n for (const value of normalized) {\n if (!Number.isSafeInteger(value) || value <= 0 || (max !== undefined && value > max)) {\n throw new TypeError(\n `${name} must contain positive integers${max ? ` no greater than ${max}` : \"\"}`,\n );\n }\n }\n return normalized;\n}\n\nfunction normalizeNonNegativeInteger(value: number, name: string): number {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new TypeError(`${name} must be a non-negative safe integer`);\n }\n return value;\n}\n\nfunction parseSize(value: number | string, name: string): number {\n if (typeof value === \"number\") {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new TypeError(`${name} must be a positive safe integer`);\n }\n return value;\n }\n\n const match = value\n .trim()\n .toLowerCase()\n .match(/^(\\d+(?:\\.\\d+)?)\\s*(b|kb|mb|gb|kib|mib|gib)$/);\n if (!match) {\n throw new TypeError(`${name} must be bytes or a size string such as \"5mb\"`);\n }\n\n const bytes = Number(match[1]) * SIZE_UNITS[match[2]];\n if (!Number.isSafeInteger(bytes) || bytes <= 0) {\n throw new TypeError(`${name} must resolve to a positive safe integer`);\n }\n return bytes;\n}\n\nfunction normalizeRemotePattern(pattern: FarmImageRemotePattern): FarmImageRemotePattern {\n const hostname = pattern.hostname.trim().toLowerCase();\n if (!hostname || hostname.includes(\"/\") || hostname.includes(\":\")) {\n throw new TypeError(\"images.remotePatterns[].hostname must be a hostname or wildcard hostname\");\n }\n if (pattern.pathname && !pattern.pathname.startsWith(\"/\")) {\n throw new TypeError(\"images.remotePatterns[].pathname must start with /\");\n }\n if (pattern.search && !pattern.search.startsWith(\"?\")) {\n throw new TypeError(\"images.remotePatterns[].search must start with ?\");\n }\n return Object.freeze({ ...pattern, hostname });\n}\n\nfunction normalizeLocalPattern(pattern: FarmImageLocalPattern): FarmImageLocalPattern {\n if (!pattern.pathname.startsWith(\"/\")) {\n throw new TypeError(\"images.localPatterns[].pathname must start with /\");\n }\n if (pattern.search && !pattern.search.startsWith(\"?\")) {\n throw new TypeError(\"images.localPatterns[].search must start with ?\");\n }\n return Object.freeze({ ...pattern });\n}\n","import path from \"node:path\";\nimport type {\n FarmI18nDetectionSignal,\n FarmI18nDirection,\n FarmI18nUserConfig,\n ResolvedFarmI18nConfig,\n} from \"./types\";\n\nexport const DEFAULT_FARM_I18N_COOKIE = \"farm_locale\";\nexport const DEFAULT_FARM_I18N_COOKIE_MAX_AGE = 60 * 60 * 24 * 365;\n\nconst DEFAULT_DETECTION: readonly FarmI18nDetectionSignal[] = [\"url\", \"cookie\", \"accept-language\"];\n\nexport function resolveFarmI18nConfig(\n input: FarmI18nUserConfig | false | undefined,\n options: { root?: string; mode?: \"development\" | \"production\" } = {},\n): ResolvedFarmI18nConfig {\n const root = options.root || process.cwd();\n const strictByDefault = options.mode === \"production\";\n\n if (!input) {\n return {\n enabled: false,\n locales: [\"en\"],\n defaultLocale: \"en\",\n messages: path.join(root, \"src/messages\"),\n routing: \"none\",\n detection: [],\n fallbackLocale: \"en\",\n strict: strictByDefault,\n cookie: {\n name: DEFAULT_FARM_I18N_COOKIE,\n maxAge: DEFAULT_FARM_I18N_COOKIE_MAX_AGE,\n path: \"/\",\n sameSite: \"lax\",\n secure: options.mode === \"production\",\n },\n direction: {},\n };\n }\n\n if (!Array.isArray(input.locales) || input.locales.length === 0) {\n throw new Error(\"i18n.locales must contain at least one locale.\");\n }\n\n const locales = input.locales.map(canonicalizeLocale);\n if (new Set(locales).size !== locales.length) {\n throw new Error(\"i18n.locales must not contain duplicate locales.\");\n }\n\n const defaultLocale = canonicalizeLocale(input.defaultLocale);\n if (!locales.includes(defaultLocale)) {\n throw new Error(`i18n.defaultLocale \"${defaultLocale}\" must be included in i18n.locales.`);\n }\n\n const fallbackLocale = canonicalizeLocale(input.fallbackLocale || defaultLocale);\n if (!locales.includes(fallbackLocale)) {\n throw new Error(`i18n.fallbackLocale \"${fallbackLocale}\" must be included in i18n.locales.`);\n }\n\n const detection = resolveDetection(input);\n const direction: Record<string, FarmI18nDirection> = {};\n for (const [rawLocale, value] of Object.entries(input.direction || {})) {\n const locale = canonicalizeLocale(rawLocale);\n if (!locales.includes(locale)) {\n throw new Error(`i18n.direction contains unknown locale \"${rawLocale}\".`);\n }\n if (value !== \"ltr\" && value !== \"rtl\") {\n throw new Error(`i18n.direction.${rawLocale} must be \"ltr\" or \"rtl\".`);\n }\n direction[locale] = value;\n }\n\n return {\n enabled: true,\n locales,\n defaultLocale,\n messages: path.resolve(root, input.messages || \"src/messages\"),\n routing: input.routing || \"prefix-except-default\",\n detection,\n fallbackLocale,\n strict: input.strict ?? strictByDefault,\n cookie: {\n name: input.cookie?.name?.trim() || DEFAULT_FARM_I18N_COOKIE,\n maxAge: normalizePositiveInteger(\n input.cookie?.maxAge,\n DEFAULT_FARM_I18N_COOKIE_MAX_AGE,\n \"i18n.cookie.maxAge\",\n ),\n path: input.cookie?.path || \"/\",\n sameSite: input.cookie?.sameSite || \"lax\",\n secure: input.cookie?.secure ?? options.mode === \"production\",\n },\n direction,\n };\n}\n\nexport function resolveFarmI18nMessagePath(\n config: Pick<ResolvedFarmI18nConfig, \"messages\">,\n locale: string,\n): string {\n return config.messages.includes(\"{locale}\")\n ? config.messages.split(\"{locale}\").join(locale)\n : path.join(config.messages, `${locale}.json`);\n}\n\nexport function canonicalizeLocale(locale: string): string {\n if (!locale || typeof locale !== \"string\") {\n throw new Error(\"Farm i18n locales must be non-empty strings.\");\n }\n\n try {\n return Intl.getCanonicalLocales(locale)[0]!;\n } catch {\n throw new Error(`Invalid i18n locale \"${locale}\".`);\n }\n}\n\nfunction resolveDetection(input: FarmI18nUserConfig): readonly FarmI18nDetectionSignal[] {\n if (input.detection === false || input.localeDetection === false) {\n return [\"url\"];\n }\n\n const detection = input.detection || DEFAULT_DETECTION;\n const allowed = new Set<FarmI18nDetectionSignal>([\"url\", \"cookie\", \"accept-language\"]);\n const unique: FarmI18nDetectionSignal[] = [];\n\n for (const signal of detection) {\n if (!allowed.has(signal)) {\n throw new Error(`Unsupported i18n detection signal \"${signal}\".`);\n }\n if (!unique.includes(signal)) unique.push(signal);\n }\n\n return unique;\n}\n\nfunction normalizePositiveInteger(\n value: number | undefined,\n fallback: number,\n name: string,\n): number {\n if (value === undefined) return fallback;\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(`${name} must be a positive integer.`);\n }\n return value;\n}\n","import { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { FarmIntegration } from \"./integrations\";\n\nexport interface FarmAuthEmailAndPasswordConfig {\n /** Require a verified email before creating a session. @default false */\n requireEmailVerification?: boolean;\n /** Smallest accepted password length. @default 8 */\n minPasswordLength?: number;\n /** Largest accepted password length. @default 128 */\n maxPasswordLength?: number;\n}\n\nexport interface FarmAuthSessionConfig {\n /** Session lifetime in seconds. @default 604800 */\n expiresIn?: number;\n /** Session refresh interval in seconds. @default 86400 */\n updateAge?: number;\n}\n\nexport interface FarmAuthDatabaseConfig {\n /**\n * Postgres connection string. Defaults to DATABASE_URL.\n * Local development falls back to SQLite when no URL is present.\n */\n url?: string;\n /** Local SQLite path. @default \".farm/auth.sqlite\" */\n path?: string;\n /** Automatically update the auth schema in development. @default true */\n migrateInDevelopment?: boolean;\n}\n\nexport interface FarmAuthConfig {\n /** Set false to disable auth without removing its configuration. @default true */\n enabled?: boolean;\n /** Display name used by authentication emails and metadata. */\n appName?: string;\n /** Route prefix for the auth endpoints. @default \"/api/auth\" */\n basePath?: string;\n /**\n * Email/password authentication. It is enabled by default; set false to\n * disable it when adding another sign-in method.\n */\n emailAndPassword?: boolean | FarmAuthEmailAndPasswordConfig;\n session?: FarmAuthSessionConfig;\n database?: FarmAuthDatabaseConfig;\n}\n\nexport type FarmAuthUserConfig = boolean | FarmAuthConfig;\n\nexport interface ResolvedFarmAuthConfig {\n enabled: boolean;\n appName?: string;\n basePath: string;\n emailAndPassword: {\n enabled: boolean;\n requireEmailVerification: boolean;\n minPasswordLength: number;\n maxPasswordLength: number;\n };\n session: {\n expiresIn: number;\n updateAge: number;\n };\n database: {\n url?: string;\n path: string;\n migrateInDevelopment: boolean;\n };\n}\n\ninterface FarmAuthRuntimeModule {\n createFarmAuthIntegration(\n config: ResolvedFarmAuthConfig,\n options: {\n root: string;\n mode: \"development\" | \"production\";\n },\n ): FarmIntegration;\n}\n\nexport function resolveFarmAuthConfig(\n input: FarmAuthUserConfig | undefined,\n): ResolvedFarmAuthConfig {\n const config = input === true ? {} : input && typeof input === \"object\" ? input : {};\n const passwordConfig = typeof config.emailAndPassword === \"object\" ? config.emailAndPassword : {};\n\n const resolved: ResolvedFarmAuthConfig = {\n enabled: input !== undefined && input !== false && config.enabled !== false,\n appName: config.appName,\n basePath: normalizeBasePath(config.basePath),\n emailAndPassword: {\n enabled: config.emailAndPassword !== false,\n requireEmailVerification: passwordConfig.requireEmailVerification ?? false,\n minPasswordLength: passwordConfig.minPasswordLength ?? 8,\n maxPasswordLength: passwordConfig.maxPasswordLength ?? 128,\n },\n session: {\n expiresIn: config.session?.expiresIn ?? 60 * 60 * 24 * 7,\n updateAge: config.session?.updateAge ?? 60 * 60 * 24,\n },\n database: {\n url: config.database?.url,\n path: config.database?.path || \".farm/auth.sqlite\",\n migrateInDevelopment: config.database?.migrateInDevelopment ?? true,\n },\n };\n\n validateFarmAuthConfig(resolved);\n return resolved;\n}\n\nexport async function resolveFarmAuthIntegration(\n config: ResolvedFarmAuthConfig,\n options: {\n root: string;\n mode: \"development\" | \"production\";\n },\n): Promise<FarmIntegration | undefined> {\n if (!config.enabled) return undefined;\n\n const root = path.resolve(options.root);\n let modulePath: string;\n try {\n const resolveFromApp = createRequire(path.join(root, \"package.json\"));\n modulePath = resolveFromApp.resolve(\"@farm.js/auth/internal\");\n } catch {\n throw new Error(\n \"The `auth` config requires @farm.js/auth. Install it with `pnpm add @farm.js/auth` and try again.\",\n );\n }\n\n const runtime = (await import(\n /* @vite-ignore */ pathToFileURL(modulePath).href\n )) as FarmAuthRuntimeModule;\n if (typeof runtime.createFarmAuthIntegration !== \"function\") {\n throw new Error(\n \"The installed @farm.js/auth package is incompatible with this version of @farm.js/core.\",\n );\n }\n\n return runtime.createFarmAuthIntegration(config, {\n ...options,\n root,\n });\n}\n\nfunction normalizeBasePath(value: string | undefined): string {\n const route = (value || \"/api/auth\").trim();\n const withLeadingSlash = route.startsWith(\"/\") ? route : `/${route}`;\n const normalized = withLeadingSlash.replace(/\\/+/g, \"/\").replace(/\\/+$/, \"\");\n return normalized || \"/api/auth\";\n}\n\nfunction validateFarmAuthConfig(config: ResolvedFarmAuthConfig): void {\n const { minPasswordLength, maxPasswordLength } = config.emailAndPassword;\n if (!Number.isInteger(minPasswordLength) || minPasswordLength < 1) {\n throw new Error(\"auth.emailAndPassword.minPasswordLength must be a positive integer.\");\n }\n if (!Number.isInteger(maxPasswordLength) || maxPasswordLength < minPasswordLength) {\n throw new Error(\n \"auth.emailAndPassword.maxPasswordLength must be an integer greater than or equal to minPasswordLength.\",\n );\n }\n if (!Number.isInteger(config.session.expiresIn) || config.session.expiresIn < 1) {\n throw new Error(\"auth.session.expiresIn must be a positive integer.\");\n }\n if (!Number.isInteger(config.session.updateAge) || config.session.updateAge < 0) {\n throw new Error(\"auth.session.updateAge must be a non-negative integer.\");\n }\n}\n","import type {\n build as viteBuild,\n createServer as createViteServer,\n loadEnv as viteLoadEnv,\n} from \"vite\";\n\nexport type FarmProductionViteBuilder = \"rollup\" | \"rolldown\";\n\nexport interface FarmProductionViteRuntime {\n build: typeof viteBuild;\n createServer: typeof createViteServer;\n loadEnv: typeof viteLoadEnv;\n builder: FarmProductionViteBuilder;\n}\n\nexport function canUseRolldownForRouteDiscovery(viteConfig: object | undefined): boolean {\n return !viteConfig || Object.keys(viteConfig).length === 0;\n}\n\nexport function supportsRolldownVite(nodeVersion = process.versions.node): boolean {\n const [major = 0, minor = 0] = nodeVersion.split(\".\").map(Number);\n return (major === 20 && minor >= 19) || major > 22 || (major === 22 && minor >= 12);\n}\n\nfunction requestedProductionViteBuilder(): FarmProductionViteBuilder | undefined {\n const requested = process.env.FARM_VITE_BUILDER?.trim().toLowerCase();\n if (!requested) return undefined;\n if (requested === \"rollup\" || requested === \"rolldown\") return requested;\n throw new Error('FARM_VITE_BUILDER must be either \"rolldown\" or \"rollup\"');\n}\n\nasync function loadRollupVite(): Promise<FarmProductionViteRuntime> {\n const runtime = await import(\"vite\");\n return {\n build: runtime.build,\n createServer: runtime.createServer,\n loadEnv: runtime.loadEnv,\n builder: \"rollup\",\n };\n}\n\n/**\n * Prefer Vite's Rolldown-powered production builder on supported Node releases.\n * Vite 5 remains the compatibility path for Node 18, --no-optional installs,\n * and projects that explicitly request Rollup.\n */\nexport async function loadFarmProductionVite(): Promise<FarmProductionViteRuntime> {\n const requested = requestedProductionViteBuilder();\n if (requested === \"rollup\" || !supportsRolldownVite()) {\n if (requested === \"rolldown\") {\n throw new Error(\n \"FARM_VITE_BUILDER=rolldown requires Node 20.19+, Node 22.12+, or a newer release\",\n );\n }\n return loadRollupVite();\n }\n\n try {\n const runtime = (await import(\"vite-rolldown\")) as unknown as typeof import(\"vite\");\n return {\n build: runtime.build,\n createServer: runtime.createServer,\n loadEnv: runtime.loadEnv,\n builder: \"rolldown\",\n };\n } catch (error) {\n if (requested === \"rolldown\") {\n const detail = error instanceof Error ? `: ${error.message}` : \"\";\n throw new Error(\n `FARM_VITE_BUILDER=rolldown was requested, but the optional Vite Rolldown runtime could not be loaded${detail}`,\n );\n }\n return loadRollupVite();\n }\n}\n","import type { RouteSegment, ParsedRoute } from \"./types\";\nimport path from \"path\";\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\n for (const part of pathParts) {\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?|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);\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\nexport function resolveAppPath(root: string, ...paths: string[]): string {\n return path.resolve(root, ...paths);\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 const result: Record<string, string | string[]> = {};\n\n for (const [key, value] of searchParams.entries()) {\n if (key in result) {\n const existing = result[key];\n if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n result[key] = [existing, value];\n }\n } else {\n result[key] = value;\n }\n }\n\n return result;\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoHA,SAAS,sBAA+B;AACtC,aAAO,gCAAc;AAAA,IACnB,YAAQ,cAAAA,SAAa;AAAA,EACvB,CAAC;AACH;AAIA,SAAS,oBAAyC;AAChD,SAAQ,WAAmE,kBAAkB;AAC/F;AAEA,SAAS,mBAAmB,SAA2B;AACrD,EAAC,WAAmE,kBAAkB,IAAI;AAC1F,SAAO;AACT;AAEA,SAAS,yBAAkC;AACzC,QAAM,WAAW,kBAAkB;AACnC,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,SAAO,mBAAmB,oBAAoB,CAAC;AACjD;AAIA,SAAS,kBAAkB,MAAuB;AAChD,UAAQ,QAAQ,IACb,KAAK,EACL,QAAQ,sBAAsB,EAAE,EAChC,QAAQ,WAAW,GAAG;AAC3B;AAEA,SAAS,iBAAiB,OAAiC;AACzD,SACE,CAAC,CAAC,SACF,OAAO,UAAU,YACjB,OAAQ,MAAiB,YAAY,cACrC,OAAQ,MAAiB,YAAY;AAEzC;AAEA,SAAS,kBAAkB,OAAkC;AAC3D,SACE,CAAC,CAAC,SACF,OAAO,UAAU,YACjB,OAAQ,MAAkB,UAAU,cACpC,OAAQ,MAAkB,aAAa;AAE3C;AAEA,SAAS,gBAAgB,OAA4C;AACnE,SACE,CAAC,CAAC,SACF,OAAO,UAAU,YAChB,MAA4B,SAAS,yBACtC,OAAQ,MAA4B,kBAAkB,cACtD,OAAQ,MAA4B,kBAAkB;AAE1D;AAEA,SAAS,qBAAqB,MAAqD;AACjF,SAAO,QAAQ;AACjB;AAEA,SAAS,qBAAqB,QAAkE;AAC9F,QAAM,SAAS;AACf,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA,WAAW;AAAA,IACX,GAAG;AAAA,EACL,IAAI;AACJ,QAAM,mBAAmB,OAAO,KAAK,aAAa,EAAE,SAAS;AAE7D,MAAI,WAAW,OAAO,YAAY,YAAY,CAAC,MAAM,QAAQ,OAAO,GAAG;AACrE,WAAO,mBAAmB,EAAE,GAAG,eAAe,GAAG,QAAQ,IAAI;AAAA,EAC/D;AAEA,MAAI,kBAAkB;AACpB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAe,kBACb,MACA,SACiB;AACjB,QAAM,aAAa,gCAAe,IAAI;AAEtC,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,+BAA+B,IAAI,IAAI;AAAA,EACzD;AAEA,QAAMC,UAAU,MAAM,WAAW,UAAU;AAC3C,SAAOA,QAAO,QAAQ,OAAO;AAC/B;AAEA,eAAe,mBAAmB,QAAoD;AACpF,QAAM,iBAAiB,oBAAoB,OAAO,MAAuC;AACzF,QAAM,CAAC,EAAE,eAAe,GAAG,iBAAiB,eAAe,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC/E,WAAiC,KAAK;AAAA,IACtC,eAAe,KAAK;AAAA,IACpB,WAAmD,uBAAuB;AAAA,EAC5E,CAAC;AAED,QAAM,WAAW,eAAe,gBAAgB,QAAQ,qBAAqB,MAAM,KAAK,CAAC,CAAC,CAAC;AAC3F,SAAO,gBAAgB,QAAQ;AAAA,IAC7B;AAAA,IACA,WAAW,OAAO;AAAA,EACpB,CAAC;AACH;AAEA,eAAe,cAAc,QAAkD;AAC7E,MAAI,UAAU,gBAAgB,MAAM,GAAG;AACrC,WAAO,OAAO,cAAc;AAAA,EAC9B;AAEA,QAAM,cAAc,QAAQ,UAAU;AAEtC,MAAI,OAAO,gBAAgB,YAAY;AACrC,WAAO,MAAM,YAAY;AAAA,EAC3B;AAEA,MAAI,iBAAiB,WAAW,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,MAAI,qBAAqB,WAAW,GAAG;AACrC,WAAO,mBAAmB,MAAmC;AAAA,EAC/D;AAEA,MAAI,gBAAgB,SAAS;AAC3B,WAAO,kBAAkB,WAAW,qBAAqB,MAAgC,CAAC;AAAA,EAC5F;AAEA,SAAO;AAAA,IACL;AAAA,IACA,qBAAqB,MAAiC;AAAA,EACxD;AACF;AAEA,SAAS,gCAAgCC,gBAAkD;AACzF,MAAI;AACJ,MAAI;AAEJ,QAAM,eAAe,mCAAY;AAC/B,sCAAkB,QAAQ,QAAQA,eAAc,CAAC;AACjD,WAAO;AAAA,EACT,GAHqB;AAKrB,QAAM,gBAAgB,mCAAY;AAChC,wCAAmB,aAAa,EAAE;AAAA,MAAK,CAAC,eACtC,gCAAc;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT,GAPsB;AAStB,QAAM,SAAS;AAAA,IACb,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe;AAAA,IACf,eAAe;AAAA,EACjB;AAEA,SAAO,IAAI,MAAM,QAA6B;AAAA,IAC5C,IAAI,eAAe,MAAM,UAAU;AACjC,UAAI,SAAS,QAAQ;AACnB,eAAO;AAAA,MACT;AAEA,UAAI,QAAQ,IAAI,eAAe,IAAI,GAAG;AACpC,eAAO,QAAQ,IAAI,eAAe,MAAM,QAAQ;AAAA,MAClD;AAEA,aAAO,IAAI,SACT,cAAc,EAAE,KAAK,OAAO,YAAY;AACtC,cAAM,SAAS,QAAQ,IAAI,SAAmB,IAAI;AAElD,YAAI,OAAO,WAAW,YAAY;AAChC,iBAAO;AAAA,QACT;AAEA,cAAM,SAAS,QAAQ,MAAM,QAAQ,SAAS,IAAI;AAElD,YAAI,SAAS,WAAW;AACtB,iBAAO,QAAQ,QAAQ,MAAM,EAAE,QAAQ,MAAM;AAC3C,6BAAiB;AAAA,UACnB,CAAC;AAAA,QACH;AAEA,eAAO;AAAA,MACT,CAAC;AAAA,IACL;AAAA,EACF,CAAC;AACH;AAEO,SAAS,oBAAoBA,gBAAkD;AACpF,SAAO,gCAAgCA,cAAa;AACtD;AAEO,SAAS,oBAAoB,QAAoD;AACtF,SAAO,oBAAoB,MAAM,cAAc,MAAM,CAAC;AACxD;AAEO,SAAS,cACd,QACmB;AACnB,SAAO,oBAAoB,MAAO,OAAO,WAAW,aAAa,OAAO,IAAI,MAAO;AACrF;AAEO,SAAS,gBACd,UACA,UAAkC,CAAC,GAChB;AACnB,SAAO,oBAAoB,YAAY;AACrC,UAAM,kBACJ,MAAM,WAAmD,uBAAuB;AAClF,WAAO,gBAAgB,QAAQ;AAAA,MAC7B;AAAA,MACA,WAAW,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,gBAAmC;AACjD,SAAO,oBAAoB,EAAE,QAAQ,SAAS,CAAC;AACjD;AAEO,SAAS,aAAa,UAAwD,CAAC,GAAG;AACvF,SAAO,oBAAoB;AAAA,IACzB,QAAQ;AAAA,IACR,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,cAAc,SAAoD;AAChF,SAAO,oBAAoB;AAAA,IACzB,QAAQ;AAAA,IACR,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,aAAa,SAAoD;AAC/E,SAAO,oBAAoB;AAAA,IACzB,QAAQ;AAAA,IACR,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,cAAc,SAAoD;AAChF,SAAO,aAAa,OAAO;AAC7B;AAEO,SAAS,gBAAgB,SAAoD;AAClF,SAAO,oBAAoB;AAAA,IACzB,QAAQ;AAAA,IACR,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,UAAU,SAAoD;AAC5E,SAAO,gBAAgB,OAAO;AAChC;AAEO,SAAS,cAAc,SAAoD;AAChF,SAAO,oBAAoB;AAAA,IACzB,QAAQ;AAAA,IACR,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,mBAAmB,SAAoD;AACrF,SAAO,oBAAoB;AAAA,IACzB,QAAQ;AAAA,IACR,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,cAAc,SAAoD;AAChF,SAAO,oBAAoB;AAAA,IACzB,QAAQ;AAAA,IACR,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,aACd,SACA;AACA,SAAO,oBAAoB;AAAA,IACzB,QAAQ;AAAA,IACR,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,UACd,SACA;AACA,SAAO,oBAAoB;AAAA,IACzB,QAAQ;AAAA,IACR,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,eACd,SACA;AACA,SAAO,oBAAoB;AAAA,IACzB,QAAQ;AAAA,IACR,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,eACd,SACA;AACA,SAAO,oBAAoB;AAAA,IACzB,QAAQ;AAAA,IACR,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,oBACd,SACA;AACA,SAAO,oBAAoB;AAAA,IACzB,QAAQ;AAAA,IACR,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,gBACd,SACA;AACA,SAAO,oBAAoB;AAAA,IACzB,QAAQ;AAAA,IACR,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,kBACd,SACA;AACA,SAAO,oBAAoB;AAAA,IACzB,QAAQ;AAAA,IACR,GAAG;AAAA,EACL,CAAC;AACH;AAEA,eAAe,gBAAgB,SAAkB,QAA2C;AAC1F,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,aAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,MAAM,GAAG;AACnD,YAAQ,MAAM,kBAAkB,IAAI,GAAG,MAAM,cAAc,MAAM,CAAC;AAAA,EACpE;AACF;AAEA,eAAsB,kBAAkB,SAAgC,CAAC,GAAqB;AAC5F,MAAI,kBAAkB,MAAM,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,gBAAgB,MAAM,GAAG;AAC3B,WAAO,OAAO,cAAc;AAAA,EAC9B;AAEA,QAAM,aAAa,gBAAgB,OAAO,MAAM,IAAI,OAAO,SAAS;AACpE,QAAM,cAAU,gCAAc;AAAA,IAC5B,QAAQ,MAAM,cAAc,UAAU;AAAA,EACxC,CAAC;AAED,QAAM,gBAAgB,SAAS,OAAO,MAAM;AAC5C,SAAO;AACT;AAEA,eAAsB,4BACpB,QAC8B;AAC9B,MAAI,CAAC,UAAU,kBAAkB,MAAM,KAAK,gBAAgB,MAAM,GAAG;AACnE,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO;AACtB,MAAI,CAAC,UAAU,kBAAkB,MAAM,KAAK,gBAAgB,MAAM,GAAG;AACnE,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,WAAW,aAAa,MAAM,OAAO,IAAI;AACzD;AAEA,eAAsB,YAAY,SAAgC,CAAC,GAAqB;AACtF,kBAAgB,uBAAuB;AACvC,QAAM,cAAc,MAAM,kBAAkB,MAAM;AAClD,QAAM,kBAAkB;AACxB,kBAAgB,mBAAmB,WAAW;AAE9C,MAAI,oBAAoB,aAAa;AACnC,UAAM,gBAAgB,QAAQ,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAChD;AAEA,SAAO;AACT;AAEO,SAAS,WAAW,WAA6B;AACtD,kBAAgB,uBAAuB;AACvC,QAAM,OAAO,kBAAkB,SAAS;AACxC,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,QAAM,iBAAa,gCAAc,eAAe,IAAI;AACpD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,QAAQ;AACZ,YAAM,OAAO,MAAM,WAAW,QAAQ;AACtC,YAAM,QAAQ,IAAI,KAAK,IAAI,CAAC,QAAQ,WAAW,WAAW,GAAG,CAAC,CAAC;AAAA,IACjE;AAAA,EACF;AACF;AAEA,eAAsB,iBAAgC;AACpD,kBAAgB,uBAAuB;AACvC,QAAM,kBAAkB;AACxB,kBAAgB,mBAAmB,oBAAoB,CAAC;AACxD,QAAM,gBAAgB,QAAQ,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AAChD;AAtiBA,sBAGA,eA+CM,YAEA,qBAsEA,oBAmBF;AA7IJ;AAAA;AAAA;AAAA,uBAAqF;AAGrF,oBAAyB;AA+CzB,IAAM,aAA2B,wBAAC,cAAc;AAAA;AAAA,MAA0B;AAAA,OAAzC;AAEjC,IAAM,sBAKF;AAAA,MACF,QAAQ;AAAA,QACN,WAAW;AAAA,QACX,MAAM,6BAAM,WAAW,4BAA4B,GAA7C;AAAA,MACR;AAAA,MACA,eAAe;AAAA,QACb,WAAW;AAAA,QACX,MAAM,6BAAM,WAAW,4BAA4B,GAA7C;AAAA,MACR;AAAA,MACA,SAAS;AAAA,QACP,WAAW;AAAA,QACX,MAAM,6BAAM,WAAW,wBAAwB,GAAzC;AAAA,MACR;AAAA,MACA,kBAAkB;AAAA,QAChB,WAAW;AAAA,QACX,MAAM,6BAAM,WAAW,+BAA+B,GAAhD;AAAA,MACR;AAAA,MACA,UAAU;AAAA,QACR,WAAW;AAAA,QACX,MAAM,6BAAM,WAAW,2BAA2B,GAA5C;AAAA,MACR;AAAA,MACA,YAAY;AAAA,QACV,WAAW;AAAA,QACX,MAAM,6BAAM,WAAW,2BAA2B,GAA5C;AAAA,MACR;AAAA,MACA,IAAI;AAAA,QACF,WAAW;AAAA,QACX,MAAM,6BAAM,WAAW,2BAA2B,GAA5C;AAAA,MACR;AAAA,MACA,OAAO;AAAA,QACL,WAAW;AAAA,QACX,MAAM,6BAAM,WAAW,uBAAuB,GAAxC;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,QACN,WAAW;AAAA,QACX,MAAM,6BAAM,WAAW,uBAAuB,GAAxC;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,QACN,WAAW;AAAA,QACX,MAAM,6BAAM,WAAW,uBAAuB,GAAxC;AAAA,MACR;AAAA,MACA,aAAa;AAAA,QACX,WAAW;AAAA,QACX,MAAM,6BAAM,WAAW,4BAA4B,GAA7C;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,QACN,WAAW;AAAA,QACX,MAAM,6BAAM,WAAW,4BAA4B,GAA7C;AAAA,MACR;AAAA,MACA,eAAe;AAAA,QACb,WAAW;AAAA,QACX,MAAM,6BAAM,WAAW,4BAA4B,GAA7C;AAAA,MACR;AAAA,MACA,eAAe;AAAA,QACb,WAAW;AAAA,QACX,MAAM,6BAAM,WAAW,4BAA4B,GAA7C;AAAA,MACR;AAAA,IACF;AAES;AAMT,IAAM,qBAAqB,uBAAO,IAAI,uBAAuB;AAEpD;AAIA;AAKA;AAQT,IAAI,gBAAgB,uBAAuB;AAElC;AAOA;AASA;AASA;AAUA;AAIA;AAuBM;AAcA;AAeA;AA6BN;AAyDO;AAIA;AAIA;AAMA;AAcA;AAIA;AAOA;AAOA;AAOA;AAIA;AAOA;AAIA;AAOA;AAOA;AAOA;AASA;AASA;AASA;AASA;AASA;AASA;AASD;AAUO;AAkBA;AAeA;AAaN;AAiBM;AAAA;AAAA;;;ACjiBtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAqGA,eAAsB,qBAIpB,SACiD;AACjD,QAAM,CAAC,QAAQ,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,IACzC,iCAAiC,QAAQ,MAAM;AAAA,IAC/C,mCAAmC,OAAO;AAAA,EAC5C,CAAC;AAED,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,2BAA2B;AACzE,SAAO,qBAAqB;AAAA,IAC1B;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,mCACpB,SACwC;AACxC,MAAI,QAAQ,WAAW,QAAW;AAChC,WAAO,OAAO,QAAQ,WAAW,aAC7B,MAAO,QAAQ,OAAyC,IACxD,QAAQ;AAAA,EACd;AAEA,SAAO,4BAA4B,QAAQ,WAAW,QAAQ,QAAQ,OAAO;AAC/E;AAEA,eAAsB,iCACpB,QACmC;AACnC,QAAM,MAAM,MAAM,OAAO,mBAAmB;AAC5C,QAAM,SAA6C,CAAC;AAEpD,aAAW,CAAC,UAAU,WAAW,KAAK,OAAO,QAAQ,OAAO,MAAM,GAAG;AACnE,WAAO,QAAQ,IAAI,IAAI,MAAM;AAAA,MAC3B,OAAO,YAAY,QAAQ;AAAA,MAC3B,QAAQ,qBAAqB,KAAK,WAAW;AAAA,MAC7C,aAAa,0BAA0B,WAAW;AAAA,MAClD,aAAa,YAAY;AAAA,IAC3B,CAAC;AAAA,EACH;AAEA,SAAO,IAAI,aAAa,MAAM;AAChC;AAEA,SAAS,qBACP,KACA,aACiC;AACjC,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,YAAY,MAAM,EAAE,IAAI,CAAC,CAAC,UAAU,WAAW,MAAM;AAAA,MAClE;AAAA,MACA,eAAe,KAAK,UAAU,WAAW;AAAA,IAC3C,CAAC;AAAA,EACH;AACF;AAEA,SAAS,eACP,KACA,UACA,OACiB;AACjB,MAAI,UAAU,sBAAsB,KAAK,UAAU,KAAK;AAExD,MAAI,MAAM,QAAQ;AAChB,cAAU,QAAQ,OAAO;AAAA,EAC3B;AAEA,MAAI,MAAM,YAAY,MAAM,aAAa,OAAO;AAC9C,cAAU,QAAQ,SAAS;AAAA,EAC7B;AAEA,MAAI,MAAM,YAAY,QAAW;AAC/B,cACE,MAAM,SAAS,cAAc,MAAM,YAAY,QAC3C,QAAQ,WAAW,IACnB,QAAQ,QAAQ,MAAM,OAAgB;AAAA,EAC9C;AAEA,MAAI,MAAM,WAAW;AACnB,cAAU,QAAQ,WAAW,GAAG,MAAM,UAAU,KAAK,IAAI,MAAM,UAAU,KAAK,EAAE;AAAA,EAClF;AAEA,MAAI,MAAM,QAAQ,MAAM,SAAS,UAAU;AACzC,cAAU,QAAQ,IAAI,MAAM,IAAI;AAAA,EAClC;AAEA,MAAI,MAAM,aAAa;AACrB,cAAU,QAAQ,SAAS,MAAM,WAAW;AAAA,EAC9C;AAEA,SAAO;AACT;AAEA,SAAS,sBACP,KACA,UACA,OACiB;AACjB,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,IAAI,GAAG;AAAA,IAChB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,IAAI,OAAO;AAAA,IACpB,KAAK;AACH,aAAO,IAAI,QAAQ;AAAA,IACrB,KAAK;AACH,aAAO,IAAI,QAAQ;AAAA,IACrB,KAAK;AACH,aAAO,IAAI,QAAQ;AAAA,IACrB,KAAK;AACH,aAAO,IAAI,SAAS;AAAA,IACtB,KAAK;AACH,aAAO,IAAI,KAAK;AAAA,IAClB,KAAK,QAAQ;AACX,UAAI,CAAC,MAAM,QAAQ,QAAQ;AACzB,cAAM,IAAI,MAAM,kCAAkC,QAAQ,uBAAuB;AAAA,MACnF;AAEA,aAAO,IAAI,YAAY,MAAM,MAAwC;AAAA,IACvE;AAAA,IACA;AACE,YAAM,IAAI;AAAA,QACR,8CAA8C,MAAM,IAAI,UAAU,QAAQ;AAAA,MAC5E;AAAA,EACJ;AACF;AAEA,SAAS,0BAA0B,aAAyC;AAC1E,QAAM,SAAgD,CAAC;AACvD,QAAM,UAAiD,CAAC;AAExD,aAAW,cAAc,YAAY,eAAe,CAAC,GAAG;AACtD,QAAI,CAAC,WAAW,OAAO,QAAQ;AAC7B;AAAA,IACF;AAEA,UAAM,SAAS,WAAW;AAC1B,QAAI,WAAW,SAAS,UAAU;AAChC,aAAO,KAAK,MAAM;AAAA,IACpB,OAAO;AACL,cAAQ,KAAK,MAAM;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AArQA;AAAA;AAAA;AAeA;AAsFsB;AAwBA;AAYA;AAkBb;AAYA;AAqCA;AAoCA;AAAA;AAAA;;;AChPT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACqDO,SAAS,8BAOd,WAIyE;AACzE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,GAAG;AAAA,EACL;AACF;AAhBgB;;;ACtChB,IAAM,4BAA4B,uBAAO,IAAI,0BAA0B;AAMvE,SAAS,yBAAyB;AAChC,QAAMC,eAAc;AACpB,MAAI,CAACA,aAAY,yBAAyB,GAAG;AAC3C,IAAAA,aAAY,yBAAyB,IAAI,oBAAI,QAG3C;AAAA,EACJ;AAEA,SAAOA,aAAY,yBAAyB;AAC9C;AAVS;AAYT,SAAS,UAAU,QAAqD;AACtE,QAAM,sBAAsB,uBAAuB;AACnD,MAAI,SAAS,oBAAoB,IAAI,MAAM;AAC3C,MAAI,CAAC,QAAQ;AACX,aAAS;AAAA,MACP,aAAa,oBAAI,IAAiB;AAAA,MAClC,aAAa,oBAAI,IAAiB;AAAA,IACpC;AACA,wBAAoB,IAAI,QAAQ,MAAM;AAAA,EACxC;AACA,SAAO;AACT;AAXS;AAaF,SAAS,kBACd,QACA,KACA,OACA,UAAoC,CAAC,GAC/B;AACN,QAAM,SAAS,UAAU,MAAM;AAC/B,SAAO,YAAY,IAAI,KAAK,KAAK;AACjC,MAAI,QAAQ,cAAc;AACxB,WAAO,YAAY,IAAI,KAAK,KAAK;AAAA,EACnC;AACF;AAXgB;AAaT,SAAS,kBACd,QACA,KACe;AACf,QAAM,sBAAsB,uBAAuB;AACnD,QAAM,SAAS,oBAAoB,IAAI,MAAM;AAC7C,SAAO,QAAQ,YAAY,IAAI,GAAG;AACpC;AAPgB;AAST,SAAS,kBAAkB,QAA+B,KAAsB;AACrF,QAAM,sBAAsB,uBAAuB;AACnD,QAAM,SAAS,oBAAoB,IAAI,MAAM;AAC7C,SAAO,QAAQ,YAAY,IAAI,GAAG,KAAK;AACzC;AAJgB;AAMT,SAAS,qBAAqB,QAA+B,KAAsB;AACxF,QAAM,sBAAsB,uBAAuB;AACnD,QAAM,SAAS,oBAAoB,IAAI,MAAM;AAC7C,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,iBAAiB,OAAO,YAAY,OAAO,GAAG;AACpD,SAAO,YAAY,OAAO,GAAG;AAC7B,SAAO;AACT;AAPgB;AAST,SAAS,oBAAoB,QAAqC;AACvE,QAAM,sBAAsB,uBAAuB;AACnD,QAAM,SAAS,oBAAoB,IAAI,MAAM;AAC7C,MAAI,CAAC,OAAQ;AACb,SAAO,YAAY,MAAM;AACzB,SAAO,YAAY,MAAM;AAC3B;AANgB;AAQT,SAAS,0BACd,QACA,UAAyC,CAAC,GACxB;AAClB,QAAM,sBAAsB,uBAAuB;AACnD,QAAM,SAAS,oBAAoB,IAAI,MAAM;AAC7C,MAAI,CAAC,OAAQ,QAAO,oBAAI,IAAiB;AACzC,MAAI,QAAQ,aAAa;AACvB,WAAO,IAAI,IAAI,OAAO,WAAW;AAAA,EACnC;AACA,SAAO,IAAI,IAAI,OAAO,WAAW;AACnC;AAXgB;;;AC3FhB,yBAAqB;AAGrB,eAAsB,gBAAgB,KAAqB,UAAmC;AAC5F,MAAI,aAAa,SAAS;AAE1B,QAAM,kBAAkB,SAAS;AAGjC,QAAM,aAAa,gBAAgB,eAAe,KAAK,CAAC;AACxD,MAAI,WAAW,SAAS,GAAG;AACzB,QAAI,UAAU,cAAc,UAAU;AAAA,EACxC;AAEA,WAAS,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AACvC,QAAI,IAAI,YAAY,MAAM,gBAAgB,WAAW,SAAS,GAAG;AAC/D;AAAA,IACF;AACA,QAAI,UAAU,KAAK,KAAK;AAAA,EAC1B,CAAC;AAED,MAAI,CAAC,SAAS,MAAM;AAClB,QAAI,IAAI;AACR;AAAA,EACF;AAEA,MAAI,OAAO,IAAI,UAAU,YAAY;AACnC,UAAM,OAAO,MAAM,SAAS,YAAY;AACxC,QAAI,IAAI,OAAO,KAAK,IAAI,CAAC;AACzB;AAAA,EACF;AAEA,QAAM,SAAS,SAAS,KAAK,UAAU;AAEvC,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,MAAM;AACR;AAAA,MACF;AAEA,UAAI,CAAC,SAAS,MAAM,eAAe,GAAG;AACpC;AAAA,MACF;AAEA,UAAI,CAAC,IAAI,MAAM,KAAK,GAAG;AACrB,kBAAM,yBAAK,KAAK,OAAO;AAAA,MACzB;AAAA,IACF;AAEA,QAAI,IAAI;AAAA,EACV,SAAS,OAAO;AACd,QAAI,CAAC,IAAI,eAAe;AACtB,YAAM,gBAAgB,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAC9E,UAAI,OAAO,IAAI,YAAY,YAAY;AACrC,YAAI,QAAQ,aAAa;AAAA,MAC3B,OAAO;AACL,YAAI,IAAI;AAAA,MACV;AAAA,IACF;AACA,UAAM;AAAA,EACR,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AACF;AA7DsB;;;ACoHf,IAAM,iDAAiD;AAiW9D,IAAM,yCAAyC,uBAAO;AAAA,EACpD;AACF;AAkCA,SAAS,4BASP,QACAC,OACA,OACuF;AACvF,SAAO;AAAA,IACL,MAAAA;AAAA,IACA;AAAA,IACA,YAAY,MAAM;AAAA,IAClB,QAAQ,MAAM;AAAA,IACd,OAAO,MAAM;AAAA,IACb,SAAS,MAAM;AAAA,IACf,YAAY,MAAM;AAAA,IAClB,OAAO,sCAAsC,KAAK;AAAA,IAClD,SAAS,MAAM;AAAA,IACf,aAAa,8BAA0E;AAAA,MACrF,MAAAA;AAAA,MACA;AAAA,MACA,YAAY,MAAM;AAAA,MAClB,gBAAgB,MAAM;AAAA,MACtB,SAAS,MAAM;AAAA,MACf,aAAa,MAAM;AAAA,MACnB,UAAU,MAAM;AAAA,IAClB,CAAC;AAAA,EACH;AACF;AAjCS;AAuIT,SAAS,gCAEiC;AACxC,SAAO;AAAA,IACL,IACEA,OACA,OACA;AACA,aAAO;AAAA,QACL;AAAA,QACAA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAMEA,OAAa,OAAwE;AACrF,aAAO;AAAA,QACL;AAAA,QACAA;AAAA,QACA;AAAA,UACE,YAAY;AAAA,UACZ,GAAG;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAAA,IACA,IAMEA,OAAa,OAAwE;AACrF,aAAO;AAAA,QACL;AAAA,QACAA;AAAA,QACA;AAAA,UACE,YAAY;AAAA,UACZ,GAAG;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAMEA,OAAa,OAAwE;AACrF,aAAO,4BAQL,SAASA,OAAM;AAAA,QACf,YAAY;AAAA,QACZ,GAAG;AAAA,MACL,CAAC;AAAA,IACH;AAAA,IACA,OAMEA,OAAa,OAAwE;AACrF,aAAO,4BAQL,UAAUA,OAAM;AAAA,QAChB,YAAY;AAAA,QACZ,GAAG;AAAA,MACL,CAAC;AAAA,IACH;AAAA,IACA,QAMEA,OACA,OACA;AACA,aAAO,4BAQL,WAAWA,OAAM,KAAK;AAAA,IAC1B;AAAA,IACA,KAMEA,OACA,OACA;AACA,aAAO;AAAA,QACL;AAAA,QACAA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAzHS;AAiIF,IAAM,mBAAmB,8BAAyC;AASzE,IAAM,mCAAmC,uBAAO,IAAI,iCAAiC;AACrF,IAAM,qCAAqC,uBAAO,IAAI,mCAAmC;AAazF,SAAS,gCAAgC;AACvC,QAAMC,eAAc;AACpB,MAAI,CAACA,aAAY,gCAAgC,GAAG;AAClD,IAAAA,aAAY,gCAAgC,IAAI,oBAAI,IAA0C;AAAA,EAChG;AAEA,SAAOA,aAAY,gCAAgC;AACrD;AAPS;AA8PF,SAAS,kBAAkB,OAA0C;AAC1E,SACE,CAAC,CAAC,SAAS,OAAO,UAAU,YAAa,MAA0B,SAAS;AAEhF;AAJgB;AAMT,SAAS,0BACd,cACc;AACd,MAAI,CAAC,cAAc;AACjB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAwB,CAAC;AAC/B,aAAW,CAAC,KAAK,WAAW,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC7D,QAAI,CAAC,eAAe,CAAC,kBAAkB,WAAW,GAAG;AACnD;AAAA,IACF;AAEA,YAAQ,KAAK,wBAAwB,KAAK,WAAW,CAAC;AAEtD,QAAI,YAAY,SAAS,QAAQ;AAC/B,cAAQ,KAAK,GAAG,YAAY,OAAO;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AACT;AArBgB;AAmOhB,SAAS,2BAA+D;AACtE,SAAO,OAAO,YAAY,cAAc,QAAQ,MAAM,CAAC;AACzD;AAFS;AAIT,SAAS,8BACP,OACmD;AACnD,SACE,CAAC,CAAC,SACF,OAAO,UAAU,aAChB,YAAY,SACX,SAAS,SACT,cAAc,SACd,WAAW,SACX,aAAa;AAEnB;AAZS;AAcT,SAAS,4BAA4B,SAAkB,MAAwB;AAC7E,MAAI,SAAS,QAAW;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,+BAA+B,OAAO,KAAK,+BAA+B,IAAI,GAAG;AACnF,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA,EACF;AAEA,SAAO;AACT;AAbS;AAeT,SAAS,+BAA+B,OAAkD;AACxF,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACrE;AAFS;AAIT,eAAe,6BACb,OACA,SAC6B;AAC7B,MAAI,OAAO,UAAU,YAAY;AAC/B,WAAQ,MAA0E,OAAO;AAAA,EAC3F;AAEA,SAAO;AACT;AATe;AAWf,SAAS,4BACPC,MACoC;AACpC,MAAI,CAACA,MAAK;AACR,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,yBAAyB;AAC5C,QAAM,SAAiC,CAAC;AAExC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQA,IAAG,GAAG;AAC9C,UAAM,WAAW,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AACtD,UAAM,QAAQ,SAAS,IAAI,CAAC,SAAS,WAAW,IAAI,CAAC,EAAE,KAAK,CAAC,UAAU,UAAU,MAAS;AAC1F,QAAI,UAAU,QAAW;AACvB,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;AAnBS;AAqBT,eAAe,6BACb,aACA,QACA,OACkB;AAClB,QAAM,SAAS,OAAO,kBAAkB,OAAO;AAC/C,MAAI,QAAQ;AACV,UAAM,SAAS,MAAM,OAAO,KAAK,QAAQ,KAAK;AAC9C,QAAI,OAAO,SAAS;AAClB,aAAO,OAAO;AAAA,IAChB;AAEA,UAAM,uCAAuC,aAAa,OAAO,KAAK;AAAA,EACxE;AAEA,MAAI,OAAO,WAAW,GAAG,UAAU;AACjC,UAAM,SAAS,MAAM,OAAO,WAAW,EAAE,SAAS,KAAK;AACvD,QAAI,WAAW,QAAQ;AACrB,aAAO,OAAO;AAAA,IAChB;AAEA,UAAM,uCAAuC,aAAa;AAAA,MACxD,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,OAAO;AAChB,QAAI;AACF,aAAO,MAAM,OAAO,MAAM,KAAK;AAAA,IACjC,SAAS,OAAO;AACd,YAAM;AAAA,QACJ;AAAA,QACA,oCAAoC,KAAK;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR,gBAAgB,YAAY,IAAI;AAAA,EAClC;AACF;AAxCe;AA0Cf,SAAS,uCACP,aACA,OACA;AACA,QAAM,SACJ,MAAM,QAAQ,MAAM,MAAM,KAAK,MAAM,OAAO,SAAS,IACjD,MAAM,OACH,IAAI,CAAC,UAAU;AACd,UAAM,iBAAiB,mCAAmC,MAAM,IAAI;AACpE,UAAMC,QAAO,eAAe,SAAS,GAAG,eAAe,KAAK,GAAG,CAAC,OAAO;AACvE,WAAO,GAAGA,KAAI,GAAG,MAAM,WAAW,gBAAgB;AAAA,EACpD,CAAC,EACA,KAAK,IAAI,IACZ,MAAM,WAAW;AAEvB,SAAO,IAAI,MAAM,gBAAgB,YAAY,IAAI,+BAA+B,MAAM,EAAE;AAC1F;AAhBS;AAkBT,eAAe,yBACb,aACA,SACkB;AAClB,QAAM,SAAS,YAAY;AAC3B,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,8BAA8B,MAAM,GAAG;AAC1C,WAAO,6BAA6B,aAAa,QAAQ,CAAC,CAAC;AAAA,EAC7D;AAEA,MAAI,QAAiB,CAAC;AACtB,UAAQ;AAAA,IACN;AAAA,IACA,MAAM,6BAA6B,OAAO,UAAU,OAAO;AAAA,EAC7D;AACA,UAAQ,4BAA4B,OAAO,4BAA4B,OAAO,GAAG,CAAC;AAClF,UAAQ;AAAA,IACN;AAAA,IACA,MAAM,6BAA6B,OAAO,OAAO,OAAO;AAAA,EAC1D;AACA,UAAQ,4BAA4B,OAAO,MAAM,OAAO,UAAU,OAAO,CAAC;AAE1E,SAAO,OAAO,SACV,6BAA6B,aAAa,OAAO,QAAQ,KAAK,IAC7D;AACP;AA5Be;AA8Bf,SAAS,iCACP,aACA,OACgC;AAChC,QAAM,QAAQ,wBACZ,OACA,SACA,SACG;AACH,QAAI,CAAC,YAAY,KAAK;AACpB;AAAA,IACF;AAEA,SAAK,QAAQ;AAAA,MACX,YAAY,IAAI;AAAA,QACd,UAAU,YAAY;AAAA,QACtB,MAAM,YAAY;AAAA,QAClB,MAAM,YAAY;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,oBAAI,IAAI;AAAA,MACnB,CAAC;AAAA,IACH,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAClB,GArBc;AAuBd,SAAO;AAAA,IACL,KAAK,SAAS,MAAM;AAClB,YAAM,QAAQ,SAAS,IAAI;AAAA,IAC7B;AAAA,IACA,KAAK,SAAS,MAAM;AAClB,YAAM,QAAQ,SAAS,IAAI;AAAA,IAC7B;AAAA,IACA,MAAM,SAAS,MAAM;AACnB,YAAM,SAAS,SAAS,IAAI;AAAA,IAC9B;AAAA,EACF;AACF;AAtCS;AAwCT,IAAM,0BAA0B;AAChC,IAAM,qCAAqC,KAAK;AAChD,IAAM,gCAAgC,oBAAI,IAAI,CAAC,aAAa,eAAe,WAAW,CAAC;AAEvF,SAAS,sBAAsB,OAA8C;AAC3E,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACrE;AAFS;AAIT,SAAS,6BAA6B,OAAkD;AACtF,MAAI,CAAC,sBAAsB,KAAK,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,SAAO,cAAc,OAAO,aAAa,cAAc;AACzD;AAPS;AAST,SAAS,6BAA6B,OAAyB;AAC7D,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,6BAA6B,IAAI,CAAC;AAAA,EAC/D;AAEA,MAAI,CAAC,6BAA6B,KAAK,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,QAAM,YAAqC,CAAC;AAC5C,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,QAAI,8BAA8B,IAAI,GAAG,GAAG;AAC1C;AAAA,IACF;AAEA,cAAU,GAAG,IAAI,6BAA6B,IAAI;AAAA,EACpD;AAEA,SAAO;AACT;AAnBS;AAqBT,SAAS,yBAAyB,OAA6D;AAC7F,MAAI,CAAC,sBAAsB,KAAK,GAAG;AACjC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,YAAY,6BAA6B,KAAK;AACpD,SAAO,sBAAsB,SAAS,IAAI,YAAY,CAAC;AACzD;AAPS;AAST,SAAS,mCAAmC,OAAuB;AACjE,SAAO,IAAI,YAAY,EAAE,OAAO,KAAK,EAAE;AACzC;AAFS;AAIT,SAAS,2BAA2B,SAAuC;AACzE,QAAM,MAAM,QAAQ,QAAQ,IAAI,uBAAuB;AACvD,MAAI,CAAC,KAAK;AACR,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,mCAAmC,GAAG,IAAI,oCAAoC;AAChF,WAAO,CAAC;AAAA,EACV;AAEA,MAAI;AACF,UAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,WAAO,yBAAyB,KAAK;AAAA,EACvC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAhBS;AAkBT,SAAS,uBAAuB,SAAkB,MAAiD;AACjG,SAAO;AAAA,IACL,GAAG,2BAA2B,OAAO;AAAA,IACrC,GAAG,yBAAyB,IAAI;AAAA,EAClC;AACF;AALS;AAOT,SAAS,wBAAwB,gBAAwB,aAA0C;AACjG,QAAM,SAAS,2BAA2B,YAAY,UAAU,CAAC,CAAC;AAClE,QAAM,aAAa,CAAC,GAAI,YAAY,cAAc,CAAC,CAAE;AACrD,QAAM,mBAAkD,CAAC;AACzD,MAAI;AAEJ,QAAM,aAAa,mCAAY;AAC7B,UAAM,YAAY,iBAAiB,OAAO,CAAC,EAAE,QAAQ;AACrD,eAAW,YAAY,WAAW;AAChC,YAAM,SAAS;AAAA,IACjB;AAAA,EACF,GALmB;AAOnB,QAAM,yBAAyB,8BAC7B,SACA,OACA,UAA+B,CAAC,MACa;AAC7C,UAAM,OAAO,2BAA2B;AAAA,MACtC;AAAA,MACA,QAAQ,QAAQ;AAAA,IAClB,CAAC;AACD,UAAM,gBAA8C;AAAA,MAClD,KAAK;AAAA,MACL;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA,KAAK,yBAAyB;AAAA,MAC9B,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB;AACA,4DAA6B,yBAAyB,aAAa,aAAa;AAEhF,WAAO;AAAA,MACL,GAAG;AAAA,MACH,mBAAmB,MAAM;AAAA,MACzB,KAAK,iCAAiC,aAAa,KAAK;AAAA,MACxD,QAAQ,QAAQ;AAAA,MAChB,MAAM,QAAQ,UAAU;AACtB,YAAI,UAAU;AACZ,2BAAiB,KAAK,QAAQ;AAC9B;AAAA,QACF;AAEA,cAAM,WAAW;AAAA,MACnB;AAAA,IACF;AAAA,EACF,GAnC+B;AAqC/B,QAAM,SAAqB;AAAA,IACzB,MAAM,oBAAoB,YAAY,QAAQ,IAAI,YAAY,IAAI;AAAA,IAClE,SAAS;AAAA,IAET,MAAM,KAAK,SAAS;AAClB,oCAA8B,EAAE,IAAI,gBAAgB;AAAA,QAClD;AAAA,QACA,QAAQ,QAAQ;AAAA,QAChB,OAAO,QAAQ;AAAA,QACf,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAED,YAAM,uBAAuB,SAAS,UAAU;AAEhD,UAAI,YAAY,UAAU;AACxB,cAAM,YAAY,SAAS,MAAM,uBAAuB,SAAS,UAAU,CAAC;AAAA,MAC9E;AAEA,UAAI,YAAY,OAAO;AACrB,cAAM,YAAY,MAAM,MAAM,uBAAuB,SAAS,OAAO,CAAC;AAAA,MACxE;AAEA,UAAI,CAAC,YAAY,KAAK;AACpB;AAAA,MACF;AAEA,iBAAW,SAAS,QAAQ;AAC1B,cAAM,YAAY,IAAI;AAAA,UACpB,UAAU,YAAY;AAAA,UACtB,MAAM,YAAY;AAAA,UAClB,MAAM,YAAY;AAAA,UAClB,OAAO;AAAA,UACP,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,YACZ,SAAS,MAAM;AAAA,UACjB;AAAA,UACA,SAAS,oBAAI,IAAI;AAAA,QACnB,CAAC;AAAA,MACH;AAEA,iBAAW,SAAS,YAAY;AAC9B,cAAM,YAAY,IAAI;AAAA,UACpB,UAAU,YAAY;AAAA,UACtB,MAAM,YAAY;AAAA,UAClB,MAAM,YAAY;AAAA,UAClB,OAAO;AAAA,UACP,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,YACpC,SAAS,CAAC,KAAK;AAAA,UACjB;AAAA,UACA,SAAS,oBAAI,IAAI;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,MAAM,MAAM,SAAS;AACnB,UAAI,YAAY,OAAO;AACrB,cAAM,YAAY,MAAM,MAAM,uBAAuB,SAAS,OAAO,CAAC;AAAA,MACxE;AAAA,IACF;AAAA,IAEA,MAAM,SAAS,SAAS,SAAS;AAC/B,UAAI;AACF,YAAI,YAAY,SAAS;AACvB,gBAAM,YAAY;AAAA,YAChB,MAAM,uBAAuB,SAAS,WAAW;AAAA,cAC/C,QAAQ,QAAQ;AAAA,YAClB,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF,UAAE;AACA,cAAM,WAAW;AAAA,MACnB;AAAA,IACF;AAAA,IAEA,MAAM,cAAc,KAAK,KAAK,SAAS;AACrC,YAAM,UAAU,UAAU,IAAI,QAAQ,QAAQ,WAAW,GAAG,IAAI,OAAO,GAAG;AAC1E,YAAM,MAAM,IAAI,IAAI,OAAO;AAC3B,YAAM,WAAW,IAAI;AACrB,YAAM,YAAY,aAAa,GAAG;AAClC,UAAI,aAAa;AACjB,UAAI;AAEJ,YAAM,iBAAiB,mCAAY;AACjC,YAAI,CAAC,YAAY;AACf,uBAAa;AACb,cAAI,IAAI,UAAU,IAAI,WAAW,SAAS,IAAI,WAAW,QAAQ;AAC/D,0BAAc,MAAM,gBAAgB,GAAG;AAAA,UACzC;AAAA,QACF;AAEA,eAAO;AAAA,MACT,GATuB;AAWvB,YAAM,uBAAuB,mCAAY;AACvC,eAAO,iBAAiB,KAAK,SAAS,MAAM,eAAe,CAAC;AAAA,MAC9D,GAF6B;AAI7B,iBAAW,SAAS,YAAY;AAC9B,cAAM,SAAS,qBAAqB,MAAM,SAAS,QAAQ;AAC3D,YAAI,CAAC,QAAQ;AACX;AAAA,QACF;AAEA,cAAM,UAAU,MAAM,qBAAqB;AAC3C,cAAM,iBAAiB,gCAAgC;AAAA,UACrD;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,YACpC,SAAS,CAAC,KAAK;AAAA,UACjB;AAAA,UACA;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QACjB,CAAC;AACD,cAAM,YAAY,KAAK,IAAI;AAC3B,cAAM,YAAY,MAAM;AAAA,UACtB,UAAU,YAAY;AAAA,UACtB,MAAM,YAAY;AAAA,UAClB,MAAM,YAAY;AAAA,UAClB,OAAO;AAAA,UACP,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,YACpC,SAAS,CAAC,KAAK;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS,eAAe,IAAI,SAAS;AAAA,QACvC,CAAC;AAED,YAAI;AACF,gBAAM,WAAW,MAAM,MAAM,QAAQ,SAAS,cAAc;AAC5D,cAAI,UAAU;AACZ,kBAAM,gBAAgB,KAAK,QAAQ;AACnC,kBAAM,YAAY,MAAM;AAAA,cACtB,UAAU,YAAY;AAAA,cACtB,MAAM,YAAY;AAAA,cAClB,MAAM,YAAY;AAAA,cAClB,OAAO;AAAA,cACP,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,gBACpC,SAAS,CAAC,KAAK;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,YAAY,KAAK,IAAI,IAAI;AAAA,cACzB,SAAS,eAAe,IAAI,SAAS;AAAA,YACvC,CAAC;AACD;AAAA,UACF;AAEA,gBAAM,YAAY,MAAM;AAAA,YACtB,UAAU,YAAY;AAAA,YACtB,MAAM,YAAY;AAAA,YAClB,MAAM,YAAY;AAAA,YAClB,OAAO;AAAA,YACP,OAAO;AAAA,cACL,MAAM;AAAA,cACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,cACpC,SAAS,CAAC,KAAK;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY,KAAK,IAAI,IAAI;AAAA,YACzB,SAAS,eAAe,IAAI,SAAS;AAAA,UACvC,CAAC;AAAA,QACH,SAAS,OAAO;AACd,gBAAM,YAAY,MAAM;AAAA,YACtB,UAAU,YAAY;AAAA,YACtB,MAAM,YAAY;AAAA,YAClB,MAAM,YAAY;AAAA,YAClB,OAAO;AAAA,YACP,OAAO;AAAA,cACL,MAAM;AAAA,cACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,cACpC,SAAS,CAAC,KAAK;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY,KAAK,IAAI,IAAI;AAAA,YACzB;AAAA,YACA,SAAS,eAAe,IAAI,SAAS;AAAA,UACvC,CAAC;AACD,gBAAM;AAAA,QACR;AAAA,MACF;AAEA,iBAAW,SAAS,QAAQ;AAC1B,cAAM,SAAS,cAAc,MAAM,SAAS,IAAI,MAAM,IAClD,kBAAkB,MAAM,MAAM,QAAQ,IACtC;AACJ,YAAI,CAAC,QAAQ;AACX;AAAA,QACF;AAEA,cAAM,UAAU,MAAM,qBAAqB;AAC3C,cAAM,iBAAiB,gCAAgC;AAAA,UACrD;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,YACZ,SAAS,MAAM;AAAA,UACjB;AAAA,UACA;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QACjB,CAAC;AACD,cAAM,YAAY,KAAK,IAAI;AAC3B,cAAM,YAAY,MAAM;AAAA,UACtB,UAAU,YAAY;AAAA,UACtB,MAAM,YAAY;AAAA,UAClB,MAAM,YAAY;AAAA,UAClB,OAAO;AAAA,UACP,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,YACZ,SAAS,MAAM;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS,eAAe,IAAI,SAAS;AAAA,QACvC,CAAC;AAED,YAAI;AACF,gBAAM,aAAa,MAAM,8BAA8B,OAAO,SAAS,GAAG;AAC1E,cAAI,CAAC,WAAW,SAAS;AACvB,kBAAM,gBAAgB,KAAK,WAAW,QAAQ;AAC9C,kBAAM,YAAY,MAAM;AAAA,cACtB,UAAU,YAAY;AAAA,cACtB,MAAM,YAAY;AAAA,cAClB,MAAM,YAAY;AAAA,cAClB,OAAO;AAAA,cACP,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,MAAM,MAAM;AAAA,gBACZ,SAAS,MAAM;AAAA,cACjB;AAAA,cACA;AAAA,cACA,UAAU,WAAW;AAAA,cACrB;AAAA,cACA,YAAY,KAAK,IAAI,IAAI;AAAA,cACzB,SAAS,eAAe,IAAI,SAAS;AAAA,YACvC,CAAC;AACD;AAAA,UACF;AACA,yBAAe,QAAQ,WAAW;AAElC,qBAAW,mBAAmB,MAAM,cAAc,CAAC,GAAG;AACpD,kBAAM,qBAAqB,MAAM,gBAAgB,QAAQ,SAAS,cAAc;AAChF,gBAAI,oBAAoB;AACtB,oBAAM,gBAAgB,KAAK,kBAAkB;AAC7C,oBAAM,YAAY,MAAM;AAAA,gBACtB,UAAU,YAAY;AAAA,gBACtB,MAAM,YAAY;AAAA,gBAClB,MAAM,YAAY;AAAA,gBAClB,OAAO;AAAA,gBACP,OAAO;AAAA,kBACL,MAAM;AAAA,kBACN,MAAM,MAAM;AAAA,kBACZ,SAAS,MAAM;AAAA,gBACjB;AAAA,gBACA;AAAA,gBACA,UAAU;AAAA,gBACV;AAAA,gBACA,YAAY,KAAK,IAAI,IAAI;AAAA,gBACzB,SAAS,eAAe,IAAI,SAAS;AAAA,cACvC,CAAC;AACD;AAAA,YACF;AAAA,UACF;AAEA,gBAAM,iBAAiB,MAAM;AAAA,YAC3B;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,cAAI,gBAAgB;AAClB,kBAAMC,YAAW,MAAM;AAAA,cACrB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACA,kBAAM,gBAAgB,KAAKA,SAAQ;AACnC,kBAAM,YAAY,MAAM;AAAA,cACtB,UAAU,YAAY;AAAA,cACtB,MAAM,YAAY;AAAA,cAClB,MAAM,YAAY;AAAA,cAClB,OAAO;AAAA,cACP,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,MAAM,MAAM;AAAA,gBACZ,SAAS,MAAM;AAAA,cACjB;AAAA,cACA;AAAA,cACA,UAAAA;AAAA,cACA;AAAA,cACA,YAAY,KAAK,IAAI,IAAI;AAAA,cACzB,SAAS,eAAe,IAAI,SAAS;AAAA,YACvC,CAAC;AACD;AAAA,UACF;AAEA,gBAAM,kBAAkB,MAAM,MAAM,QAAQ,SAAS,cAAc;AACnE,gBAAM,WAAW,MAAM;AAAA,YACrB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,gBAAM,gBAAgB,KAAK,QAAQ;AACnC,gBAAM,YAAY,MAAM;AAAA,YACtB,UAAU,YAAY;AAAA,YACtB,MAAM,YAAY;AAAA,YAClB,MAAM,YAAY;AAAA,YAClB,OAAO;AAAA,YACP,OAAO;AAAA,cACL,MAAM;AAAA,cACN,MAAM,MAAM;AAAA,cACZ,SAAS,MAAM;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY,KAAK,IAAI,IAAI;AAAA,YACzB,SAAS,eAAe,IAAI,SAAS;AAAA,UACvC,CAAC;AACD;AAAA,QACF,SAAS,OAAO;AACd,gBAAM,YAAY,MAAM;AAAA,YACtB,UAAU,YAAY;AAAA,YACtB,MAAM,YAAY;AAAA,YAClB,MAAM,YAAY;AAAA,YAClB,OAAO;AAAA,YACP,OAAO;AAAA,cACL,MAAM;AAAA,cACN,MAAM,MAAM;AAAA,cACZ,SAAS,MAAM;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY,KAAK,IAAI,IAAI;AAAA,YACzB;AAAA,YACA,SAAS,eAAe,IAAI,SAAS;AAAA,UACvC,CAAC;AACD,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,eAAe,QAAQ,wCAAwC;AAAA,IACpE,OAAO,YAAY,kBAAkB;AAAA,EACvC,CAAC;AAED,SAAO;AACT;AAlaS;AAoaT,SAAS,gCAAgC,OASP;AAChC,QAAM,MAAM;AAAA,IACV,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,WAAW,MAAM;AAAA,IACjB,KAAK,IAAI,IAAI,MAAM,QAAQ,GAAG;AAAA,IAC9B,UAAU,MAAM;AAAA,IAChB,QAAQ,MAAM,QAAQ;AAAA,IACtB,QAAQ,MAAM;AAAA,IACd,OAAO,CAAC;AAAA,IACR,MAAM,2BAA2B;AAAA,MAC/B,aAAa,MAAM;AAAA,MACnB,QAAQ,MAAM,cAAc;AAAA,IAC9B,CAAC;AAAA,IACD,MAAM,uBAAuB,MAAM,OAAO;AAAA,IAC1C,aAAa;AAAA,MACX,UAAU,MAAM,YAAY;AAAA,MAC5B,MAAM,MAAM,YAAY;AAAA,MACxB,MAAM,MAAM,YAAY;AAAA,MACxB,UAAU,MAAM,YAAY;AAAA,IAC9B;AAAA,IACA,OAAO,MAAM;AAAA,IACb;AAAA,IACA,gBAAgB;AAAA,IAChB,QAAQ,MAAM,cAAc;AAAA,IAC5B,OAAO,MAAM,cAAc;AAAA,IAC3B,QAAQ,MAAM,cAAc;AAAA,EAC9B;AACF;AA1CS;AAiDT,SAAS,2BACP,QAC8B;AAC9B,SAAO,OAAO,IAAI,CAAC,WAAW;AAAA,IAC5B,GAAG;AAAA,IACH,SAAS,iCAAiC,KAAK;AAAA,IAC/C,OAAO,sCAAsC,KAAK;AAAA,EACpD,EAAE;AACJ;AARS;AAUT,SAAS,iCAAiC,OAAyD;AACjG,QAAM,QACJ,MAAM,WAAW,MAAM,QAAQ,SAAS,IACpC,CAAC,GAAG,MAAM,OAAO,IACjB,MAAM,SACJ,CAAC,MAAM,MAAM,IACb,CAAC,KAAK;AAEd,SAAO,MAAM,IAAI,CAAC,WAAW,OAAO,MAAM,EAAE,YAAY,CAAC;AAC3D;AATS;AAWT,SAAS,sCACP,OAC6D;AAC7D,QAAM,QAAyD;AAAA,IAC7D,GAAG,MAAM;AAAA,EACX;AAEA,MAAI,MAAM,MAAM;AACd,UAAM,OAAO,MAAM;AAAA,EACrB;AAEA,MAAI,MAAM,OAAO;AACf,UAAM,QAAQ,MAAM;AAAA,EACtB;AAEA,SAAO,MAAM,QAAQ,MAAM,QAAQ,QAAQ;AAC7C;AAhBS;AA4BT,eAAe,8BACb,OACA,SACA,KACgD;AAChD,QAAM,UAAU,MAAM;AACtB,MAAI,CAAC,SAAS,QAAQ,CAAC,SAAS,OAAO;AACrC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,CAAC;AAAA,IACV;AAAA,EACF;AAEA,QAAM,QAAmC,CAAC;AAC1C,QAAM,SAA2C,CAAC;AAElD,MAAI,QAAQ,OAAO;AACjB,UAAM,cAAc,MAAM;AAAA,MACxB;AAAA,MACA,QAAQ;AAAA,MACR,iBAAiB,IAAI,YAAY;AAAA,IACnC;AACA,QAAI,YAAY,SAAS;AACvB,YAAM,QAAQ,YAAY;AAAA,IAC5B,OAAO;AACL,aAAO,KAAK,GAAG,YAAY,MAAM;AAAA,IACnC;AAAA,EACF;AAEA,MAAI,QAAQ,MAAM;AAChB,UAAM,YAAY,MAAM;AAAA,MACtB;AAAA,MACA,8BAA8B,KAAK;AAAA,IACrC;AAEA,QAAI,UAAU,SAAS;AACrB,YAAM,aAAa,MAAM,4BAA4B,QAAQ,QAAQ,MAAM,UAAU,IAAI;AACzF,UAAI,WAAW,SAAS;AACtB,cAAM,OAAO,WAAW;AAAA,MAC1B,OAAO;AACL,eAAO,KAAK,GAAG,WAAW,MAAM;AAAA,MAClC;AAAA,IACF,OAAO;AACL,aAAO,KAAK,UAAU,KAAK;AAAA,IAC7B;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,oCAAoC,MAAM;AAAA,IACtD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,EACF;AACF;AA1De;AA4Df,eAAe,4BACb,QACA,QACA,OAUA;AACA,QAAM,SAAS,OAAO,kBAAkB,OAAO;AAC/C,MAAI,QAAQ;AACV,UAAM,SAAS,MAAM,OAAO,KAAK,QAAQ,KAAK;AAC9C,QAAI,OAAO,SAAS;AAClB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,OAAO;AAAA,MACf;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ,qCAAqC,QAAQ,OAAO,KAAK;AAAA,IACnE;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,GAAG,UAAU;AACjC,UAAM,SAAS,MAAM,OAAO,WAAW,EAAE,SAAS,KAAK;AACvD,QAAI,WAAW,QAAQ;AACrB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,OAAO;AAAA,MACf;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ,qCAAqC,QAAQ;AAAA,QACnD,QAAQ,OAAO;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,OAAO,OAAO;AAChB,QAAI;AACF,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,MAAM,OAAO,MAAM,KAAK;AAAA,MAChC;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,UACN;AAAA,UACA,oCAAoC,KAAK;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,QAAQ;AAAA,MACN;AAAA,QACE;AAAA,QACA,SACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACF;AA1Ee;AA4Ef,SAAS,oCAAoC,QAAmD;AAC9F,SAAO,SAAS;AAAA,IACd;AAAA,MACE,OAAO;AAAA,MACP;AAAA,IACF;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAVS;AAYT,SAAS,qCACP,QACA,OACkC;AAClC,MAAI,MAAM,QAAQ,MAAM,MAAM,KAAK,MAAM,OAAO,SAAS,GAAG;AAC1D,WAAO,MAAM,OAAO,IAAI,CAAC,WAAW;AAAA,MAClC;AAAA,MACA,MAAM,mCAAmC,MAAM,IAAI;AAAA,MACnD,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM,WAAW;AAAA,IAC5B,EAAE;AAAA,EACJ;AAEA,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,MAAM,CAAC;AAAA,MACP,SAAS,MAAM,WAAW;AAAA,IAC5B;AAAA,EACF;AACF;AApBS;AAsBT,SAAS,mCACPD,OACqB;AACrB,UAAQA,SAAQ,CAAC,GAAG,IAAI,CAAC,YAAY;AACnC,UAAM,MACJ,OAAO,YAAY,YAAY,YAAY,QAAQ,SAAS,UAAU,QAAQ,MAAM;AACtF,WAAO,OAAO,QAAQ,WAAW,IAAI,eAAe,IAAI,SAAS,IAAI;AAAA,EACvE,CAAC;AACH;AARS;AAUT,SAAS,oCAAoC,OAAoD;AAC/F,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,eAAe;AAAA,EACnF;AACF;AARS;AAUT,eAAe,8BACb,SACA,QAUA;AACA,MAAI,QAAQ,WAAW,SAAS,QAAQ,WAAW,UAAU,WAAW,QAAQ;AAC9E,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AAEA,MAAI;AACF,QAAI,WAAW,QAAQ;AACrB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,gBAAgB,MAAM,QAAQ,MAAM,EAAE,SAAS,CAAC;AAAA,MACxD;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,QAAQ,MAAM,EAAE,KAAK;AACxC,QAAI,KAAK,KAAK,EAAE,WAAW,GAAG;AAC5B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM,KAAK,MAAM,IAAI;AAAA,IACvB;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,CAAC;AAAA,QACP,SACE,WAAW,SACP,wCACA,iBAAiB,SAAS,MAAM,UAC9B,MAAM,UACN;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAvDe;AAyDf,SAAS,8BAA8B,OAAmC;AACxE,SAAO,MAAM,cAAc,MAAM,aAAa,cAAc;AAC9D;AAFS;AAIT,SAAS,2BAA2B,OAGP;AAC3B,MAAI;AACJ,MAAI;AAEJ,QAAM,YAAY,6BAAM;AACtB,sCAAkB,gEAAoB;AAAA,MAAK,CAAC,EAAE,6BAAAE,6BAA4B,MACxEA,6BAA4B,MAAM,OAAO,OAAO;AAAA,IAClD;AACA,WAAO;AAAA,EACT,GALkB;AAOlB,QAAM,SAAS,6BAAM;AACnB,QAAI,CAAC,MAAM,YAAY,QAAQ;AAC7B,YAAM,IAAI;AAAA,QACR,gBAAgB,MAAM,YAAY,IAAI;AAAA,MACxC;AAAA,IACF;AAEA,gCAAe,gFAA4B;AAAA,MAAK,CAAC,EAAE,sBAAAC,sBAAqB,MACtEA,sBAAqB;AAAA,QACnB,QAAQ,MAAM,YAAY;AAAA,QAC1B,QAAQ,MAAM;AAAA,MAChB,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT,GAde;AAgBf,SAAO;AAAA,IACL,IAAI,+BAA+B,MAAM;AAAA,IACzC,OAAO;AAAA,IACP,SAAS;AAAA,MACP;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAtCS;AAwCT,SAAS,+BAA+B,YAAoC;AAC1E,QAAM,kBAAkB,oBAAI,IAA0B;AAEtD,SAAO,IAAI;AAAA,IACT,CAAC;AAAA,IACD;AAAA,MACE,IAAI,SAAS,MAAM;AACjB,YAAI,SAAS,QAAQ;AACnB,iBAAO;AAAA,QACT;AAEA,YAAI,SAAS,iBAAiB,SAAS,SAAS;AAC9C,iBAAO,UAAU,SAAoB;AACnC,kBAAM,MAAO,MAAM,WAAW;AAC9B,kBAAM,SAAS,IAAI,IAAI;AACvB,gBAAI,OAAO,WAAW,YAAY;AAChC,oBAAM,IAAI,MAAM,oCAAoC,OAAO,IAAI,CAAC,IAAI;AAAA,YACtE;AACA,mBAAO,OAAO,MAAM,KAAK,IAAI;AAAA,UAC/B;AAAA,QACF;AAEA,YAAI,SAAS,WAAW;AACtB,iBAAO;AAAA,QACT;AAEA,YAAI,CAAC,gBAAgB,IAAI,IAAI,GAAG;AAC9B,0BAAgB,IAAI,MAAM,8BAA8B,YAAY,IAAI,CAAC;AAAA,QAC3E;AAEA,eAAO,gBAAgB,IAAI,IAAI;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AACF;AAlCS;AAoCT,SAAS,8BAA8B,YAAoC,WAAwB;AACjG,SAAO,IAAI;AAAA,IACT,CAAC;AAAA,IACD;AAAA,MACE,IAAI,SAAS,MAAM;AACjB,YAAI,SAAS,QAAQ;AACnB,iBAAO;AAAA,QACT;AAEA,eAAO,UAAU,SAAoB;AACnC,gBAAM,MAAO,MAAM,WAAW;AAC9B,gBAAM,QAAQ,IAAI,SAAS;AAC3B,gBAAM,SAAS,QAAQ,IAAI;AAC3B,cAAI,OAAO,WAAW,YAAY;AAChC,kBAAM,IAAI;AAAA,cACR,0BAA0B,OAAO,SAAS,CAAC,sBAAsB,OAAO,IAAI,CAAC;AAAA,YAC/E;AAAA,UACF;AACA,iBAAO,OAAO,MAAM,OAAO,IAAI;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAvBS;AAyBT,eAAe,+BACb,OACA,SACA,SAC+B;AAC/B,QAAM,cAAc;AACpB,cAAY,WAAW;AAEvB,aAAW,QAAQ,MAAM,UAAU,CAAC,GAAG;AACrC,UAAM,WAAW,MAAM,KAAK,SAAS,WAAW;AAChD,QAAI,UAAU;AACZ,kBAAY,WAAW;AACvB,aAAO;AAAA,IACT;AAEA,QAAI,YAAY,UAAU;AACxB,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;AArBe;AAuBf,eAAe,8BACb,OACA,SACA,SACA,UACmB;AACnB,QAAM,cAAc;AACpB,MAAI,kBAAkB;AAEtB,aAAW,QAAQ,MAAM,SAAS,CAAC,GAAG;AACpC,gBAAY,WAAW;AACvB,UAAM,eAAe,MAAM,KAAK,SAAS,WAAW;AACpD,sBAAkB,gBAAgB,YAAY,YAAY;AAAA,EAC5D;AAEA,cAAY,WAAW;AACvB,SAAO;AACT;AAjBe;AAmBf,SAAS,iBAAiB,cAAkE;AAC1F,QAAM,QAA2C,CAAC;AAClD,eAAa,QAAQ,CAAC,OAAO,QAAQ;AACnC,UAAM,WAAW,MAAM,GAAG;AAC1B,QAAI,aAAa,QAAW;AAC1B,YAAM,GAAG,IAAI;AACb;AAAA,IACF;AAEA,UAAM,GAAG,IAAI,MAAM,QAAQ,QAAQ,IAAI,CAAC,GAAG,UAAU,KAAK,IAAI,CAAC,UAAU,KAAK;AAAA,EAChF,CAAC;AACD,SAAO;AACT;AAZS;AAcT,SAAS,gBACP,UAC2D;AAC3D,QAAM,QAAmE,CAAC;AAC1E,WAAS,QAAQ,CAAC,OAAO,QAAQ;AAC/B,UAAM,WAAW,MAAM,GAAG;AAC1B,QAAI,aAAa,QAAW;AAC1B,YAAM,GAAG,IAAI;AACb;AAAA,IACF;AAEA,UAAM,GAAG,IAAI,MAAM,QAAQ,QAAQ,IAAI,CAAC,GAAG,UAAU,KAAK,IAAI,CAAC,UAAU,KAAK;AAAA,EAChF,CAAC;AACD,SAAO;AACT;AAdS;AAgBT,eAAsB,2BACpB,SACA,SACA,UAII,CAAC,GACqB;AAC1B,QAAM,cAAc,QAAQ;AAC5B,QAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,QAAM,WAAW,IAAI;AACrB,QAAM,YACJ,QAAQ,QAAQ,IAAI,cAAc,KAClC,QAAQ,gBAAgB,QAAQ,IAAI,cAAc,KAClD,OAAO,KAAK,IAAI,CAAC;AACnB,QAAM,SAAS,2BAA2B,YAAY,UAAU,CAAC,CAAC;AAClE,QAAM,aAAa,CAAC,GAAI,YAAY,cAAc,CAAC,CAAE;AAErD,aAAW,SAAS,YAAY;AAC9B,UAAM,SAAS,qBAAqB,MAAM,SAAS,QAAQ;AAC3D,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,UAAM,iBAAiB,sCAAsC;AAAA,MAC3D;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,QACpC,SAAS,CAAC,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB,QAAQ;AAAA,MACxB,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ,aAAa;AAAA,IACjC,CAAC;AACD,UAAM,YAAY,KAAK,IAAI;AAE3B,UAAM,YAAY,MAAM;AAAA,MACtB,UAAU,YAAY;AAAA,MACtB,MAAM,YAAY;AAAA,MAClB,MAAM,YAAY;AAAA,MAClB,OAAO;AAAA,MACP,OAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,QACpC,SAAS,CAAC,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,eAAe,IAAI,SAAS;AAAA,IACvC,CAAC;AAED,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,QAAQ,SAAS,cAAc;AAC5D,UAAI,UAAU;AACZ,cAAM,YAAY,MAAM;AAAA,UACtB,UAAU,YAAY;AAAA,UACtB,MAAM,YAAY;AAAA,UAClB,MAAM,YAAY;AAAA,UAClB,OAAO;AAAA,UACP,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,YACpC,SAAS,CAAC,KAAK;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,SAAS,eAAe,IAAI,SAAS;AAAA,QACvC,CAAC;AACD,eAAO;AAAA,MACT;AAEA,YAAM,YAAY,MAAM;AAAA,QACtB,UAAU,YAAY;AAAA,QACtB,MAAM,YAAY;AAAA,QAClB,MAAM,YAAY;AAAA,QAClB,OAAO;AAAA,QACP,OAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,UACpC,SAAS,CAAC,KAAK;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB,SAAS,eAAe,IAAI,SAAS;AAAA,MACvC,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,YAAY,MAAM;AAAA,QACtB,UAAU,YAAY;AAAA,QACtB,MAAM,YAAY;AAAA,QAClB,MAAM,YAAY;AAAA,QAClB,OAAO;AAAA,QACP,OAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,UACpC,SAAS,CAAC,KAAK;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB;AAAA,QACA,SAAS,eAAe,IAAI,SAAS;AAAA,MACvC,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAEA,aAAW,SAAS,QAAQ;AAC1B,UAAM,SAAS,cAAc,MAAM,SAAS,QAAQ,MAAM,IACtD,kBAAkB,MAAM,MAAM,QAAQ,IACtC;AACJ,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,UAAM,iBAAiB,sCAAsC;AAAA,MAC3D;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB,QAAQ;AAAA,MACxB,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ,aAAa;AAAA,IACjC,CAAC;AACD,UAAM,YAAY,KAAK,IAAI;AAE3B,UAAM,YAAY,MAAM;AAAA,MACtB,UAAU,YAAY;AAAA,MACtB,MAAM,YAAY;AAAA,MAClB,MAAM,YAAY;AAAA,MAClB,OAAO;AAAA,MACP,OAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,eAAe,IAAI,SAAS;AAAA,IACvC,CAAC;AAED,QAAI;AACF,YAAM,aAAa,MAAM,8BAA8B,OAAO,SAAS,GAAG;AAC1E,UAAI,CAAC,WAAW,SAAS;AACvB,cAAM,YAAY,MAAM;AAAA,UACtB,UAAU,YAAY;AAAA,UACtB,MAAM,YAAY;AAAA,UAClB,MAAM,YAAY;AAAA,UAClB,OAAO;AAAA,UACP,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,YACZ,SAAS,MAAM;AAAA,UACjB;AAAA,UACA;AAAA,UACA,UAAU,WAAW;AAAA,UACrB;AAAA,UACA,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,SAAS,eAAe,IAAI,SAAS;AAAA,QACvC,CAAC;AACD,eAAO,WAAW;AAAA,MACpB;AACA,qBAAe,QAAQ,WAAW;AAElC,iBAAW,mBAAmB,MAAM,cAAc,CAAC,GAAG;AACpD,cAAM,qBAAqB,MAAM,gBAAgB,QAAQ,SAAS,cAAc;AAChF,YAAI,oBAAoB;AACtB,gBAAM,YAAY,MAAM;AAAA,YACtB,UAAU,YAAY;AAAA,YACtB,MAAM,YAAY;AAAA,YAClB,MAAM,YAAY;AAAA,YAClB,OAAO;AAAA,YACP,OAAO;AAAA,cACL,MAAM;AAAA,cACN,MAAM,MAAM;AAAA,cACZ,SAAS,MAAM;AAAA,YACjB;AAAA,YACA;AAAA,YACA,UAAU;AAAA,YACV;AAAA,YACA,YAAY,KAAK,IAAI,IAAI;AAAA,YACzB,SAAS,eAAe,IAAI,SAAS;AAAA,UACvC,CAAC;AACD,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,YAAM,iBAAiB,MAAM,+BAA+B,OAAO,SAAS,cAAc;AAC1F,UAAI,gBAAgB;AAClB,cAAMF,YAAW,MAAM;AAAA,UACrB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,cAAM,YAAY,MAAM;AAAA,UACtB,UAAU,YAAY;AAAA,UACtB,MAAM,YAAY;AAAA,UAClB,MAAM,YAAY;AAAA,UAClB,OAAO;AAAA,UACP,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,YACZ,SAAS,MAAM;AAAA,UACjB;AAAA,UACA;AAAA,UACA,UAAAA;AAAA,UACA;AAAA,UACA,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,SAAS,eAAe,IAAI,SAAS;AAAA,QACvC,CAAC;AACD,eAAOA;AAAA,MACT;AAEA,YAAM,kBAAkB,MAAM,MAAM,QAAQ,SAAS,cAAc;AACnE,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,YAAY,MAAM;AAAA,QACtB,UAAU,YAAY;AAAA,QACtB,MAAM,YAAY;AAAA,QAClB,MAAM,YAAY;AAAA,QAClB,OAAO;AAAA,QACP,OAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,MAAM;AAAA,UACZ,SAAS,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB,SAAS,eAAe,IAAI,SAAS;AAAA,MACvC,CAAC;AACD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,YAAY,MAAM;AAAA,QACtB,UAAU,YAAY;AAAA,QACtB,MAAM,YAAY;AAAA,QAClB,MAAM,YAAY;AAAA,QAClB,OAAO;AAAA,QACP,OAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,MAAM;AAAA,UACZ,SAAS,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB;AAAA,QACA,SAAS,eAAe,IAAI,SAAS;AAAA,MACvC,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AACT;AAlRsB;AAoRrB,WAAoD,kCAAkC,IACrF;AAEF,SAAS,qCACP,YACA,SACA,eACoC;AACpC,SAAO;AAAA,IACL,IAAI,KAAK;AACP,YAAM,eAAe,cAAc,eAAe,IAAI,SAAS,GAAG;AAClE,UAAI,iBAAiB,QAAW;AAC9B,eAAO;AAAA,MACT;AAEA,aAAO,cAAc,eAAe,IAAI,YAAY,GAAG;AAAA,IACzD;AAAA,IACA,IAAI,KAAK,OAAO,SAAS;AACvB,oBAAc,eAAe,IAAI,YAAY,KAAK,OAAO,OAAO;AAChE,oBAAc,eAAe,IAAI,SAAS,KAAK,OAAO,OAAO;AAAA,IAC/D;AAAA,IACA,IAAI,KAAK;AACP,aACE,cAAc,eAAe,IAAI,SAAS,GAAG,KAC7C,cAAc,eAAe,IAAI,YAAY,GAAG;AAAA,IAEpD;AAAA,IACA,OAAO,KAAK;AACV,YAAM,iBAAiB,cAAc,eAAe,OAAO,SAAS,GAAG;AACvE,YAAM,aAAa,cAAc,eAAe,OAAO,YAAY,GAAG;AACtE,aAAO,kBAAkB;AAAA,IAC3B;AAAA,IACA,QAAQ;AACN,oBAAc,eAAe,MAAM,UAAU;AAC7C,oBAAc,eAAe,MAAM,OAAO;AAAA,IAC5C;AAAA,IACA,SAAS,SAAS;AAChB,YAAM,SAAS,cAAc,eAAe,OAAO,YAAY,OAAO;AACtE,YAAM,kBAAkB,cAAc,eAAe,OAAO,SAAS,OAAO;AAC5E,iBAAW,CAAC,KAAK,KAAK,KAAK,iBAAiB;AAC1C,eAAO,IAAI,KAAK,KAAK;AAAA,MACvB;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AA1CS;AA4CT,SAAS,sCAAsC,OAUb;AAChC,QAAM,MAAM,2CAA2C,MAAM,SAAS,MAAM,cAAc;AAE1F,MAAI,MAAM,UAAU;AAClB,QAAI,IAAI,gDAAgD,IAAI;AAAA,EAC9D;AAEA,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,WAAW,MAAM;AAAA,IACjB,KAAK,IAAI,IAAI,MAAM,QAAQ,GAAG;AAAA,IAC9B,UAAU,MAAM;AAAA,IAChB,QAAQ,MAAM,QAAQ;AAAA,IACtB,QAAQ,MAAM;AAAA,IACd,OAAO,CAAC;AAAA,IACR,MAAM,2BAA2B;AAAA,MAC/B,aAAa,MAAM,QAAQ;AAAA,MAC3B,QAAQ,MAAM,QAAQ;AAAA,IACxB,CAAC;AAAA,IACD,MAAM,uBAAuB,MAAM,SAAS,MAAM,IAAI;AAAA,IACtD,aAAa;AAAA,MACX,UAAU,MAAM,QAAQ,YAAY;AAAA,MACpC,MAAM,MAAM,QAAQ,YAAY;AAAA,MAChC,MAAM,MAAM,QAAQ,YAAY;AAAA,MAChC,UAAU,MAAM,QAAQ,YAAY;AAAA,IACtC;AAAA,IACA,OAAO,MAAM;AAAA,IACb;AAAA,IACA,gBAAgB;AAAA,IAChB,QAAQ,MAAM,QAAQ;AAAA,IACtB,OAAO,MAAM,QAAQ;AAAA,IACrB,QAAQ,MAAM,QAAQ;AAAA,EACxB;AACF;AA3CS;AA6CT,SAAS,2CACP,SACA,gBACoC;AACpC,SAAO;AAAA,IACL,IAAI,KAAK;AACP,YAAM,eAAe,kBAAkB,SAAS,GAAG;AACnD,UAAI,iBAAiB,QAAW;AAC9B,eAAO;AAAA,MACT;AAEA,UAAI,gBAAgB;AAClB,eAAO,kBAAkB,gBAAgB,GAAG;AAAA,MAC9C;AAEA,aAAO;AAAA,IACT;AAAA,IACA,IAAI,KAAK,OAAO,SAAS;AACvB,wBAAkB,SAAS,KAAK,OAAO,OAAO;AAC9C,UAAI,gBAAgB;AAClB,0BAAkB,gBAAgB,KAAK,OAAO,OAAO;AAAA,MACvD;AAAA,IACF;AAAA,IACA,IAAI,KAAK;AACP,aACE,kBAAkB,SAAS,GAAG,KAC7B,CAAC,CAAC,kBAAkB,kBAAkB,gBAAgB,GAAG;AAAA,IAE9D;AAAA,IACA,OAAO,KAAK;AACV,YAAM,iBAAiB,qBAAqB,SAAS,GAAG;AACxD,YAAM,iBAAiB,iBAAiB,qBAAqB,gBAAgB,GAAG,IAAI;AACpF,aAAO,kBAAkB;AAAA,IAC3B;AAAA,IACA,QAAQ;AACN,0BAAoB,OAAO;AAC3B,UAAI,gBAAgB;AAClB,4BAAoB,cAAc;AAAA,MACpC;AAAA,IACF;AAAA,IACA,SAAS,SAAS;AAChB,YAAM,SAAS,iBACX,0BAA0B,gBAAgB,OAAO,IACjD,oBAAI,IAAqB;AAC7B,YAAM,kBAAkB,0BAA0B,SAAS,OAAO;AAClE,iBAAW,CAAC,KAAK,KAAK,KAAK,iBAAiB;AAC1C,eAAO,IAAI,KAAK,KAAK;AAAA,MACvB;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAnDS;AAqDT,SAAS,iBAAiB,KAAkB,SAAiB,MAAwB;AACnF,QAAM,UAAU,IAAI,QAAQ;AAC5B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,OAAO,GAAG;AACtD,QAAI,SAAS,MAAM;AACjB;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,iBAAW,QAAQ,OAAO;AACxB,gBAAQ,OAAO,KAAK,IAAI;AAAA,MAC1B;AACA;AAAA,IACF;AAEA,YAAQ,IAAI,KAAK,KAAK;AAAA,EACxB;AAEA,SAAO,IAAI,QAAQ,SAAS;AAAA,IAC1B,QAAQ,IAAI;AAAA,IACZ;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAtBS;AAwBT,SAAS,cAAc,SAA4B,QAAqC;AACtF,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,KAAK,CAAC,SAAS,KAAK,YAAY,MAAM,OAAO,YAAY,CAAC;AAC3E;AANS;AAeT,SAAS,qBACP,SACA,UACmC;AACnC,MAAI,CAAC,SAAS;AACZ,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,OAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AACxD,aAAW,QAAQ,MAAM;AACvB,QAAI,SAAS,WAAW,SAAS,KAAK;AACpC,aAAO,CAAC;AAAA,IACV;AACA,QAAI,KAAK,SAAS,MAAM,GAAG;AACzB,YAAM,SAAS,KAAK,MAAM,GAAG,EAAE;AAC/B,UAAI,aAAa,UAAU,SAAS,WAAW,GAAG,MAAM,GAAG,GAAG;AAC5D,eAAO,CAAC;AAAA,MACV;AACA;AAAA,IACF;AACA,UAAM,SAAS,kBAAkB,MAAM,QAAQ;AAC/C,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AA3BS;AAiCT,SAAS,kBAAkB,SAAiB,UAAqD;AAC/F,QAAM,gBAAgB,UAAU,OAAO;AACvC,QAAM,eAAe,UAAU,QAAQ;AACvC,QAAM,SAAqC,CAAC;AAE5C,MAAI,aAAa;AACjB,MAAI,YAAY;AAEhB,SAAO,aAAa,cAAc,UAAU,YAAY,aAAa,QAAQ;AAC3E,UAAM,eAAe,cAAc,UAAU;AAC7C,UAAM,cAAc,aAAa,SAAS;AAE1C,QAAI,kBAAkB,YAAY,GAAG;AACnC,aAAO,oBAAoB,YAAY,CAAC,IAAI,aACzC,MAAM,SAAS,EACf,IAAI,CAAC,YAAY,mBAAmB,OAAO,CAAC;AAC/C,aAAO;AAAA,IACT;AAEA,QAAI,iBAAiB,YAAY,GAAG;AAClC,aAAO,oBAAoB,YAAY,CAAC,IAAI,mBAAmB,WAAW;AAC1E,oBAAc;AACd,mBAAa;AACb;AAAA,IACF;AAEA,QAAI,iBAAiB,aAAa;AAChC,aAAO;AAAA,IACT;AAEA,kBAAc;AACd,iBAAa;AAAA,EACf;AAEA,MAAI,eAAe,cAAc,UAAU,cAAc,aAAa,QAAQ;AAC5E,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,cAAc,SAAS,KAAK,kBAAkB,cAAc,UAAU,CAAC,GAAG;AAC3F,WAAO,oBAAoB,cAAc,UAAU,CAAC,CAAC,IAAI,CAAC;AAC1D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AA5CS;AA8CT,SAAS,UAAU,OAAyB;AAC1C,SAAO,MAAM,MAAM,GAAG,EAAE,OAAO,OAAO;AACxC;AAFS;AAIT,SAAS,iBAAiB,SAA0B;AAClD,SAAO,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG;AACxD;AAFS;AAIT,SAAS,kBAAkB,SAA0B;AACnD,SAAO,QAAQ,WAAW,MAAM,KAAK,QAAQ,SAAS,GAAG;AAC3D;AAFS;AAIT,SAAS,oBAAoB,SAAyB;AACpD,MAAI,kBAAkB,OAAO,GAAG;AAC9B,WAAO,QAAQ,MAAM,GAAG,EAAE;AAAA,EAC5B;AAEA,SAAO,QAAQ,MAAM,GAAG,EAAE;AAC5B;AANS;AAQT,SAAS,aAAa,KAA0B;AAC9C,QAAM,cAAc,IAAI,QAAQ,cAAc;AAC9C,MAAI,MAAM,QAAQ,WAAW,GAAG;AAC9B,WAAO,YAAY,CAAC,KAAK,OAAO,KAAK,IAAI,CAAC;AAAA,EAC5C;AACA,SAAO,eAAe,OAAO,KAAK,IAAI,CAAC;AACzC;AANS;AAQT,eAAe,gBAAgB,KAAmC;AAChE,SAAO,MAAM,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC5C,UAAM,SAAmB,CAAC;AAC1B,QAAI,GAAG,QAAQ,CAAC,UAAU;AACxB,aAAO,KAAK,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,KAAK,CAAC;AAAA,IACjE,CAAC;AACD,QAAI,GAAG,OAAO,MAAM;AAClB,cAAQ,OAAO,OAAO,MAAM,CAAC;AAAA,IAC/B,CAAC;AACD,QAAI,GAAG,SAAS,MAAM;AAAA,EACxB,CAAC;AACH;AAXe;AAaf,SAAS,iBAAiB,SAAyD;AACjF,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,SAAO,OAAO,YAAY,WAAW,UAAU,QAAQ,KAAK,IAAI;AAClE;AALS;;;AC78FF,SAAS,sBACd,QAC4B;AAC5B,MAAI,WAAW,OAAO;AACpB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ,CAAC;AAAA,MACT,OAAO;AAAA,MACP,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,cAAc,OAAO,UAAU,OAAO,UAAU;AACtD,QAAM,SACJ,gBAAgB,OACZ,OACA,MAAM,QAAQ,WAAW,IACvB,YAAY,IAAI,2BAA2B,IAC3C,CAAC;AAET,SAAO;AAAA,IACL,SAAS,OAAO,YAAY,UAAU,WAAW,QAAQ,OAAO,SAAS;AAAA,IACzE;AAAA,IACA,OAAO,OAAO,SAAS;AAAA,IACvB,iBAAiB,OAAO,mBAAmB;AAAA,EAC7C;AACF;AAnCgB;AAqNhB,SAAS,4BAA4B,OAA0D;AAC7F,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,MACL,OAAO,uBAAuB,KAAK;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO,uBAAuB,MAAM,KAAK;AAAA,EAC3C;AACF;AAXS;AAaT,SAAS,uBAAuB,OAAuB;AACrD,QAAM,2BAA2B,MAAM,YAAY,EAAE,SAAS,KAAK,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI;AAC5F,QAAM,YAAY,yBAAyB,WAAW,GAAG,IACrD,2BACA,IAAI,wBAAwB;AAChC,QAAM,aAAa,UAAU,QAAQ,QAAQ,GAAG,EAAE,QAAQ,QAAQ,EAAE;AACpE,SAAO,eAAe,MAAM,eAAe,WAAW,MAAM;AAC9D;AAPS;;;AC1MF,IAAM,6BAA6B,CAAC,YAAY,iBAAiB,UAAU;AAC3E,IAAM,8BAA8B;AACpC,IAAM,mCAAmC;AA6BzC,SAAS,uBACd,WAC6B;AAC7B,MAAI,cAAc,OAAO;AACvB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM,CAAC,GAAG,0BAA0B;AAAA,MACpC,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,EACF;AAEA,QAAM,UAAU,aAAa,OAAO,cAAc,WAAW,YAAY,CAAC;AAC1E,QAAM,OAAO,sBAAsB,OAAO;AAE1C,SAAO;AAAA,IACL,SAAS,QAAQ,WAAW;AAAA,IAC5B;AAAA,IACA,OAAO,uBAAuB,QAAQ,SAAS,2BAA2B;AAAA,IAC1E,WAAW,QAAQ,aAAa;AAAA,IAChC,QAAQ,QAAQ;AAAA,EAClB;AACF;AAtBgB;AA0QhB,SAAS,sBAAsB,SAA4C;AACzE,QAAM,UACJ,QAAQ,SACP,MAAM,QAAQ,QAAQ,GAAG,IAAI,QAAQ,MAAM,QAAQ,MAAM,CAAC,QAAQ,GAAG,IAAI;AAC5E,QAAM,OAAO,WAAW,QAAQ,SAAS,IAAI,UAAU;AACvD,SAAO,CAAC,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,YAAY,GAAG,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC;AACzE;AANS;AAQT,SAAS,uBAAuB,OAAuB;AACrD,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,WAAW,YAAY,IAAK,QAAO;AACxC,SAAO,IAAI,YAAY,OAAO,CAAC;AACjC;AAJS;AAyTT,SAAS,YAAY,OAAuB;AAC1C,SAAO,MAAM,QAAQ,cAAc,EAAE;AACvC;AAFS;;;ACvoBF,IAAM,+BAA+B;AAG5C,IAAM,oBAAoB;AAAA,EACxB,CAAC,GAAG,IAAI,QAAQ;AAAA,EAChB,CAAC,GAAG,IAAI,MAAM;AAAA,EACd,CAAC,GAAG,IAAI,cAAc;AAAA,EACtB,CAAC,GAAG,IAAI,OAAO;AAAA,EACf,CAAC,GAAG,GAAG,aAAa;AACtB;AAEO,SAAS,kBACd,MACwB;AACxB,MAAI,qBAAqB,IAAI,EAAG,QAAO;AACvC,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,MACL,SAAS;AAAA,MACT,WAAW;AAAA,MACX,MAAM,CAAC;AAAA,IACT;AAAA,EACF;AAEA,QAAM,OAAsB,CAAC;AAC7B,aAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC9C,QAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,GAAG;AACzD,YAAM,IAAI,UAAU,aAAa,KAAK,UAAU,IAAI,CAAC,kCAAkC;AAAA,IACzF;AACA,QAAI,IAAI,YAAY,MAAO;AAC3B,SAAK,KAAK,iBAAiB,MAAM,GAAG,CAAC;AAAA,EACvC;AAEA,SAAO;AAAA,IACL,SAAS,KAAK,SAAS;AAAA,IACvB,WAAW;AAAA,IACX;AAAA,EACF;AACF;AA1BgB;AAkMhB,SAAS,iBAAiB,MAAc,KAAqC;AAC3E,MAAI,CAAC,+BAA+B,KAAK,IAAI,GAAG;AAC9C,UAAM,IAAI;AAAA,MACR,kBAAkB,KAAK,UAAU,IAAI,CAAC;AAAA,IACxC;AAAA,EACF;AACA,MAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,GAAG;AACzD,UAAM,IAAI,UAAU,aAAa,KAAK,UAAU,IAAI,CAAC,kCAAkC;AAAA,EACzF;AAEA,QAAMG,QAAO,kBAAkB,MAAM,IAAI,IAAI;AAC7C,QAAM,cAAc,MAAM,QAAQ,IAAI,QAAQ,IAAI,IAAI,WAAW,CAAC,IAAI,QAAQ;AAC9E,QAAM,WAAW,CAAC,GAAG,IAAI,IAAI,YAAY,IAAI,CAAC,UAAU,wBAAwB,MAAM,KAAK,CAAC,CAAC,CAAC;AAC9F,MAAI,SAAS,WAAW,GAAG;AACzB,UAAM,IAAI,UAAU,aAAa,KAAK,UAAU,IAAI,CAAC,qCAAqC;AAAA,EAC5F;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAAA;AAAA,IACA,aAAa,IAAI,aAAa,KAAK,KAAK;AAAA,EAC1C;AACF;AAvBS;AAyBT,SAAS,kBAAkB,MAAc,OAAwB;AAC/D,MAAI,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,EAAE,WAAW,GAAG,GAAG;AAC9D,UAAM,IAAI,UAAU,aAAa,KAAK,UAAU,IAAI,CAAC,4BAA4B;AAAA,EACnF;AAEA,QAAMA,QAAO,MAAM,KAAK;AACxB,MAAIA,MAAK,WAAW,IAAI,KAAKA,MAAK,SAAS,GAAG,KAAKA,MAAK,SAAS,GAAG,GAAG;AACrE,UAAM,IAAI;AAAA,MACR,aAAa,KAAK,UAAU,IAAI,CAAC;AAAA,IACnC;AAAA,EACF;AACA,SAAOA,MAAK,SAAS,IAAIA,MAAK,QAAQ,QAAQ,EAAE,IAAIA;AACtD;AAZS;AAcT,SAAS,wBAAwB,MAAc,OAAwB;AACrE,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,UAAU,aAAa,KAAK,UAAU,IAAI,CAAC,6BAA6B;AAAA,EACpF;AAEA,QAAM,aAAa,MAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG;AACnD,QAAM,SAAS,WAAW,MAAM,GAAG;AACnC,MAAI,OAAO,WAAW,kBAAkB,QAAQ;AAC9C,UAAM,IAAI;AAAA,MACR,aAAa,KAAK,UAAU,IAAI,CAAC,aAAa,KAAK,UAAU,UAAU,CAAC;AAAA,IAC1E;AAAA,EACF;AAEA,SAAO,QAAQ,CAAC,OAAO,UAAU;AAC/B,UAAM,CAAC,SAAS,SAAS,KAAK,IAAI,kBAAkB,KAAK;AACzD,sBAAkB,MAAM,YAAY,OAAO,SAAS,SAAS,KAAK;AAAA,EACpE,CAAC;AACD,MAAI,OAAO,CAAC,MAAM,OAAO,OAAO,CAAC,MAAM,KAAK;AAC1C,UAAM,IAAI;AAAA,MACR,aAAa,KAAK,UAAU,IAAI,CAAC,aAAa,KAAK,UAAU,UAAU,CAAC;AAAA,IAC1E;AAAA,EACF;AACA,SAAO;AACT;AAvBS;AAyBT,SAAS,kBACP,MACA,YACA,OACA,SACA,SACA,OACM;AACN,aAAW,WAAW,MAAM,MAAM,GAAG,GAAG;AACtC,UAAM,CAAC,OAAO,UAAU,GAAG,KAAK,IAAI,QAAQ,MAAM,GAAG;AACrD,QAAI,CAAC,SAAS,MAAM,SAAS,KAAM,aAAa,UAAa,CAAC,iBAAiB,UAAU,CAAC,GAAI;AAC5F,4BAAsB,MAAM,YAAY,KAAK;AAAA,IAC/C;AAEA,QAAI,UAAU,IAAK;AACnB,UAAM,SAAS,MAAM,MAAM,GAAG;AAC9B,QAAI,OAAO,SAAS,KAAK,CAAC,OAAO,MAAM,CAAC,UAAU,iBAAiB,OAAO,SAAS,OAAO,CAAC,GAAG;AAC5F,4BAAsB,MAAM,YAAY,KAAK;AAAA,IAC/C;AACA,QAAI,OAAO,WAAW,KAAK,OAAO,OAAO,CAAC,CAAC,IAAI,OAAO,OAAO,CAAC,CAAC,GAAG;AAChE,4BAAsB,MAAM,YAAY,KAAK;AAAA,IAC/C;AAAA,EACF;AACF;AAvBS;AAyBT,SAAS,iBAAiB,OAAe,SAAiB,UAAU,OAAO,kBAAkB;AAC3F,MAAI,CAAC,QAAQ,KAAK,KAAK,EAAG,QAAO;AACjC,QAAM,SAAS,OAAO,KAAK;AAC3B,SAAO,UAAU,WAAW,UAAU;AACxC;AAJS;AAMT,SAAS,sBAAsB,MAAc,YAAoB,OAAsB;AACrF,QAAM,IAAI;AAAA,IACR,aAAa,KAAK,UAAU,IAAI,CAAC,aAAa,KAAK,UAAU,UAAU,CAAC,mBAAmB,KAAK;AAAA,EAClG;AACF;AAJS;AAMT,SAAS,qBAAqB,OAAiD;AAC7E,SACE,CAAC,CAAC,SACF,OAAO,UAAU,YACjB,aAAa,SACb,OAAQ,MAAiC,YAAY,aACrD,UAAU,SACV,MAAM,QAAS,MAAiC,IAAI,KACpD,eAAe;AAEnB;AAVS;;;ACvST,IAAM,kBAAkB,uBAAO,IAAI,UAAU;AAC7C,IAAM,gBAAgB;AAGtB,IAAI,aAA8B,cAAc;AAEzC,SAAS,WACd,QACA,SAA6C,cAAc,GAC3B;AAChC,QAAM,WAAW;AAAA,IACf,QAAQ,gBAAgB,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACxD,QAAQ,gBAAgB,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,EAC1D;AAEA,SAAO;AACT;AAVgB;AAYT,SAAS,OAAOC,MAA4B;AACjD,eAAa,qBAAqBA,IAAG;AACrC,MAAI,OAAO,WAAW,aAAa;AACjC,kBAAc,eAAe,IAAI;AAAA,EACnC;AACF;AALgB;AAoCT,IAAM,MAAM,eAAe,QAAQ;AAEnC,IAAM,YAAY,eAAe,QAAQ;AAEhD,SAAS,gBACP,OACA,QACA,OACyB;AACzB,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAoC,CAAC;AAE3C,aAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,KAAK,GAAG;AACjD,QAAI;AACF,eAAS,GAAG,IAAI,cAAc,QAAQ,OAAO,GAAG,GAAG,KAAK,KAAK;AAAA,IAC/D,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,YAAM,IAAI,MAAM,WAAW,KAAK,SAAS,GAAG,MAAM,OAAO,EAAE;AAAA,IAC7D;AAAA,EACF;AAEA,SAAO;AACT;AArBS;AAuBT,SAAS,cACP,QACA,OACA,KACA,OACS;AACT,MAAI,OAAO,WAAW,YAAY;AAChC,WAAO,OAAO,OAAO,EAAE,KAAK,MAAM,CAAC;AAAA,EACrC;AAEA,MAAI,UAAU,OAAO,OAAO,UAAU,YAAY;AAChD,WAAO,OAAO,MAAM,KAAK;AAAA,EAC3B;AAEA,QAAM,IAAI,MAAM,mDAAmD;AACrE;AAfS;AAiBT,SAAS,eAAe,OAAqD;AAC3E,SAAO,IAAI;AAAA,IACT,CAAC;AAAA,IACD;AAAA,MACE,IAAI,SAAS,UAAU;AACrB,YAAI,OAAO,aAAa,UAAU;AAChC,iBAAO;AAAA,QACT;AAEA,cAAMC,OAAM,YAAY,KAAK;AAC7B,eAAOA,KAAI,QAAQ;AAAA,MACrB;AAAA,MACA,UAAU;AACR,eAAO,QAAQ,QAAQ,YAAY,KAAK,CAAC;AAAA,MAC3C;AAAA,MACA,yBAAyB,SAAS,UAAU;AAC1C,cAAMA,OAAM,YAAY,KAAK;AAC7B,YAAI,EAAE,YAAYA,OAAM;AACtB,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,UACL,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,OAAOA,KAAI,QAA4B;AAAA,QACzC;AAAA,MACF;AAAA,MACA,IAAI,SAAS,UAAU;AACrB,eAAO,YAAY,YAAY,KAAK;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AACF;AAhCS;AAkCT,SAAS,YAAY,OAAqD;AACxE,MAAI,UAAU,UAAU;AACtB,0BAAsB;AAAA,EACxB;AAEA,SAAO,cAAc,EAAE,KAAK,KAAK,CAAC;AACpC;AANS;AAQT,SAAS,wBAA8B;AACrC,MAAI,OAAO,WAAW,aAAa;AACjC,UAAM,IAAI,MAAM,iEAAiE;AAAA,EACnF;AACF;AAJS;AAMT,SAAS,gBAAiC;AACxC,QAAM,cAAc,eAAe;AACnC,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,eAAe,cAAc,eAAe,GAAG;AACnE,WAAO,qBAAqB,cAAc,eAAe,CAAC;AAAA,EAC5D;AAEA,SAAO;AAAA,IACL,QAAQ,CAAC;AAAA,IACT,QAAQ,qBAAqB;AAAA,EAC/B;AACF;AAdS;AAgBT,SAAS,gBAAiC;AACxC,MAAI,OAAO,WAAW,eAAe,cAAc,eAAe,GAAG;AACnE,WAAO,cAAc,eAAe;AAAA,EACtC;AAEA,SAAO;AACT;AANS;AAQT,SAAS,iBAAyC;AAChD,MAAI;AACF,QAAI,OAAO,iBAAiB,eAAe,cAAc;AACvD,aAAO,qBAAqB,YAAY;AAAA,IAC1C;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAVS;AAYT,SAAS,uBAAgD;AACvD,MAAI;AACF,QAAI,OAAO,wBAAwB,eAAe,qBAAqB;AACrE,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO,CAAC;AACV;AAVS;AAYT,SAAS,qBAAqBA,MAAuC;AACnE,SAAO;AAAA,IACL,QAAQ,SAASA,KAAI,MAAM,IAAIA,KAAI,SAAS,CAAC;AAAA,IAC7C,QAAQ,SAASA,KAAI,MAAM,IAAIA,KAAI,SAAS,CAAC;AAAA,EAC/C;AACF;AALS;AAOT,SAAS,SAAS,OAAkD;AAClE,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACrE;AAFS;AAIT,SAAS,gBAAoD;AAC3D,MAAI,OAAO,YAAY,eAAe,QAAQ,KAAK;AACjD,WAAO,QAAQ;AAAA,EACjB;AAEA,SAAO,CAAC;AACV;AANS;;;AC7QT,mBAAkB;AA2CX,SAAS,iBAAiB,QAA8D;AAC7F,SAAO;AAAA,IACL,YAAY,QAAQ;AAAA,IACpB,gBAAgB,QAAQ,kBAAkB;AAAA,IAC1C,WAAW,QAAQ,aAAa;AAAA,EAClC;AACF;AANgB;;;ACXT,SAAS,gCACd,OACA,SAAS,uBACe;AACxB,MAAI,CAAC,MAAO,QAAO,CAAC;AAEpB,QAAM,aAAqC,CAAC;AAE5C,MAAI,MAAM,YAAY,QAAW;AAC/B,QAAI,MAAM,YAAY,UAAU,MAAM,YAAY,UAAU,MAAM,YAAY,QAAQ;AACpF,YAAM,IAAI,UAAU,GAAG,MAAM,4CAA4C;AAAA,IAC3E;AACA,eAAW,UAAU,MAAM;AAAA,EAC7B;AAEA,MAAI,MAAM,YAAY,QAAW;AAC/B,QAAI,MAAM,YAAY,QAAQ;AAC5B,iBAAW,UAAU;AAAA,IACvB,OAAO;AACL,UAAI,CAAC,MAAM,QAAQ,MAAM,OAAO,KAAK,MAAM,QAAQ,WAAW,GAAG;AAC/D,cAAM,IAAI,UAAU,GAAG,MAAM,qDAAqD;AAAA,MACpF;AAEA,YAAM,UAAU,MAAM;AAAA,QACpB,IAAI;AAAA,UACF,MAAM,QAAQ,IAAI,CAAC,WAAW;AAC5B,gBACE,OAAO,WAAW,YAClB,CAAC,OAAO,KAAK,KACb,wBAAwB,KAAK,MAAM,GACnC;AACA,oBAAM,IAAI,UAAU,GAAG,MAAM,oDAAoD;AAAA,YACnF;AACA,mBAAO,OAAO,KAAK;AAAA,UACrB,CAAC;AAAA,QACH;AAAA,MACF;AAEA,iBAAW,UAAU;AAAA,IACvB;AAAA,EACF;AAEA,MAAI,MAAM,gBAAgB,QAAW;AACnC,QAAI,MAAM,gBAAgB,QAAQ;AAChC,iBAAW,cAAc;AAAA,IAC3B,WACE,OAAO,MAAM,gBAAgB,YAC7B,CAAC,OAAO,UAAU,MAAM,WAAW,KACnC,MAAM,eAAe,GACrB;AACA,YAAM,IAAI,UAAU,GAAG,MAAM,8DAA8D;AAAA,IAC7F,OAAO;AACL,iBAAW,cAAc,MAAM;AAAA,IACjC;AAAA,EACF;AAEA,SAAO;AACT;AAzDgB;;;ACGT,SAAS,oBAAoB,YAAwD;AAC1F,MAAI,CAAC,WAAY,QAAO,CAAC;AAEzB,QAAM,aAA6B,CAAC;AACpC,aAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,UAAU,GAAG;AACvD,QAAI,CAAC,UAAU,CAAC,KAAM;AACtB,UAAM,mBAAmB,oBAAoB,MAAM;AACnD,eAAW,gBAAgB,IAAI;AAAA,MAC7B,GAAG;AAAA,MACH,GAAG,gCAAgC,MAAM,eAAe,gBAAgB,GAAG;AAAA,IAC7E;AAAA,EACF;AACA,SAAO;AACT;AAbgB;AAeT,SAAS,sBAAsB,YAA8C;AAClF,SAAO,OAAO,QAAQ,UAAU,EAC7B;AAAA,IAAO,CAAC,UACP,QAAQ,MAAM,CAAC,EAAE,QAAQ;AAAA,EAC3B,EACC,IAAI,CAAC,CAAC,QAAQ,IAAI,MAAM;AACvB,UAAM,WAAW,OAAO,KAAK,aAAa,WAAW,EAAE,IAAI,KAAK,SAAS,IAAI,KAAK;AAClF,WAAO;AAAA,MACL;AAAA,MACA,aAAa,SAAS;AAAA,MACtB,WAAW,SAAS;AAAA,MACpB,YAAY,SAAS,eAAe,SAAS,cAAc,OAAO,MAAM;AAAA,IAC1E;AAAA,EACF,CAAC;AACL;AAdgB;AAgBT,SAAS,oBAAoB,YAA4C;AAC9E,QAAM,UAA0B,CAAC;AAEjC,aAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,UAAU,GAAG;AACvD,UAAM,UAAU;AAAA,MACd,GAAG,qBAAqB,KAAK,IAAI;AAAA,MACjC,GAAG,KAAK;AAAA,IACV;AAEA,UAAM,UAAU,OAAO,QAAQ,OAAO;AACtC,QAAI,QAAQ,WAAW,EAAG;AAE1B,YAAQ,KAAK;AAAA,MACX;AAAA,MACA,SAAS,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE;AAAA,IACzD,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAnBgB;AA0DhB,SAAS,qBAAqB,MAA6D;AACzF,MAAI,CAAC,KAAM,QAAO,CAAC;AAEnB,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,MACL,+BAA+B;AAAA,MAC/B,gCAAgC;AAAA,MAChC,gCAAgC;AAAA,IAClC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,+BAA+B,KAAK,UAAU;AAAA,IAC9C,gCAAgC,cAAc,KAAK,OAAO,KAAK;AAAA,IAC/D,gCAAgC,cAAc,KAAK,OAAO,KAAK;AAAA,EACjE;AACF;AAhBS;AAkBT,SAAS,cAAc,OAAmE;AACxF,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,SAAO,MAAM,KAAK,IAAI;AACxB;AAHS;AAKT,SAAS,oBAAoB,QAAwB;AACnD,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,QAAQ,WAAW,GAAG,IAAI,UAAU,IAAI,OAAO;AACxD;AAJS;;;ACnJT,8BAAkC;;;ACUlC,IAAM,gCAAgC,uBAAO,IAAI,6BAA6B;AAC9E,IAAM,cAAc;AAIpB,SAAS,gCAA4D;AACnE,SAAQ,4FAA+C;AAAA,IACrD,WAAW,oBAAI,IAAI;AAAA,IACnB,eAAe,oBAAI,IAAI;AAAA,EACzB;AACF;AALS;AAsDF,SAAS,+BACd,UACY;AACZ,QAAM,QAAQ,8BAA8B;AAC5C,QAAM,UAAU,IAAI,QAAQ;AAC5B,SAAO,MAAM,MAAM,UAAU,OAAO,QAAQ;AAC9C;AANgB;AAQT,SAAS,uBAAuB,UAA6C;AAClF,QAAM,QAAQ,8BAA8B;AAC5C,QAAM,cAAc,IAAI,QAAQ;AAChC,SAAO,MAAM,MAAM,cAAc,OAAO,QAAQ;AAClD;AAJgB;;;AD1ET,IAAM,wCAAwC;AAuDrD,IAAM,4BAA4B,uBAAO,IAAI,0BAA0B;AAkBhE,SAAS,2BACd,QACiC;AACjC,QAAM,kBAAkB,QAAQ,kBAAkB,CAAC,GAAG,IAAI,6BAA6B;AACvF,QAAM,gBAAgB;AAAA,IACpB,QAAQ,iBAAiB;AAAA,EAC3B;AAEA,SAAO,OAAO,OAAO;AAAA,IACnB,gBAAgB,OAAO,OAAO,cAAc;AAAA,IAC5C;AAAA,EACF,CAAC;AACH;AAZgB;AA+IT,SAAS,kCAA4E;AAC1F,SAAO,uBAAuB,EAAE,SAAS;AAC3C;AAFgB;AAYhB,+BAA+B,CAAC,QAAQ;AACtC,kCAAgC,GAAG,cAAc,IAAI,GAAG;AAC1D,CAAC;AAED,uBAAuB,CAAC,SAAS;AAC/B,kCAAgC,GAAG,WAAW,IAAI,IAAI;AACxD,CAAC;AAED,SAAS,yBAA0E;AACjF,QAAMC,eAAc;AACpB,MAAI,CAACA,aAAY,yBAAyB,GAAG;AAC3C,IAAAA,aAAY,yBAAyB,IAAI,IAAI,0CAAgD;AAAA,EAC/F;AACA,SAAOA,aAAY,yBAAyB;AAC9C;AANS;AAgBT,SAAS,mBAAmB,OAAgC;AAC1D,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,CAAC,OAAO,cAAc,KAAK,KAAK,SAAS,GAAG;AAC9C,YAAM,IAAI,UAAU,6DAA6D;AAAA,IACnF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MACX,KAAK,EACL,YAAY,EACZ,MAAM,+CAA+C;AACxD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,OAAO,MAAM,CAAC,CAAC;AAC9B,QAAM,OAAO,MAAM,CAAC,KAAK;AACzB,QAAM,aAAqC;AAAA,IACzC,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACA,QAAM,QAAQ,KAAK,MAAM,SAAS,WAAW,IAAI,CAAC;AAElD,MAAI,CAAC,OAAO,cAAc,KAAK,KAAK,SAAS,GAAG;AAC9C,UAAM,IAAI,UAAU,qEAAqE;AAAA,EAC3F;AAEA,SAAO;AACT;AApCS;AAsCT,SAAS,8BAA8B,OAAuB;AAC5D,QAAM,UAAU,MAAM,KAAK,EAAE,YAAY;AACzC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,UAAU,0DAA0D;AAAA,EAChF;AAEA,MAAI,QAAQ,SAAS,GAAG,GAAG;AACzB,QAAI,CAAC,6CAA6C,KAAK,OAAO,GAAG;AAC/D,YAAM,IAAI,UAAU,iDAAiD,KAAK,UAAU,KAAK,CAAC,EAAE;AAAA,IAC9F;AACA,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,KAAK,GAAG;AAC3B,QAAI;AACJ,QAAI;AACF,eAAS,IAAI,IAAI,OAAO;AAAA,IAC1B,QAAQ;AACN,YAAM,IAAI,UAAU,+CAA+C,KAAK,UAAU,KAAK,CAAC,EAAE;AAAA,IAC5F;AAEA,QACG,OAAO,aAAa,WAAW,OAAO,aAAa,YACpD,OAAO,YACP,OAAO,YACP,OAAO,aAAa,OACpB,OAAO,UACP,OAAO,MACP;AACA,YAAM,IAAI;AAAA,QACR,oEAAoE,KAAK,UAAU,KAAK,CAAC;AAAA,MAC3F;AAAA,IACF;AACA,WAAO,OAAO;AAAA,EAChB;AAEA,MAAI,SAAS,KAAK,OAAO,GAAG;AAC1B,UAAM,IAAI;AAAA,MACR,+DAA+D,KAAK,UAAU,KAAK,CAAC;AAAA,IACtF;AAAA,EACF;AAEA,MAAI;AACF,WAAO,IAAI,IAAI,UAAU,OAAO,EAAE,EAAE;AAAA,EACtC,QAAQ;AACN,UAAM,IAAI,UAAU,+CAA+C,KAAK,UAAU,KAAK,CAAC,EAAE;AAAA,EAC5F;AACF;AA/CS;;;AErST,qBAAiE;AACjE,sBAA8B;AAC9B,yBAA8B;AAC9B,uBAAiB;AACjB,sBAA8B;AAuC9B,IAAM,oBAAoB;AAC1B,IAAM,oBAAoB;AAC1B,IAAM,yBAAyB;AAC/B,IAAM,+BACJ;AACF,IAAM,kCACJ;AAEF,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,0BAA0B,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMD,eAAsB,kBACpB,eACA,SACuC;AACvC,QAAM,cAAc,iBAAAC,QAAK,QAAQ,QAAQ,IAAI;AAC7C,QAAM,UAAU,sBAAsB,cAAc,SAAS,gBAAgB;AAE7E,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,GAAG;AAAA,QACH,QAAQ,CAAC;AAAA,MACX;AAAA,MACA,QAAQ,CAAC;AAAA,IACX;AAAA,EACF;AAEA,QAAM,eAA8B,CAAC;AACrC,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,UAAU,oBAAI,IAAoB;AAExC,QAAM,QAAQ,8BACZ,QACA,WACA,UACkB;AAClB,UAAM,iBAAiB,mBAAmB,QAAQ,SAAS;AAC3D,UAAM,aAAa,MAAM,UAAU,CAAC,UAAU,MAAM,SAAS,eAAe,IAAI;AAChF,QAAI,eAAe,IAAI;AACrB,YAAM,QAAQ,CAAC,GAAG,MAAM,MAAM,UAAU,EAAE,IAAI,CAAC,UAAU,MAAM,MAAM,GAAG,MAAM;AAC9E,YAAM,IAAI,MAAM,8BAA8B,MAAM,KAAK,MAAM,CAAC,EAAE;AAAA,IACpE;AACA,QAAI,QAAQ,IAAI,eAAe,IAAI,EAAG;AAEtC,UAAM,aAAa,mBAAmB,eAAe,MAAM,eAAe,UAAU;AACpF,UAAM,SAAS,aACX,MAAM,mBAAmB,YAAY;AAAA,MACnC,WAAW;AAAA,MACX,MAAM,eAAe;AAAA,IACvB,CAAC,IACD,CAAC;AACL,UAAM,gBAAgB,sBAAsB,OAAO,SAAS,SAAS,KAAK,UAAU,MAAM,CAAC,EAAE;AAC7F,UAAM,YAAY,CAAC,GAAG,OAAO,EAAE,MAAM,eAAe,MAAM,OAAO,CAAC;AAElE,eAAW,gBAAgB,eAAe;AACxC,YAAM,MAAM,cAAc,eAAe,MAAM,SAAS;AAAA,IAC1D;AAEA,QAAI,QAAQ,IAAI,eAAe,IAAI,EAAG;AAEtC,UAAM,OAAO,aAAa,QAAQ,eAAe,IAAI;AACrD,UAAM,kBAAkB,QAAQ,IAAI,IAAI;AACxC,QAAI,mBAAmB,oBAAoB,eAAe,MAAM;AAC9D,YAAM,IAAI;AAAA,QACR,6BAA6B,IAAI,0BAA0B,eAAe,QAAQ,eAAe,IAAI;AAAA,MACvG;AAAA,IACF;AACA,YAAQ,IAAI,MAAM,eAAe,IAAI;AAErC,YAAQ,IAAI,eAAe,IAAI;AAC/B,iBAAa,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,MACA,MAAM,eAAe;AAAA,MACrB,QAAQ,qBAAqB,OAAO,MAAM;AAAA,MAC1C;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,GA/Cc;AAiDd,aAAW,UAAU,SAAS;AAC5B,UAAM,MAAM,QAAQ,aAAa,CAAC,CAAC;AAAA,EACrC;AAEA,MAAI,eAAoC,CAAC;AACzC,aAAW,SAAS,cAAc;AAChC,mBAAe,qBAAqB,cAAc,iBAAiB,MAAM,MAAM,CAAC;AAAA,EAClF;AACA,iBAAe,qBAAqB,cAAc,aAAa;AAE/D,QAAM,SAAS,aAAa,IAAI,CAAC,EAAE,QAAQ,SAAS,GAAG,MAAM,MAAM,KAAK;AACxE,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,GAAG;AAAA,MACH,MAAM,cAAc;AAAA,MACpB,QAAQ,cAAc;AAAA,MACtB,SAAS,cAAc;AAAA,MACvB;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;AA3FsB;AAmItB,eAAsB,mBACpB,YACA,SACkB;AAClB,QAAM,EAAE,OAAO,UAAU,IAAI,MAAM,OAAO,SAAS;AACnD,QAAM,YAAY,iBAAAC,QAAK,QAAQ,QAAQ,aAAa,QAAQ,IAAI;AAChE,QAAM,iBAAiB,iBAAAA,QAAK,KAAK,WAAW,SAAS,gBAAgB;AACrE,QAAM,oBAAoB,oBAAI,IAA8B;AAC5D,YAAM,uBAAM,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAE/C,QAAM,aAAa,iBAAAA,QAAK;AAAA,IACtB;AAAA,IACA,eAAe,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAAA,EAClE;AAEA,QAAM,MAAM;AAAA,IACV,eAAe,iBAAAA,QAAK,QAAQ,QAAQ,IAAI;AAAA,IACxC,aAAa,CAAC,iBAAAA,QAAK,QAAQ,UAAU,CAAC;AAAA,IACtC,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ,OAAO,QAAQ,SAAS,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,IAClD,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM,aAAa;AACjB,sBAAY,UAAU,EAAE,QAAQ,mBAAmB,GAAG,OAAO,SAAS;AACpE,gBACE,KAAK,YAAY,sBACjB,KAAK,SAAS,sBACd,CAAC,KAAK,UACN;AACA;AAAA,YACF;AAEA,gBAAI,mBAAmB,kBAAkB,IAAI,KAAK,QAAQ;AAC1D,gBAAI,CAAC,kBAAkB;AACrB,iCAAmB,6BAA6B,KAAK,UAAU,SAAS;AACxE,gCAAkB,IAAI,KAAK,UAAU,gBAAgB;AAAA,YACvD;AACA,gBAAI,CAAE,MAAM,iBAAmB;AAE/B,kBAAM,WAAW,MAAM,YAAY,QAAQ,mBAAmB;AAAA,cAC5D,UAAU,KAAK;AAAA,cACf,MAAM,KAAK;AAAA,cACX,WAAW,KAAK;AAAA,cAChB,YAAY,KAAK;AAAA,cACjB,YAAY,EAAE,oBAAoB,KAAK;AAAA,YACzC,CAAC;AACD,gBAAI,SAAS,OAAO,SAAS,KAAK,CAAC,SAAS,KAAM;AAElD,mBAAO;AAAA,cACL,MAAM,SAAS;AAAA,cACf,UAAU;AAAA,cACV,UAAU,SAAS;AAAA,YACrB;AAAA,UACF,CAAC;AAED,sBAAY,UAAU,EAAE,QAAQ,SAAS,GAAG,OAAO,SAAS;AAC1D,gBAAI,KAAK,YAAY,mBAAoB;AAEzC,kBAAM,WAAW,MAAM,YAAY,QAAQ,KAAK,MAAM;AAAA,cACpD,UAAU,KAAK;AAAA,cACf,MAAM,KAAK;AAAA,cACX,WAAW,KAAK;AAAA,cAChB,YAAY,KAAK;AAAA,cACjB,YAAY,EAAE,oBAAoB,KAAK;AAAA,YACzC,CAAC;AAED,gBAAI,SAAS,OAAO,SAAS,KAAK,CAAC,SAAS,MAAM;AAChD,qBAAO,EAAE,MAAM,KAAK,MAAM,UAAU,KAAK;AAAA,YAC3C;AAEA,mBAAO;AAAA,cACL,MAAM,SAAS;AAAA,cACf,UAAU;AAAA,cACV,UAAU,SAAS;AAAA,YACrB;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,UAAU;AAAA,IACV,WAAW;AAAA,EACb,CAAC;AAED,QAAM,YAAY,OAAG,+BAAc,UAAU,EAAE,IAAI,MAAM,KAAK,IAAI,CAAC;AACnE,MAAI;AACF,UAAM,SAAS,MAAM;AAAA;AAAA,MAA0B;AAAA;AAC/C,UAAM,SAAS,OAAO,WAAW;AACjC,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,YAAM,IAAI,UAAU,eAAe,UAAU,wBAAwB;AAAA,IACvE;AACA,WAAO;AAAA,EACT,UAAE;AACA,cAAM,wBAAO,UAAU,EAAE,MAAM,MAAM,MAAS;AAAA,EAChD;AACF;AAnGsB;AAqGtB,eAAe,6BACb,UACA,WACkB;AAClB,MAAI;AACF,UAAM,aAAS,6BAAa,UAAU,MAAM;AAC5C,QAAI,CAAC,OAAO,SAAS,iBAAiB,EAAG,QAAO;AAEhD,UAAM,cAAc,MAAM,UAAU,QAAQ;AAAA,MAC1C,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,QAAQ,iBAAiB,QAAQ;AAAA,MACjC,YAAY;AAAA,IACd,CAAC;AACD,UAAM,aAAa,CAAC,GAAG,YAAY,KAAK,SAAS,sBAAsB,CAAC;AACxE,QAAI,WAAW,WAAW,EAAG,QAAO;AAEpC,UAAM,mBAA0D,CAAC;AACjE,eAAW,SAAS,YAAY,KAAK,SAAS,4BAA4B,GAAG;AAC3E,YAAM,aAAa,MAAM,CAAC,EACvB,MAAM,GAAG,EACT,IAAI,CAAC,cAAc,UAAU,KAAK,CAAC,EACnC,OAAO,OAAO;AACjB,UACE,WAAW,WAAW,KACtB,CAAC,WAAW,MAAM,CAAC,cAAc,gCAAgC,KAAK,SAAS,CAAC,GAChF;AACA;AAAA,MACF;AAEA,YAAM,QAAQ,MAAM,SAAS;AAC7B,uBAAiB,KAAK,EAAE,OAAO,KAAK,QAAQ,MAAM,CAAC,EAAE,OAAO,CAAC;AAAA,IAC/D;AAEA,WAAO,WAAW,MAAM,CAAC,cAAc;AACrC,YAAM,QAAQ,UAAU,SAAS;AACjC,aAAO,iBAAiB,KAAK,CAAC,UAAU,SAAS,MAAM,SAAS,QAAQ,MAAM,GAAG;AAAA,IACnF,CAAC;AAAA,EACH,QAAQ;AAEN,WAAO;AAAA,EACT;AACF;AA1Ce;AA4Cf,SAAS,iBAAiB,MAA2C;AACnE,UAAQ,iBAAAA,QAAK,QAAQ,IAAI,GAAG;AAAA,IAC1B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAbS;AAeT,SAAS,sBAAsB,OAAgB,OAAyB;AACtE,MAAI,UAAU,OAAW,QAAO,CAAC;AACjC,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,UAAM,IAAI,UAAU,GAAG,KAAK,6DAA6D;AAAA,EAC3F;AAEA,SAAO,MAAM,IAAI,CAAC,OAAO,UAAU;AACjC,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI;AACpD,YAAM,IAAI,UAAU,GAAG,KAAK,oBAAoB,KAAK,6BAA6B;AAAA,IACpF;AACA,WAAO,MAAM,KAAK;AAAA,EACpB,CAAC;AACH;AAZS;AAcT,SAAS,mBACP,QACA,WACuC;AACvC,MAAI,kBAAkB,MAAM,GAAG;AAC7B,UAAM,SAAS,OAAO,WAAW,OAAO,IACpC,iBAAAA,QAAK,QAAQ,WAAW,OAAO,MAAM,QAAQ,MAAM,CAAC,IACpD,iBAAAA,QAAK,QAAQ,WAAW,MAAM;AAClC,QAAI,KAAC,2BAAW,MAAM,GAAG;AACvB,YAAM,IAAI,MAAM,6BAA6B,KAAK,UAAU,MAAM,CAAC,SAAS,SAAS,EAAE;AAAA,IACzF;AAEA,UAAM,YAAQ,yBAAS,MAAM;AAC7B,UAAM,OAAO,MAAM,YAAY,IAAI,SAAS,iBAAAA,QAAK,QAAQ,MAAM;AAC/D,WAAO;AAAA,MACL,MAAM,kBAAkB,IAAI;AAAA,MAC5B,YAAY,MAAM,OAAO,IAAI,kBAAkB,MAAM,IAAI;AAAA,IAC3D;AAAA,EACF;AAEA,QAAM,uBAAmB,kCAAc,iBAAAA,QAAK,KAAK,WAAW,cAAc,CAAC;AAC3E,MAAI;AACJ,MAAI;AACF,sBAAkB,iBAAiB,QAAQ,GAAG,MAAM,eAAe;AAAA,EACrE,QAAQ;AAAA,EAER;AAEA,MAAI,iBAAiB;AACnB,WAAO,EAAE,MAAM,kBAAkB,iBAAAA,QAAK,QAAQ,eAAe,CAAC,EAAE;AAAA,EAClE;AAEA,MAAI;AACF,UAAM,YAAY,iBAAiB,QAAQ,MAAM;AACjD,UAAM,cAAc,uBAAuB,SAAS;AACpD,QAAI,YAAa,QAAO,EAAE,MAAM,kBAAkB,WAAW,EAAE;AAAA,EACjE,QAAQ;AAAA,EAER;AAEA,QAAM,IAAI,MAAM,qCAAqC,KAAK,UAAU,MAAM,CAAC,SAAS,SAAS,EAAE;AACjG;AAzCS;AA2CT,SAAS,uBAAuB,WAAkC;AAChE,MAAI,cAAU,yBAAS,SAAS,EAAE,YAAY,IAAI,YAAY,iBAAAA,QAAK,QAAQ,SAAS;AACpF,SAAO,MAAM;AACX,YAAI,2BAAW,iBAAAA,QAAK,KAAK,SAAS,cAAc,CAAC,EAAG,QAAO;AAC3D,UAAM,SAAS,iBAAAA,QAAK,QAAQ,OAAO;AACnC,QAAI,WAAW,QAAS,QAAO;AAC/B,cAAU;AAAA,EACZ;AACF;AARS;AAUT,SAAS,mBAAmB,MAAc,cAA2C;AACnF,MAAI,aAAc,QAAO;AACzB,aAAW,YAAY,kBAAkB;AACvC,UAAM,YAAY,iBAAAA,QAAK,KAAK,MAAM,QAAQ;AAC1C,YAAI,2BAAW,SAAS,EAAG,QAAO;AAAA,EACpC;AACA,SAAO;AACT;AAPS;AAST,SAAS,aAAa,QAAgB,MAAsB;AAC1D,MAAI,CAAC,kBAAkB,MAAM,GAAG;AAC9B,UAAM,cAAc,OAAO,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,IAAI;AAC1D,QAAI,YAAa,QAAO,kBAAkB,WAAW;AAAA,EACvD;AAEA,MAAI;AACF,UAAM,cAAc,KAAK,UAAM,6BAAa,iBAAAA,QAAK,KAAK,MAAM,cAAc,GAAG,MAAM,CAAC;AACpF,QAAI,OAAO,YAAY,SAAS,UAAU;AACxC,aAAO,kBAAkB,YAAY,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,YAAY,IAAI;AAAA,IAChF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO,kBAAkB,iBAAAA,QAAK,SAAS,IAAI,CAAC;AAC9C;AAhBS;AAkBT,SAAS,kBAAkB,OAAuB;AAChD,QAAM,OAAO,MACV,KAAK,EACL,QAAQ,oBAAoB,GAAG,EAC/B,QAAQ,YAAY,EAAE;AACzB,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,uCAAuC,KAAK,UAAU,KAAK,CAAC,EAAE;AACzF,SAAO;AACT;AAPS;AAST,SAAS,qBAAqB,OAAwB;AACpD,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,MAAM,iBAAAA,QAAK,WAAW,KAAK,GAAG;AAC9E,UAAM,IAAI,UAAU,uDAAuD;AAAA,EAC7E;AACA,QAAM,aAAa,iBAAAA,QAAK,UAAU,MAAM,KAAK,CAAC;AAC9C,MAAI,eAAe,QAAQ,WAAW,WAAW,KAAK,iBAAAA,QAAK,GAAG,EAAE,GAAG;AACjE,UAAM,IAAI,UAAU,iDAAiD;AAAA,EACvE;AACA,SAAO;AACT;AAVS;AAYT,SAAS,iBAAiB,QAAkD;AAC1E,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,MAAM,EAAE;AAAA,MACrB,CAAC,CAAC,KAAK,KAAK,MACV,QAAQ,aAAa,UAAU,UAAa,CAAC,wBAAwB,IAAI,GAAG;AAAA,IAChF;AAAA,EACF;AACF;AAPS;AAST,SAAS,qBACP,MACA,UACqB;AACrB,QAAM,SAA8B,EAAE,GAAG,KAAK;AAE9C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,QAAI,UAAU,UAAa,QAAQ,SAAU;AAE7C,QAAI,QAAQ,WAAW;AACrB,aAAO,GAAG,IAAI,CAAC,GAAG,QAAQ,OAAO,GAAG,CAAC,GAAG,GAAG,QAAQ,KAAK,CAAC;AACzD;AAAA,IACF;AAEA,QAAI,QAAQ,gBAAgB,OAAO,GAAG,MAAM,QAAW;AACrD,aAAO,GAAG,IAAI,CAAC,GAAG,QAAQ,OAAO,GAAG,CAAC,GAAG,GAAG,QAAQ,KAAK,CAAC;AACzD;AAAA,IACF;AAEA,SAAK,QAAQ,eAAe,QAAQ,cAAc,QAAQ,cAAc,OAAO,GAAG,GAAG;AACnF,aAAO,GAAG,IAAI,yBAAyB,OAAO,GAAG,GAAG,KAAK;AACzD;AAAA,IACF;AAEA,QAAI,cAAc,OAAO,GAAG,CAAC,KAAK,cAAc,KAAK,GAAG;AACtD,aAAO,GAAG,IAAI,kBAAkB,OAAO,GAAG,GAAG,KAAK;AAClD;AAAA,IACF;AAEA,WAAO,GAAG,IAAI;AAAA,EAChB;AAEA,SAAO;AACT;AAjCS;AAmCT,SAAS,kBAAkB,MAA2B,UAA+B;AACnF,QAAM,SAA8B,EAAE,GAAG,KAAK;AAC9C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,QAAI,UAAU,OAAW;AACzB,WAAO,GAAG,IACR,cAAc,OAAO,GAAG,CAAC,KAAK,cAAc,KAAK,IAC7C,kBAAkB,OAAO,GAAG,GAAG,KAAK,IACpC;AAAA,EACR;AACA,SAAO;AACT;AAVS;AAYT,SAAS,yBAAyB,MAAe,UAAmB;AAClE,SAAO,YAAY,CAAC,GAAI,MAAM,kBAAkB,IAAI,GAAI,GAAI,MAAM,kBAAkB,QAAQ,CAAE;AAChG;AAFS;AAIT,eAAe,kBAAkB,OAAgC;AAC/D,QAAM,WAAW,OAAO,UAAU,aAAa,MAAM,MAAM,IAAI;AAC/D,SAAO,QAAQ,QAAQ;AACzB;AAHe;AAKf,SAAS,QAAQ,OAAuB;AACtC,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO,CAAC;AACnD,SAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAC9C;AAHS;AAKT,SAAS,cAAc,OAA8C;AACnE,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG,QAAO;AACxE,QAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,SAAO,cAAc,OAAO,aAAa,cAAc;AACzD;AAJS;AAMT,SAAS,kBAAkB,QAAyB;AAClD,SACE,OAAO,WAAW,GAAG,KACrB,OAAO,WAAW,GAAG,KACrB,OAAO,WAAW,OAAO,KACzB,kBAAkB,KAAK,MAAM;AAEjC;AAPS;AAST,SAAS,kBAAkB,OAAuB;AAChD,SAAO,iBAAAA,QAAK,YAAQ,6BAAa,KAAK,CAAC;AACzC;AAFS;;;ACphBT,kBAAiB;;;ACfV,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;;;AC9BT,IAAM,iCAAiC;AAkBvC,SAAS,0BACd,QACA,OAAqC,eACT;AAC5B,MAAI,SAAS,iBAAiB,WAAW,OAAO;AAC9C,WAAO,EAAE,SAAS,OAAO,UAAU,MAAM;AAAA,EAC3C;AAEA,QAAM,UAAU,WAAW,QAAQ,WAAW,SAAY,CAAC,IAAI;AAC/D,QAAM,UAAU,QAAQ,WAAW;AAEnC,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,SAAS,OAAO,UAAU,MAAM;AAAA,EAC3C;AAEA,QAAM,WACJ,OAAO,QAAQ,aAAa,YAAY,QAAQ,SAAS,KAAK,IAC1D,QAAQ,SACL,YAAY,EACZ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO,EACd,KAAK,GAAG,IACX,QAAQ,aAAa,QACnB,QACA;AAER,SAAO,EAAE,SAAS,MAAM,SAAS;AACnC;AA5BgB;;;AClBT,IAAM,0BAA0B;AAChC,IAAM,kCAAkC;AAAA,EAC7C;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AACzC;AACO,IAAM,2BAA2B,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,GAAG;AACnE,IAAM,+BAA+B,CAAC,EAAE;AACxC,IAAM,6BAA6B,CAAC,YAAY;AA4DvD,IAAM,aAAqC;AAAA,EACzC,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAEO,SAAS,uBACd,QACyB;AACzB,QAAMC,QAAO,mBAAmB,QAAQ,QAAQ,uBAAuB;AACvE,QAAM,cAAc;AAAA,IAClB,QAAQ,eAAe;AAAA,IACvB;AAAA,EACF;AACA,QAAM,aAAa;AAAA,IACjB,QAAQ,cAAc;AAAA,IACtB;AAAA,EACF;AACA,QAAM,YAAY;AAAA,IAChB,QAAQ,aAAa;AAAA,IACrB;AAAA,IACA;AAAA,EACF;AACA,QAAM,UAAU,CAAC,GAAG,IAAI,IAAI,QAAQ,WAAW,0BAA0B,CAAC;AAE1E,MAAI,QAAQ,KAAK,CAAC,WAAW,WAAW,gBAAgB,WAAW,YAAY,GAAG;AAChF,UAAM,IAAI,UAAU,4DAA4D;AAAA,EAClF;AAEA,QAAM,kBAAkB;AAAA,IACtB,QAAQ,mBAAmB;AAAA,IAC3B;AAAA,EACF;AACA,QAAM,mBAAmB;AAAA,IACvB,QAAQ,oBAAoB;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO,OAAO,OAAO;AAAA,IACnB,UAAU,QAAQ,YAAY;AAAA,IAC9B,MAAAA;AAAA,IACA,SAAS,OAAO,OAAO;AAAA,MACrB,GAAG,IAAI;AAAA,SACJ,QAAQ,WAAW,CAAC,GAAG,IAAI,CAAC,WAAW,OAAO,KAAK,EAAE,YAAY,CAAC,EAAE,OAAO,OAAO;AAAA,MACrF;AAAA,IACF,CAAC;AAAA,IACD,gBAAgB,OAAO;AAAA,OACpB,QAAQ,kBAAkB,CAAC,GAAG,IAAI,CAAC,YAAY,uBAAuB,OAAO,CAAC;AAAA,IACjF;AAAA,IACA,eAAe,OAAO;AAAA,OACnB,QAAQ,iBAAiB,CAAC,EAAE,UAAU,MAAM,CAAC,GAAG;AAAA,QAAI,CAAC,YACpD,sBAAsB,OAAO;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,aAAa,OAAO,OAAO,WAAW;AAAA,IACtC,YAAY,OAAO,OAAO,UAAU;AAAA,IACpC,WAAW,OAAO,OAAO,SAAS;AAAA,IAClC,SAAS,OAAO,OAAO,OAAO;AAAA,IAC9B;AAAA,IACA,qBAAqB;AAAA,MACnB,QAAQ,uBAAuB;AAAA,MAC/B;AAAA,IACF;AAAA,IACA;AAAA,IACA,qBAAqB,QAAQ,uBAAuB;AAAA,IACpD,yBAAyB,QAAQ,2BAA2B;AAAA,EAC9D,CAAC;AACH;AA7DgB;AA4EhB,SAAS,mBAAmB,OAAuB;AACjD,QAAMC,QAAO,MAAM,KAAK,EAAE,QAAQ,QAAQ,EAAE,KAAK;AACjD,MAAI,CAACA,MAAK,WAAW,GAAG,KAAKA,MAAK,SAAS,GAAG,KAAKA,MAAK,SAAS,GAAG,GAAG;AACrE,UAAM,IAAI,UAAU,kEAAkE;AAAA,EACxF;AACA,SAAOA;AACT;AANS;AAQT,SAAS,qBAAqB,QAA2B,MAAc,KAAwB;AAC7F,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI,UAAU,GAAG,IAAI,kCAAkC;AAAA,EAC/D;AAEA,QAAM,aAAa,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,UAAU,OAAO,KAAK;AAC1E,aAAW,SAAS,YAAY;AAC9B,QAAI,CAAC,OAAO,cAAc,KAAK,KAAK,SAAS,KAAM,QAAQ,UAAa,QAAQ,KAAM;AACpF,YAAM,IAAI;AAAA,QACR,GAAG,IAAI,kCAAkC,MAAM,oBAAoB,GAAG,KAAK,EAAE;AAAA,MAC/E;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAdS;AAgBT,SAAS,4BAA4B,OAAe,MAAsB;AACxE,MAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GAAG;AAC7C,UAAM,IAAI,UAAU,GAAG,IAAI,sCAAsC;AAAA,EACnE;AACA,SAAO;AACT;AALS;AAOT,SAAS,UAAU,OAAwB,MAAsB;AAC/D,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,CAAC,OAAO,cAAc,KAAK,KAAK,SAAS,GAAG;AAC9C,YAAM,IAAI,UAAU,GAAG,IAAI,kCAAkC;AAAA,IAC/D;AACA,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MACX,KAAK,EACL,YAAY,EACZ,MAAM,8CAA8C;AACvD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,UAAU,GAAG,IAAI,+CAA+C;AAAA,EAC5E;AAEA,QAAM,QAAQ,OAAO,MAAM,CAAC,CAAC,IAAI,WAAW,MAAM,CAAC,CAAC;AACpD,MAAI,CAAC,OAAO,cAAc,KAAK,KAAK,SAAS,GAAG;AAC9C,UAAM,IAAI,UAAU,GAAG,IAAI,0CAA0C;AAAA,EACvE;AACA,SAAO;AACT;AArBS;AAuBT,SAAS,uBAAuB,SAAyD;AACvF,QAAM,WAAW,QAAQ,SAAS,KAAK,EAAE,YAAY;AACrD,MAAI,CAAC,YAAY,SAAS,SAAS,GAAG,KAAK,SAAS,SAAS,GAAG,GAAG;AACjE,UAAM,IAAI,UAAU,0EAA0E;AAAA,EAChG;AACA,MAAI,QAAQ,YAAY,CAAC,QAAQ,SAAS,WAAW,GAAG,GAAG;AACzD,UAAM,IAAI,UAAU,oDAAoD;AAAA,EAC1E;AACA,MAAI,QAAQ,UAAU,CAAC,QAAQ,OAAO,WAAW,GAAG,GAAG;AACrD,UAAM,IAAI,UAAU,kDAAkD;AAAA,EACxE;AACA,SAAO,OAAO,OAAO,EAAE,GAAG,SAAS,SAAS,CAAC;AAC/C;AAZS;AAcT,SAAS,sBAAsB,SAAuD;AACpF,MAAI,CAAC,QAAQ,SAAS,WAAW,GAAG,GAAG;AACrC,UAAM,IAAI,UAAU,mDAAmD;AAAA,EACzE;AACA,MAAI,QAAQ,UAAU,CAAC,QAAQ,OAAO,WAAW,GAAG,GAAG;AACrD,UAAM,IAAI,UAAU,iDAAiD;AAAA,EACvE;AACA,SAAO,OAAO,OAAO,EAAE,GAAG,QAAQ,CAAC;AACrC;AARS;;;AC5NT,IAAAC,oBAAiB;AAQV,IAAM,2BAA2B;AACjC,IAAM,mCAAmC,KAAK,KAAK,KAAK;AAE/D,IAAM,oBAAwD,CAAC,OAAO,UAAU,iBAAiB;AAE1F,SAAS,sBACd,OACA,UAAkE,CAAC,GAC3C;AACxB,QAAM,OAAO,QAAQ,QAAQ,QAAQ,IAAI;AACzC,QAAM,kBAAkB,QAAQ,SAAS;AAEzC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,CAAC,IAAI;AAAA,MACd,eAAe;AAAA,MACf,UAAU,kBAAAC,QAAK,KAAK,MAAM,cAAc;AAAA,MACxC,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,MACZ,gBAAgB;AAAA,MAChB,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,UAAU;AAAA,QACV,QAAQ,QAAQ,SAAS;AAAA,MAC3B;AAAA,MACA,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAEA,MAAI,CAAC,MAAM,QAAQ,MAAM,OAAO,KAAK,MAAM,QAAQ,WAAW,GAAG;AAC/D,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AAEA,QAAM,UAAU,MAAM,QAAQ,IAAI,kBAAkB;AACpD,MAAI,IAAI,IAAI,OAAO,EAAE,SAAS,QAAQ,QAAQ;AAC5C,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAEA,QAAM,gBAAgB,mBAAmB,MAAM,aAAa;AAC5D,MAAI,CAAC,QAAQ,SAAS,aAAa,GAAG;AACpC,UAAM,IAAI,MAAM,uBAAuB,aAAa,qCAAqC;AAAA,EAC3F;AAEA,QAAM,iBAAiB,mBAAmB,MAAM,kBAAkB,aAAa;AAC/E,MAAI,CAAC,QAAQ,SAAS,cAAc,GAAG;AACrC,UAAM,IAAI,MAAM,wBAAwB,cAAc,qCAAqC;AAAA,EAC7F;AAEA,QAAM,YAAY,iBAAiB,KAAK;AACxC,QAAM,YAA+C,CAAC;AACtD,aAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,MAAM,aAAa,CAAC,CAAC,GAAG;AACtE,UAAM,SAAS,mBAAmB,SAAS;AAC3C,QAAI,CAAC,QAAQ,SAAS,MAAM,GAAG;AAC7B,YAAM,IAAI,MAAM,2CAA2C,SAAS,IAAI;AAAA,IAC1E;AACA,QAAI,UAAU,SAAS,UAAU,OAAO;AACtC,YAAM,IAAI,MAAM,kBAAkB,SAAS,0BAA0B;AAAA,IACvE;AACA,cAAU,MAAM,IAAI;AAAA,EACtB;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,UAAU,kBAAAA,QAAK,QAAQ,MAAM,MAAM,YAAY,cAAc;AAAA,IAC7D,SAAS,MAAM,WAAW;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,QAAQ,MAAM,UAAU;AAAA,IACxB,QAAQ;AAAA,MACN,MAAM,MAAM,QAAQ,MAAM,KAAK,KAAK;AAAA,MACpC,QAAQ;AAAA,QACN,MAAM,QAAQ;AAAA,QACd;AAAA,QACA;AAAA,MACF;AAAA,MACA,MAAM,MAAM,QAAQ,QAAQ;AAAA,MAC5B,UAAU,MAAM,QAAQ,YAAY;AAAA,MACpC,QAAQ,MAAM,QAAQ,UAAU,QAAQ,SAAS;AAAA,IACnD;AAAA,IACA;AAAA,EACF;AACF;AAlFgB;AA6FT,SAAS,mBAAmB,QAAwB;AACzD,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,MAAI;AACF,WAAO,KAAK,oBAAoB,MAAM,EAAE,CAAC;AAAA,EAC3C,QAAQ;AACN,UAAM,IAAI,MAAM,wBAAwB,MAAM,IAAI;AAAA,EACpD;AACF;AAVgB;AAYhB,SAAS,iBAAiB,OAA+D;AACvF,MAAI,MAAM,cAAc,SAAS,MAAM,oBAAoB,OAAO;AAChE,WAAO,CAAC,KAAK;AAAA,EACf;AAEA,QAAM,YAAY,MAAM,aAAa;AACrC,QAAM,UAAU,oBAAI,IAA6B,CAAC,OAAO,UAAU,iBAAiB,CAAC;AACrF,QAAM,SAAoC,CAAC;AAE3C,aAAW,UAAU,WAAW;AAC9B,QAAI,CAAC,QAAQ,IAAI,MAAM,GAAG;AACxB,YAAM,IAAI,MAAM,sCAAsC,MAAM,IAAI;AAAA,IAClE;AACA,QAAI,CAAC,OAAO,SAAS,MAAM,EAAG,QAAO,KAAK,MAAM;AAAA,EAClD;AAEA,SAAO;AACT;AAjBS;AAmBT,SAAS,yBACP,OACA,UACA,MACQ;AACR,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG;AACzC,UAAM,IAAI,MAAM,GAAG,IAAI,8BAA8B;AAAA,EACvD;AACA,SAAO;AACT;AAVS;;;ACzIT,IAAAC,sBAA8B;AAC9B,IAAAC,oBAAiB;AACjB,IAAAC,mBAA8B;AAgFvB,SAAS,sBACd,OACwB;AACxB,QAAM,SAAS,UAAU,OAAO,CAAC,IAAI,SAAS,OAAO,UAAU,WAAW,QAAQ,CAAC;AACnF,QAAM,iBAAiB,OAAO,OAAO,qBAAqB,WAAW,OAAO,mBAAmB,CAAC;AAEhG,QAAM,WAAmC;AAAA,IACvC,SAAS,UAAU,UAAa,UAAU,SAAS,OAAO,YAAY;AAAA,IACtE,SAAS,OAAO;AAAA,IAChB,UAAU,kBAAkB,OAAO,QAAQ;AAAA,IAC3C,kBAAkB;AAAA,MAChB,SAAS,OAAO,qBAAqB;AAAA,MACrC,0BAA0B,eAAe,4BAA4B;AAAA,MACrE,mBAAmB,eAAe,qBAAqB;AAAA,MACvD,mBAAmB,eAAe,qBAAqB;AAAA,IACzD;AAAA,IACA,SAAS;AAAA,MACP,WAAW,OAAO,SAAS,aAAa,KAAK,KAAK,KAAK;AAAA,MACvD,WAAW,OAAO,SAAS,aAAa,KAAK,KAAK;AAAA,IACpD;AAAA,IACA,UAAU;AAAA,MACR,KAAK,OAAO,UAAU;AAAA,MACtB,MAAM,OAAO,UAAU,QAAQ;AAAA,MAC/B,sBAAsB,OAAO,UAAU,wBAAwB;AAAA,IACjE;AAAA,EACF;AAEA,yBAAuB,QAAQ;AAC/B,SAAO;AACT;AA7BgB;AA+BhB,eAAsB,2BACpB,QACA,SAIsC;AACtC,MAAI,CAAC,OAAO,QAAS,QAAO;AAE5B,QAAM,OAAO,kBAAAC,QAAK,QAAQ,QAAQ,IAAI;AACtC,MAAI;AACJ,MAAI;AACF,UAAM,qBAAiB,mCAAc,kBAAAA,QAAK,KAAK,MAAM,cAAc,CAAC;AACpE,iBAAa,eAAe,QAAQ,wBAAwB;AAAA,EAC9D,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAW,MAAM;AAAA;AAAA,QACF,gCAAc,UAAU,EAAE;AAAA;AAE/C,MAAI,OAAO,QAAQ,8BAA8B,YAAY;AAC3D,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,QAAQ,0BAA0B,QAAQ;AAAA,IAC/C,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAjCsB;AAmCtB,SAAS,kBAAkB,OAAmC;AAC5D,QAAM,SAAS,SAAS,aAAa,KAAK;AAC1C,QAAM,mBAAmB,MAAM,WAAW,GAAG,IAAI,QAAQ,IAAI,KAAK;AAClE,QAAM,aAAa,iBAAiB,QAAQ,QAAQ,GAAG,EAAE,QAAQ,QAAQ,EAAE;AAC3E,SAAO,cAAc;AACvB;AALS;AAOT,SAAS,uBAAuB,QAAsC;AACpE,QAAM,EAAE,mBAAmB,kBAAkB,IAAI,OAAO;AACxD,MAAI,CAAC,OAAO,UAAU,iBAAiB,KAAK,oBAAoB,GAAG;AACjE,UAAM,IAAI,MAAM,qEAAqE;AAAA,EACvF;AACA,MAAI,CAAC,OAAO,UAAU,iBAAiB,KAAK,oBAAoB,mBAAmB;AACjF,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,OAAO,UAAU,OAAO,QAAQ,SAAS,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC/E,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AACA,MAAI,CAAC,OAAO,UAAU,OAAO,QAAQ,SAAS,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC/E,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AACF;AAhBS;;;AL5FT,IAAM,+BAA+B,uBAAO,IAAI,4BAA4B;AAgSrE,SAAS,sBAAsB,QAAyD;AAC7F,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,WAAW,sBAAsB,WAAW,mBAAoB,QAAO;AAC3E,MAAI,WAAW,iBAAiB,WAAW,QAAS,QAAO;AAC3D,SAAO;AACT;AALgB;AAOT,SAAS,yBACd,QACsC;AACtC,UAAQ,sBAAsB,MAAM,GAAG;AAAA,IACrC,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAfgB;AAiBT,SAAS,yBAAyB,QAA+C;AACtF,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,WAAW,YAAY,WAAW,cAAe,QAAO;AAC5D,MAAI,WAAW,gBAAgB,WAAW,sBAAsB,WAAW,qBAAqB;AAC9F,WAAO;AAAA,EACT;AACA,MAAI,WAAW,aAAa,WAAW,eAAgB,QAAO;AAC9D,MAAI,WAAW,cAAe,QAAO;AACrC,SAAO;AACT;AATgB;AAWT,SAAS,0BACd,QACA,QACA,SACQ;AACR,QAAM,mBAAmB,sBAAsB,MAAM,KAAK,yBAAyB,MAAM;AACzF,MAAI,qBAAqB,SAAU,QAAO;AAC1C,SAAO,GAAG,OAAO;AACnB;AARgB;AAcT,SAAS,oBACd,QACA,YAII,CAAC,GACqB;AAC1B,QAAM,SAAS,OAAO,UAAU,CAAC;AACjC,QAAM,UAAU,OAAO,WAAW;AAClC,QAAM,SAAS,sBAAsB,UAAU,UAAU,OAAO,MAAM;AACtE,QAAM,SACJ,UAAU,UACV,OAAO,UACP,OAAO,UACP,yBAAyB,MAAM,KAC/B;AACF,QAAM,iBAAiB,UAAU,yBAAyB,MAAM;AAChE,QAAM,iBACJ,mBAAmB,WACf,OAAO,QAAQ,kBACf,mBAAmB,eACjB,OAAO,YAAY,YACnB,mBAAmB,YACjB,OAAO,SAAS,YAChB;AACV,QAAM,YACJ,UAAU,aACV,OAAO,aACP,OAAO,UACP,kBACA,0BAA0B,gBAAgB,QAAQ,OAAO;AAE3D,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACF;AAvCgB;AAyCT,SAAS,wBACd,YAC8B;AAC9B,MAAI,CAAC,WAAY,QAAO,EAAE,UAAU,CAAC,EAAE;AACvC,MAAI,MAAM,QAAQ,UAAU,EAAG,QAAO,EAAE,UAAU,WAAW;AAC7D,SAAO,EAAE,UAAU,WAAW,YAAY,CAAC,EAAE;AAC/C;AANgB;AAQT,IAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,mBAAmB,OAA2B,WAAW,SAAiB;AACjF,QAAM,OAAO,SAAS,UAAU,KAAK;AACrC,MAAI,CAAC,OAAO,QAAQ,IAAK,QAAO;AAChC,QAAM,aAAa,IAChB,QAAQ,OAAO,GAAG,EAClB,QAAQ,QAAQ,GAAG,EACnB,QAAQ,QAAQ,GAAG,EACnB,QAAQ,QAAQ,EAAE;AACrB,SAAO,cAAc;AACvB;AATS;AAWT,SAAS,iBAAiB,OAAuB;AAC/C,QAAM,QAAQ,MAAM,QAAQ,QAAQ,EAAE,EAAE,QAAQ,QAAQ,EAAE;AAC1D,SAAO,SAAS;AAClB;AAHS;AAKT,SAAS,wBAAwB,OAA+C;AAC9E,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,aAAa,MAAM,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,EAAE,EAAE,QAAQ,QAAQ,EAAE;AACnF,SAAO,cAAc;AACvB;AAJS;AAMT,SAASC,UAAS,OAA8C;AAC9D,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACrE;AAFS,OAAAA,WAAA;AAIT,SAAS,kBAAkB,OAAgB,OAAO,oBAAI,QAAgB,GAAQ;AAC5E,MAAI,UAAU,KAAM,QAAO;AAE3B,QAAM,YAAY,OAAO;AACzB,MAAI,cAAc,YAAY,cAAc,YAAY,cAAc,WAAW;AAC/E,WAAO;AAAA,EACT;AACA,MAAI,cAAc,eAAe,cAAc,cAAc,cAAc,UAAU;AACnF,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,kBAAkB,MAAM,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,SAAS,MAAS;AAAA,EAC/F;AACA,MAAI,iBAAiB,MAAM;AACzB,WAAO,MAAM,YAAY;AAAA,EAC3B;AACA,MAAIA,UAAS,KAAK,GAAG;AACnB,QAAI,KAAK,IAAI,KAAK,EAAG,QAAO;AAC5B,SAAK,IAAI,KAAK;AAEd,UAAM,SAA8B,CAAC;AACrC,eAAW,CAAC,KAAK,WAAW,KAAK,OAAO,QAAQ,KAAK,GAAG;AACtD,YAAM,cAAc,kBAAkB,aAAa,IAAI;AACvD,UAAI,gBAAgB,QAAW;AAC7B,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AA/BS;AAiCT,SAAS,mBAAmB,QAAkD;AAC5E,SAAO,kBAAkB,MAAM,KAAK,CAAC;AACvC;AAFS;AAIT,eAAsB,mBACpB,SACA,YAC6B;AAC7B,QAAM,EAAE,YAAAC,YAAW,IAAI,MAAM,OAAO,IAAI;AACxC,QAAM,OAAO,YAAAC,QAAK,QAAQ,WAAW,QAAQ,IAAI,CAAC;AAElD,MAAI,YAAY;AACd,UAAM,eAAe,YAAAA,QAAK,WAAW,UAAU,IAAI,aAAa,YAAAA,QAAK,KAAK,MAAM,UAAU;AAC1F,QAAI,CAACD,YAAW,YAAY,GAAG;AAC7B,YAAM,IAAI,MAAM,iCAAiC,UAAU,GAAG;AAAA,IAChE;AACA,WAAO,YAAAC,QAAK,QAAQ,YAAY;AAAA,EAClC;AAEA,aAAW,YAAY,uBAAuB;AAC5C,UAAM,eAAe,YAAAA,QAAK,KAAK,MAAM,QAAQ;AAC7C,QAAID,YAAW,YAAY,GAAG;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAvBsB;AAyBtB,eAAsB,eACpB,SACA,YAC0E;AAC1E,QAAM,KAAK,MAAM,OAAO,aAAa;AACrC,QAAM,EAAE,eAAAE,eAAc,IAAI,MAAM,OAAO,KAAK;AAC5C,QAAM,OAAO,YAAAD,QAAK,QAAQ,WAAW,QAAQ,IAAI,CAAC;AAClD,QAAM,eAAe,MAAM,mBAAmB,MAAM,UAAU;AAE9D,MAAI,CAAC,aAAc,QAAO;AAE1B,MAAI;AACF,QAAI,aAAa,SAAS,OAAO,GAAG;AAClC,YAAM,UAAU,MAAM,GAAG,SAAS,cAAc,MAAM;AACtD,aAAO,EAAE,QAAQ,KAAK,MAAM,OAAO,GAAG,YAAY,aAAa;AAAA,IACjE;AAEA,UAAM,EAAE,MAAM,IAAI,MAAM,OAAO,SAAS;AACxC,UAAM,iBAAiB,YAAAA,QAAK,KAAK,MAAM,SAAS,gBAAgB;AAChE,UAAM,GAAG,MAAM,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAClD,UAAM,aAAa,YAAAA,QAAK;AAAA,MACtB;AAAA,MACA,eAAe,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAAA,IAClE;AAEA,UAAM,MAAM;AAAA,MACV,eAAe;AAAA,MACf,aAAa,CAAC,YAAY;AAAA,MAC1B,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ,OAAO,QAAQ,SAAS,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,MAClD,UAAU;AAAA,MACV,KAAK;AAAA,MACL,UAAU;AAAA,MACV,WAAW;AAAA,IACb,CAAC;AAED,UAAM,YAAYC,eAAc,UAAU,EAAE,OAAO,MAAM,KAAK,IAAI,CAAC;AACnE,QAAI;AAEJ,QAAI;AACF,uBAAiB,MAAM;AAAA;AAAA,QAA0B;AAAA;AAAA,IACnD,UAAE;AACA,YAAM,GAAG,OAAO,UAAU,EAAE,MAAM,MAAM,MAAS;AAAA,IACnD;AAEA,WAAO;AAAA,MACL,QAAQ,eAAe,WAAW;AAAA,MAClC,YAAY;AAAA,IACd;AAAA,EACF,SAAS,OAAY;AACnB,UAAM,eAAe,YAAAD,QAAK,SAAS,MAAM,YAAY,KAAK;AAC1D,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAM,IAAI,MAAM,mCAAmC,YAAY,KAAK,OAAO,EAAE;AAAA,EAC/E;AACF;AAzDsB;AA2DtB,eAAsB,kBACpB,UACA,UAGI,CAAC,GAC4B;AACjC,QAAM,OAAO,QAAQ,QAAQ,QAAQ,IAAI;AAEzC,MAAI,aAAa,OAAO;AACtB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,MACP,QAAQ,EAAE,OAAO,QAAQ,UAAU,QAAQ;AAAA,IAC7C;AAAA,EACF;AAEA,QAAM,cAAcF,UAAS,QAAQ,IAAI,WAAW,CAAC;AACrD,MAAI,YAAY,YAAY,OAAO;AACjC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,MACP,QAAQ,EAAE,OAAO,QAAQ,UAAU,QAAQ;AAAA,IAC7C;AAAA,EACF;AAEA,QAAM,eAAe,MAAM,eAAe,MAAM,YAAY,UAAU;AACtE,QAAM,wBAAwB,aAAa,QAAQA,UAAS,QAAQ;AAEpE,MAAI,CAAC,yBAAyB,CAAC,cAAc;AAC3C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,MACP,QAAQ,EAAE,OAAO,QAAQ,UAAU,QAAQ;AAAA,IAC7C;AAAA,EACF;AAEA,QAAM,mBAAmB,mBAAmB,YAAY,UAAU,CAAC,CAAC;AACpE,QAAM,mBAAmB,mBAAmB;AAAA,IAC1C,GAAG;AAAA,IACH,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,EACd,CAAwB;AACxB,QAAM,mBAAmB,mBAAmB,cAAc,UAAU,CAAC,CAAC;AACtE,QAAM,mBAAwC;AAAA,IAC5C,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAEA,QAAM,gBAAgB,OAAO,YAAY,UAAU,WAAW,YAAY,QAAQ;AAClF,QAAM,qBACJ,OAAO,iBAAiB,aAAa,WAAW,iBAAiB,WAAW;AAC9E,QAAM,kBACJ,OAAO,iBAAiB,UAAU,WAAW,iBAAiB,QAAQ;AACxE,QAAM,aAAa;AAAA,IACjB,sBAAsB,kBAAkB,kBAAkB,IAAI,eAAe,KAAK;AAAA,EACpF;AACA,QAAM,YACJ,iBAAiB,cAAc,WAAW,GAAG,IACzC,iBAAiB,aAAa,IAC9B,iBAAiB,mBAAmB,UAAU;AACpD,QAAM,aAAa,wBAAwB,YAAY,cAAc,iBAAiB,UAAU;AAEhG,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,IACP;AAAA,IACA,YAAY,cAAc;AAAA,IAC1B,QAAQ;AAAA,MACN,GAAG;AAAA,MACH,OAAO;AAAA,MACP,UAAU;AAAA,MACV,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,IACrC;AAAA,EACF;AACF;AA7EsB;AA+EtB,eAAsB,cACpB,YACA,MAC6B;AAC7B,QAAM,cAAc,WAAW,QAAQ,QAAQ,IAAI;AACnD,QAAM,kBAAkB,MAAM,kBAAkB,YAAY;AAAA,IAC1D,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AACD,eAAa,gBAAgB;AAE7B,QAAM,YACJ,OAAO,WAAW,cAAc,aAC5B,MAAM,WAAW,UAAU,IAC3B,WAAW,aAAa,CAAC;AAE/B,QAAM,WACJ,OAAO,WAAW,aAAa,aAC3B,MAAM,WAAW,SAAS,IAC1B,WAAW,YAAY,CAAC;AAE9B,QAAM,UACJ,OAAO,WAAW,YAAY,aAC1B,MAAM,WAAW,QAAQ,IACzB,WAAW,WAAW,CAAC;AAC7B,QAAM,aAAa,oBAAoB,WAAW,UAAU;AAC5D,QAAM,qBAAqB,sBAAsB,UAAU;AAC3D,QAAM,mBAAmB,oBAAoB,UAAU;AAEvD,QAAM,SAAS,oBAAoB,UAAU;AAC7C,QAAM,OAAO,WAAW,QAAQ,QAAQ,IAAI;AAC5C,QAAM,SAAS,WAAW,UAAU;AACpC,QAAM,OAAO,MAAM,kBAAkB,WAAW,MAAM,EAAE,MAAM,OAAO,CAAC;AACtE,QAAM,KAAK,sBAAsB,WAAW,EAAE;AAC9C,QAAM,MAAM,iBAAiB,WAAW,GAAG;AAC3C,QAAMI,OAAM,WAAW,WAAW,KAAK,QAAQ,GAAG;AAClD,SAAOA,IAAG;AACV,QAAM,OAAO,sBAAsB,WAAW,IAAI;AAClD,MAAI,KAAK,WAAW,WAAW,cAAc,MAAM;AACjD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,wBAAwB,MAAM,2BAA2B,MAAM;AAAA,IACnE;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,eAAe,wBACjB,EAAE,GAAG,WAAW,cAAc,MAAM,sBAAsB,IAC1D,WAAW,gBAAgB,CAAC;AAChC,QAAM,kBAAkB,WAAW,oBAAoB,MAAM,SAAS,KAAK,IAAI,CAAC;AAChF,QAAM,eAAe;AAAA,IACnB,WAAW,gBACT,QAAQ,IAAI,sBACZ,QAAQ,IAAI,yBACZ,QAAQ,IAAI,wBACX,SAAS,eAAe,MAAM,gBAAgB,IAAI;AAAA,EACvD;AAEA,QAAM,WAA+B;AAAA,IACnC,CAAC,4BAA4B,GAAG,OAAO,WAAW,YAAY;AAAA,IAC9D;AAAA,IACA;AAAA,IACA,SAAS,WAAW,WAAW,CAAC;AAAA,IAChC,QAAQ,gBAAgB;AAAA,IACxB,QAAQ,WAAW,UAAU;AAAA,IAC7B,UAAU,WAAW,YAAY;AAAA,IACjC,QAAQ,OAAO,UAAU;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,wBAAwB,WAAW,UAAU;AAAA,IACzD,MAAM,kBAAkB,WAAW,IAAI;AAAA,IACvC,WAAW,uBAAuB,WAAW,SAAS;AAAA,IACtD,eAAe,WAAW,iBAAiB;AAAA,IAC3C,UAAU,0BAA0B,WAAW,UAAU,IAAI;AAAA,IAC7D,SAAS,WAAW,WAAW,CAAC;AAAA,IAChC,OAAO,WAAW,SAAS,CAAC;AAAA,IAC5B;AAAA,IACA,oBAAoB,WAAW,sBAAsB;AAAA,IACrD,cAAc;AAAA,MACZ,kBAAkB;AAAA,MAClB,eAAe;AAAA,MACf,GAAG,WAAW;AAAA,IAChB;AAAA,IACA,SAAS,CAAC,GAAG,0BAA0B,YAAY,GAAG,GAAI,WAAW,WAAW,CAAC,CAAE;AAAA,IACnF;AAAA,IACA,eAAe,WAAW,iBAAiB;AAAA,IAC3C,WAAW,6BAAM,CAAC,GAAG,WAAW,GAAG,kBAAkB,GAA1C;AAAA,IACX,UAAU,6BAAM,UAAN;AAAA,IACV,SAAS,6BAAM,CAAC,GAAG,SAAS,GAAG,gBAAgB,GAAtC;AAAA,IACT;AAAA,IACA,QAAQ,uBAAuB,WAAW,MAAM;AAAA,IAChD,WAAW,WAAW,aAAa;AAAA,IACnC,MAAM,sBAAsB,WAAW,MAAM,EAAE,MAAM,KAAK,CAAC;AAAA,IAC3D,SAAS;AAAA,MACP,SAAS;AAAA,MACT,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,MACT,SAAS,CAAC,EAAE,KAAK,yBAAyB,aAAa,qBAAqB,CAAC;AAAA,MAC7E,GAAG,WAAW;AAAA,IAChB;AAAA,IACA,YAAY,WAAW,cAAc,CAAC;AAAA,IACtC,UAAU,WAAW,YAAY,CAAC;AAAA,IAClC,SAAS,WAAW,YAAY,MAAM;AAAA,IACtC,eAAe,2BAA2B,WAAW,aAAa;AAAA,IAClE;AAAA,IACA,QAAQ,WAAW,UAAU;AAAA,IAC7B,SAAS,WAAW,WAAW;AAAA,IAC/B;AAAA,IACA,UAAU,WAAW,YAAY;AAAA,IACjC,eAAe;AAAA,MACb,eAAe;AAAA,MACf,uBAAuB;AAAA,MACvB,GAAG,WAAW;AAAA,IAChB;AAAA,IACA,qBAAqB,WAAW,uBAAuB,CAAC;AAAA,IACxD,qBAAqB,WAAW,uBAAuB,CAAC;AAAA,IACxD,KAAAA;AAAA,IACA,YAAY;AAAA,MACV,cAAc;AAAA,MACd,mBAAmB;AAAA,MACnB,GAAG,WAAW;AAAA,IAChB;AAAA,IACA,MAAM,OAAO,WAAW,SAAS,aAAa,WAAW,KAAK,CAAC,CAAC,IAAI,WAAW,QAAQ,CAAC;AAAA,EAC1F;AAEA,SAAO;AACT;AAnIsB;AAqItB,eAAsB,WACpB,SACA,YACA,OAAO,QAAQ,IAAI,aAAa,eAAe,eAAe,eAC9D,iBACqC;AACrC,QAAM,EAAE,YAAAH,YAAW,IAAI,MAAM,OAAO,IAAI;AACxC,QAAM,UAAU,oBAAoB,MAAM,OAAO,MAAM,GAAG;AAE1D,QAAM,OAAO,WAAW,QAAQ,IAAI;AACpC,QAAM,YAAY,QAAQ,MAAM,MAAM,EAAE;AACxC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACpD,QAAI,QAAQ,IAAI,GAAG,MAAM,QAAW;AAClC,cAAQ,IAAI,GAAG,IAAI;AAAA,IACrB;AAAA,EACF;AACA,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,OAAO,OAAO;AAEhB,aAAW,gBAAgB,aAAa;AACtC,QAAI;AAEF,YAAM,eAAe,aAAa,WAAW,GAAG,IAC5C,eACA,YAAAC,QAAK,KAAK,MAAM,YAAY;AAGhC,YAAM,iBAAiB,YAAAA,QAAK,QAAQ,YAAY;AAGhD,UAAI,CAACD,YAAW,cAAc,GAAG;AAC/B;AAAA,MACF;AAEA,YAAM,eAAe,MAAM,mBAAmC,gBAAgB,EAAE,KAAK,CAAC;AACtF,aAAO,aAAa,SAAS,SAAY,EAAE,GAAG,cAAc,KAAK,IAAI;AAAA,IACvE,SAAS,OAAY;AACnB,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,YAAM,IAAI,MAAM,8BAA8B,YAAY,KAAK,OAAO,EAAE;AAAA,IAC1E;AAAA,EACF;AACA,SAAO;AACT;AAnDsB;;;AMjyBf,SAAS,qBAAqB,cAAc,QAAQ,SAAS,MAAe;AACjF,QAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,YAAY,MAAM,GAAG,EAAE,IAAI,MAAM;AAChE,SAAQ,UAAU,MAAM,SAAS,MAAO,QAAQ,MAAO,UAAU,MAAM,SAAS;AAClF;AAHgB;AAKhB,SAAS,iCAAwE;AAC/E,QAAM,YAAY,QAAQ,IAAI,mBAAmB,KAAK,EAAE,YAAY;AACpE,MAAI,CAAC,UAAW,QAAO;AACvB,MAAI,cAAc,YAAY,cAAc,WAAY,QAAO;AAC/D,QAAM,IAAI,MAAM,yDAAyD;AAC3E;AALS;AAOT,eAAe,iBAAqD;AAClE,QAAM,UAAU,MAAM,OAAO,MAAM;AACnC,SAAO;AAAA,IACL,OAAO,QAAQ;AAAA,IACf,cAAc,QAAQ;AAAA,IACtB,SAAS,QAAQ;AAAA,IACjB,SAAS;AAAA,EACX;AACF;AARe;AAef,eAAsB,yBAA6D;AACjF,QAAM,YAAY,+BAA+B;AACjD,MAAI,cAAc,YAAY,CAAC,qBAAqB,GAAG;AACrD,QAAI,cAAc,YAAY;AAC5B,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO,eAAe;AAAA,EACxB;AAEA,MAAI;AACF,UAAM,UAAW,MAAM,OAAO,eAAe;AAC7C,WAAO;AAAA,MACL,OAAO,QAAQ;AAAA,MACf,cAAc,QAAQ;AAAA,MACtB,SAAS,QAAQ;AAAA,MACjB,SAAS;AAAA,IACX;AAAA,EACF,SAAS,OAAO;AACd,QAAI,cAAc,YAAY;AAC5B,YAAM,SAAS,iBAAiB,QAAQ,KAAK,MAAM,OAAO,KAAK;AAC/D,YAAM,IAAI;AAAA,QACR,uGAAuG,MAAM;AAAA,MAC/G;AAAA,IACF;AACA,WAAO,eAAe;AAAA,EACxB;AACF;AA5BsB;;;AC4If,IAAM,SAAS;AAAA,EACpB,MAAM,wBAAC,YAAoB,QAAQ,IAAI,UAAU,OAAO,EAAE,GAApD;AAAA,EACN,SAAS,wBAAC,YAAoB,QAAQ,IAAI,aAAa,OAAO,EAAE,GAAvD;AAAA,EACT,MAAM,wBAAC,YAAoB,QAAQ,KAAK,iBAAO,OAAO,EAAE,GAAlD;AAAA,EACN,OAAO,wBAAC,YAAoB,QAAQ,MAAM,UAAK,OAAO,EAAE,GAAjD;AAAA,EACP,OAAO,wBAAC,YAAoB,QAAQ,IAAI,GAAG,OAAO,EAAE,GAA7C;AAAA,EACP,OAAO,wBAAC,YAAoB,QAAQ,IAAI,KAAK,OAAO,EAAE,GAA/C;AACT;","names":["memoryDriver","module","resolveDriver","globalState","path","globalState","env","path","response","resolveStorageRuntimeClient","createIntegrationOrm","path","env","env","globalState","path","path","path","path","import_node_path","path","import_node_module","import_node_path","import_node_url","path","isRecord","existsSync","path","pathToFileURL","env"]}
|