@farm.js/core 0.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +11 -0
- 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 +93 -0
- package/dist/agent-runtime.d.ts +93 -0
- package/dist/agent-runtime.mjs +479 -0
- package/dist/agent-runtime.mjs.map +1 -0
- package/dist/api/route-manager.cjs +1196 -0
- package/dist/api/route-manager.cjs.map +1 -0
- package/dist/api/route-manager.d.mts +64 -0
- package/dist/api/route-manager.d.ts +64 -0
- package/dist/api/route-manager.mjs +34 -0
- package/dist/api/route-manager.mjs.map +1 -0
- package/dist/api/runtime.cjs +272 -0
- package/dist/api/runtime.cjs.map +1 -0
- package/dist/api/runtime.d.mts +16 -0
- package/dist/api/runtime.d.ts +16 -0
- package/dist/api/runtime.mjs +16 -0
- package/dist/api/runtime.mjs.map +1 -0
- package/dist/api.cjs +3199 -0
- package/dist/api.cjs.map +1 -0
- package/dist/api.d.mts +190 -0
- package/dist/api.d.ts +190 -0
- package/dist/api.mjs +63 -0
- package/dist/api.mjs.map +1 -0
- package/dist/app-BiX4qb-d.d.mts +265 -0
- package/dist/app-CFRNJXP1.d.ts +265 -0
- package/dist/app-markdown.cjs +220 -0
- package/dist/app-markdown.cjs.map +1 -0
- package/dist/app-markdown.d.mts +21 -0
- package/dist/app-markdown.d.ts +21 -0
- package/dist/app-markdown.mjs +26 -0
- package/dist/app-markdown.mjs.map +1 -0
- package/dist/cache.cjs +543 -0
- package/dist/cache.cjs.map +1 -0
- package/dist/cache.d.mts +78 -0
- package/dist/cache.d.ts +78 -0
- package/dist/cache.mjs +38 -0
- package/dist/cache.mjs.map +1 -0
- package/dist/chunk-25D7G34K.mjs +142 -0
- package/dist/chunk-25D7G34K.mjs.map +1 -0
- package/dist/chunk-3QJO55ZF.mjs +3548 -0
- package/dist/chunk-3QJO55ZF.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-4PTK6KT4.mjs +364 -0
- package/dist/chunk-4PTK6KT4.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-6XDUHOEM.mjs +157 -0
- package/dist/chunk-6XDUHOEM.mjs.map +1 -0
- package/dist/chunk-74YTBPTY.mjs +450 -0
- package/dist/chunk-74YTBPTY.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-7ZY5AIJO.mjs +161 -0
- package/dist/chunk-7ZY5AIJO.mjs.map +1 -0
- package/dist/chunk-AGS7UJ52.mjs +446 -0
- package/dist/chunk-AGS7UJ52.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-B6N4ZB2H.mjs +718 -0
- package/dist/chunk-B6N4ZB2H.mjs.map +1 -0
- package/dist/chunk-BHG3LVHH.mjs +176 -0
- package/dist/chunk-BHG3LVHH.mjs.map +1 -0
- package/dist/chunk-C3DLZMBU.mjs +597 -0
- package/dist/chunk-C3DLZMBU.mjs.map +1 -0
- package/dist/chunk-CGILA3WO.mjs +14 -0
- package/dist/chunk-CGILA3WO.mjs.map +1 -0
- package/dist/chunk-CHFHNEMO.mjs +7088 -0
- package/dist/chunk-CHFHNEMO.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-EVGBEZDF.mjs +215 -0
- package/dist/chunk-EVGBEZDF.mjs.map +1 -0
- package/dist/chunk-FQYDHKKU.mjs +128 -0
- package/dist/chunk-FQYDHKKU.mjs.map +1 -0
- package/dist/chunk-G3B5BRDY.mjs +5763 -0
- package/dist/chunk-G3B5BRDY.mjs.map +1 -0
- package/dist/chunk-GN72QAIH.mjs +146 -0
- package/dist/chunk-GN72QAIH.mjs.map +1 -0
- package/dist/chunk-GS6K5OCM.mjs +407 -0
- package/dist/chunk-GS6K5OCM.mjs.map +1 -0
- package/dist/chunk-GY2STC2S.mjs +180 -0
- package/dist/chunk-GY2STC2S.mjs.map +1 -0
- package/dist/chunk-GZP5W4K3.mjs +158 -0
- package/dist/chunk-GZP5W4K3.mjs.map +1 -0
- package/dist/chunk-H2FA2SBS.mjs +51 -0
- package/dist/chunk-H2FA2SBS.mjs.map +1 -0
- package/dist/chunk-HXP3ZSPC.mjs +211 -0
- package/dist/chunk-HXP3ZSPC.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-JK25YEN6.mjs +219 -0
- package/dist/chunk-JK25YEN6.mjs.map +1 -0
- package/dist/chunk-JLWMCADZ.mjs +204 -0
- package/dist/chunk-JLWMCADZ.mjs.map +1 -0
- package/dist/chunk-JN3UU635.mjs +622 -0
- package/dist/chunk-JN3UU635.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-LLC7BNXW.mjs +275 -0
- package/dist/chunk-LLC7BNXW.mjs.map +1 -0
- package/dist/chunk-LM2YNO4U.mjs +24 -0
- package/dist/chunk-LM2YNO4U.mjs.map +1 -0
- package/dist/chunk-NNLCAVB6.mjs +391 -0
- package/dist/chunk-NNLCAVB6.mjs.map +1 -0
- package/dist/chunk-O3HADRW6.mjs +639 -0
- package/dist/chunk-O3HADRW6.mjs.map +1 -0
- package/dist/chunk-OYXO65LI.mjs +119 -0
- package/dist/chunk-OYXO65LI.mjs.map +1 -0
- package/dist/chunk-P7QDS5AT.mjs +191 -0
- package/dist/chunk-P7QDS5AT.mjs.map +1 -0
- package/dist/chunk-PRNYWD7K.mjs +599 -0
- package/dist/chunk-PRNYWD7K.mjs.map +1 -0
- package/dist/chunk-QF4PHCMA.mjs +422 -0
- package/dist/chunk-QF4PHCMA.mjs.map +1 -0
- package/dist/chunk-QFQRHRZS.mjs +1224 -0
- package/dist/chunk-QFQRHRZS.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-QM6VV26B.mjs +149 -0
- package/dist/chunk-QM6VV26B.mjs.map +1 -0
- package/dist/chunk-RHIFZZUI.mjs +69 -0
- package/dist/chunk-RHIFZZUI.mjs.map +1 -0
- package/dist/chunk-RKI6TN3A.mjs +49 -0
- package/dist/chunk-RKI6TN3A.mjs.map +1 -0
- package/dist/chunk-RSKVYESE.mjs +187 -0
- package/dist/chunk-RSKVYESE.mjs.map +1 -0
- package/dist/chunk-S2XHZS7W.mjs +180 -0
- package/dist/chunk-S2XHZS7W.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-SOU3Q3ZA.mjs +173 -0
- package/dist/chunk-SOU3Q3ZA.mjs.map +1 -0
- package/dist/chunk-SPBBQLXI.mjs +207 -0
- package/dist/chunk-SPBBQLXI.mjs.map +1 -0
- package/dist/chunk-SXZTEK3V.mjs +396 -0
- package/dist/chunk-SXZTEK3V.mjs.map +1 -0
- package/dist/chunk-T4QJQK76.mjs +459 -0
- package/dist/chunk-T4QJQK76.mjs.map +1 -0
- package/dist/chunk-TRORP7E4.mjs +41 -0
- package/dist/chunk-TRORP7E4.mjs.map +1 -0
- package/dist/chunk-TU4YJICB.mjs +728 -0
- package/dist/chunk-TU4YJICB.mjs.map +1 -0
- package/dist/chunk-TXCFGOHW.mjs +42 -0
- package/dist/chunk-TXCFGOHW.mjs.map +1 -0
- package/dist/chunk-UHE2TTLK.mjs +466 -0
- package/dist/chunk-UHE2TTLK.mjs.map +1 -0
- package/dist/chunk-UREJA4GZ.mjs +364 -0
- package/dist/chunk-UREJA4GZ.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-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-WZ5QFROO.mjs +23 -0
- package/dist/chunk-WZ5QFROO.mjs.map +1 -0
- package/dist/chunk-Y2OJJD7R.mjs +543 -0
- package/dist/chunk-Y2OJJD7R.mjs.map +1 -0
- package/dist/chunk-Y7A27276.mjs +538 -0
- package/dist/chunk-Y7A27276.mjs.map +1 -0
- package/dist/chunk-YHU7SS6L.mjs +365 -0
- package/dist/chunk-YHU7SS6L.mjs.map +1 -0
- package/dist/chunk-ZBE6MLHL.mjs +230 -0
- package/dist/chunk-ZBE6MLHL.mjs.map +1 -0
- package/dist/chunk-ZJQNATYV.mjs +299 -0
- package/dist/chunk-ZJQNATYV.mjs.map +1 -0
- package/dist/client-D_yUjVhe.d.mts +402 -0
- package/dist/client-Dkc03WP8.d.ts +402 -0
- package/dist/client-cache-CIlyBlmx.d.ts +6 -0
- package/dist/client-cache-D-EZ7XVW.d.mts +6 -0
- package/dist/client-plugins-BZnpeTGA.d.ts +1848 -0
- package/dist/client-plugins-g4bzuCmo.d.mts +1848 -0
- package/dist/client-plugins.cjs +415 -0
- package/dist/client-plugins.cjs.map +1 -0
- package/dist/client-plugins.d.mts +21 -0
- package/dist/client-plugins.d.ts +21 -0
- package/dist/client-plugins.mjs +10 -0
- package/dist/client-plugins.mjs.map +1 -0
- package/dist/client.cjs +4571 -0
- package/dist/client.cjs.map +1 -0
- package/dist/client.d.mts +329 -0
- package/dist/client.d.ts +329 -0
- package/dist/client.mjs +103 -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 +28 -0
- package/dist/config.d.ts +28 -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-AE4RVXCM.mjs +370 -0
- package/dist/devtools-AE4RVXCM.mjs.map +1 -0
- package/dist/devtools-client-6WPY2AQU.mjs +225 -0
- package/dist/devtools-client-6WPY2AQU.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 +5541 -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 +46 -0
- package/dist/docs.mjs.map +1 -0
- package/dist/env-types.cjs +223 -0
- package/dist/env-types.cjs.map +1 -0
- package/dist/env-types.d.mts +11 -0
- package/dist/env-types.d.ts +11 -0
- package/dist/env-types.mjs +9 -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.cjs +374 -0
- package/dist/environment/vite.cjs.map +1 -0
- package/dist/environment/vite.d.mts +22 -0
- package/dist/environment/vite.d.ts +22 -0
- package/dist/environment/vite.mjs +10 -0
- package/dist/environment/vite.mjs.map +1 -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.cjs +283 -0
- package/dist/i18n/client.cjs.map +1 -0
- package/dist/i18n/client.d.mts +32 -0
- package/dist/i18n/client.d.ts +32 -0
- package/dist/i18n/client.mjs +121 -0
- package/dist/i18n/client.mjs.map +1 -0
- package/dist/i18n/index.cjs +130 -0
- package/dist/i18n/index.cjs.map +1 -0
- package/dist/i18n/index.d.mts +20 -0
- package/dist/i18n/index.d.ts +20 -0
- package/dist/i18n/index.mjs +22 -0
- package/dist/i18n/index.mjs.map +1 -0
- package/dist/i18n/server.cjs +637 -0
- package/dist/i18n/server.cjs.map +1 -0
- package/dist/i18n/server.d.mts +30 -0
- package/dist/i18n/server.d.ts +30 -0
- package/dist/i18n/server.mjs +32 -0
- package/dist/i18n/server.mjs.map +1 -0
- package/dist/image/server.cjs +477 -0
- package/dist/image/server.cjs.map +1 -0
- package/dist/image/server.d.mts +37 -0
- package/dist/image/server.d.ts +37 -0
- package/dist/image/server.mjs +16 -0
- package/dist/image/server.mjs.map +1 -0
- package/dist/image/sharp.cjs +135 -0
- package/dist/image/sharp.cjs.map +1 -0
- package/dist/image/sharp.d.mts +7 -0
- package/dist/image/sharp.d.ts +7 -0
- package/dist/image/sharp.mjs +75 -0
- package/dist/image/sharp.mjs.map +1 -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 +39433 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +451 -0
- package/dist/index.d.ts +451 -0
- package/dist/index.mjs +930 -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 +21 -0
- package/dist/integrations.d.ts +21 -0
- package/dist/integrations.mjs +51 -0
- package/dist/integrations.mjs.map +1 -0
- package/dist/internal/build-runtime.cjs +31340 -0
- package/dist/internal/build-runtime.cjs.map +1 -0
- package/dist/internal/build-runtime.d.mts +38 -0
- package/dist/internal/build-runtime.d.ts +38 -0
- package/dist/internal/build-runtime.mjs +73 -0
- package/dist/internal/build-runtime.mjs.map +1 -0
- package/dist/internal/client-runtime.cjs +579 -0
- package/dist/internal/client-runtime.cjs.map +1 -0
- package/dist/internal/client-runtime.d.mts +2 -0
- package/dist/internal/client-runtime.d.ts +2 -0
- package/dist/internal/client-runtime.mjs +12 -0
- package/dist/internal/client-runtime.mjs.map +1 -0
- package/dist/internal/config-runtime.cjs +4172 -0
- package/dist/internal/config-runtime.cjs.map +1 -0
- package/dist/internal/config-runtime.d.mts +38 -0
- package/dist/internal/config-runtime.d.ts +38 -0
- package/dist/internal/config-runtime.mjs +38 -0
- package/dist/internal/config-runtime.mjs.map +1 -0
- package/dist/internal/production-node-env.cjs +65 -0
- package/dist/internal/production-node-env.cjs.map +1 -0
- package/dist/internal/production-node-env.d.mts +12 -0
- package/dist/internal/production-node-env.d.ts +12 -0
- package/dist/internal/production-node-env.mjs +8 -0
- package/dist/internal/production-node-env.mjs.map +1 -0
- package/dist/internal/production-runtime.cjs +1896 -0
- package/dist/internal/production-runtime.cjs.map +1 -0
- package/dist/internal/production-runtime.d.mts +39 -0
- package/dist/internal/production-runtime.d.ts +39 -0
- package/dist/internal/production-runtime.mjs +79 -0
- package/dist/internal/production-runtime.mjs.map +1 -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 +299 -0
- package/dist/markdown.cjs.map +1 -0
- package/dist/markdown.d.mts +43 -0
- package/dist/markdown.d.ts +43 -0
- package/dist/markdown.mjs +14 -0
- package/dist/markdown.mjs.map +1 -0
- package/dist/metadata-C9NZxMDW.d.mts +22 -0
- package/dist/metadata-DAXRaOHx.d.ts +22 -0
- package/dist/middleware.cjs +2148 -0
- package/dist/middleware.cjs.map +1 -0
- package/dist/middleware.d.mts +163 -0
- package/dist/middleware.d.ts +163 -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 +1304 -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-KME62MWG.mjs +691 -0
- package/dist/nitro-KME62MWG.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 +22285 -0
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.d.mts +21 -0
- package/dist/plugin.d.ts +21 -0
- package/dist/plugin.mjs +60 -0
- package/dist/plugin.mjs.map +1 -0
- package/dist/production-runtime-C_B79w2P.d.mts +28 -0
- package/dist/production-runtime-DDEM1D2q.d.ts +28 -0
- package/dist/production-runtime-DRkCHUvJ.d.ts +79 -0
- package/dist/production-runtime-flrjp_nC.d.mts +79 -0
- package/dist/query/client.cjs +560 -0
- package/dist/query/client.cjs.map +1 -0
- package/dist/query/client.d.mts +61 -0
- package/dist/query/client.d.ts +61 -0
- package/dist/query/client.mjs +364 -0
- package/dist/query/client.mjs.map +1 -0
- package/dist/query/index.cjs +226 -0
- package/dist/query/index.cjs.map +1 -0
- package/dist/query/index.d.mts +90 -0
- package/dist/query/index.d.ts +90 -0
- package/dist/query/index.mjs +31 -0
- package/dist/query/index.mjs.map +1 -0
- package/dist/query/parsers.cjs +178 -0
- package/dist/query/parsers.cjs.map +1 -0
- package/dist/query/parsers.d.mts +25 -0
- package/dist/query/parsers.d.ts +25 -0
- package/dist/query/parsers.mjs +24 -0
- package/dist/query/parsers.mjs.map +1 -0
- package/dist/query/server.cjs +301 -0
- package/dist/query/server.cjs.map +1 -0
- package/dist/query/server.d.mts +55 -0
- package/dist/query/server.d.ts +55 -0
- package/dist/query/server.mjs +105 -0
- package/dist/query/server.mjs.map +1 -0
- package/dist/request-BrFBuc8G.d.mts +6 -0
- package/dist/request-BslSZIRz.d.ts +6 -0
- package/dist/request.cjs +71 -0
- package/dist/request.cjs.map +1 -0
- package/dist/request.d.mts +2 -0
- package/dist/request.d.ts +2 -0
- package/dist/request.mjs +9 -0
- package/dist/request.mjs.map +1 -0
- package/dist/resolver-C6iecsDV.d.ts +14 -0
- package/dist/resolver-DlOPpjkB.d.mts +14 -0
- package/dist/route-runtime-DoOHzCAD.d.mts +38 -0
- package/dist/route-runtime-DoOHzCAD.d.ts +38 -0
- package/dist/router.cjs +254 -0
- package/dist/router.cjs.map +1 -0
- package/dist/router.d.mts +36 -0
- package/dist/router.d.ts +36 -0
- package/dist/router.mjs +14 -0
- package/dist/router.mjs.map +1 -0
- package/dist/routes.cjs +1213 -0
- package/dist/routes.cjs.map +1 -0
- package/dist/routes.d.mts +224 -0
- package/dist/routes.d.ts +224 -0
- package/dist/routes.mjs +52 -0
- package/dist/routes.mjs.map +1 -0
- package/dist/runtime-B6GvwDS1.d.ts +27 -0
- package/dist/runtime-DeAAZ6gO.d.mts +27 -0
- package/dist/search-client-6OXIBNYQ.mjs +14 -0
- package/dist/search-client-6OXIBNYQ.mjs.map +1 -0
- package/dist/server-action-security.cjs +492 -0
- package/dist/server-action-security.cjs.map +1 -0
- package/dist/server-action-security.d.mts +42 -0
- package/dist/server-action-security.d.ts +42 -0
- package/dist/server-action-security.mjs +29 -0
- package/dist/server-action-security.mjs.map +1 -0
- package/dist/server-fn-client.cjs +180 -0
- package/dist/server-fn-client.cjs.map +1 -0
- package/dist/server-fn-client.d.mts +31 -0
- package/dist/server-fn-client.d.ts +31 -0
- package/dist/server-fn-client.mjs +9 -0
- package/dist/server-fn-client.mjs.map +1 -0
- package/dist/server-fn.cjs +284 -0
- package/dist/server-fn.cjs.map +1 -0
- package/dist/server-fn.d.mts +84 -0
- package/dist/server-fn.d.ts +84 -0
- package/dist/server-fn.mjs +17 -0
- package/dist/server-fn.mjs.map +1 -0
- package/dist/server-plugins.cjs +235 -0
- package/dist/server-plugins.cjs.map +1 -0
- package/dist/server-plugins.d.mts +54 -0
- package/dist/server-plugins.d.ts +54 -0
- package/dist/server-plugins.mjs +18 -0
- package/dist/server-plugins.mjs.map +1 -0
- package/dist/server-query-client.cjs +792 -0
- package/dist/server-query-client.cjs.map +1 -0
- package/dist/server-query-client.d.mts +50 -0
- package/dist/server-query-client.d.ts +50 -0
- package/dist/server-query-client.mjs +23 -0
- package/dist/server-query-client.mjs.map +1 -0
- package/dist/server-query.cjs +804 -0
- package/dist/server-query.cjs.map +1 -0
- package/dist/server-query.d.mts +36 -0
- package/dist/server-query.d.ts +36 -0
- package/dist/server-query.mjs +18 -0
- package/dist/server-query.mjs.map +1 -0
- package/dist/server.cjs +25739 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.mts +47 -0
- package/dist/server.d.ts +47 -0
- package/dist/server.mjs +511 -0
- package/dist/server.mjs.map +1 -0
- package/dist/storage.cjs +515 -0
- package/dist/storage.cjs.map +1 -0
- package/dist/storage.d.mts +52 -0
- package/dist/storage.d.ts +52 -0
- package/dist/storage.mjs +58 -0
- package/dist/storage.mjs.map +1 -0
- package/dist/testing.cjs +1882 -0
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.mts +100 -0
- package/dist/testing.d.ts +100 -0
- package/dist/testing.mjs +324 -0
- package/dist/testing.mjs.map +1 -0
- package/dist/types-BH1lhg5G.d.mts +81 -0
- package/dist/types-BH1lhg5G.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-DA1yo54_.d.ts +23 -0
- package/dist/utils-DOXXivjL.d.mts +23 -0
- package/dist/vite.cjs +22684 -0
- package/dist/vite.cjs.map +1 -0
- package/dist/vite.d.mts +21 -0
- package/dist/vite.d.ts +21 -0
- package/dist/vite.mjs +59 -0
- package/dist/vite.mjs.map +1 -0
- package/dist/workflows.cjs +586 -0
- package/dist/workflows.cjs.map +1 -0
- package/dist/workflows.d.mts +110 -0
- package/dist/workflows.d.ts +110 -0
- package/dist/workflows.mjs +32 -0
- package/dist/workflows.mjs.map +1 -0
- package/package.json +523 -0
- package/types/api.d.ts +88 -0
- package/types/client.d.ts +1171 -0
- package/types/index.d.ts +17 -0
- package/types/middleware.d.ts +266 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/testing.ts","../src/routes.ts","../src/observability.ts","../src/cache-invalidation.ts","../src/i18n/bridge.ts","../src/cache.ts","../src/route-context.ts","../src/route-runtime.ts","../src/i18n/server.ts","../src/i18n/runtime.ts","../src/i18n/catalog.ts","../src/i18n/config.ts","../src/server/request.ts","../src/server/request-bridge.ts","../src/api/runtime.ts","../src/router.ts","../src/server-action-security.ts"],"sourcesContent":["import { createElement, type ReactElement } from \"react\";\nimport { invokeAPIRouteEndpoint, matchAPIRoute, type APIRouteParams } from \"./api/route-manager\";\nimport { getFarmDataCache } from \"./cache\";\nimport { resolveFarmRouteContext, withFarmRouteContext } from \"./route-context\";\nimport {\n createRouteModuleFromProgrammaticPage,\n type InferProgrammaticRouteData,\n type ProgrammaticApiRoute,\n type ProgrammaticPageRoute,\n type ProgrammaticRouteComponentProps,\n type ProgrammaticRouteMethod,\n} from \"./routes\";\nimport {\n buildFarmRoutePath,\n matchFarmRoute,\n type FarmRouterPathParams,\n type FarmRouterQueryValue,\n} from \"./router\";\nimport { runWithServerActionRequest } from \"./server-action-security\";\nimport type { ServerFn } from \"./server-fn\";\nimport type { FarmContextFactory, MiddlewareProps, PluginContextProps, RouteModule } from \"./types\";\n\nexport type FarmTestQuery = URLSearchParams | Record<string, FarmRouterQueryValue>;\nexport type FarmTestPathParams = FarmRouterPathParams;\nexport type FarmTestFormValues = Record<string, FormDataEntryValue | readonly FormDataEntryValue[]>;\n\nexport interface FarmTestRequestOptions extends Omit<RequestInit, \"body\" | \"headers\"> {\n origin?: string;\n headers?: HeadersInit;\n query?: FarmTestQuery;\n cookies?: Record<string, string>;\n json?: unknown;\n form?: FormData | FarmTestFormValues;\n body?: BodyInit | null;\n}\n\nexport interface FarmTestHarnessOptions<TContext = unknown> {\n origin?: string;\n headers?: HeadersInit;\n cookies?: Record<string, string>;\n context?: FarmContextFactory<TContext>;\n}\n\ntype AnyProgrammaticPageRoute = ProgrammaticPageRoute<any, any, any, any>;\n\nexport type InferFarmTestRouteParams<TRoute> =\n TRoute extends ProgrammaticPageRoute<infer TParams, any, any, any> ? TParams : never;\n\nexport type InferFarmTestRouteSearch<TRoute> =\n TRoute extends ProgrammaticPageRoute<any, infer TSearch, any, any> ? TSearch : never;\n\nexport type InferFarmTestRouteData<TRoute> =\n TRoute extends ProgrammaticPageRoute<any, any, infer TDataHooks, any>\n ? InferProgrammaticRouteData<TDataHooks>\n : never;\n\nexport type FarmTestRouteProps<TRoute extends AnyProgrammaticPageRoute> =\n ProgrammaticRouteComponentProps<\n InferFarmTestRouteParams<TRoute>,\n InferFarmTestRouteSearch<TRoute>,\n InferFarmTestRouteData<TRoute>\n >;\n\ntype FarmTestRouteParamsInput<TRoute> =\n InferFarmTestRouteParams<TRoute> extends Record<string, unknown>\n ? Partial<InferFarmTestRouteParams<TRoute>>\n : FarmTestPathParams;\n\ntype FarmTestRouteSearchInput<TRoute> =\n InferFarmTestRouteSearch<TRoute> extends Record<string, unknown>\n ? Partial<InferFarmTestRouteSearch<TRoute>> | URLSearchParams\n : FarmTestQuery;\n\nexport interface FarmTestRouteOptions<\n TRoute extends AnyProgrammaticPageRoute,\n TContext = unknown,\n> extends Pick<FarmTestRequestOptions, \"origin\" | \"headers\" | \"cookies\" | \"signal\"> {\n path?: string | URL;\n params?: FarmTestRouteParamsInput<TRoute>;\n search?: FarmTestRouteSearchInput<TRoute>;\n context?: TContext;\n middleware?: MiddlewareProps;\n pluginContext?: PluginContextProps;\n}\n\nexport interface FarmTestRouteResult<TRoute extends AnyProgrammaticPageRoute> {\n route: TRoute;\n module: RouteModule;\n request: Request;\n props: FarmTestRouteProps<TRoute>;\n element: ReactElement;\n canonicalPath?: string;\n}\n\nexport interface FarmTestApiOptions extends FarmTestRequestOptions {\n path?: string | URL;\n params?: FarmTestPathParams;\n throwOnError?: boolean;\n}\n\nexport interface FarmTestEndpointOptions extends FarmTestRequestOptions {\n path?: string | URL;\n params?: APIRouteParams;\n throwOnError?: boolean;\n}\n\nexport interface FarmTestServerFnOptions extends Pick<\n FarmTestRequestOptions,\n \"origin\" | \"headers\" | \"cookies\" | \"signal\"\n> {\n path?: string | URL;\n request?: Request;\n}\n\nexport type FarmTestServerFnArguments<TInput> = [unknown] extends [TInput]\n ? [input?: TInput | FormData, options?: FarmTestServerFnOptions]\n : [input: TInput | FormData, options?: FarmTestServerFnOptions];\n\nexport interface FarmTestHarness<TContext = unknown> {\n request(path?: string | URL, options?: FarmTestRequestOptions): Request;\n route<TRoute extends AnyProgrammaticPageRoute>(\n route: TRoute,\n options?: FarmTestRouteOptions<TRoute, TContext>,\n ): Promise<FarmTestRouteResult<TRoute>>;\n api(route: ProgrammaticApiRoute, options?: FarmTestApiOptions): Promise<Response>;\n endpoint(endpoint: unknown, options?: FarmTestEndpointOptions): Promise<Response>;\n serverFn<TInput, TResult>(\n serverFn: ServerFn<TInput, TResult>,\n ...args: FarmTestServerFnArguments<TInput>\n ): Promise<TResult>;\n clearCache(): void;\n}\n\n/** Create a deterministic Web Request without depending on a test runner. */\nexport function createTestRequest(\n path: string | URL = \"/\",\n options: FarmTestRequestOptions = {},\n): Request {\n const url = resolveTestURL(path, options.origin);\n applyQuery(url.searchParams, options.query);\n\n const headers = new Headers(options.headers);\n applyCookies(headers, options.cookies);\n const { body, hasBody } = resolveRequestBody(options, headers);\n const method = (options.method ?? (hasBody ? \"POST\" : \"GET\")).toUpperCase();\n\n if ((method === \"GET\" || method === \"HEAD\") && body != null) {\n throw new TypeError(`Farm test requests cannot send a body with ${method}`);\n }\n\n const {\n origin: _origin,\n query: _query,\n cookies: _cookies,\n json: _json,\n form: _form,\n body: _body,\n headers: _headers,\n ...requestInit\n } = options;\n\n return new Request(url, {\n ...requestInit,\n method,\n headers,\n body,\n });\n}\n\n/**\n * Create test helpers that exercise Farm's real route, API, and server-function runtimes.\n * The harness has no dependency on Vitest, Jest, or a DOM environment.\n */\nexport function createFarmTestHarness<TContext = unknown>(\n options: FarmTestHarnessOptions<TContext> = {},\n): FarmTestHarness<TContext> {\n const origin = normalizeOrigin(options.origin);\n\n const request = (path: string | URL = \"/\", requestOptions: FarmTestRequestOptions = {}) =>\n createTestRequest(path, mergeRequestDefaults(options, origin, requestOptions));\n\n return {\n request,\n\n async route<TRoute extends AnyProgrammaticPageRoute>(\n route: TRoute,\n routeOptions: FarmTestRouteOptions<TRoute, TContext> = {},\n ): Promise<FarmTestRouteResult<TRoute>> {\n const requestPath =\n routeOptions.path ??\n buildFarmRoutePath(route.path, (routeOptions.params ?? {}) as FarmRouterPathParams);\n const routeRequest = request(requestPath, {\n origin: routeOptions.origin,\n headers: routeOptions.headers,\n cookies: routeOptions.cookies,\n signal: routeOptions.signal,\n query: routeOptions.search as FarmTestQuery | undefined,\n });\n const url = new URL(routeRequest.url);\n const params = resolvePageParams(route.path, url.pathname, routeOptions.params);\n const search = readSearchParams(url.searchParams);\n const routeContext = Object.prototype.hasOwnProperty.call(routeOptions, \"context\")\n ? routeOptions.context\n : await resolveFarmRouteContext(\n { context: options.context },\n {\n request: routeRequest,\n params,\n search,\n path: url.pathname,\n },\n );\n const rawProps = withFarmRouteContext(\n {\n params,\n searchParams: Promise.resolve(search),\n path: url.pathname,\n middleware: routeOptions.middleware,\n context: routeOptions.pluginContext,\n },\n routeContext,\n );\n const routeModule = createRouteModuleFromProgrammaticPage(route);\n const resolveProps = (\n routeModule as RouteModule & {\n __farmResolveRouteProps?: (props: typeof rawProps) => Promise<Record<string, unknown>>;\n }\n ).__farmResolveRouteProps;\n const resolvedProps = resolveProps\n ? await resolveProps(rawProps)\n : { ...rawProps, search, searchParams: Promise.resolve(search) };\n const canonicalPath = readCanonicalPath(resolvedProps);\n const componentProps = stripInternalRouteProps(resolvedProps) as FarmTestRouteProps<TRoute>;\n\n return {\n route,\n module: routeModule,\n request: routeRequest,\n props: componentProps,\n element: createElement(route.component, componentProps),\n canonicalPath,\n };\n },\n\n async api(route, apiOptions = {}) {\n const requestPath =\n apiOptions.path ?? buildFarmRoutePath(route.path, apiOptions.params ?? {});\n const method = apiOptions.method ?? getDefaultApiMethod(route);\n const apiRequest = request(requestPath, omitApiControlOptions({ ...apiOptions, method }));\n const match = matchAPIRoute(new Map([[route.path, route]]), new URL(apiRequest.url).pathname);\n\n if (!match) {\n return jsonErrorResponse(\"Not Found\", 404);\n }\n\n const endpoint = match.route.methods[apiRequest.method as ProgrammaticRouteMethod];\n if (!endpoint) {\n return jsonErrorResponse(\"Method Not Allowed\", 405);\n }\n\n return invokeTestEndpoint(endpoint, apiRequest, match.params, apiOptions.throwOnError);\n },\n\n async endpoint(endpoint, endpointOptions = {}) {\n const endpointRecord = endpoint as { __method?: string; __path?: string };\n const endpointPath = endpointOptions.path ?? endpointRecord.__path ?? \"/__farm/test/endpoint\";\n const endpointRequest = request(endpointPath, {\n ...omitEndpointControlOptions(endpointOptions),\n method: endpointOptions.method ?? endpointRecord.__method ?? \"GET\",\n });\n\n return invokeTestEndpoint(\n endpoint,\n endpointRequest,\n endpointOptions.params,\n endpointOptions.throwOnError,\n );\n },\n\n async serverFn<TInput, TResult>(\n serverFn: ServerFn<TInput, TResult>,\n ...args: FarmTestServerFnArguments<TInput>\n ): Promise<TResult> {\n const [input, serverFnOptions = {}] = args;\n const actionRequest =\n serverFnOptions.request ??\n request(serverFnOptions.path ?? \"/__farm/test/server-fn\", {\n origin: serverFnOptions.origin,\n headers: serverFnOptions.headers,\n cookies: serverFnOptions.cookies,\n signal: serverFnOptions.signal,\n method: \"POST\",\n });\n\n return await runWithServerActionRequest(actionRequest, () => serverFn(input as TInput));\n },\n\n clearCache() {\n getFarmDataCache().clear();\n },\n };\n}\n\nfunction resolveTestURL(path: string | URL, origin: string | undefined): URL {\n const url = path instanceof URL ? new URL(path) : new URL(path, `${normalizeOrigin(origin)}/`);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new TypeError(`Farm test requests require an HTTP(S) URL, received ${url.protocol}`);\n }\n return url;\n}\n\nfunction normalizeOrigin(origin = \"http://farm.test\"): string {\n let url: URL;\n try {\n url = new URL(origin);\n } catch {\n throw new TypeError(`Invalid Farm test origin: ${JSON.stringify(origin)}`);\n }\n\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new TypeError(`Farm test origins must use HTTP(S), received ${url.protocol}`);\n }\n\n return url.origin;\n}\n\nfunction mergeRequestDefaults<TContext>(\n harnessOptions: FarmTestHarnessOptions<TContext>,\n origin: string,\n requestOptions: FarmTestRequestOptions,\n): FarmTestRequestOptions {\n const headers = new Headers(harnessOptions.headers);\n new Headers(requestOptions.headers).forEach((value, key) => headers.set(key, value));\n\n return {\n ...requestOptions,\n origin: requestOptions.origin ?? origin,\n headers,\n cookies: {\n ...harnessOptions.cookies,\n ...requestOptions.cookies,\n },\n };\n}\n\nfunction applyQuery(searchParams: URLSearchParams, query: FarmTestQuery | undefined): void {\n if (!query) return;\n\n if (query instanceof URLSearchParams) {\n for (const key of new Set(query.keys())) {\n searchParams.delete(key);\n for (const value of query.getAll(key)) searchParams.append(key, value);\n }\n return;\n }\n\n for (const [key, rawValue] of Object.entries(query)) {\n searchParams.delete(key);\n const values = Array.isArray(rawValue) ? rawValue : [rawValue];\n for (const value of values) {\n if (value == null) continue;\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\") {\n throw new TypeError(`Invalid query value for ${JSON.stringify(key)}`);\n }\n searchParams.append(key, String(value));\n }\n }\n}\n\nfunction applyCookies(headers: Headers, cookies: Record<string, string> | undefined): void {\n if (!cookies || Object.keys(cookies).length === 0) return;\n\n const value = Object.entries(cookies)\n .map(([name, cookieValue]) => `${encodeURIComponent(name)}=${encodeURIComponent(cookieValue)}`)\n .join(\"; \");\n const current = headers.get(\"cookie\");\n headers.set(\"cookie\", current ? `${current}; ${value}` : value);\n}\n\nfunction resolveRequestBody(\n options: FarmTestRequestOptions,\n headers: Headers,\n): { body: BodyInit | null; hasBody: boolean } {\n const sources = [\n options.json !== undefined,\n options.form !== undefined,\n options.body !== undefined,\n ];\n if (sources.filter(Boolean).length > 1) {\n throw new TypeError(\"Farm test requests accept only one of json, form, or body\");\n }\n\n if (options.json !== undefined) {\n if (!headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\");\n return { body: JSON.stringify(options.json), hasBody: true };\n }\n\n if (options.form !== undefined) {\n const formData = options.form instanceof FormData ? options.form : createFormData(options.form);\n return { body: formData, hasBody: true };\n }\n\n return {\n body: options.body ?? null,\n hasBody: options.body !== undefined,\n };\n}\n\nfunction createFormData(values: FarmTestFormValues): FormData {\n const formData = new FormData();\n for (const [key, rawValue] of Object.entries(values)) {\n const entries = Array.isArray(rawValue) ? rawValue : [rawValue];\n for (const value of entries) formData.append(key, value);\n }\n return formData;\n}\n\nfunction resolvePageParams(\n pattern: string,\n pathname: string,\n explicitParams: Record<string, unknown> | undefined,\n): Record<string, string> {\n const matchedParams = matchFarmRoute(pattern, pathname);\n if (!matchedParams) {\n throw new Error(\n `Path ${JSON.stringify(pathname)} does not match route ${JSON.stringify(pattern)}`,\n );\n }\n\n if (!explicitParams) return matchedParams;\n\n return Object.fromEntries(\n Object.entries(explicitParams).map(([key, value]) => [\n key,\n Array.isArray(value) ? value.map(String).join(\"/\") : String(value),\n ]),\n );\n}\n\nfunction readSearchParams(searchParams: URLSearchParams): Record<string, string> {\n const search: Record<string, string> = {};\n searchParams.forEach((value, key) => {\n search[key] = value;\n });\n return search;\n}\n\nfunction readCanonicalPath(props: Record<string, unknown>): string | undefined {\n return typeof props.__farmCanonicalPath === \"string\" ? props.__farmCanonicalPath : undefined;\n}\n\nfunction stripInternalRouteProps(props: Record<string, unknown>): Record<string, unknown> {\n const { __farmRoutePropsResolved, __farmCanonicalPath, ...componentProps } = props;\n return componentProps;\n}\n\nfunction getDefaultApiMethod(route: ProgrammaticApiRoute): ProgrammaticRouteMethod {\n if (route.methods.GET) return \"GET\";\n return (Object.keys(route.methods)[0] as ProgrammaticRouteMethod | undefined) ?? \"GET\";\n}\n\nfunction omitApiControlOptions(options: FarmTestApiOptions): FarmTestRequestOptions {\n const { path: _path, params: _params, throwOnError: _throwOnError, ...requestOptions } = options;\n return requestOptions;\n}\n\nfunction omitEndpointControlOptions(options: FarmTestEndpointOptions): FarmTestRequestOptions {\n const { path: _path, params: _params, throwOnError: _throwOnError, ...requestOptions } = options;\n return requestOptions;\n}\n\nasync function invokeTestEndpoint(\n endpoint: unknown,\n request: Request,\n params: APIRouteParams = {},\n throwOnError = false,\n): Promise<Response> {\n try {\n return await invokeAPIRouteEndpoint(endpoint, request, params);\n } catch (error) {\n if (throwOnError) throw error;\n return jsonErrorResponse(error instanceof Error ? error.message : \"Internal Server Error\", 500);\n }\n}\n\nfunction jsonErrorResponse(error: string, status: number): Response {\n return Response.json({ error }, { status });\n}\n","import { Suspense, createElement, type ComponentType } from \"react\";\nimport {\n createFarmCacheKey,\n createRouteDataCacheTag,\n getFarmDataCache,\n type FarmCacheOptions,\n type RouteDataCacheKey,\n} from \"./cache\";\nimport { getFarmRouteContext } from \"./route-context\";\nimport { normalizeFarmRouteRuntimeConfig, type FarmRouteRuntimeConfig } from \"./route-runtime\";\nimport type {\n FarmAppContext,\n LayoutProps,\n Metadata,\n PageProps,\n ParsedRoute,\n PluginContextProps,\n RouteModule,\n} from \"./types\";\n\nexport type ProgrammaticRouteRenderMode = \"static\" | \"dynamic\";\nexport type ProgrammaticRouteMethod =\n | \"GET\"\n | \"HEAD\"\n | \"POST\"\n | \"PUT\"\n | \"DELETE\"\n | \"PATCH\"\n | \"OPTIONS\";\n\nexport type ProgrammaticRoutePrimitive = string | number | boolean;\nexport type ProgrammaticStaticPathParams = Record<\n string,\n ProgrammaticRoutePrimitive | readonly ProgrammaticRoutePrimitive[]\n>;\nexport type ProgrammaticStaticPath =\n | string\n | readonly ProgrammaticRoutePrimitive[]\n | ProgrammaticStaticPathParams;\nexport type ProgrammaticStaticPaths = () =>\n | readonly ProgrammaticStaticPath[]\n | Promise<readonly ProgrammaticStaticPath[]>;\n\nexport interface ProgrammaticRouteSchema<TOutput = unknown> {\n parse(value: unknown): TOutput;\n}\n\nexport interface ProgrammaticRouteSearchOptions<TOutput = ProgrammaticRouteSearchFallback> {\n schema?: ProgrammaticRouteSchema<TOutput>;\n stripDefaults?: boolean | readonly string[];\n preserve?: readonly string[];\n temporary?: readonly string[];\n}\n\nexport type ProgrammaticRouteSearchConfig<TOutput = ProgrammaticRouteSearchFallback> =\n | ProgrammaticRouteSchema<TOutput>\n | ProgrammaticRouteSearchOptions<TOutput>;\n\nexport type InferProgrammaticRouteSchema<TSchema, TFallback> =\n TSchema extends ProgrammaticRouteSchema<infer TOutput> ? TOutput : TFallback;\n\nexport type InferProgrammaticRouteSearch<TSearch, TFallback> =\n TSearch extends ProgrammaticRouteSearchOptions<infer TOutput>\n ? TOutput\n : TSearch extends ProgrammaticRouteSchema<infer TOutput>\n ? TOutput\n : TFallback;\n\nexport type ProgrammaticRouteParamsFallback = Record<string, string>;\nexport type ProgrammaticRouteSearchFallback = Record<string, string | string[] | undefined>;\nexport type ProgrammaticRouteMaybePromise<T> = T | Promise<T>;\nexport type ProgrammaticRouteDataStaleTime =\n | number\n | false\n | `${number}ms`\n | `${number}s`\n | `${number}m`\n | `${number}h`;\nexport type ProgrammaticRouteContext = keyof FarmAppContext extends never\n ? unknown\n : FarmAppContext;\n\nexport type ProgrammaticRouteComponentProps<\n TParams = ProgrammaticRouteParamsFallback,\n TSearch = ProgrammaticRouteSearchFallback,\n TData = undefined,\n> = Omit<PageProps, \"params\" | \"searchParams\"> & {\n params: TParams;\n search: TSearch;\n searchParams: Promise<TSearch>;\n} & ([TData] extends [undefined] ? { data?: undefined } : { data: TData });\n\nexport type ProgrammaticRouteDataContext<\n TParams = ProgrammaticRouteParamsFallback,\n TSearch = ProgrammaticRouteSearchFallback,\n TContext = ProgrammaticRouteContext,\n> = Omit<ProgrammaticRouteComponentProps<TParams, TSearch>, \"context\" | \"data\"> & {\n context: TContext;\n pluginContext?: PluginContextProps;\n};\n\nexport type ProgrammaticRouteDataCacheContext<\n TParams = ProgrammaticRouteParamsFallback,\n TSearch = ProgrammaticRouteSearchFallback,\n TBefore = unknown,\n TContext = ProgrammaticRouteContext,\n> = ProgrammaticRouteDataContext<TParams, TSearch, TContext> & {\n before: TBefore;\n};\n\nexport type ProgrammaticRouteGuardContext<\n TParams = ProgrammaticRouteParamsFallback,\n TSearch = ProgrammaticRouteSearchFallback,\n TContext = ProgrammaticRouteContext,\n> = ProgrammaticRouteDataContext<TParams, TSearch, TContext>;\n\nexport type ProgrammaticRouteGuard<\n TParams = ProgrammaticRouteParamsFallback,\n TSearch = ProgrammaticRouteSearchFallback,\n TContext = ProgrammaticRouteContext,\n> = (\n context: ProgrammaticRouteGuardContext<TParams, TSearch, TContext>,\n) => ProgrammaticRouteMaybePromise<void>;\n\nexport type ProgrammaticRouteErrorComponentProps<\n TParams = ProgrammaticRouteParamsFallback,\n TSearch = ProgrammaticRouteSearchFallback,\n> = Partial<ProgrammaticRouteComponentProps<TParams, TSearch>> & {\n error: unknown;\n};\n\nexport type ProgrammaticRoutePendingComponentProps<\n TParams = ProgrammaticRouteParamsFallback,\n TSearch = ProgrammaticRouteSearchFallback,\n> = Partial<ProgrammaticRouteComponentProps<TParams, TSearch>>;\n\nexport type ProgrammaticRouteDataCacheKeys<\n TParams = ProgrammaticRouteParamsFallback,\n TSearch = ProgrammaticRouteSearchFallback,\n TBefore = unknown,\n TContext = ProgrammaticRouteContext,\n> =\n | readonly string[]\n | ((\n context: ProgrammaticRouteDataCacheContext<TParams, TSearch, TBefore, TContext>,\n ) => ProgrammaticRouteMaybePromise<readonly string[]>);\n\nexport interface ProgrammaticRouteDataHooks<\n TParams = ProgrammaticRouteParamsFallback,\n TSearch = ProgrammaticRouteSearchFallback,\n TBefore = unknown,\n TData = unknown,\n TContext = ProgrammaticRouteContext,\n> {\n key?: (\n context: ProgrammaticRouteDataCacheContext<TParams, TSearch, NoInfer<TBefore>, TContext>,\n ) => ProgrammaticRouteMaybePromise<RouteDataCacheKey | null | undefined>;\n staleTime?: ProgrammaticRouteDataStaleTime;\n tags?: ProgrammaticRouteDataCacheKeys<TParams, TSearch, NoInfer<TBefore>, TContext>;\n paths?: ProgrammaticRouteDataCacheKeys<TParams, TSearch, NoInfer<TBefore>, TContext>;\n before?: (\n context: ProgrammaticRouteDataContext<TParams, TSearch, TContext>,\n ) => ProgrammaticRouteMaybePromise<TBefore>;\n main: (\n context: ProgrammaticRouteDataContext<TParams, TSearch, TContext> & {\n before: NoInfer<TBefore>;\n },\n ) => ProgrammaticRouteMaybePromise<TData>;\n after?: (\n context: ProgrammaticRouteDataContext<TParams, TSearch, TContext> & {\n before: NoInfer<TBefore>;\n data: NoInfer<TData>;\n },\n ) => ProgrammaticRouteMaybePromise<void>;\n}\n\nexport type InferProgrammaticRouteData<TDataHooks> = TDataHooks extends {\n main: (...args: any[]) => infer TResult;\n}\n ? Awaited<TResult>\n : undefined;\n\nexport interface ProgrammaticPageRoute<\n TParams = ProgrammaticRouteParamsFallback,\n TSearch = ProgrammaticRouteSearchFallback,\n TDataHooks extends ProgrammaticRouteDataHooks<TParams, TSearch, any, any, any> | undefined =\n | ProgrammaticRouteDataHooks<TParams, TSearch, any, any, any>\n | undefined,\n TContext = ProgrammaticRouteContext,\n> extends FarmRouteRuntimeConfig {\n kind: \"page\";\n path: string;\n component: ComponentType<any>;\n params?: ProgrammaticRouteSchema<TParams>;\n search?: ProgrammaticRouteSearchConfig<TSearch>;\n guard?: ProgrammaticRouteGuard<TParams, TSearch, TContext>;\n data?: TDataHooks;\n pending?: ComponentType<ProgrammaticRoutePendingComponentProps<TParams, TSearch>>;\n error?: ComponentType<ProgrammaticRouteErrorComponentProps<TParams, TSearch>>;\n notFound?: ComponentType<ProgrammaticRouteErrorComponentProps<TParams, TSearch>>;\n render?: ProgrammaticRouteRenderMode;\n staticPaths?: ProgrammaticStaticPaths;\n revalidate?: number | false;\n ppr?: boolean;\n metadata?: Metadata & Record<string, any>;\n generateMetadata?: RouteModule[\"generateMetadata\"];\n}\n\nexport interface ProgrammaticLayoutRoute extends FarmRouteRuntimeConfig {\n kind: \"layout\";\n path: string;\n component: ComponentType<LayoutProps>;\n metadata?: Metadata & Record<string, any>;\n generateMetadata?: (props: { params: Record<string, string> }) => Promise<Metadata> | Metadata;\n}\n\nexport type ProgrammaticApiRouteOptions = Partial<Record<ProgrammaticRouteMethod, any>> & {\n render?: ProgrammaticRouteRenderMode;\n} & FarmRouteRuntimeConfig;\n\nexport interface ProgrammaticApiRoute extends FarmRouteRuntimeConfig {\n kind: \"api\";\n path: string;\n methods: Partial<Record<ProgrammaticRouteMethod, any>>;\n render?: ProgrammaticRouteRenderMode;\n}\n\nexport interface ProgrammaticRedirectRoute {\n kind: \"redirect\";\n source: string;\n destination: string;\n permanent?: boolean;\n statusCode?: number;\n}\n\nexport type ProgrammaticRouteDefinition =\n | ProgrammaticPageRoute<any, any>\n | ProgrammaticLayoutRoute\n | ProgrammaticApiRoute\n | ProgrammaticRedirectRoute;\n\nexport interface ProgrammaticRouteManifest {\n readonly __farmRoutes: true;\n routes: ProgrammaticRouteDefinition[];\n}\n\nexport interface ProgrammaticRouteBuilder {\n page(\n path: string,\n options: Omit<ProgrammaticPageRoute<any, any>, \"kind\" | \"path\">,\n ): ProgrammaticPageRoute;\n layout(\n path: string,\n options: Omit<ProgrammaticLayoutRoute, \"kind\" | \"path\">,\n ): ProgrammaticLayoutRoute;\n api(path: string, options: ProgrammaticApiRouteOptions): ProgrammaticApiRoute;\n redirect(\n source: string,\n destination: string,\n options?: Omit<ProgrammaticRedirectRoute, \"kind\" | \"source\" | \"destination\">,\n ): ProgrammaticRedirectRoute;\n}\n\nexport type ProgrammaticRouteFactory = (\n builder: ProgrammaticRouteBuilder,\n) => readonly ProgrammaticRouteDefinition[];\n\ntype CreateRouteParams<TParamsSchema> = InferProgrammaticRouteSchema<\n TParamsSchema,\n ProgrammaticRouteParamsFallback\n>;\n\ntype CreateRouteSearch<TSearchConfig> = InferProgrammaticRouteSearch<\n TSearchConfig,\n ProgrammaticRouteSearchFallback\n>;\n\ntype CreateRouteSharedOptions<\n TParamsSchema extends ProgrammaticRouteSchema<any> | undefined,\n TSearchConfig extends ProgrammaticRouteSearchConfig<any> | undefined,\n> = Omit<\n ProgrammaticPageRoute<CreateRouteParams<TParamsSchema>, CreateRouteSearch<TSearchConfig>>,\n \"kind\" | \"path\" | \"component\" | \"params\" | \"search\" | \"data\" | \"guard\"\n> & {\n params?: TParamsSchema;\n search?: TSearchConfig;\n guard?: ProgrammaticRouteGuard<\n CreateRouteParams<TParamsSchema>,\n CreateRouteSearch<TSearchConfig>\n >;\n};\n\ntype CreateRouteDataHooksWithBefore<\n TParams,\n TSearch,\n TBeforeResult,\n TMainResult,\n TContext = ProgrammaticRouteContext,\n> = Omit<\n ProgrammaticRouteDataHooks<\n TParams,\n TSearch,\n NoInfer<Awaited<TBeforeResult>>,\n NoInfer<Awaited<TMainResult>>,\n TContext\n >,\n \"before\" | \"main\"\n> & {\n before: (context: ProgrammaticRouteDataContext<TParams, TSearch, TContext>) => TBeforeResult;\n main: (\n context: ProgrammaticRouteDataContext<TParams, TSearch, TContext> & {\n before: NoInfer<Awaited<TBeforeResult>>;\n },\n ) => TMainResult;\n};\n\ntype CreateRouteDataHooksWithoutBefore<\n TParams,\n TSearch,\n TMainResult,\n TContext = ProgrammaticRouteContext,\n> = Omit<\n ProgrammaticRouteDataHooks<TParams, TSearch, undefined, NoInfer<Awaited<TMainResult>>, TContext>,\n \"before\" | \"main\"\n> & {\n before?: undefined;\n main: (\n context: ProgrammaticRouteDataContext<TParams, TSearch, TContext> & {\n before: undefined;\n },\n ) => TMainResult;\n};\n\ntype CreateRouteOptionsWithBefore<\n TParamsSchema extends ProgrammaticRouteSchema<any> | undefined,\n TSearchConfig extends ProgrammaticRouteSearchConfig<any> | undefined,\n TBefore,\n TData,\n> = CreateRouteSharedOptions<TParamsSchema, TSearchConfig> & {\n data: CreateRouteDataHooksWithBefore<\n CreateRouteParams<TParamsSchema>,\n CreateRouteSearch<TSearchConfig>,\n TBefore,\n TData\n >;\n component: ComponentType<\n ProgrammaticRouteComponentProps<\n CreateRouteParams<TParamsSchema>,\n CreateRouteSearch<TSearchConfig>,\n NoInfer<Awaited<TData>>\n >\n >;\n};\n\ntype CreateRouteOptionsWithoutBefore<\n TParamsSchema extends ProgrammaticRouteSchema<any> | undefined,\n TSearchConfig extends ProgrammaticRouteSearchConfig<any> | undefined,\n TData,\n> = CreateRouteSharedOptions<TParamsSchema, TSearchConfig> & {\n data: CreateRouteDataHooksWithoutBefore<\n CreateRouteParams<TParamsSchema>,\n CreateRouteSearch<TSearchConfig>,\n TData\n >;\n component: ComponentType<\n ProgrammaticRouteComponentProps<\n CreateRouteParams<TParamsSchema>,\n CreateRouteSearch<TSearchConfig>,\n NoInfer<Awaited<TData>>\n >\n >;\n};\n\ntype CreateRouteOptionsWithoutData<\n TParamsSchema extends ProgrammaticRouteSchema<any> | undefined,\n TSearchConfig extends ProgrammaticRouteSearchConfig<any> | undefined,\n> = CreateRouteSharedOptions<TParamsSchema, TSearchConfig> & {\n data?: undefined;\n component: ComponentType<\n ProgrammaticRouteComponentProps<\n CreateRouteParams<TParamsSchema>,\n CreateRouteSearch<TSearchConfig>,\n undefined\n >\n >;\n};\n\ntype CreateRouteComponentOption<TComponent extends ComponentType<any>, TProps> = {\n component: TComponent;\n} & (TComponent extends ComponentType<TProps> ? unknown : { component: ComponentType<TProps> });\n\nexport type CreateRouteOptions<\n TParamsSchema extends ProgrammaticRouteSchema<any> | undefined = undefined,\n TSearchConfig extends ProgrammaticRouteSearchConfig<any> | undefined = undefined,\n TBefore = unknown,\n TData = unknown,\n> =\n | CreateRouteOptionsWithBefore<TParamsSchema, TSearchConfig, TBefore, TData>\n | CreateRouteOptionsWithoutBefore<TParamsSchema, TSearchConfig, TData>\n | CreateRouteOptionsWithoutData<TParamsSchema, TSearchConfig>;\n\nconst FARM_ROUTES_BRAND = Symbol.for(\"farm.routes\");\nexport const PROGRAMMATIC_ROUTE_FILE_NAMES = [\n \"farm.route.ts\",\n \"farm.route.tsx\",\n \"farm.route.js\",\n \"farm.route.jsx\",\n \"farm.routes.ts\",\n \"farm.routes.tsx\",\n \"farm.routes.js\",\n \"farm.routes.jsx\",\n \"routes.ts\",\n \"routes.tsx\",\n \"routes.js\",\n \"routes.jsx\",\n];\n\nexport function defineRoutes(\n input: readonly ProgrammaticRouteDefinition[] | ProgrammaticRouteFactory,\n): ProgrammaticRouteManifest {\n const routes = typeof input === \"function\" ? input(routesBuilder) : input;\n const manifest = {\n __farmRoutes: true as const,\n routes: routes.map(normalizeProgrammaticRoute),\n };\n\n Object.defineProperty(manifest, FARM_ROUTES_BRAND, {\n value: true,\n enumerable: false,\n });\n\n return manifest;\n}\n\nexport const routesBuilder: ProgrammaticRouteBuilder = {\n page(path, options) {\n return normalizeProgrammaticRoute({\n kind: \"page\",\n path,\n ...options,\n }) as ProgrammaticPageRoute;\n },\n layout(path, options) {\n return normalizeProgrammaticRoute({\n kind: \"layout\",\n path,\n ...options,\n }) as ProgrammaticLayoutRoute;\n },\n api(path, options) {\n const { render, runtime, regions, maxDuration, ...methods } = options;\n return normalizeProgrammaticRoute({\n kind: \"api\",\n path,\n render,\n runtime,\n regions,\n maxDuration,\n methods: normalizeApiMethods(methods),\n }) as ProgrammaticApiRoute;\n },\n redirect(source, destination, options = {}) {\n return normalizeProgrammaticRoute({\n kind: \"redirect\",\n source,\n destination,\n ...options,\n }) as ProgrammaticRedirectRoute;\n },\n};\n\nexport const page = routesBuilder.page;\nexport const layout = routesBuilder.layout;\nexport const api = routesBuilder.api;\nexport const redirect = routesBuilder.redirect;\n\nexport interface ProgrammaticRouteSearchClientOptions {\n stripDefaults?: boolean | readonly string[];\n preserve?: readonly string[];\n temporary?: readonly string[];\n}\n\nexport interface ProgrammaticRouteSearchResolution<TSearch = unknown> {\n search: TSearch;\n canonicalPath?: string;\n}\n\nexport function getProgrammaticRouteSearchSchema<TSearch = unknown>(\n search: ProgrammaticRouteSearchConfig<TSearch> | undefined,\n): ProgrammaticRouteSchema<TSearch> | undefined {\n if (!search) return undefined;\n if (isProgrammaticRouteSchema(search)) return search;\n return search.schema;\n}\n\nexport function getProgrammaticRouteSearchClientOptions(\n search: ProgrammaticRouteSearchConfig<any> | undefined,\n): ProgrammaticRouteSearchClientOptions | undefined {\n if (!search || isProgrammaticRouteSchema(search)) return undefined;\n\n const options: ProgrammaticRouteSearchClientOptions = {};\n if (typeof search.stripDefaults !== \"undefined\") options.stripDefaults = search.stripDefaults;\n if (search.preserve?.length) options.preserve = [...search.preserve];\n if (search.temporary?.length) options.temporary = [...search.temporary];\n\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nfunction resolveProgrammaticRouteSearch<TSearch>(\n searchConfig: ProgrammaticRouteSearchConfig<TSearch> | undefined,\n rawSearch: ProgrammaticRouteSearchFallback,\n path: string,\n routePath: string,\n): ProgrammaticRouteSearchResolution<TSearch | ProgrammaticRouteSearchFallback> {\n const schema = getProgrammaticRouteSearchSchema(searchConfig);\n const search = parseProgrammaticSchema(schema, rawSearch, \"search\", routePath) as\n | TSearch\n | ProgrammaticRouteSearchFallback;\n const options = getProgrammaticRouteSearchOptions(searchConfig);\n const canonicalPath = resolveProgrammaticRouteCanonicalPath({\n options,\n schema,\n rawSearch,\n parsedSearch: search,\n path,\n });\n\n return { search, canonicalPath };\n}\n\nfunction getProgrammaticRouteSearchOptions(\n search: ProgrammaticRouteSearchConfig<any> | undefined,\n): ProgrammaticRouteSearchOptions<any> | undefined {\n if (!search || isProgrammaticRouteSchema(search)) return undefined;\n return search;\n}\n\nfunction isProgrammaticRouteSchema(value: unknown): value is ProgrammaticRouteSchema<any> {\n return !!value && typeof value === \"object\" && typeof (value as any).parse === \"function\";\n}\n\nfunction resolveProgrammaticRouteCanonicalPath(input: {\n options: ProgrammaticRouteSearchOptions<any> | undefined;\n schema: ProgrammaticRouteSchema<any> | undefined;\n rawSearch: ProgrammaticRouteSearchFallback;\n parsedSearch: unknown;\n path: string;\n}): string | undefined {\n const options = input.options;\n if (!options?.temporary?.length && !options?.stripDefaults) {\n return undefined;\n }\n\n const params = createSearchParams(input.rawSearch);\n const original = params.toString();\n\n for (const key of options.temporary || []) {\n params.delete(key);\n }\n\n if (options.stripDefaults) {\n const defaultSearch = parseDefaultSearch(input.schema);\n if (defaultSearch !== undefined) {\n const keys =\n options.stripDefaults === true\n ? Array.from(new Set(Array.from(params.keys())))\n : [...options.stripDefaults];\n\n for (const key of keys) {\n if (\n params.has(key) &&\n searchValuesEqual(\n readSearchValue(input.parsedSearch, key),\n readSearchValue(defaultSearch, key),\n )\n ) {\n params.delete(key);\n }\n }\n }\n }\n\n const next = params.toString();\n if (next === original) {\n return undefined;\n }\n\n return next ? `${input.path}?${next}` : input.path;\n}\n\nfunction createSearchParams(value: ProgrammaticRouteSearchFallback): URLSearchParams {\n const params = new URLSearchParams();\n\n for (const [key, item] of Object.entries(value)) {\n if (item == null) continue;\n const values = Array.isArray(item) ? item : [item];\n for (const entry of values) {\n if (entry != null) params.append(key, String(entry));\n }\n }\n\n return params;\n}\n\nfunction parseDefaultSearch(\n schema: ProgrammaticRouteSchema<any> | undefined,\n): Record<string, unknown> | undefined {\n if (!schema) return undefined;\n\n try {\n const value = schema.parse({});\n return value && typeof value === \"object\" ? (value as Record<string, unknown>) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction readSearchValue(value: unknown, key: string): unknown {\n return value && typeof value === \"object\" ? (value as Record<string, unknown>)[key] : undefined;\n}\n\nfunction searchValuesEqual(left: unknown, right: unknown): boolean {\n return (\n JSON.stringify(normalizeComparableValue(left)) ===\n JSON.stringify(normalizeComparableValue(right))\n );\n}\n\nfunction normalizeComparableValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(normalizeComparableValue);\n }\n if (value && typeof value === \"object\") {\n return Object.keys(value as Record<string, unknown>)\n .sort()\n .reduce<Record<string, unknown>>((output, key) => {\n output[key] = normalizeComparableValue((value as Record<string, unknown>)[key]);\n return output;\n }, {});\n }\n return value;\n}\n\nexport function createRoute<\n TParamsSchema extends ProgrammaticRouteSchema<any> | undefined = undefined,\n TSearchConfig extends ProgrammaticRouteSearchConfig<any> | undefined = undefined,\n TBeforeResult = unknown,\n TMainResult = unknown,\n TComponent extends ComponentType<any> = ComponentType<any>,\n>(\n path: string,\n options: Omit<\n CreateRouteOptionsWithBefore<TParamsSchema, TSearchConfig, TBeforeResult, TMainResult>,\n \"component\"\n > &\n CreateRouteComponentOption<\n TComponent,\n ProgrammaticRouteComponentProps<\n CreateRouteParams<TParamsSchema>,\n CreateRouteSearch<TSearchConfig>,\n Awaited<TMainResult>\n >\n >,\n): ProgrammaticPageRoute<\n CreateRouteParams<TParamsSchema>,\n CreateRouteSearch<TSearchConfig>,\n CreateRouteDataHooksWithBefore<\n CreateRouteParams<TParamsSchema>,\n CreateRouteSearch<TSearchConfig>,\n TBeforeResult,\n TMainResult\n >\n>;\nexport function createRoute<\n TParamsSchema extends ProgrammaticRouteSchema<any> | undefined = undefined,\n TSearchConfig extends ProgrammaticRouteSearchConfig<any> | undefined = undefined,\n TMainResult = unknown,\n TComponent extends ComponentType<any> = ComponentType<any>,\n>(\n path: string,\n options: Omit<\n CreateRouteOptionsWithoutBefore<TParamsSchema, TSearchConfig, TMainResult>,\n \"component\"\n > &\n CreateRouteComponentOption<\n TComponent,\n ProgrammaticRouteComponentProps<\n CreateRouteParams<TParamsSchema>,\n CreateRouteSearch<TSearchConfig>,\n Awaited<TMainResult>\n >\n >,\n): ProgrammaticPageRoute<\n CreateRouteParams<TParamsSchema>,\n CreateRouteSearch<TSearchConfig>,\n CreateRouteDataHooksWithoutBefore<\n CreateRouteParams<TParamsSchema>,\n CreateRouteSearch<TSearchConfig>,\n TMainResult\n >\n>;\nexport function createRoute<\n TParamsSchema extends ProgrammaticRouteSchema<any> | undefined = undefined,\n TSearchConfig extends ProgrammaticRouteSearchConfig<any> | undefined = undefined,\n>(\n path: string,\n options: CreateRouteOptionsWithoutData<TParamsSchema, TSearchConfig>,\n): ProgrammaticPageRoute<\n CreateRouteParams<TParamsSchema>,\n CreateRouteSearch<TSearchConfig>,\n undefined\n>;\nexport function createRoute(path: string, options: any): any {\n return routesBuilder.page(path, options);\n}\n\nexport function isProgrammaticRoutesFileName(fileName: string): boolean {\n const normalized = fileName.replace(/\\\\/g, \"/\");\n const baseName = normalized.split(\"/\").pop() || normalized;\n return PROGRAMMATIC_ROUTE_FILE_NAMES.includes(baseName);\n}\n\nexport function getProgrammaticRouteManifest(\n mod: Record<string, any> | null | undefined,\n): ProgrammaticRouteManifest | null {\n if (!mod) return null;\n\n const candidates = [mod.default, mod.routes, mod.Route];\n for (const candidate of candidates) {\n if (isProgrammaticRouteManifest(candidate)) {\n return candidate;\n }\n if (isProgrammaticRouteDefinition(candidate)) {\n return defineRoutes([candidate]);\n }\n if (Array.isArray(candidate)) {\n return defineRoutes(candidate as ProgrammaticRouteDefinition[]);\n }\n }\n\n const routeDefinitions = Object.values(mod).filter(isProgrammaticRouteDefinition);\n if (routeDefinitions.length > 0) {\n return defineRoutes(routeDefinitions);\n }\n\n return null;\n}\n\nexport function isProgrammaticRouteManifest(value: unknown): value is ProgrammaticRouteManifest {\n return (\n !!value &&\n typeof value === \"object\" &&\n (value as ProgrammaticRouteManifest).__farmRoutes === true &&\n Array.isArray((value as ProgrammaticRouteManifest).routes)\n );\n}\n\nexport function isProgrammaticRouteDefinition(\n value: unknown,\n): value is ProgrammaticRouteDefinition {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const kind = (value as { kind?: unknown }).kind;\n return kind === \"page\" || kind === \"layout\" || kind === \"api\" || kind === \"redirect\";\n}\n\nexport function createProgrammaticRouteModuleId(\n filePath: string,\n kind: \"page\" | \"layout\" | \"api\",\n routePath: string,\n): string {\n return `${filePath}?farm-route=${kind}:${encodeURIComponent(normalizeRoutePath(routePath))}`;\n}\n\nexport function parseProgrammaticRouteModuleId(moduleId: string): {\n filePath: string;\n kind: \"page\" | \"layout\" | \"api\";\n routePath: string;\n} | null {\n const queryIndex = moduleId.indexOf(\"?\");\n if (queryIndex === -1) {\n return null;\n }\n\n const filePath = moduleId.slice(0, queryIndex);\n const params = new URLSearchParams(moduleId.slice(queryIndex + 1));\n const value = params.get(\"farm-route\");\n if (!value) {\n return null;\n }\n\n const separator = value.indexOf(\":\");\n if (separator === -1) {\n return null;\n }\n\n const kind = value.slice(0, separator);\n if (kind !== \"page\" && kind !== \"layout\" && kind !== \"api\") {\n return null;\n }\n\n return {\n filePath,\n kind,\n routePath: normalizeRoutePath(value.slice(separator + 1)),\n };\n}\n\nexport function parseProgrammaticRoutePath(\n routePath: string,\n type: ParsedRoute[\"type\"] = \"page\",\n): ParsedRoute {\n const fileName = type === \"layout\" ? \"layout.tsx\" : \"page.tsx\";\n const normalized = normalizeRoutePath(routePath);\n const filePath =\n normalized === \"/\" ? fileName : `${normalized.slice(1).replace(/\\/+$/, \"\")}/${fileName}`;\n\n return {\n filePath,\n type,\n segments: normalized === \"/\" ? [] : normalized.slice(1).split(\"/\").map(parseRouteSegment),\n };\n}\n\nexport function createRouteModuleFromProgrammaticPage(route: ProgrammaticPageRoute): RouteModule {\n const mod: RouteModule = {\n default: createProgrammaticPageComponent(route),\n ...normalizeFarmRouteRuntimeConfig(route, `Route \"${route.path}\"`),\n };\n\n if (route.params || route.search || route.guard || route.data) {\n (mod as any).__farmRouteSchemas = {\n params: route.params,\n search: getProgrammaticRouteSearchSchema(route.search),\n };\n (mod as any).__farmRouteSearch = getProgrammaticRouteSearchClientOptions(route.search);\n (mod as any).__farmRouteGuard = route.guard;\n (mod as any).__farmRouteData = route.data;\n (mod as any).__farmRouteParsesProps = true;\n (mod as any).__farmResolveRouteProps = (props: PageProps) =>\n resolveProgrammaticRouteProps(route, props);\n (mod as any).__farmResolveRouteCanonicalPath = (\n rawSearch: ProgrammaticRouteSearchFallback,\n path: string,\n ) => resolveProgrammaticRouteSearch(route.search, rawSearch, path, route.path).canonicalPath;\n }\n\n if (route.pending || route.error || route.notFound) {\n (mod as any).__farmRouteComponents = {\n pending: route.pending,\n error: route.error,\n notFound: route.notFound,\n };\n }\n\n if (route.render === \"static\" || route.staticPaths) {\n mod.ssg = true;\n mod.dynamic = \"force-static\";\n } else if (route.render === \"dynamic\") {\n mod.ssg = false;\n mod.dynamic = \"force-dynamic\";\n }\n\n if (typeof route.revalidate !== \"undefined\") {\n mod.revalidate = route.revalidate;\n }\n\n if (route.ppr) {\n mod.ppr = true;\n }\n\n if (route.metadata) {\n mod.metadata = route.metadata;\n }\n\n if (route.generateMetadata) {\n mod.generateMetadata = route.generateMetadata;\n }\n\n if (route.staticPaths) {\n mod.getStaticPaths = async () => normalizeStaticPaths(route.path, await route.staticPaths!());\n }\n\n return mod;\n}\n\nexport function createLayoutModuleFromProgrammaticLayout(route: ProgrammaticLayoutRoute) {\n return {\n default: route.component,\n ...normalizeFarmRouteRuntimeConfig(route, `Layout \"${route.path}\"`),\n metadata: route.metadata,\n generateMetadata: route.generateMetadata,\n };\n}\n\nexport function scanProgrammaticPagePaths(source: string): string[] {\n const paths = new Set<string>();\n const callRe = /\\b(?:page|createRoute)\\s*\\(\\s*([\"'`])([^\"'`]+)\\1/g;\n\n for (const match of source.matchAll(callRe)) {\n if (match[2]) {\n paths.add(normalizeRoutePath(match[2]));\n }\n }\n\n return Array.from(paths);\n}\n\nfunction createProgrammaticPageComponent(route: ProgrammaticPageRoute): ComponentType<PageProps> {\n if (\n !route.params &&\n !route.search &&\n !route.guard &&\n !route.data &&\n !route.pending &&\n !route.error &&\n !route.notFound\n ) {\n return route.component as ComponentType<PageProps>;\n }\n\n const Component = route.component;\n\n if (route.pending) {\n const PendingComponent = route.pending;\n const routePropsResources = new WeakMap<object, ProgrammaticRoutePropsResource>();\n const FarmProgrammaticPageContent = function FarmProgrammaticPageContent(props: PageProps) {\n try {\n const resolvedProps = readProgrammaticRouteProps(route, props, routePropsResources);\n return createElement(Component, stripProgrammaticRoutePropsMarker(resolvedProps));\n } catch (error) {\n if (isPromiseLike(error) || isProgrammaticRedirectSignal(error)) {\n throw error;\n }\n\n if (isProgrammaticNotFoundSignal(error) && route.notFound) {\n return createElement(route.notFound, createProgrammaticRouteErrorProps(error, props));\n }\n\n if (route.error) {\n return createElement(route.error, createProgrammaticRouteErrorProps(error, props));\n }\n\n throw error;\n }\n };\n const PageContent = FarmProgrammaticPageContent as unknown as ComponentType<PageProps>;\n const FarmProgrammaticPage = function FarmProgrammaticPage(props: PageProps) {\n return createElement(\n Suspense,\n {\n fallback: createElement(PendingComponent, createProgrammaticRoutePendingProps(props)),\n },\n createElement(PageContent, props),\n );\n };\n\n return FarmProgrammaticPage as unknown as ComponentType<PageProps>;\n }\n\n const FarmProgrammaticPageContent = async function FarmProgrammaticPageContent(props: PageProps) {\n try {\n const resolvedProps = isProgrammaticRoutePropsResolved(props)\n ? props\n : await resolveProgrammaticRouteProps(route, props);\n\n return createElement(Component, stripProgrammaticRoutePropsMarker(resolvedProps));\n } catch (error) {\n if (isProgrammaticRedirectSignal(error)) {\n throw error;\n }\n\n if (isProgrammaticNotFoundSignal(error) && route.notFound) {\n return createElement(route.notFound, createProgrammaticRouteErrorProps(error, props));\n }\n\n if (route.error) {\n return createElement(route.error, createProgrammaticRouteErrorProps(error, props));\n }\n\n throw error;\n }\n };\n\n return FarmProgrammaticPageContent as unknown as ComponentType<PageProps>;\n}\n\ntype ProgrammaticRoutePropsResource =\n | { status: \"pending\"; promise: Promise<Record<string, any>> }\n | { status: \"resolved\"; value: Record<string, any> }\n | { status: \"rejected\"; error: unknown };\n\nfunction readProgrammaticRouteProps(\n route: ProgrammaticPageRoute,\n props: PageProps,\n resources: WeakMap<object, ProgrammaticRoutePropsResource>,\n): Record<string, any> {\n if (isProgrammaticRoutePropsResolved(props)) {\n return props;\n }\n\n let resource = resources.get(props as object);\n if (!resource) {\n const deferredRouteProps = (props as any).__farmRoutePropsPromise;\n const promise = Promise.resolve<Record<string, any>>(\n isPromiseLike(deferredRouteProps)\n ? (deferredRouteProps as PromiseLike<Record<string, any>>)\n : resolveProgrammaticRouteProps(route, props),\n );\n resource = { status: \"pending\", promise };\n resources.set(props as object, resource);\n promise.then(\n (value) => resources.set(props as object, { status: \"resolved\", value }),\n (error) => resources.set(props as object, { status: \"rejected\", error }),\n );\n }\n\n if (resource.status === \"pending\") throw resource.promise;\n if (resource.status === \"rejected\") throw resource.error;\n return resource.value;\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return Boolean(\n value &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n typeof (value as PromiseLike<unknown>).then === \"function\",\n );\n}\n\nfunction createProgrammaticRoutePendingProps(\n props: PageProps,\n): ProgrammaticRoutePendingComponentProps {\n return {\n params: props.params,\n searchParams: props.searchParams,\n path: props.path,\n };\n}\n\nfunction createProgrammaticRouteErrorProps(\n error: unknown,\n props: PageProps,\n): ProgrammaticRouteErrorComponentProps {\n return {\n error,\n params: props.params,\n searchParams: props.searchParams,\n path: props.path,\n };\n}\n\nfunction isProgrammaticRedirectSignal(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const digest = (error as { digest?: unknown }).digest;\n return typeof digest === \"string\" && digest.startsWith(\"FARM_REDIRECT;\");\n}\n\nfunction isProgrammaticNotFoundSignal(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const digest = (error as { digest?: unknown }).digest;\n return digest === \"FARM_NOT_FOUND\";\n}\n\nasync function resolveProgrammaticRouteProps(\n route: ProgrammaticPageRoute,\n props: PageProps,\n): Promise<Record<string, any> & { __farmRoutePropsResolved: true }> {\n const rawSearch = await props.searchParams;\n const params = parseProgrammaticSchema(route.params, props.params, \"params\", route.path);\n const { search, canonicalPath } = resolveProgrammaticRouteSearch(\n route.search,\n rawSearch,\n props.path,\n route.path,\n );\n const routeContextValue = getFarmRouteContext(props);\n const pluginContext = props.context;\n const baseProps = {\n ...props,\n params,\n search,\n searchParams: Promise.resolve(search),\n };\n const routeContextProps = {\n ...baseProps,\n context: routeContextValue,\n pluginContext,\n };\n\n if (route.guard) {\n await route.guard(routeContextProps as any);\n }\n\n if (!route.data) {\n return markProgrammaticRoutePropsResolved(addCanonicalPath(baseProps, canonicalPath));\n }\n\n const before = route.data.before ? await route.data.before(routeContextProps as any) : undefined;\n const dataContext = {\n ...(routeContextProps as any),\n before,\n };\n const data = await resolveProgrammaticRouteData(route, route.data, dataContext);\n\n if (route.data.after) {\n await route.data.after({\n ...(routeContextProps as any),\n before,\n data,\n });\n }\n\n return markProgrammaticRoutePropsResolved({\n ...baseProps,\n data,\n ...(canonicalPath ? { __farmCanonicalPath: canonicalPath } : {}),\n });\n}\n\nasync function resolveProgrammaticRouteData(\n route: ProgrammaticPageRoute,\n dataHooks: ProgrammaticRouteDataHooks<any, any, any, any>,\n context: ProgrammaticRouteDataCacheContext<any, any, any>,\n): Promise<unknown> {\n if (!dataHooks?.key) {\n return dataHooks.main(context);\n }\n\n const routeDataKey = await dataHooks.key(context);\n if (routeDataKey == null) {\n return dataHooks.main(context);\n }\n\n const cacheKey = createFarmCacheKey([\"route-data\", routeDataKey]);\n const cacheOptions: FarmCacheOptions = {\n tags: [\n createRouteDataCacheTag(routeDataKey),\n ...(await resolveProgrammaticRouteDataKeys(dataHooks.tags, context)),\n ],\n paths: [\n ...(typeof context.path === \"string\" ? [context.path] : []),\n ...(await resolveProgrammaticRouteDataKeys(dataHooks.paths, context)),\n ],\n revalidate: normalizeProgrammaticRouteStaleTime(dataHooks.staleTime),\n };\n\n return getFarmDataCache().getOrSet(cacheKey, () => dataHooks.main(context), cacheOptions);\n}\n\nasync function resolveProgrammaticRouteDataKeys(\n input: ProgrammaticRouteDataCacheKeys<any, any, any> | undefined,\n context: ProgrammaticRouteDataCacheContext<any, any, any>,\n): Promise<readonly string[]> {\n if (!input) return [];\n const value = typeof input === \"function\" ? await input(context) : input;\n return value.filter((item) => typeof item === \"string\" && item.trim().length > 0);\n}\n\nfunction normalizeProgrammaticRouteStaleTime(\n staleTime: ProgrammaticRouteDataStaleTime | undefined,\n): number | false | undefined {\n if (staleTime === undefined) return undefined;\n if (staleTime === false) return false;\n\n if (typeof staleTime === \"number\") {\n if (!Number.isFinite(staleTime) || staleTime <= 0) return undefined;\n return Math.max(1, Math.ceil(staleTime / 1000));\n }\n\n const match = staleTime.match(/^(\\d+(?:\\.\\d+)?)(ms|s|m|h)$/);\n if (!match) return undefined;\n\n const value = Number(match[1]);\n if (!Number.isFinite(value) || value <= 0) return undefined;\n\n const unit = match[2];\n const milliseconds =\n unit === \"ms\"\n ? value\n : unit === \"s\"\n ? value * 1000\n : unit === \"m\"\n ? value * 60000\n : value * 3600000;\n\n return Math.max(1, Math.ceil(milliseconds / 1000));\n}\n\nfunction isProgrammaticRoutePropsResolved(value: unknown): boolean {\n return !!value && typeof value === \"object\" && (value as any).__farmRoutePropsResolved === true;\n}\n\nfunction markProgrammaticRoutePropsResolved<T extends Record<string, any>>(\n props: T,\n): T & { __farmRoutePropsResolved: true } {\n return {\n ...props,\n __farmRoutePropsResolved: true,\n };\n}\n\nfunction addCanonicalPath<T extends Record<string, any>>(\n props: T,\n canonicalPath: string | undefined,\n): T {\n return canonicalPath ? ({ ...props, __farmCanonicalPath: canonicalPath } as T) : props;\n}\n\nfunction stripProgrammaticRoutePropsMarker<TProps>(props: TProps): TProps {\n if (!isProgrammaticRoutePropsResolved(props)) {\n return props;\n }\n\n const {\n __farmRoutePropsResolved,\n __farmCanonicalPath,\n __farmRoutePropsPromise,\n ...componentProps\n } = props as any;\n return componentProps;\n}\n\nfunction parseProgrammaticSchema<TFallback>(\n schema: ProgrammaticRouteSchema<any> | undefined,\n value: TFallback,\n label: string,\n routePath: string,\n): unknown {\n if (!schema) {\n return value;\n }\n\n try {\n return schema.parse(value);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid ${label} for route \"${routePath}\": ${message}`);\n }\n}\n\nfunction normalizeProgrammaticRoute(\n route: ProgrammaticRouteDefinition,\n): ProgrammaticRouteDefinition {\n if (route.kind === \"redirect\") {\n return {\n ...route,\n source: normalizeRoutePath(route.source),\n };\n }\n\n if (route.kind === \"api\") {\n return {\n ...route,\n ...normalizeFarmRouteRuntimeConfig(route, `API route \"${route.path}\"`),\n path: normalizeRoutePath(route.path),\n methods: normalizeApiMethods(route.methods),\n };\n }\n\n return {\n ...route,\n ...normalizeFarmRouteRuntimeConfig(\n route,\n `${route.kind === \"layout\" ? \"Layout\" : \"Route\"} \"${route.path}\"`,\n ),\n path: normalizeRoutePath(route.path),\n };\n}\n\nfunction normalizeRoutePath(routePath: string): string {\n const withSlash = routePath.startsWith(\"/\") ? routePath : `/${routePath}`;\n const withoutTrailing = withSlash.length > 1 ? withSlash.replace(/\\/+$/, \"\") : withSlash;\n return withoutTrailing || \"/\";\n}\n\nfunction parseRouteSegment(segment: string): ParsedRoute[\"segments\"][number] {\n if (segment.startsWith(\"[\") && segment.endsWith(\"]\")) {\n let name = segment.slice(1, -1);\n let isOptional = false;\n let isCatchAll = false;\n\n if (name.startsWith(\"[\") && name.endsWith(\"]\")) {\n isOptional = true;\n name = name.slice(1, -1);\n }\n\n if (name.startsWith(\"...\")) {\n isCatchAll = true;\n name = name.slice(3);\n }\n\n return {\n segment: name,\n isDynamic: true,\n isOptional,\n isCatchAll,\n };\n }\n\n return {\n segment,\n isDynamic: false,\n isOptional: false,\n isCatchAll: false,\n };\n}\n\nfunction normalizeApiMethods(\n methods: Record<string, any>,\n): Partial<Record<ProgrammaticRouteMethod, any>> {\n const normalized: Partial<Record<ProgrammaticRouteMethod, any>> = {};\n\n for (const [method, handler] of Object.entries(methods)) {\n const normalizedMethod = method.toUpperCase() as ProgrammaticRouteMethod;\n if (handler && isProgrammaticRouteMethod(normalizedMethod)) {\n normalized[normalizedMethod] = handler;\n }\n }\n\n return normalized;\n}\n\nfunction isProgrammaticRouteMethod(method: string): method is ProgrammaticRouteMethod {\n return (\n method === \"GET\" ||\n method === \"HEAD\" ||\n method === \"POST\" ||\n method === \"PUT\" ||\n method === \"DELETE\" ||\n method === \"PATCH\" ||\n method === \"OPTIONS\"\n );\n}\n\nfunction normalizeStaticPaths(\n routePath: string,\n paths: readonly ProgrammaticStaticPath[],\n): Record<string, string>[] {\n const dynamicSegments = parseProgrammaticRoutePath(routePath).segments.filter(\n (segment) => segment.isDynamic,\n );\n\n return paths.map((entry) => {\n if (typeof entry === \"string\" || Array.isArray(entry)) {\n if (dynamicSegments.length !== 1) {\n throw new Error(\n `staticPaths for \"${routePath}\" must return objects when the route has ${dynamicSegments.length} dynamic params.`,\n );\n }\n\n const value = Array.isArray(entry) ? entry.join(\"/\") : entry;\n return { [dynamicSegments[0].segment]: String(value) };\n }\n\n return Object.fromEntries(\n Object.entries(entry).map(([key, value]) => [\n key,\n Array.isArray(value) ? value.map(String).join(\"/\") : String(value),\n ]),\n );\n });\n}\n","export type FarmEventLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface FarmEventBase {\n type: string;\n timestamp: number;\n level: FarmEventLevel;\n requestId?: string;\n route?: string;\n pathname?: string;\n}\n\nexport type FarmServerEvent =\n | (FarmEventBase & {\n type: \"server.start\";\n mode: \"dev\" | \"preview\" | \"production\";\n port?: number;\n })\n | (FarmEventBase & { type: \"server.ready\"; url?: string })\n | (FarmEventBase & { type: \"server.shutdown\"; reason?: string });\n\nexport type FarmRouteEvent =\n | (FarmEventBase & { type: \"route.discovered\"; route: string; filePath: string })\n | (FarmEventBase & {\n type: \"route.matched\";\n pathname: string;\n route: string;\n params?: Record<string, string>;\n })\n | (FarmEventBase & { type: \"route.notFound\"; pathname: string })\n | (FarmEventBase & { type: \"route.redirect\"; from: string; to: string; status?: number })\n | (FarmEventBase & { type: \"route.rewrite\"; from: string; to: string });\n\nexport type FarmRenderEvent =\n | (FarmEventBase & { type: \"render.start\"; route: string; pathname?: string })\n | (FarmEventBase & {\n type: \"render.complete\";\n route: string;\n durationMs: number;\n status?: number;\n })\n | (FarmEventBase & { type: \"render.error\"; route?: string; error: unknown })\n | (FarmEventBase & { type: \"render.stream.start\"; route: string })\n | (FarmEventBase & { type: \"render.stream.shellReady\"; route: string; durationMs: number })\n | (FarmEventBase & { type: \"render.stream.complete\"; route: string; durationMs: number });\n\nexport type FarmCacheEvent =\n | (FarmEventBase & {\n type: \"cache.hit\";\n key: string;\n route?: string;\n tags?: readonly string[];\n revalidate?: number | false;\n stale?: boolean;\n })\n | (FarmEventBase & { type: \"cache.miss\"; key: string; route?: string; reason?: string })\n | (FarmEventBase & {\n type: \"cache.set\";\n key: string;\n route?: string;\n tags?: readonly string[];\n revalidate?: number | false;\n })\n | (FarmEventBase & { type: \"cache.dedupe\"; key: string })\n | (FarmEventBase & { type: \"cache.bypass\"; key?: string; route?: string; reason: string })\n | (FarmEventBase & {\n type: \"cache.stale\";\n key: string;\n route?: string;\n tags?: readonly string[];\n revalidate?: number | false;\n })\n | (FarmEventBase & { type: \"cache.revalidatePath\"; path: string; count: number })\n | (FarmEventBase & {\n type: \"cache.revalidateTag\";\n tag: string;\n profile?: unknown;\n count: number;\n })\n | (FarmEventBase & { type: \"cache.updateTag\"; tag: string; count: number })\n | (FarmEventBase & {\n type: \"cache.invalidated\";\n key?: string;\n route?: string;\n tag?: string;\n reason?: string;\n count?: number;\n })\n | (FarmEventBase & { type: \"cache.delete\"; key: string; deleted: boolean })\n | (FarmEventBase & { type: \"cache.clear\"; count: number })\n | (FarmEventBase & {\n type: \"cache.error\";\n key?: string;\n operation: \"get\" | \"set\" | \"delete\" | \"revalidate\";\n error: unknown;\n });\n\nexport type FarmPPREvent =\n | (FarmEventBase & { type: \"ppr.shell.hit\"; route: string; key: string })\n | (FarmEventBase & { type: \"ppr.shell.miss\"; route: string; key: string })\n | (FarmEventBase & {\n type: \"ppr.shell.cached\";\n route: string;\n key: string;\n revalidate?: number;\n })\n | (FarmEventBase & { type: \"ppr.shell.bypass\"; route: string; reason: string })\n | (FarmEventBase & {\n type: \"ppr.shell.invalidated\";\n route: string;\n reason?: string;\n count?: number;\n })\n | (FarmEventBase & { type: \"ppr.suspense.holeDetected\"; route: string })\n | (FarmEventBase & { type: \"ppr.refresh.start\"; route: string })\n | (FarmEventBase & { type: \"ppr.refresh.complete\"; route: string; durationMs: number })\n | (FarmEventBase & { type: \"ppr.refresh.error\"; route: string; error: unknown });\n\nexport type FarmAPIEvent =\n | (FarmEventBase & { type: \"api.request.start\"; route: string; method: string })\n | (FarmEventBase & {\n type: \"api.request.complete\";\n route: string;\n method: string;\n status: number;\n durationMs: number;\n })\n | (FarmEventBase & {\n type: \"api.validation.failed\";\n route: string;\n method: string;\n issues?: unknown;\n })\n | (FarmEventBase & { type: \"api.error\"; route: string; method: string; error: unknown });\n\nexport type FarmIntegrationEvent =\n | (FarmEventBase & { type: \"integration.registered\"; name: string })\n | (FarmEventBase & { type: \"integration.config.validated\"; name: string })\n | (FarmEventBase & { type: \"integration.ready\"; name: string })\n | (FarmEventBase & { type: \"integration.disposed\"; name: string })\n | (FarmEventBase & {\n type: \"integration.api.call.start\";\n integration: string;\n operation: string;\n })\n | (FarmEventBase & {\n type: \"integration.api.call.complete\";\n integration: string;\n operation: string;\n durationMs: number;\n })\n | (FarmEventBase & {\n type: \"integration.api.call.error\";\n integration: string;\n operation: string;\n error: unknown;\n })\n | (FarmEventBase & { type: \"integration.webhook.received\"; integration: string; event?: string })\n | (FarmEventBase & { type: \"integration.webhook.verified\"; integration: string; event?: string })\n | (FarmEventBase & { type: \"integration.webhook.failed\"; integration: string; reason: string });\n\nexport type FarmMiddlewareEvent =\n | (FarmEventBase & { type: \"middleware.start\"; route?: string; name?: string })\n | (FarmEventBase & {\n type: \"middleware.complete\";\n route?: string;\n name?: string;\n durationMs: number;\n })\n | (FarmEventBase & {\n type: \"middleware.shortCircuit\";\n route?: string;\n name?: string;\n status?: number;\n })\n | (FarmEventBase & { type: \"middleware.error\"; route?: string; name?: string; error: unknown });\n\nexport type FarmStorageEvent =\n | (FarmEventBase & { type: \"storage.query.start\"; integration?: string; operation: string })\n | (FarmEventBase & {\n type: \"storage.query.complete\";\n integration?: string;\n operation: string;\n durationMs: number;\n })\n | (FarmEventBase & {\n type: \"storage.query.error\";\n integration?: string;\n operation: string;\n error: unknown;\n })\n | (FarmEventBase & { type: \"storage.schema.ready\"; integration?: string })\n | (FarmEventBase & { type: \"storage.schema.error\"; integration?: string; error: unknown });\n\nexport type FarmBuildEvent =\n | (FarmEventBase & { type: \"build.start\"; target?: string })\n | (FarmEventBase & { type: \"build.complete\"; target?: string; durationMs: number })\n | (FarmEventBase & { type: \"build.error\"; target?: string; error: unknown })\n | (FarmEventBase & { type: \"routes.generated\"; pageCount: number; apiCount?: number })\n | (FarmEventBase & { type: \"types.generated\"; filePath: string })\n | (FarmEventBase & { type: \"manifest.generated\"; routeCount: number });\n\nexport type FarmPluginEvent =\n | (FarmEventBase & { type: \"plugin.hook.start\"; plugin: string; hook: string })\n | (FarmEventBase & {\n type: \"plugin.hook.complete\";\n plugin: string;\n hook: string;\n durationMs: number;\n })\n | (FarmEventBase & { type: \"plugin.hook.error\"; plugin: string; hook: string; error: unknown });\n\nexport type FarmErrorEvent = FarmEventBase & {\n type: \"error\";\n source: string;\n error: unknown;\n route?: string;\n};\n\nexport type FarmEvent =\n | FarmServerEvent\n | FarmRouteEvent\n | FarmRenderEvent\n | FarmCacheEvent\n | FarmPPREvent\n | FarmAPIEvent\n | FarmIntegrationEvent\n | FarmMiddlewareEvent\n | FarmStorageEvent\n | FarmBuildEvent\n | FarmPluginEvent\n | FarmErrorEvent;\n\nexport type FarmEventType = FarmEvent[\"type\"];\nexport type FarmEventHandler = (event: FarmEvent) => void | Promise<void>;\n\nexport type FarmEventInput = FarmEvent extends infer T\n ? T extends FarmEvent\n ? Omit<T, \"timestamp\" | \"level\"> & Partial<Pick<T, \"timestamp\" | \"level\">>\n : never\n : never;\n\nexport type FarmObservabilityUserConfig =\n | boolean\n | {\n logs?: boolean;\n onEvent?: FarmEventHandler | readonly FarmEventHandler[];\n events?: readonly FarmEventType[];\n };\n\nexport interface FarmResolvedObservabilityConfig {\n logs: boolean;\n handlers: FarmEventHandler[];\n events?: Set<FarmEventType>;\n}\n\nconst runtimeHandlers = new Set<FarmEventHandler>();\nlet observabilityState: FarmResolvedObservabilityConfig = {\n logs: false,\n handlers: [],\n};\n\nexport function configureFarmObservability(config: FarmObservabilityUserConfig | undefined): void {\n observabilityState = normalizeFarmObservabilityConfig(config);\n}\n\nexport function normalizeFarmObservabilityConfig(\n config: FarmObservabilityUserConfig | undefined,\n): FarmResolvedObservabilityConfig {\n if (config === undefined || config === false) {\n return { logs: false, handlers: [] };\n }\n\n if (config === true) {\n return { logs: true, handlers: [] };\n }\n\n const handlers = config.onEvent\n ? Array.isArray(config.onEvent)\n ? [...config.onEvent]\n : [config.onEvent]\n : [];\n\n return {\n logs: config.logs ?? false,\n handlers,\n events: config.events ? new Set(config.events) : undefined,\n };\n}\n\nexport function onFarmEvent(handler: FarmEventHandler): () => void {\n runtimeHandlers.add(handler);\n return () => {\n runtimeHandlers.delete(handler);\n };\n}\n\nexport function resetFarmObservability(): void {\n runtimeHandlers.clear();\n observabilityState = {\n logs: false,\n handlers: [],\n };\n}\n\nexport function emitFarmEvent(input: FarmEventInput): FarmEvent {\n const event = {\n timestamp: Date.now(),\n level: inferFarmEventLevel(input.type),\n ...input,\n } as FarmEvent;\n\n if (!shouldEmitFarmEvent(event)) {\n return event;\n }\n\n if (observabilityState.logs) {\n logFarmEvent(event);\n }\n\n for (const handler of [...observabilityState.handlers, ...runtimeHandlers]) {\n try {\n Promise.resolve(handler(event)).catch((error) => {\n console.warn(`[farm:observability] event handler failed: ${formatError(error)}`);\n });\n } catch (error) {\n console.warn(`[farm:observability] event handler failed: ${formatError(error)}`);\n }\n }\n\n return event;\n}\n\nfunction shouldEmitFarmEvent(event: FarmEvent): boolean {\n if (\n !observabilityState.logs &&\n observabilityState.handlers.length === 0 &&\n runtimeHandlers.size === 0\n ) {\n return false;\n }\n\n if (observabilityState.events && !observabilityState.events.has(event.type)) {\n return false;\n }\n\n return true;\n}\n\nfunction inferFarmEventLevel(type: FarmEventType): FarmEventLevel {\n if (type === \"error\" || type.endsWith(\".error\") || type.endsWith(\".failed\")) {\n return \"error\";\n }\n if (\n type.endsWith(\".bypass\") ||\n type.endsWith(\".invalidated\") ||\n type.endsWith(\".stale\") ||\n type.endsWith(\".notFound\")\n ) {\n return \"warn\";\n }\n if (\n type.endsWith(\".hit\") ||\n type.endsWith(\".miss\") ||\n type.endsWith(\".start\") ||\n type.endsWith(\".shellReady\")\n ) {\n return \"debug\";\n }\n return \"info\";\n}\n\nfunction logFarmEvent(event: FarmEvent): void {\n const message = `[farm:${event.level}] ${event.type}${formatFarmEventDetails(event)}`;\n switch (event.level) {\n case \"error\":\n console.error(message);\n break;\n case \"warn\":\n console.warn(message);\n break;\n default:\n console.log(message);\n break;\n }\n}\n\nfunction formatFarmEventDetails(event: FarmEvent): string {\n const details: string[] = [];\n const record = event as unknown as Record<string, unknown>;\n\n for (const key of [\n \"route\",\n \"pathname\",\n \"method\",\n \"status\",\n \"key\",\n \"tag\",\n \"path\",\n \"reason\",\n \"durationMs\",\n \"integration\",\n \"operation\",\n \"plugin\",\n \"hook\",\n \"target\",\n \"count\",\n ]) {\n const value = record[key];\n if (value !== undefined) {\n details.push(`${key}=${formatDetailValue(value)}`);\n }\n }\n\n return details.length > 0 ? ` ${details.join(\" \")}` : \"\";\n}\n\nfunction formatDetailValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","export type FarmCacheInvalidationListener = (key: string) => void;\n\ntype FarmCacheInvalidationState = {\n listeners: Set<FarmCacheInvalidationListener>;\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 });\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 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 subscribeFarmCacheInvalidation(\n listener: FarmCacheInvalidationListener,\n): () => void {\n const state = getFarmCacheInvalidationState();\n state.listeners.add(listener);\n return () => state.listeners.delete(listener);\n}\n","import type { FarmI18nClientSnapshot } from \"./types\";\n\ntype SnapshotResolver = () => FarmI18nClientSnapshot | undefined;\n\nconst FARM_I18N_SNAPSHOT_RESOLVER = Symbol.for(\"farm.i18n.snapshotResolver\");\ntype GlobalWithI18nResolver = typeof globalThis & {\n [FARM_I18N_SNAPSHOT_RESOLVER]?: SnapshotResolver;\n};\n\nexport function _setFarmI18nSnapshotResolver(resolver: SnapshotResolver | undefined): void {\n (globalThis as GlobalWithI18nResolver)[FARM_I18N_SNAPSHOT_RESOLVER] = resolver;\n}\n\nexport function getActiveFarmI18nSnapshot(): FarmI18nClientSnapshot | undefined {\n if (typeof window !== \"undefined\" && window.__FARM_I18N__) {\n return window.__FARM_I18N__;\n }\n return (globalThis as GlobalWithI18nResolver)[FARM_I18N_SNAPSHOT_RESOLVER]?.();\n}\n","import { emitFarmEvent } from \"./observability\";\nimport { notifyFarmCacheInvalidation } from \"./cache-invalidation\";\nimport { getActiveFarmI18nSnapshot } from \"./i18n/bridge\";\n\nexport { applyFarmCacheInvalidations } from \"./cache-invalidation\";\n\nexport type RevalidateTagProfile =\n | \"max\"\n | \"default\"\n | \"seconds\"\n | \"minutes\"\n | \"hours\"\n | \"days\"\n | \"weeks\"\n | \"months\"\n | { expire?: number };\n\nexport interface FarmCacheOptions {\n /**\n * Tag cached data so it can be invalidated with revalidateTag/updateTag.\n */\n tags?: readonly string[];\n /**\n * Path tags let revalidatePath invalidate data tied to a route.\n */\n paths?: readonly string[];\n /**\n * Time in seconds before the entry becomes stale. False means no TTL.\n */\n revalidate?: number | false;\n}\n\nexport interface FarmCacheSetOptions extends FarmCacheOptions {\n createdAt?: number;\n}\n\nexport type RouteDataCacheKey = string | readonly unknown[];\n\nexport interface FarmCacheEntry<T = unknown> {\n key: string;\n value: T;\n tags: readonly string[];\n createdAt: number;\n createdVersion?: number;\n revalidate?: number | false;\n}\n\ninterface InternalFarmCacheEntry<T = unknown> {\n key: string;\n value: T;\n tags: Set<string>;\n createdAt: number;\n createdVersion: number;\n revalidate?: number | false;\n}\n\nexport interface GetFarmCacheEntryOptions {\n allowStale?: boolean;\n now?: number;\n}\n\ninterface FarmCacheStaleEntry {\n tags: Iterable<string>;\n createdAt: number;\n createdVersion?: number;\n revalidate?: number | false;\n}\n\nexport class FarmDataCache {\n private entries = new Map<string, InternalFarmCacheEntry>();\n private inflight = new Map<string, Promise<unknown>>();\n private invalidatedTagVersions = new Map<string, number>();\n private version = 0;\n\n get size(): number {\n return this.entries.size;\n }\n\n get<T>(key: string, options: GetFarmCacheEntryOptions = {}): T | undefined {\n return this.getEntry<T>(key, options)?.value;\n }\n\n getEntry<T = unknown>(\n key: string,\n options: GetFarmCacheEntryOptions = {},\n ): FarmCacheEntry<T> | undefined {\n const entry = this.entries.get(key) as InternalFarmCacheEntry<T> | undefined;\n if (!entry) {\n emitFarmEvent({ type: \"cache.miss\", key });\n return undefined;\n }\n\n const stale = this.isStale(entry, options.now);\n if (stale) {\n emitFarmEvent({\n type: \"cache.stale\",\n key,\n tags: Array.from(entry.tags),\n revalidate: entry.revalidate,\n });\n }\n\n if (!options.allowStale && stale) {\n emitFarmEvent({ type: \"cache.miss\", key, reason: \"stale\" });\n return undefined;\n }\n\n emitFarmEvent({\n type: \"cache.hit\",\n key,\n tags: Array.from(entry.tags),\n revalidate: entry.revalidate,\n stale,\n });\n\n return this.toPublicEntry(entry);\n }\n\n set<T>(key: string, value: T, options: FarmCacheSetOptions = {}): FarmCacheEntry<T> {\n const tags = new Set<string>();\n for (const tag of options.tags ?? []) {\n tags.add(normalizeCacheTag(tag));\n }\n for (const routePath of options.paths ?? []) {\n tags.add(createPathCacheTag(routePath));\n }\n\n const entry: InternalFarmCacheEntry<T> = {\n key,\n value,\n tags,\n createdAt: options.createdAt ?? Date.now(),\n createdVersion: ++this.version,\n revalidate: normalizeRevalidate(options.revalidate),\n };\n\n this.entries.set(key, entry);\n emitFarmEvent({\n type: \"cache.set\",\n key,\n tags: Array.from(tags),\n revalidate: entry.revalidate,\n });\n return this.toPublicEntry(entry);\n }\n\n delete(key: string): boolean {\n const deleted = this.entries.delete(key);\n emitFarmEvent({ type: \"cache.delete\", key, deleted });\n return deleted;\n }\n\n clear(): void {\n const count = this.entries.size;\n this.entries.clear();\n this.inflight.clear();\n this.invalidatedTagVersions.clear();\n this.version = 0;\n emitFarmEvent({ type: \"cache.clear\", count });\n }\n\n isStale(entry: FarmCacheStaleEntry, now = Date.now()): boolean {\n if (\n typeof entry.revalidate === \"number\" &&\n entry.revalidate > 0 &&\n now - entry.createdAt >= entry.revalidate * 1000\n ) {\n return true;\n }\n\n for (const tag of entry.tags) {\n const invalidatedVersion = this.invalidatedTagVersions.get(normalizeCacheTag(tag));\n if (\n typeof invalidatedVersion === \"number\" &&\n typeof entry.createdVersion === \"number\" &&\n invalidatedVersion > entry.createdVersion\n ) {\n return true;\n }\n }\n\n return false;\n }\n\n revalidateTag(\n tag: string,\n options: { source?: \"revalidateTag\" | \"updateTag\"; profile?: RevalidateTagProfile } = {},\n ): number {\n const normalized = normalizeCacheTag(tag);\n const count = this.invalidateTag(normalized);\n emitFarmEvent(\n options.source === \"updateTag\"\n ? { type: \"cache.updateTag\", tag: normalized, count }\n : { type: \"cache.revalidateTag\", tag: normalized, profile: options.profile, count },\n );\n return count;\n }\n\n revalidatePath(routePath: string): number {\n const normalizedPath = normalizeRevalidatePath(routePath);\n const pathTag = createPathCacheTag(normalizedPath);\n const pprCount = this.countEntriesForTags([pathTag, \"ppr\"]);\n const count = this.invalidateTag(pathTag);\n emitFarmEvent({ type: \"cache.revalidatePath\", path: normalizedPath, count });\n\n if (pprCount > 0) {\n emitFarmEvent({\n type: \"ppr.shell.invalidated\",\n route: normalizedPath,\n reason: \"revalidatePath\",\n count: pprCount,\n });\n }\n\n return count;\n }\n\n async getOrSet<T>(\n key: string,\n producer: () => Promise<T> | T,\n options: FarmCacheOptions = {},\n ): Promise<T> {\n const cached = this.getEntry<T>(key);\n if (cached) {\n return cached.value;\n }\n\n const inflight = this.inflight.get(key) as Promise<T> | undefined;\n if (inflight) {\n emitFarmEvent({ type: \"cache.dedupe\", key });\n return inflight;\n }\n\n const promise = Promise.resolve()\n .then(producer)\n .then((value) => {\n this.set(key, value, options);\n return value;\n })\n .catch((error) => {\n emitFarmEvent({ type: \"cache.error\", key, operation: \"set\", error });\n throw error;\n })\n .finally(() => {\n this.inflight.delete(key);\n });\n\n this.inflight.set(key, promise);\n return promise;\n }\n\n private countEntriesForTag(tag: string): number {\n let count = 0;\n for (const entry of this.entries.values()) {\n if (entry.tags.has(tag)) {\n count++;\n }\n }\n return count;\n }\n\n private countEntriesForTags(tags: readonly string[]): number {\n let count = 0;\n for (const entry of this.entries.values()) {\n if (tags.every((tag) => entry.tags.has(tag))) {\n count++;\n }\n }\n return count;\n }\n\n private invalidateTag(normalizedTag: string): number {\n this.invalidatedTagVersions.set(normalizedTag, ++this.version);\n return this.countEntriesForTag(normalizedTag);\n }\n\n private toPublicEntry<T>(entry: InternalFarmCacheEntry<T>): FarmCacheEntry<T> {\n return {\n key: entry.key,\n value: entry.value,\n tags: Array.from(entry.tags),\n createdAt: entry.createdAt,\n createdVersion: entry.createdVersion,\n revalidate: entry.revalidate,\n };\n }\n}\n\nconst FARM_DATA_CACHE_SYMBOL = Symbol.for(\"farm.dataCache\");\nconst farmDataCacheGlobal = globalThis as typeof globalThis & {\n [FARM_DATA_CACHE_SYMBOL]?: FarmDataCache;\n};\nconst sharedFarmDataCache = (farmDataCacheGlobal[FARM_DATA_CACHE_SYMBOL] ??= new FarmDataCache());\nconst functionIds = new WeakMap<Function, number>();\nlet nextFunctionId = 0;\n\nexport function getFarmDataCache(): FarmDataCache {\n return sharedFarmDataCache;\n}\n\nexport function unstable_cache<Args extends unknown[], Result>(\n fn: (...args: Args) => Result | Promise<Result>,\n keyParts: readonly unknown[] = [],\n options: FarmCacheOptions = {},\n): (...args: Args) => Promise<Result> {\n return async (...args: Args): Promise<Result> => {\n const locale = getActiveFarmI18nSnapshot()?.locale;\n const key = createFarmCacheKey([\n \"unstable_cache\",\n getFunctionCacheIdentity(fn),\n locale ? [\"locale\", locale] : null,\n keyParts,\n args,\n ]);\n return getFarmDataCache().getOrSet<Result>(key, () => fn(...args), options);\n };\n}\n\nexport function revalidateTag(_tag: string, _profile?: RevalidateTagProfile): void {\n getFarmDataCache().revalidateTag(_tag, {\n source: \"revalidateTag\",\n profile: _profile,\n });\n}\n\nexport function updateTag(tag: string): void {\n getFarmDataCache().revalidateTag(tag, { source: \"updateTag\" });\n}\n\nexport function revalidatePath(routePath: string): void {\n getFarmDataCache().revalidatePath(routePath);\n}\n\nexport function invalidate(key: RouteDataCacheKey): void {\n const clientKey = createRouteDataCacheKey(key);\n getFarmDataCache().revalidateTag(createRouteDataCacheTag(key), { source: \"updateTag\" });\n notifyFarmCacheInvalidation(clientKey);\n}\n\nexport function invalidateRouteData(key: RouteDataCacheKey): void {\n invalidate(key);\n}\n\nexport function createPathCacheTag(routePath: string): string {\n return `path:${normalizeRevalidatePath(routePath)}`;\n}\n\nexport function createRouteDataCacheTag(key: RouteDataCacheKey): string {\n return `route-data:${createRouteDataCacheKey(key)}`;\n}\n\nexport function createRouteDataCacheKey(key: RouteDataCacheKey): string {\n return createFarmCacheKey(Array.isArray(key) ? key : [key]);\n}\n\nexport function normalizeRevalidatePath(routePath: string): string {\n if (typeof routePath !== \"string\") {\n throw new TypeError(\"revalidatePath expects a path string.\");\n }\n\n let normalized = routePath.trim();\n if (!normalized) {\n throw new Error(\"revalidatePath expects a non-empty path.\");\n }\n\n try {\n if (/^https?:\\/\\//.test(normalized)) {\n normalized = new URL(normalized).pathname;\n }\n } catch {\n // Keep the original path if URL parsing fails.\n }\n\n normalized = normalized.split(\"?\")[0] ?? normalized;\n normalized = normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n normalized = normalized.replace(/\\/{2,}/g, \"/\");\n if (normalized.length > 1) {\n normalized = normalized.replace(/\\/+$/, \"\");\n }\n return normalized || \"/\";\n}\n\nexport function createFarmCacheKey(parts: readonly unknown[]): string {\n return stableSerialize(parts);\n}\n\nfunction normalizeRevalidate(revalidate: number | false | undefined): number | false | undefined {\n if (revalidate === false || revalidate === undefined) {\n return revalidate;\n }\n if (!Number.isFinite(revalidate) || revalidate <= 0) {\n return undefined;\n }\n return revalidate;\n}\n\nfunction normalizeCacheTag(tag: string): string {\n if (typeof tag !== \"string\") {\n throw new TypeError(\"Cache tags must be strings.\");\n }\n const normalized = tag.trim();\n if (!normalized) {\n throw new Error(\"Cache tags cannot be empty.\");\n }\n return normalized;\n}\n\nfunction getFunctionCacheIdentity(fn: Function): string {\n if (fn.name) {\n return `name:${fn.name}`;\n }\n\n let id = functionIds.get(fn);\n if (!id) {\n id = ++nextFunctionId;\n functionIds.set(fn, id);\n }\n return `anonymous:${id}`;\n}\n\nfunction stableSerialize(value: unknown, seen = new WeakSet<object>()): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n\n const valueType = typeof value;\n if (valueType === \"string\") return JSON.stringify(value);\n if (valueType === \"number\" || valueType === \"boolean\" || valueType === \"bigint\") {\n return `${valueType}:${String(value)}`;\n }\n if (valueType === \"symbol\") {\n return `symbol:${String(value)}`;\n }\n if (valueType === \"function\") {\n return `function:${getFunctionCacheIdentity(value as Function)}`;\n }\n\n if (value instanceof Date) {\n return `date:${value.toISOString()}`;\n }\n if (value instanceof URL) {\n return `url:${value.toString()}`;\n }\n if (value instanceof RegExp) {\n return `regexp:${value.toString()}`;\n }\n\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableSerialize(item, seen)).join(\",\")}]`;\n }\n\n if (value && typeof value === \"object\") {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n\n const entries = Object.entries(value as Record<string, unknown>).sort(([a], [b]) =>\n a.localeCompare(b),\n );\n const serialized = entries\n .map(([key, item]) => `${JSON.stringify(key)}:${stableSerialize(item, seen)}`)\n .join(\",\");\n\n seen.delete(value);\n return `{${serialized}}`;\n }\n\n return String(value);\n}\n","import type { FarmConfig, FarmContextFactoryInput } from \"./types\";\n\nexport const FARM_ROUTE_CONTEXT_SYMBOL = Symbol.for(\"farm.routeContext\");\n\nexport type FarmRouteContextCarrier<TContext = unknown> = {\n [FARM_ROUTE_CONTEXT_SYMBOL]?: TContext;\n};\n\nexport async function resolveFarmRouteContext(\n config: Pick<FarmConfig, \"context\">,\n input: FarmContextFactoryInput,\n): Promise<unknown> {\n if (typeof config.context !== \"function\") {\n return undefined;\n }\n\n return config.context(input);\n}\n\nexport function withFarmRouteContext<TProps extends object, TContext>(\n props: TProps,\n context: TContext | undefined,\n): TProps & FarmRouteContextCarrier<TContext> {\n if (context === undefined) {\n return props as TProps & FarmRouteContextCarrier<TContext>;\n }\n\n Object.defineProperty(props, FARM_ROUTE_CONTEXT_SYMBOL, {\n value: context,\n enumerable: false,\n configurable: true,\n });\n\n return props as TProps & FarmRouteContextCarrier<TContext>;\n}\n\nexport function getFarmRouteContext<TContext = unknown>(props: unknown): TContext | undefined {\n if (!props || typeof props !== \"object\") {\n return undefined;\n }\n\n return (props as FarmRouteContextCarrier<TContext>)[FARM_ROUTE_CONTEXT_SYMBOL];\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 === \"**\" || /^\\[\\[\\.\\.\\./.test(segment)) return score + 1;\n if (segment === \"*\" || /^\\[\\.\\.\\./.test(segment)) 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 { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { FarmLocaleResolution } from \"./resolver\";\nimport { _setFarmI18nSnapshotResolver } from \"./bridge\";\nimport { FarmI18nRuntime, createFarmI18nRuntime } from \"./runtime\";\nimport type {\n FarmI18nClientSnapshot,\n FarmI18nLocale,\n FarmI18nLocaleSource,\n FarmI18nMessageArgs,\n FarmI18nMessageKey,\n FarmTranslator,\n} from \"./types\";\n\ninterface FarmI18nRequestState {\n runtime: FarmI18nRuntime;\n resolution: FarmLocaleResolution;\n snapshot: FarmI18nClientSnapshot;\n}\n\ninterface FarmListFormatOptions {\n localeMatcher?: \"lookup\" | \"best fit\";\n type?: \"conjunction\" | \"disjunction\" | \"unit\";\n style?: \"long\" | \"short\" | \"narrow\";\n}\n\nconst FARM_I18N_REQUEST_STORE = Symbol.for(\"farm.i18n.requestStore\");\nconst FARM_I18N_DEFAULT_RUNTIME = Symbol.for(\"farm.i18n.defaultRuntime\");\n\ntype GlobalFarmI18nState = typeof globalThis & {\n [FARM_I18N_REQUEST_STORE]?: AsyncLocalStorage<FarmI18nRequestState>;\n [FARM_I18N_DEFAULT_RUNTIME]?: FarmI18nRuntime;\n};\n\nfunction getRequestStore(): AsyncLocalStorage<FarmI18nRequestState> {\n const state = globalThis as GlobalFarmI18nState;\n return (state[FARM_I18N_REQUEST_STORE] ??= new AsyncLocalStorage<FarmI18nRequestState>());\n}\n\nfunction getState(): FarmI18nRequestState {\n const state = getRequestStore().getStore();\n if (!state) {\n throw new Error(\n \"No Farm i18n request context is active. Use this API while rendering, inside an API route, or use createTranslator(locale).\",\n );\n }\n return state;\n}\n\nexport function _setDefaultFarmI18nRuntime(runtime: FarmI18nRuntime | undefined): void {\n (globalThis as GlobalFarmI18nState)[FARM_I18N_DEFAULT_RUNTIME] = runtime;\n}\n\nexport async function _runWithFarmI18nRequest<T>(\n runtime: FarmI18nRuntime,\n request: Request,\n fn: (resolution: FarmLocaleResolution) => T | Promise<T>,\n options: { redirect?: boolean } = {},\n): Promise<T> {\n const resolution = runtime.resolveRequest(request, options);\n const state: FarmI18nRequestState = {\n runtime,\n resolution,\n snapshot: runtime.getClientSnapshot(resolution),\n };\n return getRequestStore().run(state, () => fn(resolution));\n}\n\nexport async function runWithLocale<T>(\n locale: FarmI18nLocale,\n fn: () => T | Promise<T>,\n): Promise<T> {\n const runtime = getDefaultRuntime();\n assertLocale(runtime, locale);\n const resolution: FarmLocaleResolution = {\n locale,\n source: \"explicit\",\n pathname: \"/\",\n persist: false,\n };\n const state: FarmI18nRequestState = {\n runtime,\n resolution,\n snapshot: runtime.getClientSnapshot(resolution),\n };\n return getRequestStore().run(state, fn);\n}\n\nexport function getLocale(): FarmI18nLocale {\n return getState().resolution.locale as FarmI18nLocale;\n}\n\nexport function getLocaleSource(): FarmI18nLocaleSource {\n return getState().resolution.source;\n}\n\nexport const t = createTranslatorFromState(() => getState());\n\nexport function createTranslator(locale: FarmI18nLocale): FarmTranslator {\n const runtime = getDefaultRuntime();\n assertLocale(runtime, locale);\n return createTranslatorFromState(() => ({\n runtime,\n resolution: {\n locale,\n source: \"explicit\",\n pathname: \"/\",\n persist: false,\n },\n snapshot: runtime.getClientSnapshot({\n locale,\n source: \"explicit\",\n pathname: \"/\",\n persist: false,\n }),\n }));\n}\n\nexport function getFarmI18nClientSnapshot(): FarmI18nClientSnapshot | undefined {\n return getRequestStore().getStore()?.snapshot;\n}\n\nexport const format = {\n number(value: number, options?: Intl.NumberFormatOptions): string {\n return new Intl.NumberFormat(getLocale(), options).format(value);\n },\n currency(\n value: number,\n currency: string,\n options: Omit<Intl.NumberFormatOptions, \"style\" | \"currency\"> = {},\n ): string {\n return new Intl.NumberFormat(getLocale(), {\n ...options,\n style: \"currency\",\n currency,\n }).format(value);\n },\n date(value: Date | number, options?: Intl.DateTimeFormatOptions): string {\n return new Intl.DateTimeFormat(getLocale(), options).format(value);\n },\n relativeTime(\n value: number,\n unit: Intl.RelativeTimeFormatUnit,\n options?: Intl.RelativeTimeFormatOptions,\n ): string {\n return new Intl.RelativeTimeFormat(getLocale(), options).format(value, unit);\n },\n list(values: Iterable<string>, options?: FarmListFormatOptions): string {\n const ListFormat = (Intl as any).ListFormat;\n return new ListFormat(getLocale(), options).format(Array.from(values));\n },\n};\n\nfunction getDefaultRuntime(): FarmI18nRuntime {\n const runtime = (globalThis as GlobalFarmI18nState)[FARM_I18N_DEFAULT_RUNTIME];\n if (!runtime?.config.enabled) {\n throw new Error(\"Farm i18n is not configured for this application.\");\n }\n return runtime;\n}\n\nfunction assertLocale(runtime: FarmI18nRuntime, locale: string): void {\n if (!runtime.config.locales.includes(locale)) {\n throw new Error(`Unsupported Farm i18n locale \"${locale}\".`);\n }\n}\n\nfunction createTranslatorFromState(resolveState: () => FarmI18nRequestState): FarmTranslator {\n const translator = ((key: string, values?: Record<string, unknown>) => {\n const state = resolveState();\n return state.runtime.translate(state.resolution.locale, key, values);\n }) as FarmTranslator;\n translator.rich = (key: string, values?: Record<string, unknown>) => {\n const state = resolveState();\n return state.runtime.translateRich(state.resolution.locale, key, values);\n };\n translator.raw = (key: string) => {\n const state = resolveState();\n return state.runtime.getRawMessage(state.resolution.locale, key);\n };\n translator.has = (key: string) => {\n const state = resolveState();\n return state.runtime.hasMessage(state.resolution.locale, key);\n };\n return translator;\n}\n\n_setFarmI18nSnapshotResolver(() => getFarmI18nClientSnapshot());\n\nexport { FarmI18nRuntime, createFarmI18nRuntime };\nexport type { FarmI18nClientSnapshot, FarmI18nLocale, FarmI18nMessageArgs, FarmI18nMessageKey };\n","import IntlMessageFormat from \"intl-messageformat\";\nimport { readFarmI18nCatalogs } from \"./catalog\";\nimport { getFarmLocaleDirection } from \"./routing\";\nimport { resolveFarmLocaleRequest, type FarmLocaleResolution } from \"./resolver\";\nimport type { FarmI18nCatalogs, FarmI18nClientSnapshot, ResolvedFarmI18nConfig } from \"./types\";\n\nexport class FarmI18nRuntime {\n readonly config: ResolvedFarmI18nConfig;\n private catalogs: FarmI18nCatalogs;\n private compiled = new Map<string, IntlMessageFormat>();\n private warnedMissing = new Set<string>();\n\n constructor(config: ResolvedFarmI18nConfig, catalogs: FarmI18nCatalogs = {}) {\n this.config = config;\n this.catalogs = catalogs;\n }\n\n async initialize(): Promise<void> {\n if (!this.config.enabled) return;\n const bundle = await readFarmI18nCatalogs(this.config);\n this.replaceCatalogs(bundle.catalogs);\n }\n\n async reload(): Promise<void> {\n await this.initialize();\n }\n\n replaceCatalogs(catalogs: FarmI18nCatalogs): void {\n this.catalogs = catalogs;\n this.compiled.clear();\n this.warnedMissing.clear();\n }\n\n getCatalogs(): FarmI18nCatalogs {\n return Object.fromEntries(\n Object.entries(this.catalogs).map(([locale, catalog]) => [locale, { ...catalog }]),\n );\n }\n\n resolveRequest(request: Request, options: { redirect?: boolean } = {}): FarmLocaleResolution {\n return resolveFarmLocaleRequest(request, this.config, options);\n }\n\n translate(locale: string, key: string, values?: Record<string, unknown>): string {\n const result = this.formatMessage(locale, key, values);\n if (Array.isArray(result) && result.some((part) => typeof part !== \"string\")) {\n throw new Error(`Farm i18n message \"${key}\" contains rich content. Render it with t.rich().`);\n }\n return Array.isArray(result) ? result.join(\"\") : String(result);\n }\n\n translateRich(locale: string, key: string, values?: Record<string, unknown>): unknown {\n const result = this.formatMessage(locale, key, values);\n return Array.isArray(result) && result.length === 1 ? result[0] : result;\n }\n\n getRawMessage(locale: string, key: string): string {\n return this.resolveMessage(locale, key);\n }\n\n hasMessage(locale: string, key: string): boolean {\n return (\n (this.catalogs[locale]?.[key] ?? this.catalogs[this.config.fallbackLocale]?.[key]) !==\n undefined\n );\n }\n\n getClientSnapshot(resolution: FarmLocaleResolution): FarmI18nClientSnapshot {\n return {\n locale: resolution.locale,\n source: resolution.source,\n locales: this.config.locales,\n defaultLocale: this.config.defaultLocale,\n routing: this.config.routing,\n cookie: this.config.cookie,\n direction: getFarmLocaleDirection(resolution.locale, this.config.direction),\n messages: {\n ...(this.catalogs[this.config.fallbackLocale] || {}),\n ...(this.catalogs[resolution.locale] || {}),\n },\n };\n }\n\n private formatMessage(locale: string, key: string, values?: Record<string, unknown>): unknown {\n const message = this.resolveMessage(locale, key);\n const cacheKey = `${locale}\\u0000${key}\\u0000${message}`;\n let formatter = this.compiled.get(cacheKey);\n if (!formatter) {\n formatter = new IntlMessageFormat(message, locale);\n this.compiled.set(cacheKey, formatter);\n }\n return formatter.format(values as any);\n }\n\n private resolveMessage(locale: string, key: string): string {\n const message =\n this.catalogs[locale]?.[key] ?? this.catalogs[this.config.fallbackLocale]?.[key];\n if (message !== undefined) return message;\n if (this.config.strict) {\n throw new Error(`Missing Farm i18n message \"${key}\" for locale \"${locale}\".`);\n }\n const warningKey = `${locale}:${key}`;\n if (!this.warnedMissing.has(warningKey)) {\n this.warnedMissing.add(warningKey);\n console.warn(`[Farm.js] Missing i18n message \"${key}\" for locale \"${locale}\".`);\n }\n return key;\n }\n}\n\nexport function createFarmI18nRuntime(\n config: ResolvedFarmI18nConfig,\n catalogs?: FarmI18nCatalogs,\n): FarmI18nRuntime {\n return new FarmI18nRuntime(config, catalogs);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { TYPE, parse, type MessageFormatElement } from \"@formatjs/icu-messageformat-parser\";\nimport { resolveFarmI18nMessagePath } from \"./config\";\nimport type { FarmI18nCatalog, FarmI18nCatalogs, ResolvedFarmI18nConfig } from \"./types\";\n\nexport type FarmI18nArgumentKind = \"string\" | \"number\" | \"date\" | \"select\" | \"rich\";\nexport type FarmI18nMessageSignature = Record<string, FarmI18nArgumentKind>;\n\nexport interface FarmI18nCatalogBundle {\n catalogs: FarmI18nCatalogs;\n signatures: Record<string, FarmI18nMessageSignature>;\n}\n\nexport async function readFarmI18nCatalogs(\n config: ResolvedFarmI18nConfig,\n): Promise<FarmI18nCatalogBundle> {\n if (!config.enabled) {\n return { catalogs: {}, signatures: {} };\n }\n\n const catalogs: FarmI18nCatalogs = {};\n for (const locale of config.locales) {\n const filePath = resolveFarmI18nMessagePath(config, locale);\n let source: string;\n try {\n source = await readFile(filePath, \"utf8\");\n } catch (error) {\n throw new Error(\n `Unable to read Farm i18n catalog for \"${locale}\" at ${filePath}: ${messageOf(error)}`,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch (error) {\n throw new Error(`Invalid JSON in Farm i18n catalog ${filePath}: ${messageOf(error)}`);\n }\n catalogs[locale] = flattenFarmI18nCatalog(parsed, filePath);\n }\n\n const reference = catalogs[config.defaultLocale] || {};\n const signatures: Record<string, FarmI18nMessageSignature> = {};\n for (const [key, message] of Object.entries(reference)) {\n signatures[key] = analyzeFarmI18nMessage(message, `${config.defaultLocale}:${key}`);\n }\n\n validateFarmI18nCatalogs(config, catalogs, signatures);\n return { catalogs, signatures };\n}\n\nexport function flattenFarmI18nCatalog(input: unknown, source = \"i18n catalog\"): FarmI18nCatalog {\n if (!isPlainObject(input)) {\n throw new Error(`${source} must contain a JSON object at its root.`);\n }\n\n const output: FarmI18nCatalog = {};\n const visit = (value: unknown, segments: string[]) => {\n if (typeof value === \"string\") {\n const key = segments.join(\".\");\n if (!key) throw new Error(`${source} contains an empty message key.`);\n if (key in output) throw new Error(`${source} contains duplicate message key \"${key}\".`);\n output[key] = value;\n return;\n }\n\n if (!isPlainObject(value)) {\n const key = segments.join(\".\") || \"<root>\";\n throw new Error(`${source} message \"${key}\" must be a string or nested object.`);\n }\n\n for (const [key, nested] of Object.entries(value)) {\n if (!key.trim()) throw new Error(`${source} contains an empty message key.`);\n visit(nested, [...segments, key]);\n }\n };\n\n visit(input, []);\n return output;\n}\n\nexport function analyzeFarmI18nMessage(\n message: string,\n label = \"message\",\n): FarmI18nMessageSignature {\n let ast: MessageFormatElement[];\n try {\n ast = parse(message, { captureLocation: false });\n } catch (error) {\n throw new Error(`Invalid ICU syntax in ${label}: ${messageOf(error)}`);\n }\n\n const signature: FarmI18nMessageSignature = {};\n collectArguments(ast, signature, label);\n return signature;\n}\n\nfunction validateFarmI18nCatalogs(\n config: ResolvedFarmI18nConfig,\n catalogs: FarmI18nCatalogs,\n signatures: Record<string, FarmI18nMessageSignature>,\n): void {\n const referenceKeys = Object.keys(catalogs[config.defaultLocale] || {}).sort();\n\n for (const locale of config.locales) {\n const catalog = catalogs[locale] || {};\n const localeKeys = Object.keys(catalog).sort();\n const missing = referenceKeys.filter((key) => !(key in catalog));\n const extra = localeKeys.filter((key) => !(key in signatures));\n\n if (config.strict && (missing.length > 0 || extra.length > 0)) {\n const details = [\n missing.length ? `missing: ${missing.join(\", \")}` : \"\",\n extra.length ? `extra: ${extra.join(\", \")}` : \"\",\n ]\n .filter(Boolean)\n .join(\"; \");\n throw new Error(\n `Farm i18n catalog \"${locale}\" does not match the default catalog (${details}).`,\n );\n }\n\n for (const [key, message] of Object.entries(catalog)) {\n const actual = analyzeFarmI18nMessage(message, `${locale}:${key}`);\n const expected = signatures[key];\n if (!expected || sameSignature(expected, actual)) continue;\n throw new Error(\n `Farm i18n message \"${key}\" in \"${locale}\" uses different variables than \"${config.defaultLocale}\".`,\n );\n }\n }\n}\n\nfunction collectArguments(\n elements: MessageFormatElement[],\n signature: FarmI18nMessageSignature,\n label: string,\n): void {\n for (const element of elements) {\n switch (element.type) {\n case TYPE.argument:\n addArgument(signature, element.value, \"string\", label);\n break;\n case TYPE.number:\n case TYPE.plural:\n addArgument(signature, element.value, \"number\", label);\n break;\n case TYPE.date:\n case TYPE.time:\n addArgument(signature, element.value, \"date\", label);\n break;\n case TYPE.select:\n addArgument(signature, element.value, \"select\", label);\n break;\n case TYPE.tag:\n addArgument(signature, element.value, \"rich\", label);\n collectArguments(element.children, signature, label);\n break;\n }\n\n if (element.type === TYPE.plural || element.type === TYPE.select) {\n for (const option of Object.values(element.options)) {\n collectArguments(option.value, signature, label);\n }\n }\n }\n}\n\nfunction addArgument(\n signature: FarmI18nMessageSignature,\n name: string,\n kind: FarmI18nArgumentKind,\n label: string,\n): void {\n const existing = signature[name];\n if (existing && existing !== kind) {\n throw new Error(`Farm i18n ${label} uses variable \"${name}\" as both ${existing} and ${kind}.`);\n }\n signature[name] = kind;\n}\n\nfunction sameSignature(\n expected: FarmI18nMessageSignature,\n actual: FarmI18nMessageSignature,\n): boolean {\n const expectedEntries = Object.entries(expected).sort(([a], [b]) => a.localeCompare(b));\n const actualEntries = Object.entries(actual).sort(([a], [b]) => a.localeCompare(b));\n return JSON.stringify(expectedEntries) === JSON.stringify(actualEntries);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction messageOf(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\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 { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { FarmRequest } from \"../types\";\nimport { _setCurrentRequestResolver } from \"./request-bridge\";\n\nconst REQUEST_STORAGE_KEY = Symbol.for(\"@farm.js/core/request-storage\");\n\nfunction getRequestStore(): AsyncLocalStorage<Request> {\n const runtime = globalThis as typeof globalThis & Record<PropertyKey, unknown>;\n const existing = runtime[REQUEST_STORAGE_KEY];\n if (existing instanceof AsyncLocalStorage) {\n return existing as AsyncLocalStorage<Request>;\n }\n\n const storage = new AsyncLocalStorage<Request>();\n runtime[REQUEST_STORAGE_KEY] = storage;\n return storage;\n}\n\nconst requestStore = getRequestStore();\n\n_setCurrentRequestResolver(() => requestStore.getStore());\n\nexport function createWebRequestFromFarmRequest(req: FarmRequest): Request {\n const forwardedHost = req.headers[\"x-forwarded-host\"];\n const host = Array.isArray(forwardedHost)\n ? forwardedHost[0]\n : forwardedHost || req.headers.host || \"localhost\";\n const forwardedProto = req.headers[\"x-forwarded-proto\"];\n const proto = Array.isArray(forwardedProto) ? forwardedProto[0] : forwardedProto || \"http\";\n const fullUrl = new URL(req.url || \"/\", `${proto}://${host}`).toString();\n\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 });\n}\n\nexport async function _runWithCurrentRequest<T>(\n request: Request,\n fn: () => Promise<T> | T,\n): Promise<T> {\n return requestStore.run(request, fn);\n}\n\nexport function getCurrentRequest(): Request {\n const request = requestStore.getStore();\n if (!request) {\n throw new Error(\n \"No current request is available. getCurrentRequest() can only be used during server rendering.\",\n );\n }\n\n return request;\n}\n","type CurrentRequestResolver = () => Request | undefined;\n\nconst CURRENT_REQUEST_RESOLVER_KEY = Symbol.for(\"farm.currentRequestResolver\");\n\ntype GlobalWithCurrentRequestResolver = typeof globalThis & {\n [CURRENT_REQUEST_RESOLVER_KEY]?: CurrentRequestResolver;\n};\n\nfunction getGlobalState(): GlobalWithCurrentRequestResolver {\n return globalThis as GlobalWithCurrentRequestResolver;\n}\n\nexport function _setCurrentRequestResolver(resolver: CurrentRequestResolver | undefined): void {\n getGlobalState()[CURRENT_REQUEST_RESOLVER_KEY] = resolver;\n}\n\nexport function _resolveCurrentRequest(): Request | undefined {\n return getGlobalState()[CURRENT_REQUEST_RESOLVER_KEY]?.();\n}\n","import { _runWithCurrentRequest } from \"../server/request\";\n\nexport type APIRouteParamValue = string | string[];\nexport type APIRouteParams = Record<string, APIRouteParamValue>;\n\nexport interface APIRouteMatch<T extends { path: string }> {\n route: T;\n params: APIRouteParams;\n}\n\nexport function matchAPIRoute<T extends { path: string }>(\n routes: Map<string, T>,\n pathname: string,\n): APIRouteMatch<T> | null {\n const exactRoute = routes.get(pathname);\n if (exactRoute) {\n return { route: exactRoute, params: {} };\n }\n\n const normalizedPathname = normalizePathname(pathname);\n if (normalizedPathname !== pathname) {\n const normalizedRoute = routes.get(normalizedPathname);\n if (normalizedRoute) {\n return { route: normalizedRoute, params: {} };\n }\n }\n\n for (const route of routes.values()) {\n const params = matchRoutePath(route.path, pathname);\n if (params) {\n return { route, params };\n }\n }\n\n return null;\n}\n\nexport async function invokeAPIRouteEndpoint(\n endpoint: any,\n request: Request,\n params: APIRouteParams = {},\n): Promise<Response> {\n return _runWithCurrentRequest(request, () =>\n invokeAPIRouteEndpointInContext(endpoint, request, params),\n );\n}\n\nasync function invokeAPIRouteEndpointInContext(\n endpoint: any,\n request: Request,\n params: APIRouteParams,\n): Promise<Response> {\n const farmHandler = endpoint.__handler || (isFarmContextHandler(endpoint) ? endpoint : null);\n\n if (!farmHandler) {\n const result = await endpoint(request, {\n params: Promise.resolve(params),\n });\n return normalizeRouteResponse(result);\n }\n\n const url = new URL(request.url);\n const query: Record<string, string> = {};\n url.searchParams.forEach((value, key) => {\n query[key] = value;\n });\n\n let body: any = undefined;\n if (request.method.toUpperCase() !== \"GET\" && request.method.toUpperCase() !== \"HEAD\") {\n body = await readJSONBody(request);\n }\n\n const headers = Object.fromEntries(request.headers.entries());\n const types = endpoint.__types || {};\n\n const queryValidation = validateInput(types.query, query, \"Invalid query parameters\");\n if (queryValidation instanceof Response) {\n return queryValidation;\n }\n\n const bodyValidation = validateInput(types.body, body, \"Invalid request body\");\n if (bodyValidation instanceof Response) {\n return bodyValidation;\n }\n\n const headersValidation = validateInput(types.headers, headers, \"Invalid request headers\");\n if (headersValidation instanceof Response) {\n return headersValidation;\n }\n\n const result = await farmHandler({\n query: queryValidation,\n body: bodyValidation,\n headers: headersValidation,\n request,\n context: {},\n params,\n });\n\n return normalizeRouteResponse(result);\n}\n\nexport function normalizeRouteResponse(result: unknown): Response {\n if (isWebResponse(result)) {\n return result;\n }\n\n if (result === undefined) {\n return new Response(null, { status: 204 });\n }\n\n return new Response(JSON.stringify(result), {\n status: 200,\n headers: { \"Content-Type\": \"application/json\" },\n });\n}\n\nexport function isWebResponse(value: unknown): value is Response {\n return (\n value instanceof Response ||\n (typeof value === \"object\" &&\n value !== null &&\n \"headers\" in value &&\n \"status\" in value &&\n typeof (value as Response).arrayBuffer === \"function\")\n );\n}\n\nfunction isFarmContextHandler(endpoint: unknown): boolean {\n if (typeof endpoint !== \"function\") {\n return false;\n }\n\n const source = Function.prototype.toString.call(endpoint).trim();\n const arrowMatch = source.match(/^(?:async\\s*)?(?:\\(([^)]*)\\)|([A-Za-z_$][\\w$]*))\\s*=>/);\n const functionMatch = source.match(/^(?:async\\s*)?function[^(]*\\(([^)]*)\\)/);\n const firstParameter = (arrowMatch?.[1] || arrowMatch?.[2] || functionMatch?.[1] || \"\")\n .split(\",\")[0]\n .trim();\n\n return firstParameter === \"ctx\" || firstParameter === \"context\" || firstParameter.startsWith(\"{\");\n}\n\nasync function readJSONBody(request: Request): Promise<unknown> {\n try {\n const text = await request.clone().text();\n if (text) {\n return JSON.parse(text);\n }\n } catch {\n // Body might not be JSON.\n }\n\n return undefined;\n}\n\nfunction validateInput(schema: any, value: unknown, error: string): unknown | Response {\n if (!schema || typeof schema.parse !== \"function\") {\n return value;\n }\n\n try {\n return schema.parse(value);\n } catch (validationError: any) {\n return new Response(\n JSON.stringify({\n error,\n details: validationError.errors || validationError.issues || validationError.message,\n }),\n {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n}\n\nfunction matchRoutePath(routePath: string, pathname: string): APIRouteParams | null {\n const routeSegments = getPathSegments(routePath);\n const pathnameSegments = getPathSegments(pathname);\n const params: APIRouteParams = {};\n let pathIndex = 0;\n\n for (const routeSegment of routeSegments) {\n const dynamicSegment = parseDynamicSegment(routeSegment);\n\n if (dynamicSegment?.catchAll) {\n const remainingSegments = pathnameSegments.slice(pathIndex).map(decodePathSegment);\n if (remainingSegments.length === 0 && !dynamicSegment.optional) {\n return null;\n }\n if (remainingSegments.length > 0) {\n params[dynamicSegment.name] = remainingSegments;\n }\n pathIndex = pathnameSegments.length;\n continue;\n }\n\n const pathnameSegment = pathnameSegments[pathIndex];\n if (pathnameSegment === undefined) {\n return null;\n }\n\n if (dynamicSegment) {\n params[dynamicSegment.name] = decodePathSegment(pathnameSegment);\n pathIndex++;\n continue;\n }\n\n if (routeSegment !== pathnameSegment) {\n return null;\n }\n\n pathIndex++;\n }\n\n return pathIndex === pathnameSegments.length ? params : null;\n}\n\nfunction getPathSegments(pathname: string): string[] {\n return normalizePathname(pathname)\n .split(\"/\")\n .filter((segment) => segment.length > 0);\n}\n\nfunction normalizePathname(pathname: string): string {\n if (pathname.length > 1 && pathname.endsWith(\"/\")) {\n return pathname.replace(/\\/+$/, \"\");\n }\n\n return pathname;\n}\n\nfunction parseDynamicSegment(\n segment: string,\n): { name: string; catchAll: boolean; optional: boolean } | null {\n const optionalCatchAll = segment.match(/^\\[\\[\\.\\.\\.(.+)\\]\\]$/);\n if (optionalCatchAll?.[1]) {\n return { name: optionalCatchAll[1], catchAll: true, optional: true };\n }\n\n const catchAll = segment.match(/^\\[\\.\\.\\.(.+)\\]$/);\n if (catchAll?.[1]) {\n return { name: catchAll[1], catchAll: true, optional: false };\n }\n\n const dynamic = segment.match(/^\\[(.+)\\]$/);\n if (dynamic?.[1]) {\n return { name: dynamic[1], catchAll: false, optional: false };\n }\n\n return null;\n}\n\nfunction decodePathSegment(segment: string): string {\n try {\n return decodeURIComponent(segment);\n } catch {\n return segment;\n }\n}\n","export type FarmRouterPrimitiveParam = string | number | boolean;\nexport type FarmRouterPathParam =\n | FarmRouterPrimitiveParam\n | readonly FarmRouterPrimitiveParam[]\n | null\n | undefined;\nexport type FarmRouterPathParams = Record<string, FarmRouterPathParam>;\nexport type FarmRouterParams = Record<string, string>;\n\nexport interface FarmRouterRoute<TMeta = unknown> {\n path: string;\n name?: string;\n meta?: TMeta;\n}\n\nexport type FarmRouterRouteInput<TMeta = unknown> = string | FarmRouterRoute<TMeta>;\n\nexport interface FarmRouterMatch<TMeta = unknown> {\n route: FarmRouterRoute<TMeta>;\n pathname: string;\n params: FarmRouterParams;\n}\n\nexport type FarmRouterQueryValue =\n | FarmRouterPrimitiveParam\n | readonly FarmRouterPrimitiveParam[]\n | null\n | undefined;\n\nexport interface FarmRouterBuildOptions {\n query?: URLSearchParams | Record<string, FarmRouterQueryValue>;\n hash?: string;\n trailingSlash?: boolean;\n}\n\nexport interface FarmRouterActiveOptions {\n exact?: boolean;\n}\n\nexport interface FarmRouter<TMeta = unknown> {\n routes: FarmRouterRoute<TMeta>[];\n match(pathname: string): FarmRouterMatch<TMeta> | null;\n build(pattern: string, params?: FarmRouterPathParams, options?: FarmRouterBuildOptions): string;\n isActive(pattern: string, pathname: string, options?: FarmRouterActiveOptions): boolean;\n}\n\ntype RouterSegment =\n | {\n type: \"static\";\n value: string;\n }\n | {\n type: \"dynamic\";\n name: string;\n catchAll: boolean;\n optional: boolean;\n };\n\ninterface NormalizedRouterRoute<TMeta> {\n route: FarmRouterRoute<TMeta>;\n segments: RouterSegment[];\n score: number;\n index: number;\n}\n\nexport function createFarmRouter<TMeta = unknown>(\n routes: FarmRouterRouteInput<TMeta>[],\n): FarmRouter<TMeta> {\n const normalizedRoutes = routes.map(normalizeRouteInput).sort(compareRoutes);\n\n return {\n routes: normalizedRoutes.map((entry) => entry.route),\n match(pathname) {\n const normalizedPathname = normalizePathname(pathname);\n\n for (const entry of normalizedRoutes) {\n const params = matchSegments(entry.segments, normalizedPathname);\n if (params) {\n return {\n route: entry.route,\n pathname: normalizedPathname,\n params,\n };\n }\n }\n\n return null;\n },\n build: buildFarmRoutePath,\n isActive: isFarmRouteActive,\n };\n}\n\nexport function matchFarmRoute(pattern: string, pathname: string): FarmRouterParams | null {\n return matchSegments(parseRoutePattern(pattern), normalizePathname(pathname));\n}\n\nexport function buildFarmRoutePath(\n pattern: string,\n params: FarmRouterPathParams = {},\n options: FarmRouterBuildOptions = {},\n): string {\n const parts: string[] = [];\n\n for (const segment of parseRoutePattern(pattern)) {\n if (segment.type === \"static\") {\n parts.push(encodePathSegment(segment.value));\n continue;\n }\n\n const value = params[segment.name];\n const values = Array.isArray(value) ? value : value == null ? [] : [value];\n\n if (values.length === 0) {\n if (segment.optional) continue;\n throw new Error(`Missing route param \"${segment.name}\" for ${pattern}.`);\n }\n\n if (!segment.catchAll && values.length > 1) {\n throw new Error(`Route param \"${segment.name}\" for ${pattern} expects a single value.`);\n }\n\n parts.push(...values.map((item) => encodePathSegment(String(item))));\n }\n\n let pathname = parts.length ? `/${parts.join(\"/\")}` : \"/\";\n\n if (options.trailingSlash && pathname !== \"/\") {\n pathname = `${pathname}/`;\n }\n\n return appendQueryAndHash(pathname, options);\n}\n\nexport function isFarmRouteActive(\n pattern: string,\n pathname: string,\n options: FarmRouterActiveOptions = {},\n): boolean {\n const normalizedPathname = normalizePathname(pathname);\n if (matchFarmRoute(pattern, normalizedPathname)) return true;\n if (options.exact !== false) return false;\n\n const normalizedPattern = normalizePathname(pattern);\n if (normalizedPattern === \"/\") return normalizedPathname === \"/\";\n return normalizedPathname.startsWith(`${normalizedPattern}/`);\n}\n\nfunction normalizeRouteInput<TMeta>(\n input: FarmRouterRouteInput<TMeta>,\n index: number,\n): NormalizedRouterRoute<TMeta> {\n const route = typeof input === \"string\" ? { path: input } : input;\n const path = normalizePathname(route.path);\n const segments = parseRoutePattern(path);\n\n return {\n route: {\n ...route,\n path,\n },\n segments,\n score: scoreSegments(segments),\n index,\n };\n}\n\nfunction parseRoutePattern(pattern: string): RouterSegment[] {\n return splitPathname(pattern)\n .filter((part) => !isRouteGroup(part))\n .map((part) => {\n const optionalCatchAll = part.match(/^\\[\\[\\.\\.\\.([A-Za-z0-9_$-]+)\\]\\]$/);\n if (optionalCatchAll) {\n return {\n type: \"dynamic\",\n name: optionalCatchAll[1],\n catchAll: true,\n optional: true,\n };\n }\n\n const catchAll = part.match(/^\\[\\.\\.\\.([A-Za-z0-9_$-]+)\\]$/);\n if (catchAll) {\n return {\n type: \"dynamic\",\n name: catchAll[1],\n catchAll: true,\n optional: false,\n };\n }\n\n const dynamic = part.match(/^\\[([A-Za-z0-9_$-]+)\\]$/) || part.match(/^:([A-Za-z0-9_$-]+)$/);\n if (dynamic) {\n return {\n type: \"dynamic\",\n name: dynamic[1],\n catchAll: false,\n optional: false,\n };\n }\n\n const star = part.match(/^\\*([A-Za-z0-9_$-]+)(\\?)?$/);\n if (star) {\n return {\n type: \"dynamic\",\n name: star[1],\n catchAll: true,\n optional: !!star[2],\n };\n }\n\n return {\n type: \"static\",\n value: decodePathSegment(part),\n };\n });\n}\n\nfunction matchSegments(segments: RouterSegment[], pathname: string): FarmRouterParams | null {\n const parts = splitPathname(pathname);\n const params: FarmRouterParams = {};\n\n if (segments.length === 0) {\n return parts.length === 0 ? params : null;\n }\n\n let pathIndex = 0;\n\n for (const segment of segments) {\n if (segment.type === \"static\") {\n if (decodePathSegment(parts[pathIndex] || \"\") !== segment.value) return null;\n pathIndex++;\n continue;\n }\n\n if (segment.catchAll) {\n const remaining = parts.slice(pathIndex).map(decodePathSegment);\n if (remaining.length === 0 && !segment.optional) return null;\n params[segment.name] = remaining.join(\"/\");\n pathIndex = parts.length;\n continue;\n }\n\n const value = parts[pathIndex];\n if (!value) return null;\n params[segment.name] = decodePathSegment(value);\n pathIndex++;\n }\n\n return pathIndex === parts.length ? params : null;\n}\n\nfunction compareRoutes<TMeta>(\n left: NormalizedRouterRoute<TMeta>,\n right: NormalizedRouterRoute<TMeta>,\n) {\n if (right.score !== left.score) return right.score - left.score;\n return left.index - right.index;\n}\n\nfunction scoreSegments(segments: RouterSegment[]) {\n return segments.reduce((score, segment) => {\n if (segment.type === \"static\") return score + 100;\n if (!segment.catchAll) return score + 50;\n return score + (segment.optional ? 5 : 10);\n }, segments.length);\n}\n\nfunction normalizePathname(value: string) {\n const raw = value || \"/\";\n let pathname = raw;\n\n try {\n pathname = new URL(raw, \"http://farm.local\").pathname;\n } catch {\n pathname = raw.split(/[?#]/, 1)[0] || \"/\";\n }\n\n pathname = pathname.replace(/\\\\/g, \"/\").replace(/\\/+/g, \"/\");\n if (!pathname.startsWith(\"/\")) pathname = `/${pathname}`;\n if (pathname.length > 1) pathname = pathname.replace(/\\/+$/, \"\");\n return pathname || \"/\";\n}\n\nfunction splitPathname(pathname: string) {\n return normalizePathname(pathname).split(\"/\").filter(Boolean);\n}\n\nfunction isRouteGroup(part: string) {\n return part.startsWith(\"(\") && part.endsWith(\")\");\n}\n\nfunction decodePathSegment(value: string) {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nfunction encodePathSegment(value: string) {\n return encodeURIComponent(value);\n}\n\nfunction appendQueryAndHash(pathname: string, options: FarmRouterBuildOptions) {\n const search = createSearchParams(options.query);\n const hash = options.hash ? `#${options.hash.replace(/^#/, \"\")}` : \"\";\n const query = search.toString();\n return `${pathname}${query ? `?${query}` : \"\"}${hash}`;\n}\n\nfunction createSearchParams(query: FarmRouterBuildOptions[\"query\"]) {\n if (query instanceof URLSearchParams) return query;\n\n const search = new URLSearchParams();\n if (!query) return search;\n\n for (const [key, value] of Object.entries(query)) {\n const values = Array.isArray(value) ? value : [value];\n for (const item of values) {\n if (item == null) continue;\n search.append(key, String(item));\n }\n }\n\n return search;\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { subscribeFarmCacheInvalidation } 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};\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 function runWithServerActionRequest<T>(\n request: Request,\n callback: () => T | Promise<T>,\n): T | Promise<T> {\n throwIfAborted(request.signal);\n return getServerActionStorage().run(\n {\n request,\n signal: request.signal,\n invalidations: new Set(),\n },\n callback,\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\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"],"mappings":"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","names":["import_react","path","path","FarmProgrammaticPageContent","FarmProgrammaticPage","import_node_async_hooks","getRequestStore","result","normalizePathname","decodePathSegment","normalizePathname","decodePathSegment","createSearchParams","import_node_async_hooks","globalState","path"]}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { ReactElement } from 'react';
|
|
2
|
+
import './types-BH1lhg5G.mjs';
|
|
3
|
+
import { APIRouteParams } from './api/runtime.mjs';
|
|
4
|
+
import { ProgrammaticPageRoute, InferProgrammaticRouteData, ProgrammaticRouteComponentProps, ProgrammaticApiRoute } from './routes.mjs';
|
|
5
|
+
import { FarmRouterQueryValue, FarmRouterPathParams } from './router.mjs';
|
|
6
|
+
import { ServerFn } from './server-fn.mjs';
|
|
7
|
+
import { g as FarmContextFactory, M as MiddlewareProps, P as PluginContextProps, p as RouteModule } from './client-plugins-g4bzuCmo.mjs';
|
|
8
|
+
import './route-runtime-DoOHzCAD.mjs';
|
|
9
|
+
import './cache.mjs';
|
|
10
|
+
import './plugin-BJDf43dc.mjs';
|
|
11
|
+
import 'http';
|
|
12
|
+
import './types-D1A6-XvH.mjs';
|
|
13
|
+
import 'db0';
|
|
14
|
+
import 'unstorage';
|
|
15
|
+
import './integration-api-CHT2OKAf.mjs';
|
|
16
|
+
import '@farming-labs/orm';
|
|
17
|
+
import './types-C9N-nk5R.mjs';
|
|
18
|
+
import '@farming-labs/docs';
|
|
19
|
+
import './markdown.mjs';
|
|
20
|
+
import './observability.mjs';
|
|
21
|
+
import 'vite';
|
|
22
|
+
import './workflows.mjs';
|
|
23
|
+
import './cron.mjs';
|
|
24
|
+
import './env.mjs';
|
|
25
|
+
import './server-action-security.mjs';
|
|
26
|
+
import './image-config-Duob7wER.mjs';
|
|
27
|
+
|
|
28
|
+
type FarmTestQuery = URLSearchParams | Record<string, FarmRouterQueryValue>;
|
|
29
|
+
type FarmTestPathParams = FarmRouterPathParams;
|
|
30
|
+
type FarmTestFormValues = Record<string, FormDataEntryValue | readonly FormDataEntryValue[]>;
|
|
31
|
+
interface FarmTestRequestOptions extends Omit<RequestInit, "body" | "headers"> {
|
|
32
|
+
origin?: string;
|
|
33
|
+
headers?: HeadersInit;
|
|
34
|
+
query?: FarmTestQuery;
|
|
35
|
+
cookies?: Record<string, string>;
|
|
36
|
+
json?: unknown;
|
|
37
|
+
form?: FormData | FarmTestFormValues;
|
|
38
|
+
body?: BodyInit | null;
|
|
39
|
+
}
|
|
40
|
+
interface FarmTestHarnessOptions<TContext = unknown> {
|
|
41
|
+
origin?: string;
|
|
42
|
+
headers?: HeadersInit;
|
|
43
|
+
cookies?: Record<string, string>;
|
|
44
|
+
context?: FarmContextFactory<TContext>;
|
|
45
|
+
}
|
|
46
|
+
type AnyProgrammaticPageRoute = ProgrammaticPageRoute<any, any, any, any>;
|
|
47
|
+
type InferFarmTestRouteParams<TRoute> = TRoute extends ProgrammaticPageRoute<infer TParams, any, any, any> ? TParams : never;
|
|
48
|
+
type InferFarmTestRouteSearch<TRoute> = TRoute extends ProgrammaticPageRoute<any, infer TSearch, any, any> ? TSearch : never;
|
|
49
|
+
type InferFarmTestRouteData<TRoute> = TRoute extends ProgrammaticPageRoute<any, any, infer TDataHooks, any> ? InferProgrammaticRouteData<TDataHooks> : never;
|
|
50
|
+
type FarmTestRouteProps<TRoute extends AnyProgrammaticPageRoute> = ProgrammaticRouteComponentProps<InferFarmTestRouteParams<TRoute>, InferFarmTestRouteSearch<TRoute>, InferFarmTestRouteData<TRoute>>;
|
|
51
|
+
type FarmTestRouteParamsInput<TRoute> = InferFarmTestRouteParams<TRoute> extends Record<string, unknown> ? Partial<InferFarmTestRouteParams<TRoute>> : FarmTestPathParams;
|
|
52
|
+
type FarmTestRouteSearchInput<TRoute> = InferFarmTestRouteSearch<TRoute> extends Record<string, unknown> ? Partial<InferFarmTestRouteSearch<TRoute>> | URLSearchParams : FarmTestQuery;
|
|
53
|
+
interface FarmTestRouteOptions<TRoute extends AnyProgrammaticPageRoute, TContext = unknown> extends Pick<FarmTestRequestOptions, "origin" | "headers" | "cookies" | "signal"> {
|
|
54
|
+
path?: string | URL;
|
|
55
|
+
params?: FarmTestRouteParamsInput<TRoute>;
|
|
56
|
+
search?: FarmTestRouteSearchInput<TRoute>;
|
|
57
|
+
context?: TContext;
|
|
58
|
+
middleware?: MiddlewareProps;
|
|
59
|
+
pluginContext?: PluginContextProps;
|
|
60
|
+
}
|
|
61
|
+
interface FarmTestRouteResult<TRoute extends AnyProgrammaticPageRoute> {
|
|
62
|
+
route: TRoute;
|
|
63
|
+
module: RouteModule;
|
|
64
|
+
request: Request;
|
|
65
|
+
props: FarmTestRouteProps<TRoute>;
|
|
66
|
+
element: ReactElement;
|
|
67
|
+
canonicalPath?: string;
|
|
68
|
+
}
|
|
69
|
+
interface FarmTestApiOptions extends FarmTestRequestOptions {
|
|
70
|
+
path?: string | URL;
|
|
71
|
+
params?: FarmTestPathParams;
|
|
72
|
+
throwOnError?: boolean;
|
|
73
|
+
}
|
|
74
|
+
interface FarmTestEndpointOptions extends FarmTestRequestOptions {
|
|
75
|
+
path?: string | URL;
|
|
76
|
+
params?: APIRouteParams;
|
|
77
|
+
throwOnError?: boolean;
|
|
78
|
+
}
|
|
79
|
+
interface FarmTestServerFnOptions extends Pick<FarmTestRequestOptions, "origin" | "headers" | "cookies" | "signal"> {
|
|
80
|
+
path?: string | URL;
|
|
81
|
+
request?: Request;
|
|
82
|
+
}
|
|
83
|
+
type FarmTestServerFnArguments<TInput> = [unknown] extends [TInput] ? [input?: TInput | FormData, options?: FarmTestServerFnOptions] : [input: TInput | FormData, options?: FarmTestServerFnOptions];
|
|
84
|
+
interface FarmTestHarness<TContext = unknown> {
|
|
85
|
+
request(path?: string | URL, options?: FarmTestRequestOptions): Request;
|
|
86
|
+
route<TRoute extends AnyProgrammaticPageRoute>(route: TRoute, options?: FarmTestRouteOptions<TRoute, TContext>): Promise<FarmTestRouteResult<TRoute>>;
|
|
87
|
+
api(route: ProgrammaticApiRoute, options?: FarmTestApiOptions): Promise<Response>;
|
|
88
|
+
endpoint(endpoint: unknown, options?: FarmTestEndpointOptions): Promise<Response>;
|
|
89
|
+
serverFn<TInput, TResult>(serverFn: ServerFn<TInput, TResult>, ...args: FarmTestServerFnArguments<TInput>): Promise<TResult>;
|
|
90
|
+
clearCache(): void;
|
|
91
|
+
}
|
|
92
|
+
/** Create a deterministic Web Request without depending on a test runner. */
|
|
93
|
+
declare function createTestRequest(path?: string | URL, options?: FarmTestRequestOptions): Request;
|
|
94
|
+
/**
|
|
95
|
+
* Create test helpers that exercise Farm's real route, API, and server-function runtimes.
|
|
96
|
+
* The harness has no dependency on Vitest, Jest, or a DOM environment.
|
|
97
|
+
*/
|
|
98
|
+
declare function createFarmTestHarness<TContext = unknown>(options?: FarmTestHarnessOptions<TContext>): FarmTestHarness<TContext>;
|
|
99
|
+
|
|
100
|
+
export { type FarmTestApiOptions, type FarmTestEndpointOptions, type FarmTestFormValues, type FarmTestHarness, type FarmTestHarnessOptions, type FarmTestPathParams, type FarmTestQuery, type FarmTestRequestOptions, type FarmTestRouteOptions, type FarmTestRouteProps, type FarmTestRouteResult, type FarmTestServerFnArguments, type FarmTestServerFnOptions, type InferFarmTestRouteData, type InferFarmTestRouteParams, type InferFarmTestRouteSearch, createFarmTestHarness, createTestRequest };
|