@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/integration-client.ts","../src/api/client.ts"],"sourcesContent":["import type {\n FarmIntegrationAPI,\n FarmIntegrationAPIBodyFormat,\n FarmIntegrationAPIOperation,\n} from \"./integration-api\";\nimport type { FarmIntegration as FarmIntegrationDefinition } from \"./integrations\";\n\n/**\n * Small per-call integration metadata. When sent from a browser, values are\n * client-controlled and should be validated before authorization decisions.\n */\nexport type IntegrationClientData = Record<string, unknown>;\n\nexport type IntegrationClientOptions = {\n baseURL?: string;\n headers?: Record<string, string>;\n credentials?: RequestCredentials;\n data?: IntegrationClientData;\n isServer?: false | undefined;\n};\n\ntype IntegrationRequestOptionsBase = {\n headers?: Record<string, string>;\n signal?: AbortSignal;\n credentials?: RequestCredentials;\n data?: IntegrationClientData;\n};\n\nexport type IntegrationClientRequestOptions = IntegrationRequestOptionsBase;\n\nexport type IntegrationServerRequestLike =\n | Request\n | {\n url?: string;\n headers?: HeadersInit;\n };\n\nexport type IntegrationServerClientOptions = Omit<IntegrationClientOptions, \"isServer\"> & {\n isServer: true;\n request?: IntegrationServerRequestLike;\n forwardHeaders?: boolean | readonly string[];\n};\n\nexport type IntegrationServerClientRequestOptions = IntegrationRequestOptionsBase & {\n baseURL?: string;\n request?: IntegrationServerRequestLike;\n forwardHeaders?: boolean | readonly string[];\n};\n\nexport class IntegrationClientError<TData = unknown> extends Error {\n readonly status: number;\n readonly response: Response;\n readonly data: TData | undefined;\n\n constructor(message: string, response: Response, data?: TData) {\n super(message);\n this.name = \"IntegrationClientError\";\n this.status = response.status;\n this.response = response;\n this.data = data;\n }\n}\n\nexport type IntegrationOperationResult<\n TData = unknown,\n TError = IntegrationClientError<unknown> | Error,\n> = {\n data: TData | null;\n error: TError | null;\n};\n\ntype ExtractOperationBody<T> = T extends {\n __types?: { body: infer TBody };\n}\n ? TBody\n : never;\n\ntype ExtractOperationQuery<T> = T extends {\n __types?: { query: infer TQuery };\n}\n ? TQuery\n : never;\n\ntype ExtractOperationResponse<T> = T extends {\n __types?: { response: infer TResponse };\n}\n ? TResponse\n : unknown;\n\nexport type InferIntegrationOperationBody<T> = ExtractOperationBody<T>;\nexport type InferIntegrationOperationQuery<T> = ExtractOperationQuery<T>;\nexport type InferIntegrationOperationResponse<T> = ExtractOperationResponse<T>;\n\ntype IsNever<T> = [T] extends [never] ? true : false;\n\ntype OperationInput<T> =\n IsNever<ExtractOperationBody<T>> extends true\n ? IsNever<ExtractOperationQuery<T>> extends true\n ? {}\n : { query?: ExtractOperationQuery<T> }\n : IsNever<ExtractOperationQuery<T>> extends true\n ? { body: ExtractOperationBody<T> }\n : { body: ExtractOperationBody<T>; query?: ExtractOperationQuery<T> };\n\ntype ClientOperation<T> = (\n options?: OperationInput<T>,\n requestOptions?: IntegrationClientRequestOptions,\n) => Promise<IntegrationOperationResult<ExtractOperationResponse<T>>>;\n\ntype ServerOperation<T> = (\n options?: OperationInput<T>,\n requestOptions?: IntegrationServerClientRequestOptions,\n) => Promise<IntegrationOperationResult<ExtractOperationResponse<T>>>;\n\ntype IsUnion<T, U = T> = T extends any ? ([U] extends [T] ? false : true) : never;\n\ntype SingleKey<T> = [T] extends [never] ? never : IsUnion<T> extends true ? never : T;\n\ntype ExtractAPIFromSource<TSource> = TSource extends { api?: infer TAPI }\n ? NonNullable<TAPI> extends FarmIntegrationAPI\n ? NonNullable<TAPI>\n : never\n : TSource extends FarmIntegrationAPI\n ? TSource\n : never;\n\ntype SourceKeysWithAPI<TSources extends Record<string, any>> = {\n [K in keyof TSources]: [ExtractAPIFromSource<TSources[K]>] extends [never] ? never : K;\n}[keyof TSources];\n\ntype IsServerRegisteredOperation<T> = T extends { isServer: true } ? true : false;\n\ntype ClientOperationKeys<TAPI> = {\n [K in keyof TAPI]: TAPI[K] extends FarmIntegrationAPIOperation<any, any, any, any>\n ? IsServerRegisteredOperation<TAPI[K]> extends true\n ? never\n : K\n : never;\n}[keyof TAPI];\n\ntype ClientNamespaceShape<TAPI> = {\n [K in keyof TAPI as TAPI[K] extends FarmIntegrationAPIOperation<any, any, any, any>\n ? IsServerRegisteredOperation<TAPI[K]> extends true\n ? never\n : K\n : K]: TAPI[K] extends FarmIntegrationAPIOperation<any, any, any, any>\n ? ClientOperation<TAPI[K]>\n : TAPI[K] extends Record<string, any>\n ? IntegrationAPIToClient<TAPI[K]>\n : never;\n};\n\ntype SingleClientOperationKey<TAPI> =\n Exclude<keyof TAPI, ClientOperationKeys<TAPI>> extends never\n ? SingleKey<ClientOperationKeys<TAPI>>\n : never;\n\ntype IntegrationAPIToClient<TAPI> =\n TAPI extends FarmIntegrationAPIOperation<any, any, any, any>\n ? ClientOperation<TAPI>\n : TAPI extends Record<string, any>\n ? [SingleClientOperationKey<TAPI>] extends [never]\n ? ClientNamespaceShape<TAPI>\n : SingleClientOperationKey<TAPI> extends keyof TAPI\n ? ClientOperation<TAPI[SingleClientOperationKey<TAPI>]> & ClientNamespaceShape<TAPI>\n : ClientNamespaceShape<TAPI>\n : never;\n\nexport type IntegrationClient<TSources extends Record<string, any>> = {\n [K in SourceKeysWithAPI<TSources>]: IntegrationAPIToClient<ExtractAPIFromSource<TSources[K]>>;\n};\n\nexport type IntegrationClientRoot<TSources extends Record<string, any>> = {\n integrations: IntegrationClient<TSources>;\n};\n\ntype ServerOperationKeys<TAPI> = {\n [K in keyof TAPI]: TAPI[K] extends FarmIntegrationAPIOperation<any, any, any> ? K : never;\n}[keyof TAPI];\n\ntype ServerNamespaceShape<TAPI> = {\n [K in keyof TAPI]: TAPI[K] extends FarmIntegrationAPIOperation<any, any, any>\n ? ServerOperation<TAPI[K]>\n : TAPI[K] extends Record<string, any>\n ? IntegrationAPIToServerClient<TAPI[K]>\n : never;\n};\n\ntype SingleServerOperationKey<TAPI> =\n Exclude<keyof TAPI, ServerOperationKeys<TAPI>> extends never\n ? SingleKey<ServerOperationKeys<TAPI>>\n : never;\n\ntype IntegrationAPIToServerClient<TAPI> =\n TAPI extends FarmIntegrationAPIOperation<any, any, any>\n ? ServerOperation<TAPI>\n : TAPI extends Record<string, any>\n ? [SingleServerOperationKey<TAPI>] extends [never]\n ? ServerNamespaceShape<TAPI>\n : SingleServerOperationKey<TAPI> extends keyof TAPI\n ? ServerOperation<TAPI[SingleServerOperationKey<TAPI>]> & ServerNamespaceShape<TAPI>\n : ServerNamespaceShape<TAPI>\n : never;\n\nexport type IntegrationServerClient<TSources extends Record<string, any>> = {\n [K in SourceKeysWithAPI<TSources>]: IntegrationAPIToServerClient<\n ExtractAPIFromSource<TSources[K]>\n >;\n};\n\nexport type IntegrationServerClientRoot<TSources extends Record<string, any>> = {\n integrations: IntegrationServerClient<TSources>;\n};\n\nexport type IntegrationClientAliases<TSources extends Record<string, any>> =\n IntegrationClient<TSources> & {\n integrations: IntegrationClient<TSources>;\n };\n\nexport type IntegrationServerClientAliases<TSources extends Record<string, any>> =\n IntegrationServerClient<TSources> & {\n integrations: IntegrationServerClient<TSources>;\n };\n\nexport type IntegrationAPI<TSources extends Record<string, any>> =\n IntegrationClientAliases<TSources> & {\n server: (\n options: Omit<IntegrationServerClientOptions, \"isServer\">,\n ) => IntegrationServerClientAliases<TSources>;\n };\n\nexport type IntegrationClients<TSources extends Record<string, any>> = {\n api: IntegrationServerClientAliases<TSources>;\n apiClient: IntegrationClientAliases<TSources>;\n};\n\ntype ResolvedIntegrationNamespace = readonly [\n string,\n FarmIntegrationAPI,\n FarmIntegrationDefinition | FarmIntegrationAPI,\n];\n\ntype RegisteredIntegrationRuntime = {\n integration: FarmIntegrationDefinition;\n config: unknown;\n isDev: boolean;\n isProd: boolean;\n};\n\nconst INTEGRATION_RUNTIME_REGISTRY_KEY = Symbol.for(\"farm.integrationRuntimeRegistry\");\nconst CURRENT_REQUEST_RESOLVER_KEY = Symbol.for(\"farm.currentRequestResolver\");\nconst INTEGRATION_REQUEST_DISPATCHER_KEY = Symbol.for(\"farm.integrationRequestDispatcher\");\n\ntype IntegrationRequestDispatcher = (\n runtime: RegisteredIntegrationRuntime,\n request: Request,\n options?: { currentRequest?: Request; data?: IntegrationClientData; internal?: boolean },\n) => Promise<Response | null>;\n\ntype GlobalWithIntegrationRuntimeRegistry = typeof globalThis & {\n [INTEGRATION_RUNTIME_REGISTRY_KEY]?: Map<string, RegisteredIntegrationRuntime>;\n [CURRENT_REQUEST_RESOLVER_KEY]?: () => Request | undefined;\n [INTEGRATION_REQUEST_DISPATCHER_KEY]?: IntegrationRequestDispatcher;\n};\n\ntype GlobalWithIntegrationAPIManifest = typeof globalThis & {\n __FARM_INTEGRATION_API_MANIFEST__?: Record<string, FarmIntegrationAPI>;\n window?: {\n __FARM_INTEGRATION_API_MANIFEST__?: Record<string, FarmIntegrationAPI>;\n };\n};\n\nfunction isOperation(value: unknown): value is FarmIntegrationAPIOperation<any, any, any, any> {\n return (\n !!value &&\n typeof value === \"object\" &&\n (value as FarmIntegrationAPIOperation<any, any, any, any>).kind ===\n \"farm-integration-api-operation\"\n );\n}\n\nfunction resolveSourceAPI(\n source: FarmIntegrationDefinition | FarmIntegrationAPI,\n): FarmIntegrationAPI {\n if (\"kind\" in source && source.kind === \"farm-integration\") {\n if (!source.api) {\n throw new Error(`Integration \"${source.type}\" does not expose a client API definition.`);\n }\n\n return source.api as FarmIntegrationAPI;\n }\n\n return source as FarmIntegrationAPI;\n}\n\nfunction tryResolveSourceAPI(\n source: FarmIntegrationDefinition | FarmIntegrationAPI,\n): FarmIntegrationAPI | null {\n if (\"kind\" in source && source.kind === \"farm-integration\") {\n if (!source.api) {\n return null;\n }\n\n return source.api as FarmIntegrationAPI;\n }\n\n return source as FarmIntegrationAPI;\n}\n\nfunction getIntegrationRuntimeRegistry() {\n const globalState = globalThis as GlobalWithIntegrationRuntimeRegistry;\n return (\n globalState[INTEGRATION_RUNTIME_REGISTRY_KEY] || new Map<string, RegisteredIntegrationRuntime>()\n );\n}\n\nfunction getRegisteredIntegrationRuntimeLocal(\n key: string,\n): RegisteredIntegrationRuntime | undefined {\n return getIntegrationRuntimeRegistry().get(key);\n}\n\nfunction getRegisteredIntegrationsLocal(): Record<string, FarmIntegrationDefinition> {\n return Object.fromEntries(\n Array.from(getIntegrationRuntimeRegistry().entries()).map(([key, runtime]) => [\n key,\n runtime.integration,\n ]),\n );\n}\n\nfunction resolveCurrentRequestLocal(): Request | undefined {\n const globalState = globalThis as GlobalWithIntegrationRuntimeRegistry;\n return globalState[CURRENT_REQUEST_RESOLVER_KEY]?.();\n}\n\nfunction resolveIntegrationRequestDispatcherLocal(): IntegrationRequestDispatcher | undefined {\n const globalState = globalThis as GlobalWithIntegrationRuntimeRegistry;\n return globalState[INTEGRATION_REQUEST_DISPATCHER_KEY];\n}\n\nconst INTEGRATION_DATA_HEADER = \"x-farm-integration-data\";\nconst INTEGRATION_DATA_HEADER_MAX_LENGTH = 16 * 1024;\nconst BLOCKED_INTEGRATION_DATA_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nfunction isIntegrationClientData(value: unknown): value is IntegrationClientData {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isPlainIntegrationDataObject(value: unknown): value is Record<string, unknown> {\n if (!isIntegrationClientData(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction sanitizeIntegrationClientDataValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => sanitizeIntegrationClientDataValue(item));\n }\n\n if (!isPlainIntegrationDataObject(value)) {\n return value;\n }\n\n const sanitized: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n if (BLOCKED_INTEGRATION_DATA_KEYS.has(key)) {\n continue;\n }\n\n sanitized[key] = sanitizeIntegrationClientDataValue(item);\n }\n\n return sanitized;\n}\n\nfunction normalizeIntegrationClientData(\n value: IntegrationClientData | undefined,\n): IntegrationClientData | undefined {\n if (!isIntegrationClientData(value)) {\n return undefined;\n }\n\n const sanitized = sanitizeIntegrationClientDataValue(value);\n return isIntegrationClientData(sanitized) && Object.keys(sanitized).length > 0\n ? sanitized\n : undefined;\n}\n\nfunction getIntegrationDataHeaderByteLength(value: string): number {\n return new TextEncoder().encode(value).byteLength;\n}\n\nfunction mergeIntegrationClientData(\n ...values: Array<IntegrationClientData | undefined>\n): IntegrationClientData | undefined {\n let merged: IntegrationClientData | undefined;\n\n for (const value of values) {\n const data = normalizeIntegrationClientData(value);\n if (!data) {\n continue;\n }\n\n merged = {\n ...(merged || {}),\n ...data,\n };\n }\n\n return merged && Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction serializeIntegrationClientData(data: IntegrationClientData): string {\n const serialized = JSON.stringify(data);\n if (getIntegrationDataHeaderByteLength(serialized) > INTEGRATION_DATA_HEADER_MAX_LENGTH) {\n throw new Error(\n `Integration client data must be smaller than ${INTEGRATION_DATA_HEADER_MAX_LENGTH} bytes when sent over HTTP headers.`,\n );\n }\n\n return serialized;\n}\n\nfunction appendIntegrationClientDataHeader(\n headers: Headers,\n data: IntegrationClientData | undefined,\n) {\n if (!data) {\n return;\n }\n\n headers.set(INTEGRATION_DATA_HEADER, serializeIntegrationClientData(data));\n}\n\nfunction resolveAutomaticClientNamespaces(): ResolvedIntegrationNamespace[] {\n const globalState = globalThis as GlobalWithIntegrationAPIManifest;\n const manifest =\n globalState.window?.__FARM_INTEGRATION_API_MANIFEST__ ||\n globalState.__FARM_INTEGRATION_API_MANIFEST__ ||\n {};\n\n return Object.entries(manifest).map(([key, api]) => [key, api, api] as const);\n}\n\nfunction resolveAutomaticServerNamespaces(): ResolvedIntegrationNamespace[] {\n return Object.entries(getRegisteredIntegrationsLocal()).flatMap(([key, source]) => {\n const api = tryResolveSourceAPI(source);\n return api ? [[key, api, source] as ResolvedIntegrationNamespace] : [];\n });\n}\n\nfunction appendQuery(url: URL, query: Record<string, unknown> | undefined) {\n if (!query) {\n return;\n }\n\n for (const [key, value] of Object.entries(query)) {\n if (value == null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n if (item != null) {\n url.searchParams.append(key, String(item));\n }\n }\n continue;\n }\n\n url.searchParams.set(key, String(value));\n }\n}\n\nfunction appendHeaders(target: Headers, source: HeadersInit | undefined) {\n if (!source) {\n return;\n }\n\n const headers = new Headers(source);\n headers.forEach((value, key) => {\n target.set(key, value);\n });\n}\n\nconst DEFAULT_FORWARDED_HEADERS = [\n \"authorization\",\n \"cookie\",\n \"x-client-ip\",\n \"x-forwarded-for\",\n \"x-forwarded-host\",\n \"x-forwarded-proto\",\n \"x-real-ip\",\n] as const;\n\nfunction resolveRequestLike(request: IntegrationServerRequestLike | undefined) {\n if (!request) {\n return undefined;\n }\n\n if (request instanceof Request) {\n return {\n url: request.url,\n headers: request.headers,\n };\n }\n\n return {\n url: request.url,\n headers: request.headers ? new Headers(request.headers) : undefined,\n };\n}\n\nfunction resolveServerBaseURL(\n explicitBaseURL: string | undefined,\n request: ReturnType<typeof resolveRequestLike>,\n) {\n if (explicitBaseURL) {\n return explicitBaseURL;\n }\n\n if (request?.url) {\n try {\n return new URL(request.url).origin;\n } catch {\n // Fall back to forwarded headers below.\n }\n }\n\n const headers = request?.headers;\n const host = headers?.get(\"x-forwarded-host\") || headers?.get(\"host\");\n if (host) {\n const proto = headers?.get(\"x-forwarded-proto\") || \"http\";\n return `${proto}://${host}`;\n }\n\n return \"http://localhost:3000\";\n}\n\nfunction resolveForwardHeaders(\n request: ReturnType<typeof resolveRequestLike>,\n forwardHeaders: boolean | readonly string[] | undefined,\n) {\n if (!request?.headers || forwardHeaders === false) {\n return new Headers();\n }\n\n const allowed =\n Array.isArray(forwardHeaders) && forwardHeaders.length > 0\n ? new Set(forwardHeaders.map((item) => item.toLowerCase()))\n : new Set<string>(DEFAULT_FORWARDED_HEADERS);\n\n const headers = new Headers();\n request.headers.forEach((value, key) => {\n if (allowed.has(key.toLowerCase())) {\n headers.set(key, value);\n }\n });\n\n return headers;\n}\n\nfunction createBody(\n format: FarmIntegrationAPIBodyFormat | undefined,\n body: unknown,\n headers: Headers,\n): BodyInit | undefined {\n if (body == null || format === \"none\") {\n return undefined;\n }\n\n if (format === \"form\") {\n if (body instanceof FormData || body instanceof URLSearchParams) {\n return body;\n }\n\n const form = new URLSearchParams();\n for (const [key, value] of Object.entries(body as Record<string, unknown>)) {\n if (value == null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n if (item != null) {\n form.append(key, String(item));\n }\n }\n continue;\n }\n\n form.set(key, String(value));\n }\n\n headers.set(\"content-type\", \"application/x-www-form-urlencoded;charset=UTF-8\");\n return form;\n }\n\n headers.set(\"content-type\", \"application/json\");\n return JSON.stringify(body);\n}\n\nasync function parseResponseData(response: Response): Promise<unknown> {\n if (response.status === 204 || response.status === 205) {\n return undefined;\n }\n\n const contentType = response.headers.get(\"content-type\") || \"\";\n\n if (contentType.includes(\"application/json\")) {\n return await response.json();\n }\n\n return await response.text();\n}\n\nasync function safeParseResponseData(response: Response): Promise<unknown> {\n try {\n return await parseResponseData(response);\n } catch {\n return undefined;\n }\n}\n\nfunction createResponseError(response: Response, errorData: unknown) {\n const message =\n typeof errorData === \"string\"\n ? errorData\n : typeof errorData === \"object\" && errorData\n ? String(\n (errorData as { error?: string; message?: string }).error ||\n (errorData as { error?: string; message?: string }).message ||\n response.statusText,\n )\n : response.statusText || \"Integration request failed.\";\n\n return new IntegrationClientError(message, response, errorData);\n}\n\nfunction normalizeExecutionError(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n\n if (typeof error === \"string\" && error.length > 0) {\n return new Error(error);\n }\n\n return new Error(\"Integration request failed.\");\n}\n\nasync function finalizeOperationResponse(\n operation: FarmIntegrationAPIOperation<any, any, any>,\n response: Response,\n) {\n if (!response.ok) {\n const errorData = await safeParseResponseData(response);\n return {\n data: null,\n error: createResponseError(response, errorData),\n };\n }\n\n if (operation.responseFormat === \"response\") {\n return {\n data: response,\n error: null,\n };\n }\n\n return {\n data: (await parseResponseData(response)) as unknown,\n error: null,\n };\n}\n\nasync function executeClientOperation(\n operation: FarmIntegrationAPIOperation<any, any, any>,\n input: Record<string, unknown>,\n options: Pick<IntegrationClientOptions, \"baseURL\" | \"headers\" | \"credentials\" | \"data\">,\n requestOptions?: IntegrationClientRequestOptions,\n) {\n try {\n if (!operation.path) {\n return {\n data: null,\n error: new Error(\n \"Integration API operation path is missing. Pass a path to api.get/post/... or wrap pathless methods with api.route(path, { ... }).\",\n ),\n };\n }\n\n const baseURL =\n options.baseURL ||\n (typeof window !== \"undefined\" ? window.location.origin : \"http://localhost:3000\");\n const url = new URL(operation.path, baseURL);\n appendQuery(url, input.query as Record<string, unknown> | undefined);\n\n const headers = new Headers({\n \"x-farm-integration-client\": \"1\",\n ...options.headers,\n ...operation.headers,\n ...requestOptions?.headers,\n });\n\n if (operation.responseFormat !== \"response\") {\n headers.set(\"accept\", \"application/json\");\n }\n\n appendIntegrationClientDataHeader(\n headers,\n mergeIntegrationClientData(options.data, requestOptions?.data),\n );\n\n const response = await fetch(url.toString(), {\n method: operation.method,\n headers,\n body: createBody(operation.bodyFormat, input.body, headers),\n credentials:\n requestOptions?.credentials ?? operation.credentials ?? options.credentials ?? \"include\",\n signal: requestOptions?.signal,\n });\n\n if (!response.ok) {\n const errorData = await safeParseResponseData(response);\n return {\n data: null,\n error: createResponseError(response, errorData),\n };\n }\n\n if (operation.responseFormat === \"response\") {\n return {\n data: response,\n error: null,\n };\n }\n\n return {\n data: (await parseResponseData(response)) as unknown,\n error: null,\n };\n } catch (error) {\n return {\n data: null,\n error: normalizeExecutionError(error),\n };\n }\n}\n\nasync function executeServerOperation(\n operation: FarmIntegrationAPIOperation<any, any, any>,\n input: Record<string, unknown>,\n options: Pick<\n IntegrationServerClientOptions,\n \"baseURL\" | \"headers\" | \"credentials\" | \"data\" | \"request\" | \"forwardHeaders\"\n >,\n requestOptions?: IntegrationServerClientRequestOptions,\n integrationKey?: string,\n source?: FarmIntegrationDefinition | FarmIntegrationAPI,\n) {\n try {\n if (!operation.path) {\n return {\n data: null,\n error: new Error(\n \"Integration API operation path is missing. Pass a path to api.get/post/... or wrap pathless methods with api.route(path, { ... }).\",\n ),\n };\n }\n\n const serverRequestOptions =\n requestOptions &&\n (\"request\" in requestOptions ||\n \"baseURL\" in requestOptions ||\n \"forwardHeaders\" in requestOptions)\n ? requestOptions\n : undefined;\n const currentRequest =\n serverRequestOptions?.request instanceof Request\n ? serverRequestOptions.request\n : options.request instanceof Request\n ? options.request\n : resolveCurrentRequestLocal();\n const request = resolveRequestLike(\n serverRequestOptions?.request ?? options.request ?? currentRequest,\n );\n const baseURL = resolveServerBaseURL(serverRequestOptions?.baseURL ?? options.baseURL, request);\n const url = new URL(operation.path, baseURL);\n appendQuery(url, input.query as Record<string, unknown> | undefined);\n\n const headers = new Headers();\n appendHeaders(\n headers,\n resolveForwardHeaders(\n request,\n serverRequestOptions?.forwardHeaders ?? options.forwardHeaders,\n ),\n );\n appendHeaders(headers, options.headers);\n appendHeaders(headers, operation.headers);\n appendHeaders(headers, requestOptions?.headers);\n headers.set(\"x-farm-integration-client\", \"1\");\n\n if (operation.responseFormat !== \"response\") {\n headers.set(\"accept\", \"application/json\");\n }\n\n const data = mergeIntegrationClientData(options.data, requestOptions?.data);\n\n if (integrationKey) {\n const runtime =\n \"kind\" in (source || {}) &&\n (source as FarmIntegrationDefinition).kind === \"farm-integration\"\n ? getRegisteredIntegrationRuntimeLocal(integrationKey) || {\n integration: source as FarmIntegrationDefinition,\n config: {},\n isDev: process.env.NODE_ENV !== \"production\",\n isProd: process.env.NODE_ENV === \"production\",\n }\n : getRegisteredIntegrationRuntimeLocal(integrationKey);\n\n if (runtime) {\n const dispatchIntegrationRequest = resolveIntegrationRequestDispatcherLocal();\n const directResponse = dispatchIntegrationRequest\n ? await dispatchIntegrationRequest(\n runtime,\n new Request(url.toString(), {\n method: operation.method,\n headers,\n body: createBody(operation.bodyFormat, input.body, headers),\n }),\n {\n currentRequest,\n data,\n internal: true,\n },\n )\n : null;\n\n if (directResponse) {\n return await finalizeOperationResponse(operation, directResponse);\n }\n }\n }\n\n appendIntegrationClientDataHeader(headers, data);\n\n const response = await fetch(url.toString(), {\n method: operation.method,\n headers,\n body: createBody(operation.bodyFormat, input.body, headers),\n credentials:\n requestOptions?.credentials ?? operation.credentials ?? options.credentials ?? \"include\",\n signal: requestOptions?.signal,\n });\n\n return await finalizeOperationResponse(operation, response);\n } catch (error) {\n return {\n data: null,\n error: normalizeExecutionError(error),\n };\n }\n}\n\nexport function createIntegrationClient<TSources extends Record<string, any>>(\n sources: { integrations: TSources },\n options: IntegrationServerClientOptions,\n): IntegrationServerClientAliases<TSources>;\nexport function createIntegrationClient<TSources extends Record<string, any>>(\n sources: { integrations: TSources },\n options?: IntegrationClientOptions,\n): IntegrationClientAliases<TSources>;\nexport function createIntegrationClient<TSources extends Record<string, any>>(\n sources: TSources,\n options: IntegrationServerClientOptions,\n): IntegrationServerClient<TSources>;\nexport function createIntegrationClient<TSources extends Record<string, any>>(\n sources: TSources,\n options?: IntegrationClientOptions,\n): IntegrationClient<TSources>;\nexport function createIntegrationClient<TSources extends Record<string, any>>(\n sources: TSources | { integrations: TSources },\n options: IntegrationClientOptions | IntegrationServerClientOptions = {},\n):\n | IntegrationClient<TSources>\n | IntegrationClientAliases<TSources>\n | IntegrationServerClient<TSources>\n | IntegrationServerClientAliases<TSources> {\n const rawSources = \"integrations\" in sources ? sources.integrations : sources;\n const isServer = options.isServer === true;\n\n const namespaces = Object.entries(rawSources)\n .map(([key, source]) => {\n const api = tryResolveSourceAPI(source as FarmIntegrationDefinition | FarmIntegrationAPI);\n if (!api) {\n return null;\n }\n return [key, api, source as FarmIntegrationDefinition | FarmIntegrationAPI] as const;\n })\n .filter(\n (\n value,\n ): value is readonly [\n string,\n FarmIntegrationAPI,\n FarmIntegrationDefinition | FarmIntegrationAPI,\n ] => value !== null,\n );\n\n const cache = new Map<string, any>();\n\n const integrationNamespaces = new Proxy(\n {},\n {\n get(target, property) {\n if (typeof property !== \"string\") {\n return undefined;\n }\n\n if (Reflect.has(target, property)) {\n return Reflect.get(target, property);\n }\n\n if (cache.has(property)) {\n return cache.get(property);\n }\n\n const match = namespaces.find(([key]) => key === property);\n if (!match) {\n return undefined;\n }\n\n const namespace = isServer\n ? createServerNamespaceProxy(\n match[0],\n match[2],\n match[1],\n options as IntegrationServerClientOptions,\n )\n : createNamespaceProxy(match[1], options);\n cache.set(property, namespace);\n return namespace;\n },\n },\n ) as\n | IntegrationClient<TSources>\n | IntegrationClientAliases<TSources>\n | IntegrationServerClient<TSources>\n | IntegrationServerClientAliases<TSources>;\n\n if (\"integrations\" in sources) {\n Object.defineProperty(integrationNamespaces, \"integrations\", {\n value: integrationNamespaces,\n enumerable: false,\n configurable: false,\n writable: false,\n });\n\n return integrationNamespaces as\n | IntegrationClientAliases<TSources>\n | IntegrationServerClientAliases<TSources>;\n }\n\n return integrationNamespaces as IntegrationClient<TSources> | IntegrationServerClient<TSources>;\n}\n\nfunction createAutomaticIntegrationAliases<TSources extends Record<string, any>>(\n isServer: boolean,\n options: IntegrationClientOptions | IntegrationServerClientOptions = {},\n): IntegrationClientAliases<TSources> | IntegrationServerClientAliases<TSources> {\n const cache = isServer ? new Map<string, any>() : null;\n\n const integrationNamespaces = new Proxy(\n {},\n {\n get(_target, property) {\n if (typeof property !== \"string\") {\n return undefined;\n }\n\n if (property === \"integrations\") {\n return integrationNamespaces;\n }\n\n if (cache?.has(property)) {\n return cache.get(property);\n }\n\n const namespaces = isServer\n ? resolveAutomaticServerNamespaces()\n : resolveAutomaticClientNamespaces();\n const match = namespaces.find(([key]) => key === property);\n if (!match) {\n return undefined;\n }\n\n const namespace = isServer\n ? createServerNamespaceProxy(\n match[0],\n match[2],\n match[1],\n options as IntegrationServerClientOptions,\n )\n : createNamespaceProxy(match[1], options as IntegrationClientOptions);\n\n cache?.set(property, namespace);\n return namespace;\n },\n },\n ) as IntegrationClientAliases<TSources> | IntegrationServerClientAliases<TSources>;\n\n Object.defineProperty(integrationNamespaces, \"integrations\", {\n value: integrationNamespaces,\n enumerable: false,\n configurable: false,\n writable: false,\n });\n\n return integrationNamespaces;\n}\n\nexport function integrationsClient<\n TSources extends Record<string, any>,\n>(): IntegrationClientAliases<TSources>;\nexport function integrationsClient<TSources extends Record<string, any>>(\n options: IntegrationClientOptions,\n): IntegrationClientAliases<TSources>;\nexport function integrationsClient<TSources extends Record<string, any>>(\n options: IntegrationClientOptions = {},\n): IntegrationClientAliases<TSources> {\n return createAutomaticIntegrationAliases<TSources>(\n false,\n options,\n ) as IntegrationClientAliases<TSources>;\n}\n\nexport function integrationsServer<\n TSources extends Record<string, any>,\n>(): IntegrationServerClientAliases<TSources>;\nexport function integrationsServer<TSources extends Record<string, any>>(\n options: Omit<IntegrationServerClientOptions, \"isServer\">,\n): IntegrationServerClientAliases<TSources>;\nexport function integrationsServer<TSources extends Record<string, any>>(\n options: Omit<IntegrationServerClientOptions, \"isServer\"> = {},\n): IntegrationServerClientAliases<TSources> {\n return createAutomaticIntegrationAliases<TSources>(true, {\n ...options,\n isServer: true,\n }) as IntegrationServerClientAliases<TSources>;\n}\n\nexport function createIntegrationServerClient<TSources extends Record<string, any>>(sources: {\n integrations: TSources;\n}): IntegrationServerClientAliases<TSources>;\nexport function createIntegrationServerClient<TSources extends Record<string, any>>(\n sources: TSources,\n): IntegrationServerClient<TSources>;\nexport function createIntegrationServerClient<TSources extends Record<string, any>>(\n sources: { integrations: TSources },\n options: Omit<IntegrationServerClientOptions, \"isServer\">,\n): IntegrationServerClientAliases<TSources>;\nexport function createIntegrationServerClient<TSources extends Record<string, any>>(\n sources: TSources,\n options: Omit<IntegrationServerClientOptions, \"isServer\">,\n): IntegrationServerClient<TSources>;\nexport function createIntegrationServerClient<TSources extends Record<string, any>>(\n sources: TSources | { integrations: TSources },\n options: Omit<IntegrationServerClientOptions, \"isServer\"> = {},\n): IntegrationServerClient<TSources> | IntegrationServerClientAliases<TSources> {\n return createIntegrationClient(sources, {\n ...options,\n isServer: true,\n }) as IntegrationServerClient<TSources> | IntegrationServerClientAliases<TSources>;\n}\n\nexport function createIntegrationApi<TSources extends Record<string, any>>(\n sources: { integrations: TSources },\n options: IntegrationClientOptions = {},\n): IntegrationAPI<TSources> {\n const client = createIntegrationClient(sources, options);\n\n return {\n ...client,\n server(serverOptions = {}) {\n return createIntegrationServerClient(sources, {\n ...options,\n ...serverOptions,\n });\n },\n };\n}\n\nfunction isIntegrationClientOptionsInput(value: unknown): value is IntegrationClientOptions {\n return (\n !!value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n (\"baseURL\" in value ||\n \"headers\" in value ||\n \"credentials\" in value ||\n \"data\" in value ||\n \"isServer\" in value)\n );\n}\n\nfunction resolveIntegrationServerOptions(\n clientOptions: IntegrationClientOptions = {},\n serverOptions: Omit<IntegrationServerClientOptions, \"isServer\"> = {},\n): Omit<IntegrationServerClientOptions, \"isServer\"> {\n const data = mergeIntegrationClientData(clientOptions.data, serverOptions.data);\n\n return {\n baseURL: clientOptions.baseURL,\n headers: clientOptions.headers,\n credentials: clientOptions.credentials,\n ...serverOptions,\n ...(data ? { data } : {}),\n };\n}\n\nexport function createIntegrationClients<TSources extends Record<string, any>>(\n clientOptions?: IntegrationClientOptions,\n serverOptions?: Omit<IntegrationServerClientOptions, \"isServer\">,\n): IntegrationClients<TSources>;\nexport function createIntegrationClients<TSources extends Record<string, any>>(\n sources: TSources,\n clientOptions?: IntegrationClientOptions,\n serverOptions?: Omit<IntegrationServerClientOptions, \"isServer\">,\n): IntegrationClients<TSources>;\nexport function createIntegrationClients<TSources extends Record<string, any>>(\n sources: { integrations: TSources },\n clientOptions?: IntegrationClientOptions,\n serverOptions?: Omit<IntegrationServerClientOptions, \"isServer\">,\n): IntegrationClients<TSources>;\nexport function createIntegrationClients<TSources extends Record<string, any>>(\n sources?: TSources | { integrations: TSources },\n clientOptions?: IntegrationClientOptions,\n serverOptions?: Omit<IntegrationServerClientOptions, \"isServer\">,\n): IntegrationClients<TSources> {\n if (arguments.length === 0 || isIntegrationClientOptionsInput(sources)) {\n const automaticClientOptions = isIntegrationClientOptionsInput(sources) ? sources : {};\n const automaticServerOptions = arguments.length > 1 ? clientOptions : undefined;\n\n return {\n api: integrationsServer<TSources>(\n resolveIntegrationServerOptions(\n automaticClientOptions,\n automaticServerOptions as Omit<IntegrationServerClientOptions, \"isServer\"> | undefined,\n ),\n ),\n apiClient: integrationsClient<TSources>(automaticClientOptions),\n };\n }\n\n const explicitSources =\n sources && \"integrations\" in sources ? sources.integrations : (sources as TSources);\n\n return {\n api: createIntegrationServerClient(\n {\n integrations: explicitSources,\n },\n resolveIntegrationServerOptions(clientOptions, serverOptions),\n ) as IntegrationServerClientAliases<TSources>,\n apiClient: createIntegrationClient(\n {\n integrations: explicitSources,\n },\n clientOptions,\n ) as IntegrationClientAliases<TSources>,\n };\n}\n\nexport function createIntegrations<TSources extends Record<string, any>>(\n clientOptions?: IntegrationClientOptions,\n serverOptions?: Omit<IntegrationServerClientOptions, \"isServer\">,\n): IntegrationClients<TSources>;\nexport function createIntegrations<TSources extends Record<string, any>>(\n sources: TSources,\n clientOptions?: IntegrationClientOptions,\n serverOptions?: Omit<IntegrationServerClientOptions, \"isServer\">,\n): IntegrationClients<TSources>;\nexport function createIntegrations<TSources extends Record<string, any>>(\n sources: { integrations: TSources },\n clientOptions?: IntegrationClientOptions,\n serverOptions?: Omit<IntegrationServerClientOptions, \"isServer\">,\n): IntegrationClients<TSources>;\nexport function createIntegrations<TSources extends Record<string, any>>(\n sources?: TSources | { integrations: TSources } | IntegrationClientOptions,\n clientOptions?: IntegrationClientOptions,\n serverOptions?: Omit<IntegrationServerClientOptions, \"isServer\">,\n): IntegrationClients<TSources> {\n if (arguments.length === 0) {\n return createIntegrationClients<TSources>();\n }\n\n return createIntegrationClients<TSources>(\n sources as TSources,\n clientOptions,\n serverOptions,\n ) as IntegrationClients<TSources>;\n}\n\nfunction createClientSafeIntegrationAPI(\n api: FarmIntegrationAPI | undefined,\n): FarmIntegrationAPI | undefined {\n if (!api) {\n return undefined;\n }\n\n const entries = Object.entries(api as Record<string, unknown>).map(([key, value]) => {\n if (isOperation(value)) {\n return [\n key,\n {\n kind: value.kind,\n path: value.path,\n method: value.method,\n bodyFormat: value.bodyFormat,\n responseFormat: value.responseFormat,\n credentials: value.credentials,\n isServer: value.isServer,\n __pathless: value.__pathless,\n },\n ];\n }\n\n if (value && typeof value === \"object\") {\n return [key, createClientSafeIntegrationAPI(value as FarmIntegrationAPI)];\n }\n\n return [key, value];\n });\n\n return Object.fromEntries(entries) as FarmIntegrationAPI;\n}\n\nexport function getIntegrationAPIManifest(): Record<string, FarmIntegrationAPI> {\n const manifestEntries = Object.entries(getRegisteredIntegrationsLocal())\n .map(([key, integration]) => {\n const api = createClientSafeIntegrationAPI(integration.api);\n return api ? ([key, api] as const) : null;\n })\n .filter((value): value is readonly [string, FarmIntegrationAPI] => value !== null);\n\n return Object.fromEntries(manifestEntries);\n}\n\nexport function integrationClients<TSources extends Record<string, any>>(\n clientOptions?: IntegrationClientOptions,\n serverOptions?: Omit<IntegrationServerClientOptions, \"isServer\">,\n): IntegrationClients<TSources>;\nexport function integrationClients<TSources extends Record<string, any>>(\n sources: TSources,\n clientOptions?: IntegrationClientOptions,\n serverOptions?: Omit<IntegrationServerClientOptions, \"isServer\">,\n): IntegrationClients<TSources>;\nexport function integrationClients<TSources extends Record<string, any>>(\n sources: { integrations: TSources },\n clientOptions?: IntegrationClientOptions,\n serverOptions?: Omit<IntegrationServerClientOptions, \"isServer\">,\n): IntegrationClients<TSources>;\nexport function integrationClients<TSources extends Record<string, any>>(\n sources?: TSources | { integrations: TSources },\n clientOptions?: IntegrationClientOptions,\n serverOptions?: Omit<IntegrationServerClientOptions, \"isServer\">,\n): IntegrationClients<TSources> {\n if (arguments.length === 0) {\n return createIntegrationClients<TSources>();\n }\n\n return createIntegrationClients<TSources>(\n sources as TSources,\n clientOptions,\n serverOptions,\n ) as IntegrationClients<TSources>;\n}\n\nfunction resolveSingleNamespaceOperation(api: FarmIntegrationAPI) {\n const entries = Object.entries(api as Record<string, unknown>);\n if (entries.length !== 1) {\n return null;\n }\n\n const [, value] = entries[0]!;\n return isOperation(value) ? value : null;\n}\n\nfunction createClientOperationCaller(\n operation: FarmIntegrationAPIOperation<any, any, any, any>,\n property: string,\n options: IntegrationClientOptions,\n) {\n if (operation.isServer === true) {\n return async () => {\n throw new Error(\n `Integration method \"${property}\" is registered with isServer: true and is only available from a server integration client.`,\n );\n };\n }\n\n return async (\n input: Record<string, unknown> = {},\n requestOptions?: IntegrationClientRequestOptions,\n ) => {\n if (typeof window === \"undefined\") {\n throw new Error(\n \"Client integration API cannot be called on the server. Pass { isServer: true } to createIntegrationClient(...) during server rendering, or provide { isServer: true, request } outside it.\",\n );\n }\n\n return executeClientOperation(operation, input, options, requestOptions);\n };\n}\n\nfunction createServerOperationCaller(\n operation: FarmIntegrationAPIOperation<any, any, any, any>,\n options: IntegrationServerClientOptions,\n integrationKey: string,\n source: FarmIntegrationDefinition | FarmIntegrationAPI,\n) {\n return async (\n input: Record<string, unknown> = {},\n requestOptions?: IntegrationServerClientRequestOptions,\n ) => {\n if (typeof window !== \"undefined\") {\n throw new Error(\n \"Server integration API cannot be called in the browser. Remove { isServer: true } and create a client integration API instead.\",\n );\n }\n\n return executeServerOperation(\n operation,\n input,\n options,\n requestOptions,\n integrationKey,\n source,\n );\n };\n}\n\nfunction createNamespaceProxy(api: FarmIntegrationAPI, options: IntegrationClientOptions) {\n const cache = new Map<string, any>();\n const directOperation = resolveSingleNamespaceOperation(api);\n const target = directOperation\n ? createClientOperationCaller(directOperation, directOperation.method.toLowerCase(), options)\n : {};\n\n return new Proxy(target, {\n get(targetObject, property, receiver) {\n if (typeof property !== \"string\") {\n return Reflect.get(targetObject, property, receiver);\n }\n\n if (cache.has(property)) {\n return cache.get(property);\n }\n\n const value = (api as Record<string, unknown>)[property];\n if (!value) {\n return Reflect.get(targetObject, property, receiver);\n }\n\n if (isOperation(value)) {\n const caller = createClientOperationCaller(value, property, options);\n cache.set(property, caller);\n return caller;\n }\n\n const namespace = createNamespaceProxy(value as FarmIntegrationAPI, options);\n cache.set(property, namespace);\n return namespace;\n },\n });\n}\n\nfunction createServerNamespaceProxy(\n integrationKey: string,\n source: FarmIntegrationDefinition | FarmIntegrationAPI,\n api: FarmIntegrationAPI,\n options: IntegrationServerClientOptions,\n) {\n const cache = new Map<string, any>();\n const directOperation = resolveSingleNamespaceOperation(api);\n const target = directOperation\n ? createServerOperationCaller(directOperation, options, integrationKey, source)\n : {};\n\n return new Proxy(target, {\n get(targetObject, property, receiver) {\n if (typeof property !== \"string\") {\n return Reflect.get(targetObject, property, receiver);\n }\n\n if (cache.has(property)) {\n return cache.get(property);\n }\n\n const value = (api as Record<string, unknown>)[property];\n if (!value) {\n return Reflect.get(targetObject, property, receiver);\n }\n\n if (isOperation(value)) {\n const caller = createServerOperationCaller(value, options, integrationKey, source);\n cache.set(property, caller);\n return caller;\n }\n\n const namespace = createServerNamespaceProxy(\n integrationKey,\n source,\n value as FarmIntegrationAPI,\n options,\n );\n cache.set(property, namespace);\n return namespace;\n },\n });\n}\n","import {\n integrationsClient,\n integrationsServer,\n type IntegrationClientOptions,\n type IntegrationClientRoot,\n type IntegrationServerClientOptions,\n type IntegrationServerClientRoot,\n} from \"../integration-client\";\nimport {\n getFarmClientDataCache,\n normalizeFarmClientCacheKey,\n type FarmClientCacheEntry,\n type FarmClientCacheKey,\n type FarmClientDataCache,\n} from \"../client-cache\";\n\nexport type APIClientOptions = {\n baseURL?: string;\n headers?: Record<string, string>;\n credentials?: RequestCredentials;\n cacheDefaults?: CacheOptions;\n integrations?: IntegrationClientOptions;\n};\n\nexport type APIClientWithoutIntegrationsOptions = Omit<APIClientOptions, \"integrations\"> & {\n integrations: false;\n};\n\nexport type ServerAPIClientOptions = {\n integrations?: Omit<IntegrationServerClientOptions, \"isServer\">;\n};\n\nexport type ServerAPIClientWithoutIntegrationsOptions = Omit<\n ServerAPIClientOptions,\n \"integrations\"\n> & {\n integrations: false;\n};\n\nexport type StatusPhase = \"idle\" | \"pending\" | \"success\" | \"error\" | \"revalidating\" | \"invalidated\";\n\nexport type StatusEvent<TData = unknown, TError = unknown> = {\n phase: StatusPhase;\n requestId: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\" | \"OPTIONS\" | \"HEAD\";\n key: string;\n input?: unknown;\n data?: TData;\n error?: TError;\n isBackground?: boolean;\n timestamp: number;\n};\n\nexport type CacheKey<TData = unknown> = string & {\n readonly __farmCacheData?: TData;\n};\n\nexport type APIResult<TData = unknown, TError = Error> = {\n data: TData | undefined;\n error: TError | null;\n key: CacheKey<TData>;\n};\n\nexport type RequestEvent = {\n requestId: string;\n method: StatusEvent[\"method\"];\n key: string;\n path: string;\n input?: unknown;\n attempt: number;\n timestamp: number;\n};\n\nexport type ResponseEvent<TData = unknown, TError = Error> = {\n requestId: string;\n method: StatusEvent[\"method\"];\n key: string;\n path: string;\n input?: unknown;\n attempt: number;\n timestamp: number;\n response?: Response;\n data?: TData;\n error?: TError;\n ok?: boolean;\n status?: number;\n};\n\nexport type CachePolicy = \"cache-first\" | \"network-only\" | \"stale-while-revalidate\";\n\nexport type CacheOptions = {\n key?: FarmClientCacheKey;\n policy?: CachePolicy;\n staleTime?: number;\n gcTime?: number;\n dedupeMs?: number;\n};\n\nexport type RetryOptions = {\n count?: number;\n delay?: number | ((attempt: number) => number);\n};\n\nexport type InvalidateTarget =\n | string\n | {\n key: FarmClientCacheKey;\n }\n | {\n path: string;\n method?: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\" | \"OPTIONS\" | \"HEAD\";\n input?: unknown;\n }\n | [CallableRouteRef<any>, unknown?];\n\nexport type InvalidateOptions =\n | InvalidateTarget[]\n | {\n targets: InvalidateTarget[];\n refetch?: boolean;\n };\n\nexport type OptimisticUpdate =\n | [CallableRouteRef<any>, unknown, (prev: any) => any]\n | [CacheKey<any> | string, (prev: any) => any];\n\nexport type OptimisticOptions<TUpdates extends readonly unknown[] = readonly OptimisticUpdate[]> = {\n update: TUpdates & NormalizeOptimisticUpdates<TUpdates>;\n rollbackOnError?: boolean;\n};\n\nexport type ClientOptions<\n TData = unknown,\n TError = unknown,\n TUpdates extends readonly unknown[] = readonly OptimisticUpdate[],\n> = {\n key?: CacheKey<TData> | FarmClientCacheKey;\n cache?: CacheOptions;\n retry?: RetryOptions;\n invalidate?: InvalidateOptions;\n optimistic?: OptimisticOptions<TUpdates>;\n onRequest?: (event: RequestEvent) => void;\n onResponse?: (\n data: TData | undefined,\n error: TError | null,\n event: ResponseEvent<TData, TError>,\n ) => void;\n onSuccess?: (data: TData) => void;\n onError?: (err: TError) => void;\n onSettled?: (data?: TData, err?: TError | null) => void;\n onStatus?: (event: StatusEvent<TData, TError>) => void;\n};\n\ntype AnyRouteRef = (...args: any[]) => any;\ntype RouteRef<TData = any, TInput = any> = {\n readonly __farmRouteInput: TInput;\n readonly __farmRouteData: TData;\n};\ntype CallableRouteRef<TData = any, TInput = any> = AnyRouteRef & RouteRef<TData, TInput>;\n\ntype InferRouteInput<TRoute> = TRoute extends { readonly __farmRouteInput: infer TInput }\n ? TInput\n : never;\ntype InferRouteData<TRoute> = TRoute extends { readonly __farmRouteData: infer TData }\n ? TData\n : never;\n\ntype NormalizeOptimisticUpdate<TUpdate> = TUpdate extends readonly [\n infer TRoute,\n unknown,\n (prev: any) => any,\n]\n ? TRoute extends RouteRef<any, any>\n ? [\n TRoute,\n InferRouteInput<TRoute> | undefined,\n (prev: InferRouteData<TRoute> | undefined) => InferRouteData<TRoute>,\n ]\n : never\n : TUpdate extends readonly [infer TKey, (prev: any) => any]\n ? TKey extends CacheKey<infer TData>\n ? [TKey, (prev: TData | undefined) => TData]\n : TKey extends string\n ? [TKey, (prev: unknown) => unknown]\n : never\n : never;\n\ntype NormalizeOptimisticUpdates<TUpdates extends readonly unknown[]> = {\n [K in keyof TUpdates]: NormalizeOptimisticUpdate<TUpdates[K]>;\n};\n\ntype TypedEndpointLike = {\n __types: {\n body: any;\n query: any;\n response: any;\n };\n};\n\ntype Simplify<T> = {\n [K in keyof T]: T[K];\n} & {};\n\ntype IsNever<T> = [T] extends [never] ? true : false;\ntype IsAny<T> = 0 extends 1 & T ? true : false;\ntype RequiredKeys<T> = T extends object\n ? {\n [K in keyof T]-?: {} extends Pick<T, K> ? never : K;\n }[keyof T]\n : never;\n\ntype BodyInputProp<TValue> =\n IsNever<TValue> extends true\n ? {}\n : IsAny<TValue> extends true\n ? { body?: TValue }\n : undefined extends TValue\n ? { body?: TValue }\n : { body: TValue };\n\ntype QueryInputProp<TValue> =\n IsNever<TValue> extends true\n ? {}\n : IsAny<TValue> extends true\n ? { query?: TValue }\n : undefined extends TValue\n ? { query?: TValue }\n : RequiredKeys<TValue> extends never\n ? { query?: TValue }\n : { query: TValue };\n\ntype HasRequiredKeys<T> = RequiredKeys<T> extends never ? false : true;\n\n// Type utilities to extract endpoint input/output types from TypedEndpoint\ntype InferEndpointInput<T> = T extends {\n __types: {\n body: infer TBody;\n query: infer TQuery;\n };\n}\n ? Simplify<BodyInputProp<TBody> & QueryInputProp<TQuery>>\n : {};\n\ntype InferEndpointOutput<T> = T extends {\n __types: {\n response: infer R;\n };\n}\n ? R\n : any;\n\n// Type for a single endpoint method\ntype EndpointMethod<T = any> = (<TUpdates extends readonly unknown[] = readonly OptimisticUpdate[]>(\n ...args: HasRequiredKeys<InferEndpointInput<T>> extends true\n ? [\n options: InferEndpointInput<T>,\n clientOptions?: ClientOptions<InferEndpointOutput<T>, Error, TUpdates>,\n ]\n : [\n options?: InferEndpointInput<T>,\n clientOptions?: ClientOptions<InferEndpointOutput<T>, Error, TUpdates>,\n ]\n) => Promise<APIResult<InferEndpointOutput<T>, Error>>) &\n RouteRef<InferEndpointOutput<T>, InferEndpointInput<T>>;\n\n// Type for converting router structure to client structure\ntype RouterToClient<T> = {\n [K in keyof T]: T[K] extends TypedEndpointLike\n ? EndpointMethod<T[K]>\n : T[K] extends Record<string, any>\n ? RouterToClient<T[K]> // Recurssive handling of the multi level api routes\n : EndpointMethod<T[K]>;\n};\n\nexport type RouteAPIClient<TRouter extends Record<string, any>> = RouterToClient<TRouter>;\n\nexport type APIClient<\n TRouter extends Record<string, any>,\n TIntegrations extends Record<string, any> = {},\n> = RouteAPIClient<TRouter> & IntegrationClientRoot<TIntegrations>;\n\nexport type ServerAPIClient<\n TEndpoints extends Record<string, any>,\n TIntegrations extends Record<string, any> = {},\n> = TEndpoints & IntegrationServerClientRoot<TIntegrations>;\n\n/**\n * Create a typed RPC client for Farm.js API routes\n *\n * Returns a nested proxy that supports:\n * - api.hello.get({ query: { name: 'World' } })\n * - api['auth/login'].post({ body: { email: '...', password: '...' } })\n * - api.users.get({ query: { limit: '10' } })\n * - api.integrations.billing.checkout({ body: { priceId: 'price_...' } })\n *\n * @example\n * ```typescript\n * import { createAPIClient } from 'farm/client';\n * import type { APIRouter } from '@/api';\n * import type { AppIntegrations } from '@/lib/integrations';\n *\n * export const api = createAPIClient<APIRouter, AppIntegrations>();\n *\n * // Use it (nested property access)\n * const result = await api.hello.get({ query: { name: 'World' } });\n * if (result.error) console.error(result.error);\n * else console.log(result.data);\n *\n * // Or with string keys for nested paths\n * const result = await api['auth/login'].post({\n * body: { email: 'test@example.com', password: 'pass123' }\n * });\n *\n * // Integration APIs live under a reserved namespace.\n * const checkout = await api.integrations.billing.checkout({\n * body: { priceId: 'price_123' }\n * });\n * ```\n */\nexport function createAPIClient<TRouter extends Record<string, any>>(\n options: APIClientWithoutIntegrationsOptions,\n): RouteAPIClient<TRouter>;\nexport function createAPIClient<\n TRouter extends Record<string, any>,\n TIntegrations extends Record<string, any> = {},\n>(options?: APIClientOptions): APIClient<TRouter, TIntegrations>;\nexport function createAPIClient<\n TRouter extends Record<string, any>,\n TIntegrations extends Record<string, any> = {},\n>(\n options: APIClientOptions | APIClientWithoutIntegrationsOptions = {},\n): RouteAPIClient<TRouter> | APIClient<TRouter, TIntegrations> {\n options ??= {};\n // Auto-detect baseURL\n const baseURL =\n options.baseURL ||\n (typeof window !== \"undefined\" ? window.location.origin : \"http://localhost:3000\");\n const integrationOptions =\n options.integrations === false\n ? false\n : {\n baseURL: options.baseURL,\n headers: options.headers,\n credentials: options.credentials,\n ...(typeof options.integrations === \"object\" ? options.integrations : {}),\n };\n const rootAliases =\n integrationOptions === false\n ? undefined\n : {\n integrations: integrationsClient<TIntegrations>(integrationOptions),\n };\n\n const cacheState = getFarmClientDataCache();\n const inflightState = new Map<string, InflightEntry>();\n const routeMeta = new WeakMap<AnyRouteRef, RouteMeta>();\n let requestCounter = 0;\n\n // Create a simple fetch-based client (browser compatible)\n const fetchClient = async (path: string, requestOptions: any = {}) => {\n const url = new URL(path, baseURL);\n\n // Handle query parameters\n if (requestOptions.query) {\n Object.entries(requestOptions.query).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n });\n }\n\n // Prepare fetch options\n const fetchOptions: RequestInit = {\n method: requestOptions.method || \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n ...requestOptions.headers,\n },\n };\n\n // Handle body\n if (requestOptions.body) {\n fetchOptions.body = JSON.stringify(requestOptions.body);\n }\n\n const response = await fetch(url.toString(), fetchOptions);\n let data: any = undefined;\n if (response.status !== 204 && response.status !== 205) {\n data = await response.json();\n }\n\n return { response, data };\n };\n\n const request = async (\n path: string,\n method: string,\n input: any = {},\n clientOptions?: ClientOptions<any, any>,\n ): Promise<APIResult<any, Error>> => {\n const methodUpper = method.toUpperCase() as StatusEvent[\"method\"];\n const requestId = `${Date.now()}-${++requestCounter}`;\n const cacheOptions = clientOptions?.cache\n ? {\n ...options.cacheDefaults,\n ...clientOptions.cache,\n }\n : undefined;\n const configuredCacheKey = clientOptions?.key ?? cacheOptions?.key;\n const cacheKey = normalizeFarmClientCacheKey(\n configuredCacheKey ?? buildCacheKey(methodUpper, path, input, baseURL),\n ) as CacheKey<any>;\n const now = Date.now();\n\n const emitStatus = (phase: StatusPhase, payload?: Partial<StatusEvent>) => {\n clientOptions?.onStatus?.({\n phase,\n requestId,\n method: methodUpper,\n key: cacheKey,\n input,\n timestamp: Date.now(),\n ...payload,\n });\n };\n\n const entry = getValidCacheEntry(cacheState, cacheKey, now);\n const policy = cacheOptions?.policy ?? (cacheOptions ? \"cache-first\" : \"network-only\");\n const staleTime = cacheOptions?.staleTime ?? 0;\n const isCacheEnabled = Boolean(cacheOptions) && methodUpper === \"GET\";\n const isStale = entry ? isEntryStale(entry, now) : true;\n\n const applyOptimisticUpdates = () => {\n if (!clientOptions?.optimistic?.update?.length) return [] as OptimisticSnapshot[];\n\n const snapshots: OptimisticSnapshot[] = [];\n for (const update of clientOptions.optimistic.update) {\n const [target, targetInput, updater] =\n update.length === 2\n ? [update[0], undefined, update[1]]\n : [update[0], update[1], update[2]];\n const targetKey = resolveTargetKey(routeMeta, target, targetInput, baseURL);\n if (!targetKey) continue;\n\n const targetEntry = getValidCacheEntry(cacheState, targetKey, now);\n const previousEntry = targetEntry ? { ...targetEntry } : undefined;\n const previousData = targetEntry?.data;\n const nextData = updater(previousData);\n cacheState.set(targetKey, {\n data: nextData,\n updatedAt: now,\n staleAt:\n targetEntry?.staleAt ??\n now + (cacheOptions?.staleTime ?? options.cacheDefaults?.staleTime ?? 0),\n gcAt:\n targetEntry?.gcAt ??\n getGcAt(now, cacheOptions?.gcTime ?? options.cacheDefaults?.gcTime),\n invalidatedAt: targetEntry?.invalidatedAt,\n });\n\n snapshots.push({ key: targetKey, entry: previousEntry });\n }\n\n return snapshots;\n };\n\n const rollbackOptimisticUpdates = (snapshots: OptimisticSnapshot[]) => {\n if (!clientOptions?.optimistic?.rollbackOnError) return;\n\n for (const snapshot of snapshots) {\n if (!snapshot.entry) {\n cacheState.delete(snapshot.key);\n continue;\n }\n\n cacheState.set(snapshot.key, { ...snapshot.entry });\n }\n };\n\n const executeNetwork = async (opts?: { isBackground?: boolean; callCallbacks?: boolean }) => {\n const dedupeMs = cacheOptions?.dedupeMs ?? 0;\n const inflight = inflightState.get(cacheKey);\n const allowDedupe = isCacheEnabled && dedupeMs > 0;\n\n if (allowDedupe && inflight && now - inflight.startedAt < dedupeMs) {\n emitStatus(\"pending\", { isBackground: opts?.isBackground, data: entry?.data });\n const result = await inflight.promise;\n\n if (result.error) {\n emitStatus(\"error\", { error: result.error, isBackground: opts?.isBackground });\n if (opts?.callCallbacks !== false) {\n clientOptions?.onError?.(result.error);\n }\n } else {\n emitStatus(\"success\", { data: result.data, isBackground: opts?.isBackground });\n if (opts?.callCallbacks !== false) {\n clientOptions?.onSuccess?.(result.data as any);\n }\n }\n\n return result;\n }\n\n emitStatus(opts?.isBackground ? \"revalidating\" : \"pending\", {\n isBackground: opts?.isBackground,\n });\n\n const promise = (async () => {\n const maxRetries = Math.max(0, clientOptions?.retry?.count ?? 0);\n let attempt = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n clientOptions?.onRequest?.({\n requestId,\n method: methodUpper,\n key: cacheKey,\n path,\n input,\n attempt,\n timestamp: Date.now(),\n });\n\n try {\n const { response, data } = await fetchClient(path, {\n ...input,\n method: methodUpper,\n });\n\n const error = response.ok ? null : createResponseError(response, data);\n\n const responseEvent: ResponseEvent<any, Error> = {\n requestId,\n method: methodUpper,\n key: cacheKey,\n path,\n input,\n attempt,\n timestamp: Date.now(),\n response,\n data: response.ok ? data : undefined,\n error: error ?? undefined,\n ok: response.ok,\n status: response.status,\n };\n\n clientOptions?.onResponse?.(response.ok ? data : undefined, error, responseEvent);\n\n if (!error) {\n return { data, error: null, key: cacheKey } as APIResult<any, Error>;\n }\n\n if (attempt >= maxRetries) {\n return { data: undefined, error, key: cacheKey } as APIResult<any, Error>;\n }\n } catch (err: any) {\n const error = normalizeError(err);\n const responseEvent: ResponseEvent<any, Error> = {\n requestId,\n method: methodUpper,\n key: cacheKey,\n path,\n input,\n attempt,\n timestamp: Date.now(),\n error,\n ok: false,\n };\n\n clientOptions?.onResponse?.(undefined, error, responseEvent);\n\n if (attempt >= maxRetries) {\n return { data: undefined, error, key: cacheKey } as APIResult<any, Error>;\n }\n }\n\n attempt += 1;\n const delay =\n typeof clientOptions?.retry?.delay === \"function\"\n ? clientOptions.retry.delay(attempt)\n : (clientOptions?.retry?.delay ?? 0);\n\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n })();\n\n inflightState.set(cacheKey, { promise, startedAt: now });\n\n try {\n const result = await promise;\n\n if (!result.error && isCacheEnabled) {\n const updatedAt = Date.now();\n cacheState.set(cacheKey, {\n data: result.data,\n updatedAt,\n staleAt: updatedAt + staleTime,\n gcAt: getGcAt(updatedAt, cacheOptions?.gcTime),\n invalidatedAt: undefined,\n });\n }\n\n if (result.error) {\n emitStatus(\"error\", { error: result.error, isBackground: opts?.isBackground });\n if (opts?.callCallbacks !== false) {\n clientOptions?.onError?.(result.error);\n }\n } else {\n emitStatus(\"success\", { data: result.data, isBackground: opts?.isBackground });\n if (opts?.callCallbacks !== false) {\n clientOptions?.onSuccess?.(result.data as any);\n }\n }\n\n return result;\n } finally {\n inflightState.delete(cacheKey);\n }\n };\n\n const invalidateTargets = async () => {\n if (!clientOptions?.invalidate) return;\n\n const invalidateOptions = Array.isArray(clientOptions.invalidate)\n ? { targets: clientOptions.invalidate, refetch: false }\n : {\n targets: clientOptions.invalidate.targets,\n refetch: clientOptions.invalidate.refetch ?? false,\n };\n\n for (const target of invalidateOptions.targets) {\n const targetKey = resolveTargetKey(routeMeta, target, undefined, baseURL);\n if (!targetKey) continue;\n\n const existing = cacheState.get(targetKey);\n if (existing) {\n cacheState.set(targetKey, {\n ...existing,\n staleAt: 0,\n invalidatedAt: Date.now(),\n });\n }\n\n emitStatus(\"invalidated\", { key: targetKey });\n\n if (invalidateOptions.refetch && existing && targetKey === cacheKey) {\n void executeNetwork({ isBackground: true, callCallbacks: false });\n }\n }\n };\n\n const optimisticSnapshots = applyOptimisticUpdates();\n\n if (isCacheEnabled) {\n if (entry && !isStale && policy !== \"network-only\") {\n emitStatus(\"success\", { data: entry.data });\n clientOptions?.onSuccess?.(entry.data);\n clientOptions?.onSettled?.(entry.data, null);\n return { data: entry.data, error: null, key: cacheKey };\n }\n\n if (entry && isStale && policy === \"stale-while-revalidate\") {\n emitStatus(\"success\", { data: entry.data });\n clientOptions?.onSuccess?.(entry.data);\n clientOptions?.onSettled?.(entry.data, null);\n\n void executeNetwork({ isBackground: true, callCallbacks: false });\n return { data: entry.data, error: null, key: cacheKey };\n }\n }\n\n const result = await executeNetwork();\n if (result.error) {\n rollbackOptimisticUpdates(optimisticSnapshots);\n }\n await invalidateTargets();\n clientOptions?.onSettled?.(result.data, result.error);\n return result;\n };\n\n // Return nested proxy (starts with empty path, user adds to it)\n return createNestedProxy([], request, routeMeta, baseURL, rootAliases) as APIClient<\n TRouter,\n TIntegrations\n >;\n}\n\n/**\n * Create a nested proxy that builds up the path\n *\n * Flow:\n * 1. api.hello -> Proxy(['hello'])\n * 2. api.hello.get -> Proxy(['hello', 'get'])\n * 3. api.hello.get({ query: {...} })\n * -> fetch('/api/hello', { method: 'GET', ... })\n *\n * For routes with single method:\n * 1. api.hello -> Proxy(['hello'])\n * 2. api.hello({ query: {...} })\n * -> fetch('/api/hello', ...)\n */\nfunction createNestedProxy(\n path: string[],\n client: any,\n routeMeta: WeakMap<AnyRouteRef, RouteMeta>,\n baseURL: string,\n rootAliases?: Record<string, unknown>,\n): any {\n const target = () => {};\n const proxy = new Proxy(target, {\n // When accessing a property (api.hello)\n get(_target, prop: string) {\n if (path.length === 0 && typeof prop === \"string\" && rootAliases && prop in rootAliases) {\n return rootAliases[prop];\n }\n\n // Add prop to path and return new proxy\n return createNestedProxy([...path, prop], client, routeMeta, baseURL, rootAliases);\n },\n\n // When calling as a function\n apply(_target, _thisArg, args) {\n // Check if the last part is an HTTP method\n const lastPart = path[path.length - 1];\n const httpMethods = [\"get\", \"post\", \"put\", \"delete\", \"patch\", \"options\", \"head\"];\n\n if (httpMethods.includes(lastPart)) {\n // Method is explicitly called: api.users.get() or api['auth/login'].post()\n // Remove the method from path and use it as the HTTP method\n const routePath = \"/api/\" + path.slice(0, -1).join(\"/\");\n const method = lastPart.toUpperCase();\n\n // Extract options from arguments\n const [options, clientOptions] = args;\n\n // Call fetch client with explicit method\n return client(routePath, method, options, clientOptions);\n } else {\n // Direct call without method: api.hello()\n // Use the full path and let the server determine the method (usually GET)\n const routePath = \"/api/\" + path.join(\"/\");\n\n // Extract options from arguments\n const [options, clientOptions] = args;\n\n // Call fetch client (default method will be GET)\n return client(routePath, options?.method || \"GET\", options, clientOptions);\n }\n },\n });\n\n routeMeta.set(proxy, { path: [...path], baseURL });\n return proxy;\n}\n\n/**\n * Server-side API client that calls endpoints directly as functions\n * No HTTP overhead for app endpoints, and registered integration routes can be exposed at\n * api.integrations.* where Farm can dispatch them directly to the integration handler.\n *\n * @example\n * ```typescript\n * import { createServerAPIClient } from 'farm/client';\n * import type { AppIntegrations } from '@/lib/integrations';\n *\n * export const api = createServerAPIClient<{}, AppIntegrations>({});\n *\n * const result = await api.integrations.billing.status();\n * ```\n */\nexport function createServerAPIClient<TEndpoints extends Record<string, any>>(\n endpoints: TEndpoints,\n): TEndpoints;\nexport function createServerAPIClient<TEndpoints extends Record<string, any>>(\n endpoints: TEndpoints,\n options: ServerAPIClientWithoutIntegrationsOptions,\n): TEndpoints;\nexport function createServerAPIClient<\n TEndpoints extends Record<string, any>,\n TIntegrations extends Record<string, any> = {},\n>(\n endpoints: TEndpoints,\n options?: ServerAPIClientOptions,\n): ServerAPIClient<TEndpoints, TIntegrations>;\nexport function createServerAPIClient<\n TEndpoints extends Record<string, any>,\n TIntegrations extends Record<string, any> = {},\n>(\n endpoints: TEndpoints,\n options: ServerAPIClientOptions | ServerAPIClientWithoutIntegrationsOptions = {},\n): TEndpoints | ServerAPIClient<TEndpoints, TIntegrations> {\n if (\n options.integrations === false ||\n Object.prototype.hasOwnProperty.call(endpoints, \"integrations\")\n ) {\n return endpoints;\n }\n\n Object.defineProperty(endpoints, \"integrations\", {\n get() {\n return integrationsServer<TIntegrations>(\n typeof options.integrations === \"object\" ? options.integrations : {},\n );\n },\n enumerable: false,\n configurable: true,\n });\n\n return endpoints as ServerAPIClient<TEndpoints, TIntegrations>;\n}\n\ntype CacheEntry = FarmClientCacheEntry<any>;\n\ntype InflightEntry = {\n promise: Promise<APIResult<any, Error>>;\n startedAt: number;\n};\n\ntype RouteMeta = {\n path: string[];\n baseURL: string;\n};\n\ntype OptimisticSnapshot = {\n key: string;\n entry?: CacheEntry;\n};\n\nfunction buildCacheKey(method: string, path: string, input: any, baseURL: string): string {\n const keyInput =\n input && typeof input === \"object\" ? { query: input.query, body: input.body } : input;\n const url = new URL(path, baseURL);\n return `${method}:${url.origin}${url.pathname}:${stableStringify(keyInput ?? {})}`;\n}\n\nfunction stableStringify(value: any): string {\n if (value === null || value === undefined) return String(value);\n if (value instanceof Date) return value.toISOString();\n if (typeof value !== \"object\") return JSON.stringify(value);\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableStringify(item)).join(\",\")}]`;\n }\n\n const keys = Object.keys(value).sort();\n const entries = keys.map((key) => `${JSON.stringify(key)}:${stableStringify(value[key])}`);\n return `{${entries.join(\",\")}}`;\n}\n\nfunction getGcAt(now: number, gcTime?: number): number | undefined {\n if (gcTime === undefined) return undefined;\n if (!Number.isFinite(gcTime) || gcTime <= 0) return now;\n return now + gcTime;\n}\n\nfunction getValidCacheEntry(\n cacheState: FarmClientDataCache,\n key: string,\n now: number,\n): CacheEntry | undefined {\n const entry = cacheState.get(key);\n if (!entry) return undefined;\n\n if (entry.gcAt !== undefined && now >= entry.gcAt) {\n cacheState.delete(key);\n return undefined;\n }\n\n return entry;\n}\n\nfunction isEntryStale(entry: CacheEntry, now: number): boolean {\n if (entry.invalidatedAt !== undefined) return true;\n return now >= entry.staleAt;\n}\n\nfunction resolveTargetKey(\n routeMeta: WeakMap<AnyRouteRef, RouteMeta>,\n target: InvalidateTarget | AnyRouteRef,\n input?: unknown,\n baseURL = \"http://localhost:3000\",\n): string | null {\n if (!target) return null;\n\n if (typeof target === \"string\") return target;\n\n if (typeof target === \"function\") {\n const meta = routeMeta.get(target);\n if (!meta) return null;\n\n const { method, routePath } = resolveRouteMeta(meta);\n return buildCacheKey(method, routePath, input ?? {}, meta.baseURL);\n }\n\n if (Array.isArray(target)) {\n const [route, routeInput] = target;\n return resolveTargetKey(routeMeta, route, routeInput, baseURL);\n }\n\n if (\"key\" in target) return normalizeFarmClientCacheKey(target.key);\n\n if (\"path\" in target) {\n const method = target.method ?? \"GET\";\n return buildCacheKey(method, target.path, target.input ?? {}, baseURL);\n }\n\n return null;\n}\n\nfunction resolveRouteMeta(meta: RouteMeta): { routePath: string; method: string } {\n const httpMethods = [\"get\", \"post\", \"put\", \"delete\", \"patch\", \"options\", \"head\"];\n const lastPart = meta.path[meta.path.length - 1];\n if (lastPart && httpMethods.includes(lastPart)) {\n return {\n routePath: \"/api/\" + meta.path.slice(0, -1).join(\"/\"),\n method: lastPart.toUpperCase(),\n };\n }\n\n return {\n routePath: \"/api/\" + meta.path.join(\"/\"),\n method: \"GET\",\n };\n}\n\nfunction normalizeError(error: unknown): Error {\n if (error instanceof Error) return error;\n return new Error(typeof error === \"string\" ? error : \"Unknown error\");\n}\n\nfunction createResponseError(response: Response, data: any): Error {\n const error = new Error(`HTTP ${response.status}: ${response.statusText}`);\n (error as any).status = response.status;\n (error as any).response = response;\n (error as any).data = data;\n return error;\n}\n"],"mappings":"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","names":["result","createResponseError"]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__name
|
|
3
|
+
} from "./chunk-CGILA3WO.mjs";
|
|
4
|
+
|
|
5
|
+
// src/server/response.ts
|
|
6
|
+
import { once } from "events";
|
|
7
|
+
async function sendWebResponse(res, response) {
|
|
8
|
+
res.statusCode = response.status;
|
|
9
|
+
const responseHeaders = response.headers;
|
|
10
|
+
const setCookies = responseHeaders.getSetCookie?.() || [];
|
|
11
|
+
if (setCookies.length > 0) {
|
|
12
|
+
res.setHeader("Set-Cookie", setCookies);
|
|
13
|
+
}
|
|
14
|
+
response.headers.forEach((value, key) => {
|
|
15
|
+
if (key.toLowerCase() === "set-cookie" && setCookies.length > 0) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
res.setHeader(key, value);
|
|
19
|
+
});
|
|
20
|
+
if (!response.body) {
|
|
21
|
+
res.end();
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (typeof res.write !== "function") {
|
|
25
|
+
const body = await response.arrayBuffer();
|
|
26
|
+
res.end(Buffer.from(body));
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const reader = response.body.getReader();
|
|
30
|
+
try {
|
|
31
|
+
while (true) {
|
|
32
|
+
const { done, value } = await reader.read();
|
|
33
|
+
if (done) {
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
if (!value || value.byteLength === 0) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (!res.write(value)) {
|
|
40
|
+
await once(res, "drain");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
res.end();
|
|
44
|
+
} catch (error) {
|
|
45
|
+
if (!res.writableEnded) {
|
|
46
|
+
const responseError = error instanceof Error ? error : new Error(String(error));
|
|
47
|
+
if (typeof res.destroy === "function") {
|
|
48
|
+
res.destroy(responseError);
|
|
49
|
+
} else {
|
|
50
|
+
res.end();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
throw error;
|
|
54
|
+
} finally {
|
|
55
|
+
reader.releaseLock();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
__name(sendWebResponse, "sendWebResponse");
|
|
59
|
+
|
|
60
|
+
export {
|
|
61
|
+
sendWebResponse
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=chunk-QGOHVJ6J.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/response.ts"],"sourcesContent":["import { once } from \"node:events\";\nimport type { ServerResponse } from \"node:http\";\n\nexport async function sendWebResponse(res: ServerResponse, response: Response): Promise<void> {\n res.statusCode = response.status;\n\n const responseHeaders = response.headers as Headers & {\n getSetCookie?: () => string[];\n };\n const setCookies = responseHeaders.getSetCookie?.() || [];\n if (setCookies.length > 0) {\n res.setHeader(\"Set-Cookie\", setCookies);\n }\n\n response.headers.forEach((value, key) => {\n if (key.toLowerCase() === \"set-cookie\" && setCookies.length > 0) {\n return;\n }\n res.setHeader(key, value);\n });\n\n if (!response.body) {\n res.end();\n return;\n }\n\n if (typeof res.write !== \"function\") {\n const body = await response.arrayBuffer();\n res.end(Buffer.from(body));\n return;\n }\n\n const reader = response.body.getReader();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n if (!value || value.byteLength === 0) {\n continue;\n }\n\n if (!res.write(value)) {\n await once(res, \"drain\");\n }\n }\n\n res.end();\n } catch (error) {\n if (!res.writableEnded) {\n const responseError = error instanceof Error ? error : new Error(String(error));\n if (typeof res.destroy === \"function\") {\n res.destroy(responseError);\n } else {\n res.end();\n }\n }\n throw error;\n } finally {\n reader.releaseLock();\n }\n}\n"],"mappings":";;;;;AAAA,SAAS,YAAY;AAGrB,eAAsB,gBAAgB,KAAqB,UAAmC;AAC5F,MAAI,aAAa,SAAS;AAE1B,QAAM,kBAAkB,SAAS;AAGjC,QAAM,aAAa,gBAAgB,eAAe,KAAK,CAAC;AACxD,MAAI,WAAW,SAAS,GAAG;AACzB,QAAI,UAAU,cAAc,UAAU;AAAA,EACxC;AAEA,WAAS,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AACvC,QAAI,IAAI,YAAY,MAAM,gBAAgB,WAAW,SAAS,GAAG;AAC/D;AAAA,IACF;AACA,QAAI,UAAU,KAAK,KAAK;AAAA,EAC1B,CAAC;AAED,MAAI,CAAC,SAAS,MAAM;AAClB,QAAI,IAAI;AACR;AAAA,EACF;AAEA,MAAI,OAAO,IAAI,UAAU,YAAY;AACnC,UAAM,OAAO,MAAM,SAAS,YAAY;AACxC,QAAI,IAAI,OAAO,KAAK,IAAI,CAAC;AACzB;AAAA,EACF;AAEA,QAAM,SAAS,SAAS,KAAK,UAAU;AAEvC,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,MAAM;AACR;AAAA,MACF;AAEA,UAAI,CAAC,SAAS,MAAM,eAAe,GAAG;AACpC;AAAA,MACF;AAEA,UAAI,CAAC,IAAI,MAAM,KAAK,GAAG;AACrB,cAAM,KAAK,KAAK,OAAO;AAAA,MACzB;AAAA,IACF;AAEA,QAAI,IAAI;AAAA,EACV,SAAS,OAAO;AACd,QAAI,CAAC,IAAI,eAAe;AACtB,YAAM,gBAAgB,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAC9E,UAAI,OAAO,IAAI,YAAY,YAAY;AACrC,YAAI,QAAQ,aAAa;AAAA,MAC3B,OAAO;AACL,YAAI,IAAI;AAAA,MACV;AAAA,IACF;AACA,UAAM;AAAA,EACR,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AACF;AA7DsB;","names":[]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__name
|
|
3
|
+
} from "./chunk-CGILA3WO.mjs";
|
|
4
|
+
|
|
5
|
+
// src/route-context.ts
|
|
6
|
+
var FARM_ROUTE_CONTEXT_SYMBOL = /* @__PURE__ */ Symbol.for("farm.routeContext");
|
|
7
|
+
async function resolveFarmRouteContext(config, input) {
|
|
8
|
+
if (typeof config.context !== "function") {
|
|
9
|
+
return void 0;
|
|
10
|
+
}
|
|
11
|
+
return config.context(input);
|
|
12
|
+
}
|
|
13
|
+
__name(resolveFarmRouteContext, "resolveFarmRouteContext");
|
|
14
|
+
function withFarmRouteContext(props, context) {
|
|
15
|
+
if (context === void 0) {
|
|
16
|
+
return props;
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(props, FARM_ROUTE_CONTEXT_SYMBOL, {
|
|
19
|
+
value: context,
|
|
20
|
+
enumerable: false,
|
|
21
|
+
configurable: true
|
|
22
|
+
});
|
|
23
|
+
return props;
|
|
24
|
+
}
|
|
25
|
+
__name(withFarmRouteContext, "withFarmRouteContext");
|
|
26
|
+
function getFarmRouteContext(props) {
|
|
27
|
+
if (!props || typeof props !== "object") {
|
|
28
|
+
return void 0;
|
|
29
|
+
}
|
|
30
|
+
return props[FARM_ROUTE_CONTEXT_SYMBOL];
|
|
31
|
+
}
|
|
32
|
+
__name(getFarmRouteContext, "getFarmRouteContext");
|
|
33
|
+
|
|
34
|
+
export {
|
|
35
|
+
resolveFarmRouteContext,
|
|
36
|
+
withFarmRouteContext,
|
|
37
|
+
getFarmRouteContext
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=chunk-QKVUNGAH.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/route-context.ts"],"sourcesContent":["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"],"mappings":";;;;;AAEO,IAAM,4BAA4B,uBAAO,IAAI,mBAAmB;AAMvE,eAAsB,wBACpB,QACA,OACkB;AAClB,MAAI,OAAO,OAAO,YAAY,YAAY;AACxC,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,QAAQ,KAAK;AAC7B;AATsB;AAWf,SAAS,qBACd,OACA,SAC4C;AAC5C,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AAEA,SAAO,eAAe,OAAO,2BAA2B;AAAA,IACtD,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AAED,SAAO;AACT;AAfgB;AAiBT,SAAS,oBAAwC,OAAsC;AAC5F,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,SAAQ,MAA4C,yBAAyB;AAC/E;AANgB;","names":[]}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__name
|
|
3
|
+
} from "./chunk-CGILA3WO.mjs";
|
|
4
|
+
|
|
5
|
+
// src/route-runtime.ts
|
|
6
|
+
function normalizeFarmRouteRuntimeConfig(value, source = "Route configuration") {
|
|
7
|
+
if (!value) return {};
|
|
8
|
+
const normalized = {};
|
|
9
|
+
if (value.runtime !== void 0) {
|
|
10
|
+
if (value.runtime !== "auto" && value.runtime !== "node" && value.runtime !== "edge") {
|
|
11
|
+
throw new TypeError(`${source} runtime must be "auto", "node", or "edge"`);
|
|
12
|
+
}
|
|
13
|
+
normalized.runtime = value.runtime;
|
|
14
|
+
}
|
|
15
|
+
if (value.regions !== void 0) {
|
|
16
|
+
if (value.regions === "auto") {
|
|
17
|
+
normalized.regions = "auto";
|
|
18
|
+
} else {
|
|
19
|
+
if (!Array.isArray(value.regions) || value.regions.length === 0) {
|
|
20
|
+
throw new TypeError(`${source} regions must be "auto" or a non-empty string array`);
|
|
21
|
+
}
|
|
22
|
+
const regions = Array.from(
|
|
23
|
+
new Set(
|
|
24
|
+
value.regions.map((region) => {
|
|
25
|
+
if (typeof region !== "string" || !region.trim() || /[\u0000-\u001f\u007f]/.test(region)) {
|
|
26
|
+
throw new TypeError(`${source} regions must contain non-empty region identifiers`);
|
|
27
|
+
}
|
|
28
|
+
return region.trim();
|
|
29
|
+
})
|
|
30
|
+
)
|
|
31
|
+
);
|
|
32
|
+
normalized.regions = regions;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (value.maxDuration !== void 0) {
|
|
36
|
+
if (value.maxDuration === "auto") {
|
|
37
|
+
normalized.maxDuration = "auto";
|
|
38
|
+
} else if (typeof value.maxDuration !== "number" || !Number.isInteger(value.maxDuration) || value.maxDuration <= 0) {
|
|
39
|
+
throw new TypeError(`${source} maxDuration must be "auto" or a positive integer in seconds`);
|
|
40
|
+
} else {
|
|
41
|
+
normalized.maxDuration = value.maxDuration;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return normalized;
|
|
45
|
+
}
|
|
46
|
+
__name(normalizeFarmRouteRuntimeConfig, "normalizeFarmRouteRuntimeConfig");
|
|
47
|
+
function mergeFarmRouteRuntimeConfigs(...configs) {
|
|
48
|
+
const merged = {};
|
|
49
|
+
for (const config of configs) {
|
|
50
|
+
if (!config) continue;
|
|
51
|
+
if (config.runtime !== void 0) merged.runtime = config.runtime;
|
|
52
|
+
if (config.regions !== void 0) merged.regions = config.regions;
|
|
53
|
+
if (config.maxDuration !== void 0) merged.maxDuration = config.maxDuration;
|
|
54
|
+
}
|
|
55
|
+
return merged;
|
|
56
|
+
}
|
|
57
|
+
__name(mergeFarmRouteRuntimeConfigs, "mergeFarmRouteRuntimeConfigs");
|
|
58
|
+
function resolveFarmRouteRuntimeConfig(config, source) {
|
|
59
|
+
const normalized = normalizeFarmRouteRuntimeConfig(config, source);
|
|
60
|
+
return {
|
|
61
|
+
runtime: normalized.runtime ?? "auto",
|
|
62
|
+
...normalized.regions && normalized.regions !== "auto" ? { regions: [...normalized.regions] } : {},
|
|
63
|
+
...typeof normalized.maxDuration === "number" ? { maxDuration: normalized.maxDuration } : {}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
__name(resolveFarmRouteRuntimeConfig, "resolveFarmRouteRuntimeConfig");
|
|
67
|
+
function hasFarmRouteRuntimeControls(config) {
|
|
68
|
+
return Boolean(
|
|
69
|
+
config && (config.runtime !== void 0 || config.regions !== void 0 || config.maxDuration !== void 0)
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
__name(hasFarmRouteRuntimeControls, "hasFarmRouteRuntimeControls");
|
|
73
|
+
function getFarmRouteRuntimeConfig(value) {
|
|
74
|
+
if (!value || typeof value !== "object") return {};
|
|
75
|
+
const route = value;
|
|
76
|
+
return {
|
|
77
|
+
...route.runtime !== void 0 ? { runtime: route.runtime } : {},
|
|
78
|
+
...route.regions !== void 0 ? { regions: route.regions } : {},
|
|
79
|
+
...route.maxDuration !== void 0 ? { maxDuration: route.maxDuration } : {}
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
__name(getFarmRouteRuntimeConfig, "getFarmRouteRuntimeConfig");
|
|
83
|
+
function createFarmRouteRuntimeKey(config) {
|
|
84
|
+
return JSON.stringify({
|
|
85
|
+
runtime: config.runtime,
|
|
86
|
+
regions: config.regions || null,
|
|
87
|
+
maxDuration: config.maxDuration || null
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
__name(createFarmRouteRuntimeKey, "createFarmRouteRuntimeKey");
|
|
91
|
+
function resolveFarmRouteRuleRuntimeConfig(pathname, routeRules) {
|
|
92
|
+
if (!routeRules) return {};
|
|
93
|
+
const matches = Object.entries(routeRules).filter(
|
|
94
|
+
([pattern, rule]) => hasFarmRouteRuntimeControls(rule) && farmRouteRuleMatches(pattern, pathname)
|
|
95
|
+
).sort(([left], [right]) => compareFarmRouteRuleSpecificity(left, right));
|
|
96
|
+
return mergeFarmRouteRuntimeConfigs(...matches.map(([, rule]) => rule));
|
|
97
|
+
}
|
|
98
|
+
__name(resolveFarmRouteRuleRuntimeConfig, "resolveFarmRouteRuleRuntimeConfig");
|
|
99
|
+
function farmRouteRuleMatches(pattern, pathname) {
|
|
100
|
+
const normalizedPattern = normalizeRoutePattern(pattern);
|
|
101
|
+
const normalizedPathname = normalizeRoutePattern(pathname);
|
|
102
|
+
if (normalizedPattern === normalizedPathname) return true;
|
|
103
|
+
const expression = normalizedPattern.split("/").filter(Boolean).map((segment) => {
|
|
104
|
+
if (segment === "**") return ".*";
|
|
105
|
+
if (segment === "*") return "[^/]+";
|
|
106
|
+
if (/^\[\[\.\.\..+\]\]$/.test(segment)) return ".*";
|
|
107
|
+
if (/^\[\.\.\..+\]$/.test(segment)) return ".+";
|
|
108
|
+
if (/^\[.+\]$/.test(segment) || /^:.+$/.test(segment)) return "[^/]+";
|
|
109
|
+
return escapeRegExp(segment);
|
|
110
|
+
}).join("/");
|
|
111
|
+
return new RegExp(`^/${expression}/?$`).test(normalizedPathname);
|
|
112
|
+
}
|
|
113
|
+
__name(farmRouteRuleMatches, "farmRouteRuleMatches");
|
|
114
|
+
function compareFarmRouteRuleSpecificity(left, right) {
|
|
115
|
+
const leftScore = getFarmRouteRuleSpecificity(left);
|
|
116
|
+
const rightScore = getFarmRouteRuleSpecificity(right);
|
|
117
|
+
return leftScore - rightScore || left.localeCompare(right);
|
|
118
|
+
}
|
|
119
|
+
__name(compareFarmRouteRuleSpecificity, "compareFarmRouteRuleSpecificity");
|
|
120
|
+
function getFarmRouteRuleSpecificity(pattern) {
|
|
121
|
+
return normalizeRoutePattern(pattern).split("/").filter(Boolean).reduce((score, segment) => {
|
|
122
|
+
if (segment === "**" || /^\[\[\.\.\./.test(segment)) return score + 1;
|
|
123
|
+
if (segment === "*" || /^\[\.\.\./.test(segment)) return score + 10;
|
|
124
|
+
if (/^\[.+\]$/.test(segment) || /^:.+$/.test(segment)) return score + 50;
|
|
125
|
+
return score + 100;
|
|
126
|
+
}, 0);
|
|
127
|
+
}
|
|
128
|
+
__name(getFarmRouteRuleSpecificity, "getFarmRouteRuleSpecificity");
|
|
129
|
+
function normalizeRoutePattern(value) {
|
|
130
|
+
const withSlash = value.trim().startsWith("/") ? value.trim() : `/${value.trim()}`;
|
|
131
|
+
return withSlash.length > 1 ? withSlash.replace(/\/+$/, "") : withSlash;
|
|
132
|
+
}
|
|
133
|
+
__name(normalizeRoutePattern, "normalizeRoutePattern");
|
|
134
|
+
function escapeRegExp(value) {
|
|
135
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
136
|
+
}
|
|
137
|
+
__name(escapeRegExp, "escapeRegExp");
|
|
138
|
+
|
|
139
|
+
export {
|
|
140
|
+
normalizeFarmRouteRuntimeConfig,
|
|
141
|
+
mergeFarmRouteRuntimeConfigs,
|
|
142
|
+
resolveFarmRouteRuntimeConfig,
|
|
143
|
+
hasFarmRouteRuntimeControls,
|
|
144
|
+
getFarmRouteRuntimeConfig,
|
|
145
|
+
createFarmRouteRuntimeKey,
|
|
146
|
+
resolveFarmRouteRuleRuntimeConfig,
|
|
147
|
+
farmRouteRuleMatches
|
|
148
|
+
};
|
|
149
|
+
//# sourceMappingURL=chunk-QM6VV26B.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/route-runtime.ts"],"sourcesContent":["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"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import {
|
|
2
|
+
_setCurrentRequestResolver
|
|
3
|
+
} from "./chunk-LM2YNO4U.mjs";
|
|
4
|
+
import {
|
|
5
|
+
__name
|
|
6
|
+
} from "./chunk-CGILA3WO.mjs";
|
|
7
|
+
|
|
8
|
+
// src/server/request.ts
|
|
9
|
+
import { AsyncLocalStorage } from "async_hooks";
|
|
10
|
+
var REQUEST_STORAGE_KEY = /* @__PURE__ */ Symbol.for("@farm.js/core/request-storage");
|
|
11
|
+
function getRequestStore() {
|
|
12
|
+
const runtime = globalThis;
|
|
13
|
+
const existing = runtime[REQUEST_STORAGE_KEY];
|
|
14
|
+
if (existing instanceof AsyncLocalStorage) {
|
|
15
|
+
return existing;
|
|
16
|
+
}
|
|
17
|
+
const storage = new AsyncLocalStorage();
|
|
18
|
+
runtime[REQUEST_STORAGE_KEY] = storage;
|
|
19
|
+
return storage;
|
|
20
|
+
}
|
|
21
|
+
__name(getRequestStore, "getRequestStore");
|
|
22
|
+
var requestStore = getRequestStore();
|
|
23
|
+
_setCurrentRequestResolver(() => requestStore.getStore());
|
|
24
|
+
function createWebRequestFromFarmRequest(req) {
|
|
25
|
+
const forwardedHost = req.headers["x-forwarded-host"];
|
|
26
|
+
const host = Array.isArray(forwardedHost) ? forwardedHost[0] : forwardedHost || req.headers.host || "localhost";
|
|
27
|
+
const forwardedProto = req.headers["x-forwarded-proto"];
|
|
28
|
+
const proto = Array.isArray(forwardedProto) ? forwardedProto[0] : forwardedProto || "http";
|
|
29
|
+
const fullUrl = new URL(req.url || "/", `${proto}://${host}`).toString();
|
|
30
|
+
const headers = new Headers();
|
|
31
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
32
|
+
if (value == null) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (Array.isArray(value)) {
|
|
36
|
+
for (const item of value) {
|
|
37
|
+
headers.append(key, item);
|
|
38
|
+
}
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
headers.set(key, value);
|
|
42
|
+
}
|
|
43
|
+
return new Request(fullUrl, {
|
|
44
|
+
method: req.method,
|
|
45
|
+
headers
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
__name(createWebRequestFromFarmRequest, "createWebRequestFromFarmRequest");
|
|
49
|
+
async function _runWithCurrentRequest(request, fn) {
|
|
50
|
+
return requestStore.run(request, fn);
|
|
51
|
+
}
|
|
52
|
+
__name(_runWithCurrentRequest, "_runWithCurrentRequest");
|
|
53
|
+
function getCurrentRequest() {
|
|
54
|
+
const request = requestStore.getStore();
|
|
55
|
+
if (!request) {
|
|
56
|
+
throw new Error(
|
|
57
|
+
"No current request is available. getCurrentRequest() can only be used during server rendering."
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
return request;
|
|
61
|
+
}
|
|
62
|
+
__name(getCurrentRequest, "getCurrentRequest");
|
|
63
|
+
|
|
64
|
+
export {
|
|
65
|
+
createWebRequestFromFarmRequest,
|
|
66
|
+
_runWithCurrentRequest,
|
|
67
|
+
getCurrentRequest
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=chunk-RHIFZZUI.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/request.ts"],"sourcesContent":["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"],"mappings":";;;;;;;;AAAA,SAAS,yBAAyB;AAIlC,IAAM,sBAAsB,uBAAO,IAAI,+BAA+B;AAEtE,SAAS,kBAA8C;AACrD,QAAM,UAAU;AAChB,QAAM,WAAW,QAAQ,mBAAmB;AAC5C,MAAI,oBAAoB,mBAAmB;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,IAAI,kBAA2B;AAC/C,UAAQ,mBAAmB,IAAI;AAC/B,SAAO;AACT;AAVS;AAYT,IAAM,eAAe,gBAAgB;AAErC,2BAA2B,MAAM,aAAa,SAAS,CAAC;AAEjD,SAAS,gCAAgC,KAA2B;AACzE,QAAM,gBAAgB,IAAI,QAAQ,kBAAkB;AACpD,QAAM,OAAO,MAAM,QAAQ,aAAa,IACpC,cAAc,CAAC,IACf,iBAAiB,IAAI,QAAQ,QAAQ;AACzC,QAAM,iBAAiB,IAAI,QAAQ,mBAAmB;AACtD,QAAM,QAAQ,MAAM,QAAQ,cAAc,IAAI,eAAe,CAAC,IAAI,kBAAkB;AACpF,QAAM,UAAU,IAAI,IAAI,IAAI,OAAO,KAAK,GAAG,KAAK,MAAM,IAAI,EAAE,EAAE,SAAS;AAEvE,QAAM,UAAU,IAAI,QAAQ;AAC5B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,OAAO,GAAG;AACtD,QAAI,SAAS,MAAM;AACjB;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,iBAAW,QAAQ,OAAO;AACxB,gBAAQ,OAAO,KAAK,IAAI;AAAA,MAC1B;AACA;AAAA,IACF;AAEA,YAAQ,IAAI,KAAK,KAAK;AAAA,EACxB;AAEA,SAAO,IAAI,QAAQ,SAAS;AAAA,IAC1B,QAAQ,IAAI;AAAA,IACZ;AAAA,EACF,CAAC;AACH;AA7BgB;AA+BhB,eAAsB,uBACpB,SACA,IACY;AACZ,SAAO,aAAa,IAAI,SAAS,EAAE;AACrC;AALsB;AAOf,SAAS,oBAA6B;AAC3C,QAAM,UAAU,aAAa,SAAS;AACtC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AATgB;","names":[]}
|