@farm.js/core 0.1.0-beta.6 → 0.1.0-beta.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/after.cjs +227 -0
- package/dist/after.cjs.map +1 -0
- package/dist/after.d.mts +25 -0
- package/dist/after.d.ts +25 -0
- package/dist/after.mjs +14 -0
- package/dist/after.mjs.map +1 -0
- package/dist/agent-runtime.cjs +2379 -0
- package/dist/agent-runtime.cjs.map +1 -0
- package/dist/agent-runtime.d.mts +94 -0
- package/dist/agent-runtime.d.ts +94 -0
- package/dist/agent-runtime.mjs +479 -0
- package/dist/agent-runtime.mjs.map +1 -0
- package/dist/api/route-manager.d.mts +66 -0
- package/dist/api/route-manager.d.ts +66 -0
- package/dist/api/runtime.d.mts +3 -0
- package/dist/api/runtime.d.ts +3 -0
- package/dist/api.cjs +4100 -0
- package/dist/api.cjs.map +1 -0
- package/dist/api.d.mts +48 -0
- package/dist/api.d.ts +48 -0
- package/dist/api.mjs +93 -0
- package/dist/api.mjs.map +1 -0
- package/dist/app-BWtqQu3R.d.mts +302 -0
- package/dist/app-markdown.cjs +244 -0
- package/dist/app-markdown.cjs.map +1 -0
- package/dist/app-markdown.d.mts +22 -0
- package/dist/app-markdown.d.ts +22 -0
- package/dist/app-markdown.mjs +27 -0
- package/dist/app-markdown.mjs.map +1 -0
- package/dist/app-xltejvLY.d.ts +302 -0
- package/dist/cache.cjs +945 -0
- package/dist/cache.cjs.map +1 -0
- package/dist/cache.d.mts +192 -0
- package/dist/cache.d.ts +192 -0
- package/dist/cache.mjs +46 -0
- package/dist/cache.mjs.map +1 -0
- package/dist/chunk-2ED5Q2GH.mjs +422 -0
- package/dist/chunk-2ED5Q2GH.mjs.map +1 -0
- package/dist/chunk-32W4QEJP.mjs +158 -0
- package/dist/chunk-32W4QEJP.mjs.map +1 -0
- package/dist/chunk-3XNTL3FQ.mjs +452 -0
- package/dist/chunk-3XNTL3FQ.mjs.map +1 -0
- package/dist/chunk-44ZCFSKE.mjs +84 -0
- package/dist/chunk-44ZCFSKE.mjs.map +1 -0
- package/dist/chunk-4MGVSBRP.mjs +7787 -0
- package/dist/chunk-4MGVSBRP.mjs.map +1 -0
- package/dist/chunk-4S3ORGFA.mjs +44 -0
- package/dist/chunk-4S3ORGFA.mjs.map +1 -0
- package/dist/chunk-5BY76U2M.mjs +1 -0
- package/dist/chunk-5BY76U2M.mjs.map +1 -0
- package/dist/chunk-5ZGPRGWV.mjs +136 -0
- package/dist/chunk-5ZGPRGWV.mjs.map +1 -0
- package/dist/chunk-65A7QIKI.mjs +142 -0
- package/dist/chunk-65A7QIKI.mjs.map +1 -0
- package/dist/chunk-74YTBPTY.mjs +450 -0
- package/dist/chunk-74YTBPTY.mjs.map +1 -0
- package/dist/chunk-7FBJLMQH.mjs +338 -0
- package/dist/chunk-7FBJLMQH.mjs.map +1 -0
- package/dist/chunk-7HO6AEOP.mjs +74 -0
- package/dist/chunk-7HO6AEOP.mjs.map +1 -0
- package/dist/chunk-7MABZJIM.mjs +29 -0
- package/dist/chunk-7MABZJIM.mjs.map +1 -0
- package/dist/chunk-7N62DNSO.mjs +41 -0
- package/dist/chunk-7N62DNSO.mjs.map +1 -0
- package/dist/chunk-7ZY5AIJO.mjs +161 -0
- package/dist/chunk-7ZY5AIJO.mjs.map +1 -0
- package/dist/chunk-ALCLXXTY.mjs +187 -0
- package/dist/chunk-ALCLXXTY.mjs.map +1 -0
- package/dist/chunk-AZ7YUVNR.mjs +65 -0
- package/dist/chunk-AZ7YUVNR.mjs.map +1 -0
- package/dist/chunk-B232I2GP.mjs +163 -0
- package/dist/chunk-B232I2GP.mjs.map +1 -0
- package/dist/chunk-B4W3BNTL.mjs +483 -0
- package/dist/chunk-B4W3BNTL.mjs.map +1 -0
- package/dist/chunk-C2ROET2V.mjs +718 -0
- package/dist/chunk-C2ROET2V.mjs.map +1 -0
- package/dist/chunk-CGILA3WO.mjs +14 -0
- package/dist/chunk-CGILA3WO.mjs.map +1 -0
- package/dist/chunk-CGIXMLSY.mjs +184 -0
- package/dist/chunk-CGIXMLSY.mjs.map +1 -0
- package/dist/chunk-DJSGLHCN.mjs +597 -0
- package/dist/chunk-DJSGLHCN.mjs.map +1 -0
- package/dist/chunk-E2MPIBRE.mjs +149 -0
- package/dist/chunk-E2MPIBRE.mjs.map +1 -0
- package/dist/chunk-E6EPN5BT.mjs +203 -0
- package/dist/chunk-E6EPN5BT.mjs.map +1 -0
- package/dist/chunk-EI43C4RA.mjs +6277 -0
- package/dist/chunk-EI43C4RA.mjs.map +1 -0
- package/dist/chunk-EJ7T4TPB.mjs +622 -0
- package/dist/chunk-EJ7T4TPB.mjs.map +1 -0
- package/dist/chunk-FQYDHKKU.mjs +128 -0
- package/dist/chunk-FQYDHKKU.mjs.map +1 -0
- package/dist/chunk-FRPWCMMG.mjs +299 -0
- package/dist/chunk-FRPWCMMG.mjs.map +1 -0
- package/dist/chunk-GN72QAIH.mjs +146 -0
- package/dist/chunk-GN72QAIH.mjs.map +1 -0
- package/dist/chunk-GQVGIUSN.mjs +149 -0
- package/dist/chunk-GQVGIUSN.mjs.map +1 -0
- package/dist/chunk-GS6K5OCM.mjs +407 -0
- package/dist/chunk-GS6K5OCM.mjs.map +1 -0
- package/dist/chunk-GXASWWJU.mjs +364 -0
- package/dist/chunk-GXASWWJU.mjs.map +1 -0
- package/dist/chunk-GY2STC2S.mjs +180 -0
- package/dist/chunk-GY2STC2S.mjs.map +1 -0
- package/dist/chunk-H2FA2SBS.mjs +51 -0
- package/dist/chunk-H2FA2SBS.mjs.map +1 -0
- package/dist/chunk-I4CUBGVF.mjs +93 -0
- package/dist/chunk-I4CUBGVF.mjs.map +1 -0
- package/dist/chunk-ITN462YM.mjs +98 -0
- package/dist/chunk-ITN462YM.mjs.map +1 -0
- package/dist/chunk-J23HNLFY.mjs +72 -0
- package/dist/chunk-J23HNLFY.mjs.map +1 -0
- package/dist/chunk-J4FNJ5IU.mjs +179 -0
- package/dist/chunk-J4FNJ5IU.mjs.map +1 -0
- package/dist/chunk-J5YWQVI5.mjs +211 -0
- package/dist/chunk-J5YWQVI5.mjs.map +1 -0
- package/dist/chunk-JDEOUK5V.mjs +427 -0
- package/dist/chunk-JDEOUK5V.mjs.map +1 -0
- package/dist/chunk-JK25YEN6.mjs +219 -0
- package/dist/chunk-JK25YEN6.mjs.map +1 -0
- package/dist/chunk-K4667E2Q.mjs +1916 -0
- package/dist/chunk-K4667E2Q.mjs.map +1 -0
- package/dist/chunk-LGHEOHBU.mjs +218 -0
- package/dist/chunk-LGHEOHBU.mjs.map +1 -0
- package/dist/chunk-LM2YNO4U.mjs +24 -0
- package/dist/chunk-LM2YNO4U.mjs.map +1 -0
- package/dist/chunk-ME4MO2RJ.mjs +3540 -0
- package/dist/chunk-ME4MO2RJ.mjs.map +1 -0
- package/dist/chunk-MIUW47JX.mjs +639 -0
- package/dist/chunk-MIUW47JX.mjs.map +1 -0
- package/dist/chunk-NNLCAVB6.mjs +391 -0
- package/dist/chunk-NNLCAVB6.mjs.map +1 -0
- package/dist/chunk-P7QDS5AT.mjs +191 -0
- package/dist/chunk-P7QDS5AT.mjs.map +1 -0
- package/dist/chunk-PFE6GMNE.mjs +603 -0
- package/dist/chunk-PFE6GMNE.mjs.map +1 -0
- package/dist/chunk-QGOHVJ6J.mjs +63 -0
- package/dist/chunk-QGOHVJ6J.mjs.map +1 -0
- package/dist/chunk-QKVUNGAH.mjs +39 -0
- package/dist/chunk-QKVUNGAH.mjs.map +1 -0
- package/dist/chunk-QM746KUO.mjs +56 -0
- package/dist/chunk-QM746KUO.mjs.map +1 -0
- package/dist/chunk-QTZZ2ISQ.mjs +753 -0
- package/dist/chunk-QTZZ2ISQ.mjs.map +1 -0
- package/dist/chunk-RBRLLZL5.mjs +81 -0
- package/dist/chunk-RBRLLZL5.mjs.map +1 -0
- package/dist/chunk-RHIFZZUI.mjs +69 -0
- package/dist/chunk-RHIFZZUI.mjs.map +1 -0
- package/dist/chunk-RQ633A5I.mjs +187 -0
- package/dist/chunk-RQ633A5I.mjs.map +1 -0
- package/dist/chunk-SCFX4UTD.mjs +28 -0
- package/dist/chunk-SCFX4UTD.mjs.map +1 -0
- package/dist/chunk-SL6HTIOK.mjs +66 -0
- package/dist/chunk-SL6HTIOK.mjs.map +1 -0
- package/dist/chunk-SPBBQLXI.mjs +207 -0
- package/dist/chunk-SPBBQLXI.mjs.map +1 -0
- package/dist/chunk-SSA7THPX.mjs +10 -0
- package/dist/chunk-SSA7THPX.mjs.map +1 -0
- package/dist/chunk-T4QJQK76.mjs +459 -0
- package/dist/chunk-T4QJQK76.mjs.map +1 -0
- package/dist/chunk-TQAEEJB4.mjs +157 -0
- package/dist/chunk-TQAEEJB4.mjs.map +1 -0
- package/dist/chunk-UB5UOSHB.mjs +458 -0
- package/dist/chunk-UB5UOSHB.mjs.map +1 -0
- package/dist/chunk-USWZZUEH.mjs +25 -0
- package/dist/chunk-USWZZUEH.mjs.map +1 -0
- package/dist/chunk-UVCIEUJC.mjs +16 -0
- package/dist/chunk-UVCIEUJC.mjs.map +1 -0
- package/dist/chunk-UXUAWNO5.mjs +396 -0
- package/dist/chunk-UXUAWNO5.mjs.map +1 -0
- package/dist/chunk-V3XURYJO.mjs +756 -0
- package/dist/chunk-V3XURYJO.mjs.map +1 -0
- package/dist/chunk-V6WE6JSZ.mjs +352 -0
- package/dist/chunk-V6WE6JSZ.mjs.map +1 -0
- package/dist/chunk-V7RBCSDJ.mjs +170 -0
- package/dist/chunk-V7RBCSDJ.mjs.map +1 -0
- package/dist/chunk-VCANOYFI.mjs +588 -0
- package/dist/chunk-VCANOYFI.mjs.map +1 -0
- package/dist/chunk-VY2UYN5R.mjs +224 -0
- package/dist/chunk-VY2UYN5R.mjs.map +1 -0
- package/dist/chunk-W2CRQFF6.mjs +1352 -0
- package/dist/chunk-W2CRQFF6.mjs.map +1 -0
- package/dist/chunk-WDU6QXNK.mjs +872 -0
- package/dist/chunk-WDU6QXNK.mjs.map +1 -0
- package/dist/chunk-WZ5QFROO.mjs +23 -0
- package/dist/chunk-WZ5QFROO.mjs.map +1 -0
- package/dist/chunk-XIVV5IWN.mjs +541 -0
- package/dist/chunk-XIVV5IWN.mjs.map +1 -0
- package/dist/chunk-YW7OBE6Q.mjs +119 -0
- package/dist/chunk-YW7OBE6Q.mjs.map +1 -0
- package/dist/chunk-Z5CQMP54.mjs +365 -0
- package/dist/chunk-Z5CQMP54.mjs.map +1 -0
- package/dist/chunk-ZBE6MLHL.mjs +230 -0
- package/dist/chunk-ZBE6MLHL.mjs.map +1 -0
- package/dist/chunk-ZVWA4ZQ3.mjs +189 -0
- package/dist/chunk-ZVWA4ZQ3.mjs.map +1 -0
- package/dist/chunk-ZZ57EH5Z.mjs +173 -0
- package/dist/chunk-ZZ57EH5Z.mjs.map +1 -0
- package/dist/client-BT1mFQas.d.mts +447 -0
- package/dist/client-Nn0q4eO4.d.ts +447 -0
- package/dist/client-cache-CIlyBlmx.d.ts +6 -0
- package/dist/client-cache-D-EZ7XVW.d.mts +6 -0
- package/dist/client-plugins-BI2R6Eae.d.mts +1926 -0
- package/dist/client-plugins-DU9oMspX.d.ts +1926 -0
- package/dist/client-plugins.cjs +415 -0
- package/dist/client-plugins.cjs.map +1 -0
- package/dist/client-plugins.d.mts +22 -0
- package/dist/client-plugins.d.ts +22 -0
- package/dist/client-plugins.mjs +10 -0
- package/dist/client-plugins.mjs.map +1 -0
- package/dist/client.cjs +5402 -0
- package/dist/client.cjs.map +1 -0
- package/dist/client.d.mts +447 -0
- package/dist/client.d.ts +447 -0
- package/dist/client.mjs +110 -0
- package/dist/client.mjs.map +1 -0
- package/dist/config.cjs +38 -0
- package/dist/config.cjs.map +1 -0
- package/dist/config.d.mts +29 -0
- package/dist/config.d.ts +29 -0
- package/dist/config.mjs +10 -0
- package/dist/config.mjs.map +1 -0
- package/dist/cron.cjs +406 -0
- package/dist/cron.cjs.map +1 -0
- package/dist/cron.d.mts +78 -0
- package/dist/cron.d.ts +78 -0
- package/dist/cron.mjs +30 -0
- package/dist/cron.mjs.map +1 -0
- package/dist/deferred.cjs +438 -0
- package/dist/deferred.cjs.map +1 -0
- package/dist/deferred.d.mts +42 -0
- package/dist/deferred.d.ts +42 -0
- package/dist/deferred.mjs +28 -0
- package/dist/deferred.mjs.map +1 -0
- package/dist/deployment.cjs +199 -0
- package/dist/deployment.cjs.map +1 -0
- package/dist/deployment.d.mts +34 -0
- package/dist/deployment.d.ts +34 -0
- package/dist/deployment.mjs +38 -0
- package/dist/deployment.mjs.map +1 -0
- package/dist/devtools-REQTS3I7.mjs +371 -0
- package/dist/devtools-REQTS3I7.mjs.map +1 -0
- package/dist/devtools-client-3XRTBND5.mjs +216 -0
- package/dist/devtools-client-3XRTBND5.mjs.map +1 -0
- package/dist/devtools-ui-NJKFORTG.mjs +1349 -0
- package/dist/devtools-ui-NJKFORTG.mjs.map +1 -0
- package/dist/docs.cjs +5548 -0
- package/dist/docs.cjs.map +1 -0
- package/dist/docs.d.mts +69 -0
- package/dist/docs.d.ts +69 -0
- package/dist/docs.mjs +47 -0
- package/dist/docs.mjs.map +1 -0
- package/dist/env-types.cjs +232 -0
- package/dist/env-types.cjs.map +1 -0
- package/dist/env-types.d.mts +12 -0
- package/dist/env-types.d.ts +12 -0
- package/dist/env-types.mjs +11 -0
- package/dist/env-types.mjs.map +1 -0
- package/dist/env.cjs +215 -0
- package/dist/env.cjs.map +1 -0
- package/dist/env.d.mts +45 -0
- package/dist/env.d.ts +45 -0
- package/dist/env.mjs +22 -0
- package/dist/env.mjs.map +1 -0
- package/dist/environment/vite.d.mts +22 -0
- package/dist/environment/vite.d.ts +22 -0
- package/dist/environment.cjs +96 -0
- package/dist/environment.cjs.map +1 -0
- package/dist/environment.d.mts +18 -0
- package/dist/environment.d.ts +18 -0
- package/dist/environment.mjs +14 -0
- package/dist/environment.mjs.map +1 -0
- package/dist/headers.cjs +126 -0
- package/dist/headers.cjs.map +1 -0
- package/dist/headers.d.mts +22 -0
- package/dist/headers.d.ts +22 -0
- package/dist/headers.mjs +12 -0
- package/dist/headers.mjs.map +1 -0
- package/dist/i18n/client.d.mts +32 -0
- package/dist/i18n/client.d.ts +32 -0
- package/dist/i18n/index.d.mts +20 -0
- package/dist/i18n/index.d.ts +20 -0
- package/dist/i18n/server.d.mts +30 -0
- package/dist/i18n/server.d.ts +30 -0
- package/dist/image/server.d.mts +37 -0
- package/dist/image/server.d.ts +37 -0
- package/dist/image/sharp.d.mts +7 -0
- package/dist/image/sharp.d.ts +7 -0
- package/dist/image-config-Duob7wER.d.mts +50 -0
- package/dist/image-config-Duob7wER.d.ts +50 -0
- package/dist/image.cjs +209 -0
- package/dist/image.cjs.map +1 -0
- package/dist/image.d.mts +39 -0
- package/dist/image.d.ts +39 -0
- package/dist/image.mjs +165 -0
- package/dist/image.mjs.map +1 -0
- package/dist/index.cjs +42186 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +454 -0
- package/dist/index.d.ts +454 -0
- package/dist/index.mjs +980 -0
- package/dist/index.mjs.map +1 -0
- package/dist/integration-api-CHT2OKAf.d.mts +93 -0
- package/dist/integration-api-CHT2OKAf.d.ts +93 -0
- package/dist/integration-orm-GQLGU66X.mjs +13 -0
- package/dist/integration-orm-GQLGU66X.mjs.map +1 -0
- package/dist/integrations.cjs +2820 -0
- package/dist/integrations.cjs.map +1 -0
- package/dist/integrations.d.mts +22 -0
- package/dist/integrations.d.ts +22 -0
- package/dist/integrations.mjs +51 -0
- package/dist/integrations.mjs.map +1 -0
- package/dist/internal/build-runtime.cjs +643 -322
- package/dist/internal/build-runtime.cjs.map +1 -1
- package/dist/internal/build-runtime.d.mts +39 -0
- package/dist/internal/build-runtime.d.ts +39 -0
- package/dist/internal/build-runtime.mjs +11 -10
- package/dist/internal/client-runtime.d.mts +2 -0
- package/dist/internal/client-runtime.d.ts +2 -0
- package/dist/internal/config-runtime.cjs +135 -39
- package/dist/internal/config-runtime.cjs.map +1 -1
- package/dist/internal/config-runtime.d.mts +39 -0
- package/dist/internal/config-runtime.d.ts +39 -0
- package/dist/internal/config-runtime.mjs +5 -4
- package/dist/internal/production-node-env.d.mts +12 -0
- package/dist/internal/production-node-env.d.ts +12 -0
- package/dist/internal/production-runtime.d.mts +39 -0
- package/dist/internal/production-runtime.d.ts +39 -0
- package/dist/layers-VWVDTPUZ.mjs +16 -0
- package/dist/layers-VWVDTPUZ.mjs.map +1 -0
- package/dist/manager-THKFTOFE.mjs +10 -0
- package/dist/manager-THKFTOFE.mjs.map +1 -0
- package/dist/markdown.cjs +364 -0
- package/dist/markdown.cjs.map +1 -0
- package/dist/markdown.d.mts +60 -0
- package/dist/markdown.d.ts +60 -0
- package/dist/markdown.mjs +18 -0
- package/dist/markdown.mjs.map +1 -0
- package/dist/metadata-Cm9ujH4I.d.ts +22 -0
- package/dist/metadata-DacXbnLA.d.mts +22 -0
- package/dist/middleware.cjs +2148 -0
- package/dist/middleware.cjs.map +1 -0
- package/dist/middleware.d.mts +164 -0
- package/dist/middleware.d.ts +164 -0
- package/dist/middleware.mjs +49 -0
- package/dist/middleware.mjs.map +1 -0
- package/dist/navigation-errors-Dvwpzaer.d.mts +13 -0
- package/dist/navigation-errors-Dvwpzaer.d.ts +13 -0
- package/dist/navigation.cjs +1329 -0
- package/dist/navigation.cjs.map +1 -0
- package/dist/navigation.d.mts +14 -0
- package/dist/navigation.d.ts +14 -0
- package/dist/navigation.mjs +33 -0
- package/dist/navigation.mjs.map +1 -0
- package/dist/nitro-QO5LV6QK.mjs +689 -0
- package/dist/nitro-QO5LV6QK.mjs.map +1 -0
- package/dist/observability.cjs +186 -0
- package/dist/observability.cjs.map +1 -0
- package/dist/observability.d.mts +335 -0
- package/dist/observability.d.ts +335 -0
- package/dist/observability.mjs +16 -0
- package/dist/observability.mjs.map +1 -0
- package/dist/params-BALtrRim.d.ts +15 -0
- package/dist/params-ry-lxqmy.d.mts +15 -0
- package/dist/plugin-BJDf43dc.d.mts +165 -0
- package/dist/plugin-BJDf43dc.d.ts +165 -0
- package/dist/plugin.cjs +23470 -0
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.mts +22 -0
- package/dist/plugin.d.ts +22 -0
- package/dist/plugin.mjs +8 -7
- package/dist/production-runtime-4KKq1AVC.d.mts +79 -0
- package/dist/production-runtime-C_B79w2P.d.mts +28 -0
- package/dist/production-runtime-DDEM1D2q.d.ts +28 -0
- package/dist/production-runtime-DRsWDN2x.d.ts +79 -0
- package/dist/query/client.d.mts +61 -0
- package/dist/query/client.d.ts +61 -0
- package/dist/query/index.d.mts +90 -0
- package/dist/query/index.d.ts +90 -0
- package/dist/query/parsers.d.mts +25 -0
- package/dist/query/parsers.d.ts +25 -0
- package/dist/query/server.d.mts +55 -0
- package/dist/query/server.d.ts +55 -0
- package/dist/request-Dsq4kGW0.d.mts +6 -0
- package/dist/request-udtobOLv.d.ts +6 -0
- package/dist/request.d.mts +2 -0
- package/dist/request.d.ts +2 -0
- package/dist/resolver-DJqjLMg_.d.mts +14 -0
- package/dist/resolver-IH4RmPEl.d.ts +14 -0
- package/dist/route-runtime-DoOHzCAD.d.mts +38 -0
- package/dist/route-runtime-DoOHzCAD.d.ts +38 -0
- package/dist/router.d.mts +36 -0
- package/dist/router.d.ts +36 -0
- package/dist/routes.d.mts +224 -0
- package/dist/routes.d.ts +224 -0
- package/dist/runtime-9nQjVM7X.d.mts +206 -0
- package/dist/runtime-Cxpq6xZN.d.mts +27 -0
- package/dist/runtime-DgeS2skB.d.ts +206 -0
- package/dist/runtime-bv63eUiO.d.ts +27 -0
- package/dist/server-action-security.d.mts +43 -0
- package/dist/server-action-security.d.ts +43 -0
- package/dist/server-fn-client.d.mts +32 -0
- package/dist/server-fn-client.d.ts +32 -0
- package/dist/server-fn.d.mts +93 -0
- package/dist/server-fn.d.ts +93 -0
- package/dist/server-plugins.d.mts +55 -0
- package/dist/server-plugins.d.ts +55 -0
- package/dist/server-query-client.d.mts +50 -0
- package/dist/server-query-client.d.ts +50 -0
- package/dist/server-query.d.mts +36 -0
- package/dist/server-query.d.ts +36 -0
- package/dist/server.cjs +731 -447
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.mts +48 -0
- package/dist/server.d.ts +48 -0
- package/dist/server.mjs +9 -8
- package/dist/server.mjs.map +1 -1
- package/dist/storage.d.mts +52 -0
- package/dist/storage.d.ts +52 -0
- package/dist/testing.d.mts +101 -0
- package/dist/testing.d.ts +101 -0
- package/dist/transport-BmbGTXA5.d.mts +49 -0
- package/dist/transport-BmbGTXA5.d.ts +49 -0
- package/dist/types-BMxWr97v.d.mts +81 -0
- package/dist/types-BMxWr97v.d.ts +81 -0
- package/dist/types-C9N-nk5R.d.mts +53 -0
- package/dist/types-C9N-nk5R.d.ts +53 -0
- package/dist/types-D1A6-XvH.d.mts +73 -0
- package/dist/types-D1A6-XvH.d.ts +73 -0
- package/dist/utils-B-cUHwoK.d.ts +23 -0
- package/dist/utils-Cm41AefV.d.mts +23 -0
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -1
- package/dist/version.d.mts +3 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.mjs +1 -1
- package/dist/vite.cjs +682 -437
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.d.mts +22 -0
- package/dist/vite.d.ts +22 -0
- package/dist/vite.mjs +6 -5
- package/dist/workflows.d.mts +110 -0
- package/dist/workflows.d.ts +110 -0
- package/package.json +3 -2
- package/types/client.d.ts +1 -1
- package/types/image.d.ts +4 -0
- package/types/images.d.ts +59 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getFarmClientDataCache
|
|
3
|
+
} from "./chunk-TQAEEJB4.mjs";
|
|
4
|
+
import {
|
|
5
|
+
isFarmServerQueryResult
|
|
6
|
+
} from "./chunk-SCFX4UTD.mjs";
|
|
7
|
+
import {
|
|
8
|
+
createFarmCacheKey
|
|
9
|
+
} from "./chunk-V3XURYJO.mjs";
|
|
10
|
+
import {
|
|
11
|
+
__name
|
|
12
|
+
} from "./chunk-CGILA3WO.mjs";
|
|
13
|
+
|
|
14
|
+
// src/server-query-client.ts
|
|
15
|
+
import { useCallback, useEffect, useRef, useSyncExternalStore } from "react";
|
|
16
|
+
var FARM_SERVER_QUERY_CLIENT_STATE = /* @__PURE__ */ Symbol.for("farm.serverQueryClientState");
|
|
17
|
+
var serverQueryClientGlobal = globalThis;
|
|
18
|
+
var serverQueryClientState = serverQueryClientGlobal[FARM_SERVER_QUERY_CLIENT_STATE] ?? (serverQueryClientGlobal[FARM_SERVER_QUERY_CLIENT_STATE] = {
|
|
19
|
+
functionIds: /* @__PURE__ */ new WeakMap(),
|
|
20
|
+
nextFunctionId: 0,
|
|
21
|
+
active: []
|
|
22
|
+
});
|
|
23
|
+
function beginFarmServerQueryAction(actionId, args) {
|
|
24
|
+
const active = serverQueryClientState.active.at(-1);
|
|
25
|
+
return {
|
|
26
|
+
actionId,
|
|
27
|
+
args,
|
|
28
|
+
provisionalKey: active?.provisionalKey
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
__name(beginFarmServerQueryAction, "beginFarmServerQueryAction");
|
|
32
|
+
function completeFarmServerQueryAction(invocation, value) {
|
|
33
|
+
if (!isFarmServerQueryResult(value)) return value;
|
|
34
|
+
const cache = getFarmClientDataCache();
|
|
35
|
+
const metadata = value.__farmServerQuery;
|
|
36
|
+
if (invocation.provisionalKey) {
|
|
37
|
+
cache.alias(invocation.provisionalKey, metadata.key);
|
|
38
|
+
}
|
|
39
|
+
cache.set(metadata.key, {
|
|
40
|
+
data: value.data,
|
|
41
|
+
updatedAt: metadata.updatedAt,
|
|
42
|
+
staleAt: metadata.staleTime === false ? Number.POSITIVE_INFINITY : metadata.updatedAt + metadata.staleTime,
|
|
43
|
+
status: "success",
|
|
44
|
+
error: null,
|
|
45
|
+
fetching: false
|
|
46
|
+
});
|
|
47
|
+
return value.data;
|
|
48
|
+
}
|
|
49
|
+
__name(completeFarmServerQueryAction, "completeFarmServerQueryAction");
|
|
50
|
+
async function fetchServerQuery(query, input, options = {}) {
|
|
51
|
+
const cache = getFarmClientDataCache();
|
|
52
|
+
const provisionalKey = createServerQueryCallKey(query, input);
|
|
53
|
+
const entry = cache.get(provisionalKey);
|
|
54
|
+
const stale = cache.isStale(provisionalKey);
|
|
55
|
+
const inflight = cache.getInflight(provisionalKey);
|
|
56
|
+
if (inflight) return inflight;
|
|
57
|
+
if (!options.force && entry && !stale && entry.status !== "error") {
|
|
58
|
+
return entry.data;
|
|
59
|
+
}
|
|
60
|
+
if (!options.force && entry && stale && entry.status !== "pending" && entry.status !== "error" && (options.swr ?? true)) {
|
|
61
|
+
void executeServerQuery(query, input, provisionalKey, options).catch(() => void 0);
|
|
62
|
+
return entry.data;
|
|
63
|
+
}
|
|
64
|
+
return executeServerQuery(query, input, provisionalKey, options);
|
|
65
|
+
}
|
|
66
|
+
__name(fetchServerQuery, "fetchServerQuery");
|
|
67
|
+
function prefetchServerQuery(query, input, options = {}) {
|
|
68
|
+
return fetchServerQuery(query, input, options);
|
|
69
|
+
}
|
|
70
|
+
__name(prefetchServerQuery, "prefetchServerQuery");
|
|
71
|
+
function useServerQuery(query, input, options = {}) {
|
|
72
|
+
const cache = getFarmClientDataCache();
|
|
73
|
+
const key = createServerQueryCallKey(query, input);
|
|
74
|
+
const inputRef = useRef(input);
|
|
75
|
+
const optionsRef = useRef(options);
|
|
76
|
+
const mountedKeyRef = useRef(void 0);
|
|
77
|
+
inputRef.current = input;
|
|
78
|
+
optionsRef.current = options;
|
|
79
|
+
const subscribe = useCallback(
|
|
80
|
+
(listener) => cache.subscribe(key, listener),
|
|
81
|
+
[cache, key]
|
|
82
|
+
);
|
|
83
|
+
const getSnapshot = useCallback(() => cache.get(key), [cache, key]);
|
|
84
|
+
const entry = useSyncExternalStore(subscribe, getSnapshot, () => void 0);
|
|
85
|
+
const run = useCallback(
|
|
86
|
+
(force = false) => fetchServerQuery(query, inputRef.current, {
|
|
87
|
+
...optionsRef.current,
|
|
88
|
+
force
|
|
89
|
+
}),
|
|
90
|
+
[query]
|
|
91
|
+
);
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
if (options.enabled === false) return;
|
|
94
|
+
const firstReadForKey = mountedKeyRef.current !== key;
|
|
95
|
+
if (firstReadForKey) mountedKeyRef.current = key;
|
|
96
|
+
if (firstReadForKey && (!entry || cache.isStale(key)) || entry?.invalidatedAt !== void 0 && !entry.fetching) {
|
|
97
|
+
void run().catch(() => void 0);
|
|
98
|
+
}
|
|
99
|
+
}, [cache, entry, key, options.enabled, run]);
|
|
100
|
+
useEffect(() => {
|
|
101
|
+
if (options.enabled === false || typeof window === "undefined") return;
|
|
102
|
+
const refreshIfStale = /* @__PURE__ */ __name(() => {
|
|
103
|
+
if (cache.isStale(key)) void run().catch(() => void 0);
|
|
104
|
+
}, "refreshIfStale");
|
|
105
|
+
const onFocus = options.refetchOnWindowFocus === false ? void 0 : refreshIfStale;
|
|
106
|
+
const onOnline = options.refetchOnReconnect === false ? void 0 : refreshIfStale;
|
|
107
|
+
if (onFocus) window.addEventListener("focus", onFocus);
|
|
108
|
+
if (onOnline) window.addEventListener("online", onOnline);
|
|
109
|
+
return () => {
|
|
110
|
+
if (onFocus) window.removeEventListener("focus", onFocus);
|
|
111
|
+
if (onOnline) window.removeEventListener("online", onOnline);
|
|
112
|
+
};
|
|
113
|
+
}, [cache, key, options.enabled, options.refetchOnReconnect, options.refetchOnWindowFocus, run]);
|
|
114
|
+
const status = entry?.status ?? (entry ? "success" : "idle");
|
|
115
|
+
const fetching = entry?.fetching ?? false;
|
|
116
|
+
return {
|
|
117
|
+
data: entry?.data,
|
|
118
|
+
error: entry?.error ?? null,
|
|
119
|
+
status,
|
|
120
|
+
pending: status === "pending" && (entry?.updatedAt ?? 0) === 0,
|
|
121
|
+
fetching,
|
|
122
|
+
stale: cache.isStale(key),
|
|
123
|
+
refetch: /* @__PURE__ */ __name(() => run(true), "refetch")
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
__name(useServerQuery, "useServerQuery");
|
|
127
|
+
function createServerQueryCallKey(query, input) {
|
|
128
|
+
let id = serverQueryClientState.functionIds.get(query);
|
|
129
|
+
if (!id) {
|
|
130
|
+
id = ++serverQueryClientState.nextFunctionId;
|
|
131
|
+
serverQueryClientState.functionIds.set(query, id);
|
|
132
|
+
}
|
|
133
|
+
return createFarmCacheKey(["server-query-call", id, input]);
|
|
134
|
+
}
|
|
135
|
+
__name(createServerQueryCallKey, "createServerQueryCallKey");
|
|
136
|
+
async function executeServerQuery(query, input, provisionalKey, options) {
|
|
137
|
+
const cache = getFarmClientDataCache();
|
|
138
|
+
const inflight = cache.getInflight(provisionalKey);
|
|
139
|
+
if (inflight) return inflight;
|
|
140
|
+
const previous = cache.get(provisionalKey);
|
|
141
|
+
cache.set(provisionalKey, {
|
|
142
|
+
data: previous?.data,
|
|
143
|
+
updatedAt: previous?.updatedAt ?? 0,
|
|
144
|
+
staleAt: previous?.staleAt ?? 0,
|
|
145
|
+
gcAt: previous?.gcAt,
|
|
146
|
+
invalidatedAt: previous?.invalidatedAt,
|
|
147
|
+
status: "pending",
|
|
148
|
+
error: null,
|
|
149
|
+
fetching: true
|
|
150
|
+
});
|
|
151
|
+
const promise = (async () => {
|
|
152
|
+
try {
|
|
153
|
+
serverQueryClientState.active.push({ provisionalKey });
|
|
154
|
+
let pending;
|
|
155
|
+
try {
|
|
156
|
+
pending = query(input);
|
|
157
|
+
} finally {
|
|
158
|
+
serverQueryClientState.active.pop();
|
|
159
|
+
}
|
|
160
|
+
const data = await pending;
|
|
161
|
+
const transported = cache.get(provisionalKey);
|
|
162
|
+
if (!transported || transported.fetching) {
|
|
163
|
+
const updatedAt = Date.now();
|
|
164
|
+
cache.set(provisionalKey, {
|
|
165
|
+
data,
|
|
166
|
+
updatedAt,
|
|
167
|
+
staleAt: options.staleTime === false ? Number.POSITIVE_INFINITY : updatedAt + (options.staleTime ?? 0),
|
|
168
|
+
status: "success",
|
|
169
|
+
error: null,
|
|
170
|
+
fetching: false
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
return data;
|
|
174
|
+
} catch (cause) {
|
|
175
|
+
const error = normalizeServerQueryError(cause);
|
|
176
|
+
const current = cache.get(provisionalKey);
|
|
177
|
+
cache.set(provisionalKey, {
|
|
178
|
+
data: current?.data,
|
|
179
|
+
updatedAt: current?.updatedAt ?? 0,
|
|
180
|
+
staleAt: current?.staleAt ?? 0,
|
|
181
|
+
gcAt: current?.gcAt,
|
|
182
|
+
invalidatedAt: current?.invalidatedAt,
|
|
183
|
+
status: "error",
|
|
184
|
+
error,
|
|
185
|
+
fetching: false
|
|
186
|
+
});
|
|
187
|
+
throw error;
|
|
188
|
+
} finally {
|
|
189
|
+
cache.deleteInflight(provisionalKey);
|
|
190
|
+
}
|
|
191
|
+
})();
|
|
192
|
+
cache.setInflight(provisionalKey, promise);
|
|
193
|
+
return promise;
|
|
194
|
+
}
|
|
195
|
+
__name(executeServerQuery, "executeServerQuery");
|
|
196
|
+
function normalizeServerQueryError(cause) {
|
|
197
|
+
if (cause instanceof Error) return cause;
|
|
198
|
+
const error = new Error(typeof cause === "string" ? cause : "Server query failed");
|
|
199
|
+
error.cause = cause;
|
|
200
|
+
return error;
|
|
201
|
+
}
|
|
202
|
+
__name(normalizeServerQueryError, "normalizeServerQueryError");
|
|
203
|
+
|
|
204
|
+
export {
|
|
205
|
+
beginFarmServerQueryAction,
|
|
206
|
+
completeFarmServerQueryAction,
|
|
207
|
+
fetchServerQuery,
|
|
208
|
+
prefetchServerQuery,
|
|
209
|
+
useServerQuery
|
|
210
|
+
};
|
|
211
|
+
//# sourceMappingURL=chunk-J5YWQVI5.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server-query-client.ts"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useEffect, useRef, useSyncExternalStore } from \"react\";\nimport { createFarmCacheKey } from \"./cache\";\nimport {\n getFarmClientDataCache,\n type FarmClientCacheEntry,\n type FarmClientCacheStatus,\n} from \"./client-cache\";\nimport type { ServerQuery } from \"./server-query\";\nimport { isFarmServerQueryResult, type FarmServerQueryResult } from \"./server-query-protocol\";\n\nexport type ServerQueryFetchOptions = {\n /** Used only when a non-Farm transport returns plain data. Farm transports use the declaration. */\n staleTime?: number | false;\n /** Return stale data immediately while refreshing it in the background. Default true. */\n swr?: boolean;\n /** Always wait for a new result. */\n force?: boolean;\n};\n\nexport type UseServerQueryOptions = ServerQueryFetchOptions & {\n enabled?: boolean;\n refetchOnWindowFocus?: boolean;\n refetchOnReconnect?: boolean;\n};\n\nexport type UseServerQueryResult<TData> = {\n data: TData | undefined;\n error: Error | null;\n status: FarmClientCacheStatus;\n pending: boolean;\n fetching: boolean;\n stale: boolean;\n refetch: () => Promise<TData>;\n};\n\nexport type FarmServerQueryActionInvocation = {\n actionId: string;\n args: readonly unknown[];\n provisionalKey?: string;\n};\n\ntype ActiveServerQueryInvocation = {\n provisionalKey: string;\n};\n\ntype ServerQueryClientState = {\n functionIds: WeakMap<Function, number>;\n nextFunctionId: number;\n active: ActiveServerQueryInvocation[];\n};\n\nconst FARM_SERVER_QUERY_CLIENT_STATE = Symbol.for(\"farm.serverQueryClientState\");\nconst serverQueryClientGlobal = globalThis as typeof globalThis & {\n [FARM_SERVER_QUERY_CLIENT_STATE]?: ServerQueryClientState;\n};\nconst serverQueryClientState = (serverQueryClientGlobal[FARM_SERVER_QUERY_CLIENT_STATE] ??= {\n functionIds: new WeakMap(),\n nextFunctionId: 0,\n active: [],\n});\n\nexport function beginFarmServerQueryAction(\n actionId: string,\n args: readonly unknown[],\n): FarmServerQueryActionInvocation {\n const active = serverQueryClientState.active.at(-1);\n return {\n actionId,\n args,\n provisionalKey: active?.provisionalKey,\n };\n}\n\nexport function completeFarmServerQueryAction<TData>(\n invocation: FarmServerQueryActionInvocation,\n value: TData | FarmServerQueryResult<TData>,\n): TData {\n if (!isFarmServerQueryResult(value)) return value as TData;\n\n const cache = getFarmClientDataCache();\n const metadata = value.__farmServerQuery;\n if (invocation.provisionalKey) {\n cache.alias(invocation.provisionalKey, metadata.key);\n }\n\n cache.set(metadata.key, {\n data: value.data,\n updatedAt: metadata.updatedAt,\n staleAt:\n metadata.staleTime === false\n ? Number.POSITIVE_INFINITY\n : metadata.updatedAt + metadata.staleTime,\n status: \"success\",\n error: null,\n fetching: false,\n });\n\n return value.data as TData;\n}\n\nexport async function fetchServerQuery<TInput, TData>(\n query: ServerQuery<TInput, TData>,\n input: TInput,\n options: ServerQueryFetchOptions = {},\n): Promise<TData> {\n const cache = getFarmClientDataCache();\n const provisionalKey = createServerQueryCallKey(query, input);\n const entry = cache.get<TData>(provisionalKey);\n const stale = cache.isStale(provisionalKey);\n const inflight = cache.getInflight<TData>(provisionalKey);\n\n if (inflight) return inflight;\n\n if (!options.force && entry && !stale && entry.status !== \"error\") {\n return entry.data;\n }\n\n if (\n !options.force &&\n entry &&\n stale &&\n entry.status !== \"pending\" &&\n entry.status !== \"error\" &&\n (options.swr ?? true)\n ) {\n void executeServerQuery(query, input, provisionalKey, options).catch(() => undefined);\n return entry.data;\n }\n\n return executeServerQuery(query, input, provisionalKey, options);\n}\n\nexport function prefetchServerQuery<TInput, TData>(\n query: ServerQuery<TInput, TData>,\n input: TInput,\n options: Omit<ServerQueryFetchOptions, \"force\"> = {},\n): Promise<TData> {\n return fetchServerQuery(query, input, options);\n}\n\nexport function useServerQuery<TInput, TData>(\n query: ServerQuery<TInput, TData>,\n input: TInput,\n options: UseServerQueryOptions = {},\n): UseServerQueryResult<TData> {\n const cache = getFarmClientDataCache();\n const key = createServerQueryCallKey(query, input);\n const inputRef = useRef(input);\n const optionsRef = useRef(options);\n const mountedKeyRef = useRef<string | undefined>(undefined);\n inputRef.current = input;\n optionsRef.current = options;\n\n const subscribe = useCallback(\n (listener: () => void) => cache.subscribe(key, listener),\n [cache, key],\n );\n const getSnapshot = useCallback(() => cache.get<TData>(key), [cache, key]);\n const entry = useSyncExternalStore(subscribe, getSnapshot, () => undefined);\n\n const run = useCallback(\n (force = false) =>\n fetchServerQuery(query, inputRef.current, {\n ...optionsRef.current,\n force,\n }),\n [query],\n );\n\n useEffect(() => {\n if (options.enabled === false) return;\n\n const firstReadForKey = mountedKeyRef.current !== key;\n if (firstReadForKey) mountedKeyRef.current = key;\n\n if (\n (firstReadForKey && (!entry || cache.isStale(key))) ||\n (entry?.invalidatedAt !== undefined && !entry.fetching)\n ) {\n void run().catch(() => undefined);\n }\n }, [cache, entry, key, options.enabled, run]);\n\n useEffect(() => {\n if (options.enabled === false || typeof window === \"undefined\") return;\n\n const refreshIfStale = () => {\n if (cache.isStale(key)) void run().catch(() => undefined);\n };\n const onFocus = options.refetchOnWindowFocus === false ? undefined : refreshIfStale;\n const onOnline = options.refetchOnReconnect === false ? undefined : refreshIfStale;\n\n if (onFocus) window.addEventListener(\"focus\", onFocus);\n if (onOnline) window.addEventListener(\"online\", onOnline);\n return () => {\n if (onFocus) window.removeEventListener(\"focus\", onFocus);\n if (onOnline) window.removeEventListener(\"online\", onOnline);\n };\n }, [cache, key, options.enabled, options.refetchOnReconnect, options.refetchOnWindowFocus, run]);\n\n const status = entry?.status ?? (entry ? \"success\" : \"idle\");\n const fetching = entry?.fetching ?? false;\n\n return {\n data: entry?.data,\n error: entry?.error ?? null,\n status,\n pending: status === \"pending\" && (entry?.updatedAt ?? 0) === 0,\n fetching,\n stale: cache.isStale(key),\n refetch: () => run(true),\n };\n}\n\nfunction createServerQueryCallKey<TInput, TData>(\n query: ServerQuery<TInput, TData>,\n input: TInput,\n): string {\n let id = serverQueryClientState.functionIds.get(query);\n if (!id) {\n id = ++serverQueryClientState.nextFunctionId;\n serverQueryClientState.functionIds.set(query, id);\n }\n return createFarmCacheKey([\"server-query-call\", id, input]);\n}\n\nasync function executeServerQuery<TInput, TData>(\n query: ServerQuery<TInput, TData>,\n input: TInput,\n provisionalKey: string,\n options: ServerQueryFetchOptions,\n): Promise<TData> {\n const cache = getFarmClientDataCache();\n const inflight = cache.getInflight<TData>(provisionalKey);\n if (inflight) return inflight;\n\n const previous = cache.get<TData>(provisionalKey);\n cache.set(provisionalKey, {\n data: previous?.data as TData,\n updatedAt: previous?.updatedAt ?? 0,\n staleAt: previous?.staleAt ?? 0,\n gcAt: previous?.gcAt,\n invalidatedAt: previous?.invalidatedAt,\n status: \"pending\",\n error: null,\n fetching: true,\n });\n\n const promise = (async () => {\n try {\n serverQueryClientState.active.push({ provisionalKey });\n let pending: Promise<TData>;\n try {\n pending = query(input);\n } finally {\n serverQueryClientState.active.pop();\n }\n\n const data = await pending;\n const transported = cache.get<TData>(provisionalKey);\n if (!transported || transported.fetching) {\n const updatedAt = Date.now();\n cache.set(provisionalKey, {\n data,\n updatedAt,\n staleAt:\n options.staleTime === false\n ? Number.POSITIVE_INFINITY\n : updatedAt + (options.staleTime ?? 0),\n status: \"success\",\n error: null,\n fetching: false,\n });\n }\n return data;\n } catch (cause) {\n const error = normalizeServerQueryError(cause);\n const current = cache.get<TData>(provisionalKey);\n cache.set(provisionalKey, {\n data: current?.data as TData,\n updatedAt: current?.updatedAt ?? 0,\n staleAt: current?.staleAt ?? 0,\n gcAt: current?.gcAt,\n invalidatedAt: current?.invalidatedAt,\n status: \"error\",\n error,\n fetching: false,\n });\n throw error;\n } finally {\n cache.deleteInflight(provisionalKey);\n }\n })();\n\n cache.setInflight(provisionalKey, promise);\n return promise;\n}\n\nfunction normalizeServerQueryError(cause: unknown): Error {\n if (cause instanceof Error) return cause;\n const error = new Error(typeof cause === \"string\" ? cause : \"Server query failed\");\n (error as Error & { cause?: unknown }).cause = cause;\n return error;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
import {
|
|
2
|
+
_withAfterNodeMiddleware
|
|
3
|
+
} from "./chunk-E6EPN5BT.mjs";
|
|
4
|
+
import {
|
|
5
|
+
sendWebResponse
|
|
6
|
+
} from "./chunk-QGOHVJ6J.mjs";
|
|
7
|
+
import {
|
|
8
|
+
API_ROUTE_METHODS,
|
|
9
|
+
findProgrammaticRouteFilesInDir
|
|
10
|
+
} from "./chunk-Z5CQMP54.mjs";
|
|
11
|
+
import {
|
|
12
|
+
getProgrammaticRouteManifest,
|
|
13
|
+
isProgrammaticRoutesFileName
|
|
14
|
+
} from "./chunk-C2ROET2V.mjs";
|
|
15
|
+
import {
|
|
16
|
+
toViteModuleId
|
|
17
|
+
} from "./chunk-J4FNJ5IU.mjs";
|
|
18
|
+
import {
|
|
19
|
+
invokeAPIRouteEndpoint,
|
|
20
|
+
matchAPIRoute
|
|
21
|
+
} from "./chunk-PFE6GMNE.mjs";
|
|
22
|
+
import {
|
|
23
|
+
__name,
|
|
24
|
+
__require
|
|
25
|
+
} from "./chunk-CGILA3WO.mjs";
|
|
26
|
+
|
|
27
|
+
// src/api/vite-plugin.ts
|
|
28
|
+
function farmApiPlugin(options = {}) {
|
|
29
|
+
const srcDir = options.srcDir ?? "src";
|
|
30
|
+
const debug = options.debug ?? false;
|
|
31
|
+
let apiRoutesCache = /* @__PURE__ */ new Map();
|
|
32
|
+
let apiRouterHandler = null;
|
|
33
|
+
let discoveryComplete = false;
|
|
34
|
+
let discoveryPromise = null;
|
|
35
|
+
const log = /* @__PURE__ */ __name((_message) => {
|
|
36
|
+
}, "log");
|
|
37
|
+
const logResponse = /* @__PURE__ */ __name((method, urlPath, status, duration) => {
|
|
38
|
+
try {
|
|
39
|
+
const pc = __require("picocolors");
|
|
40
|
+
let statusColor = pc.green;
|
|
41
|
+
if (status >= 500) statusColor = pc.red;
|
|
42
|
+
else if (status >= 400) statusColor = pc.yellow;
|
|
43
|
+
else if (status >= 300) statusColor = pc.cyan;
|
|
44
|
+
const logMsg = [
|
|
45
|
+
pc.dim("[") + pc.bold(pc.blue("FARM")) + pc.dim("]"),
|
|
46
|
+
pc.dim("[") + pc.bold(pc.cyan("API")) + pc.dim("]"),
|
|
47
|
+
pc.dim("[") + pc.bold(pc.white(method.padEnd(3))) + pc.dim("]"),
|
|
48
|
+
pc.gray(urlPath),
|
|
49
|
+
pc.dim("-"),
|
|
50
|
+
statusColor(status.toString()),
|
|
51
|
+
pc.dim(`(${duration}ms)`)
|
|
52
|
+
].join(" ");
|
|
53
|
+
console.log(logMsg);
|
|
54
|
+
} catch {
|
|
55
|
+
console.log(`[FARM] [API] [${method}] ${urlPath} - ${status} (${duration}ms)`);
|
|
56
|
+
}
|
|
57
|
+
}, "logResponse");
|
|
58
|
+
const addEndpoint = /* @__PURE__ */ __name((routePath, filePath, method, endpoint) => {
|
|
59
|
+
const normalizedMethod = method.toUpperCase();
|
|
60
|
+
const existing = apiRoutesCache.get(routePath);
|
|
61
|
+
if (existing) {
|
|
62
|
+
if (!existing.methods.includes(normalizedMethod)) {
|
|
63
|
+
existing.methods.push(normalizedMethod);
|
|
64
|
+
}
|
|
65
|
+
existing.endpoints[normalizedMethod] = endpoint;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
apiRoutesCache.set(routePath, {
|
|
69
|
+
path: routePath,
|
|
70
|
+
filePath,
|
|
71
|
+
methods: [normalizedMethod],
|
|
72
|
+
endpoints: { [normalizedMethod]: endpoint }
|
|
73
|
+
});
|
|
74
|
+
}, "addEndpoint");
|
|
75
|
+
const createRouter = /* @__PURE__ */ __name(async () => {
|
|
76
|
+
const totalEndpoints = Array.from(apiRoutesCache.values()).reduce(
|
|
77
|
+
(sum, route) => sum + route.methods.length,
|
|
78
|
+
0
|
|
79
|
+
);
|
|
80
|
+
apiRouterHandler = null;
|
|
81
|
+
if (totalEndpoints > 0) {
|
|
82
|
+
apiRouterHandler = /* @__PURE__ */ __name(async (request) => {
|
|
83
|
+
const url = new URL(request.url);
|
|
84
|
+
const method = request.method.toUpperCase();
|
|
85
|
+
const pathname = url.pathname;
|
|
86
|
+
const match = matchAPIRoute(apiRoutesCache, pathname);
|
|
87
|
+
if (!match) {
|
|
88
|
+
return new Response(JSON.stringify({ error: "Not Found" }), {
|
|
89
|
+
status: 404,
|
|
90
|
+
headers: { "Content-Type": "application/json" }
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
const { route, params } = match;
|
|
94
|
+
const endpoint = route.endpoints[method];
|
|
95
|
+
if (!endpoint) {
|
|
96
|
+
return new Response(JSON.stringify({ error: "Method Not Allowed" }), {
|
|
97
|
+
status: 405,
|
|
98
|
+
headers: { "Content-Type": "application/json" }
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
return await invokeAPIRouteEndpoint(endpoint, request, params);
|
|
103
|
+
} catch (error) {
|
|
104
|
+
return new Response(JSON.stringify({ error: error.message || "Internal Server Error" }), {
|
|
105
|
+
status: 500,
|
|
106
|
+
headers: { "Content-Type": "application/json" }
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}, "apiRouterHandler");
|
|
110
|
+
log(`API router created with ${totalEndpoints} endpoints`);
|
|
111
|
+
}
|
|
112
|
+
}, "createRouter");
|
|
113
|
+
return {
|
|
114
|
+
name: "@farm.js/core:api",
|
|
115
|
+
enforce: "pre",
|
|
116
|
+
configureServer(server) {
|
|
117
|
+
const discoverFileRoutes = /* @__PURE__ */ __name(async (apiDir) => {
|
|
118
|
+
const fs = await import("fs");
|
|
119
|
+
const path = await import("path");
|
|
120
|
+
if (!fs.existsSync(apiDir)) {
|
|
121
|
+
log("No api directory found");
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const findRouteFiles = /* @__PURE__ */ __name((dir) => {
|
|
125
|
+
const files = [];
|
|
126
|
+
if (!fs.existsSync(dir)) return files;
|
|
127
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
128
|
+
for (const entry of entries) {
|
|
129
|
+
const fullPath = path.join(dir, entry.name);
|
|
130
|
+
if (entry.isDirectory()) {
|
|
131
|
+
files.push(...findRouteFiles(fullPath));
|
|
132
|
+
} else if (entry.name === "route.ts" || entry.name === "route.tsx" || entry.name === "route.js") {
|
|
133
|
+
files.push(fullPath);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return files;
|
|
137
|
+
}, "findRouteFiles");
|
|
138
|
+
const routeFiles = findRouteFiles(apiDir);
|
|
139
|
+
apiRoutesCache.clear();
|
|
140
|
+
for (const filePath of routeFiles) {
|
|
141
|
+
try {
|
|
142
|
+
const relativePath = path.relative(apiDir, path.dirname(filePath));
|
|
143
|
+
const routePath = "/api/" + (relativePath === "." ? "" : relativePath.replace(/\\/g, "/"));
|
|
144
|
+
const routeModule = await server.ssrLoadModule(filePath);
|
|
145
|
+
const endpoints = {};
|
|
146
|
+
const availableMethods = [];
|
|
147
|
+
for (const method of API_ROUTE_METHODS) {
|
|
148
|
+
if (routeModule[method]) {
|
|
149
|
+
availableMethods.push(method);
|
|
150
|
+
endpoints[method] = routeModule[method];
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (availableMethods.length > 0) {
|
|
154
|
+
apiRoutesCache.set(routePath, {
|
|
155
|
+
path: routePath,
|
|
156
|
+
filePath,
|
|
157
|
+
methods: availableMethods,
|
|
158
|
+
endpoints
|
|
159
|
+
});
|
|
160
|
+
log(`API route discovered: ${availableMethods.join(", ")} ${routePath}`);
|
|
161
|
+
}
|
|
162
|
+
} catch (e) {
|
|
163
|
+
log(`API route load failed at ${filePath}: ${e.message}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}, "discoverFileRoutes");
|
|
167
|
+
const discoverRootRoutes = /* @__PURE__ */ __name(async () => {
|
|
168
|
+
const fs = await import("fs");
|
|
169
|
+
const path = await import("path");
|
|
170
|
+
const routesFiles = [
|
|
171
|
+
path.join(server.config.root, srcDir, "routes.ts"),
|
|
172
|
+
path.join(server.config.root, srcDir, "routes.tsx"),
|
|
173
|
+
path.join(server.config.root, srcDir, "routes.js")
|
|
174
|
+
];
|
|
175
|
+
for (const routesFile of routesFiles) {
|
|
176
|
+
if (fs.existsSync(routesFile)) {
|
|
177
|
+
try {
|
|
178
|
+
const routesModule = await server.ssrLoadModule(routesFile);
|
|
179
|
+
for (const [exportName, exportValue] of Object.entries(routesModule)) {
|
|
180
|
+
const endpoint = exportValue;
|
|
181
|
+
if (endpoint && endpoint.__path) {
|
|
182
|
+
const routePath = endpoint.__path;
|
|
183
|
+
const method = String(endpoint.__method || "GET").toUpperCase();
|
|
184
|
+
addEndpoint(routePath, routesFile, method, endpoint);
|
|
185
|
+
log(`Root route discovered: ${method} ${routePath}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
} catch (e) {
|
|
189
|
+
log(`Root routes.ts load failed: ${e.message}`);
|
|
190
|
+
}
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}, "discoverRootRoutes");
|
|
195
|
+
const discoverProgrammaticRoutes = /* @__PURE__ */ __name(async () => {
|
|
196
|
+
const path = await import("path");
|
|
197
|
+
const srcRoot = path.join(server.config.root, srcDir);
|
|
198
|
+
const routeFiles = findProgrammaticRouteFilesInDir(srcRoot);
|
|
199
|
+
for (const routeFile of routeFiles) {
|
|
200
|
+
try {
|
|
201
|
+
const routesModule = await server.ssrLoadModule(
|
|
202
|
+
toViteModuleId(routeFile, server.config.root)
|
|
203
|
+
);
|
|
204
|
+
const manifest = getProgrammaticRouteManifest(routesModule);
|
|
205
|
+
if (!manifest) continue;
|
|
206
|
+
for (const definition of manifest.routes) {
|
|
207
|
+
if (definition.kind !== "api") continue;
|
|
208
|
+
for (const [method, endpoint] of Object.entries(definition.methods)) {
|
|
209
|
+
if (endpoint) {
|
|
210
|
+
addEndpoint(definition.path, routeFile, method, endpoint);
|
|
211
|
+
log(`Programmatic route discovered: ${method} ${definition.path}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
} catch (e) {
|
|
216
|
+
log(`Programmatic routes file load failed at ${routeFile}: ${e.message}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}, "discoverProgrammaticRoutes");
|
|
220
|
+
const initializeDiscovery = /* @__PURE__ */ __name(async () => {
|
|
221
|
+
const path = await import("path");
|
|
222
|
+
const apiDir = path.join(server.config.root, srcDir, "api");
|
|
223
|
+
log(`Discovering API routes in: ${apiDir}`);
|
|
224
|
+
await discoverFileRoutes(apiDir);
|
|
225
|
+
await discoverRootRoutes();
|
|
226
|
+
await discoverProgrammaticRoutes();
|
|
227
|
+
await createRouter();
|
|
228
|
+
discoveryComplete = true;
|
|
229
|
+
log(`API discovery complete: ${apiRoutesCache.size} routes found`);
|
|
230
|
+
}, "initializeDiscovery");
|
|
231
|
+
discoveryPromise = initializeDiscovery().catch((e) => {
|
|
232
|
+
console.error("[FARM] API discovery error:", e);
|
|
233
|
+
});
|
|
234
|
+
server.__farmApi__ = {
|
|
235
|
+
getHandler: /* @__PURE__ */ __name(() => apiRouterHandler, "getHandler"),
|
|
236
|
+
getRoutes: /* @__PURE__ */ __name(() => apiRoutesCache, "getRoutes"),
|
|
237
|
+
isReady: /* @__PURE__ */ __name(() => discoveryComplete, "isReady"),
|
|
238
|
+
waitForDiscovery: /* @__PURE__ */ __name(() => discoveryPromise, "waitForDiscovery")
|
|
239
|
+
};
|
|
240
|
+
return () => {
|
|
241
|
+
server.middlewares.use(
|
|
242
|
+
_withAfterNodeMiddleware(async (req, res, next) => {
|
|
243
|
+
const url = req.url || "/";
|
|
244
|
+
const pathname = url.split("?")[0];
|
|
245
|
+
const method = req.method || "GET";
|
|
246
|
+
if (discoveryPromise && !discoveryComplete) {
|
|
247
|
+
await discoveryPromise;
|
|
248
|
+
}
|
|
249
|
+
if (!matchAPIRoute(apiRoutesCache, pathname)) {
|
|
250
|
+
return next();
|
|
251
|
+
}
|
|
252
|
+
if (!apiRouterHandler) {
|
|
253
|
+
return next();
|
|
254
|
+
}
|
|
255
|
+
const startTime = Date.now();
|
|
256
|
+
try {
|
|
257
|
+
const farmMiddleware = server.__farmMiddleware__;
|
|
258
|
+
if (farmMiddleware) {
|
|
259
|
+
await farmMiddleware.waitForDiscovery?.();
|
|
260
|
+
const middlewareData = /* @__PURE__ */ new Map();
|
|
261
|
+
const handled = await farmMiddleware.execute(req, res, pathname, middlewareData);
|
|
262
|
+
if (handled) {
|
|
263
|
+
const duration2 = Date.now() - startTime;
|
|
264
|
+
logResponse(method, pathname, res.statusCode || 200, duration2);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
const fullUrl = `http://${req.headers.host || "localhost:3000"}${url}`;
|
|
269
|
+
const headers = new Headers();
|
|
270
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
271
|
+
if (value) {
|
|
272
|
+
headers.set(key, Array.isArray(value) ? value.join(", ") : value);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
let body;
|
|
276
|
+
if (method !== "GET" && method !== "HEAD") {
|
|
277
|
+
body = await new Promise((resolve) => {
|
|
278
|
+
let data = "";
|
|
279
|
+
req.on("data", (chunk) => {
|
|
280
|
+
data += chunk;
|
|
281
|
+
});
|
|
282
|
+
req.on("end", () => {
|
|
283
|
+
resolve(data);
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
const request = new Request(fullUrl, {
|
|
288
|
+
method,
|
|
289
|
+
headers,
|
|
290
|
+
body: body || void 0
|
|
291
|
+
});
|
|
292
|
+
const response = await apiRouterHandler(request);
|
|
293
|
+
const duration = Date.now() - startTime;
|
|
294
|
+
logResponse(method, pathname, response.status, duration);
|
|
295
|
+
await sendWebResponse(res, response);
|
|
296
|
+
} catch (error) {
|
|
297
|
+
const duration = Date.now() - startTime;
|
|
298
|
+
logResponse(method, pathname, 500, duration);
|
|
299
|
+
console.error("[FARM] API error:", error);
|
|
300
|
+
res.statusCode = 500;
|
|
301
|
+
res.setHeader("Content-Type", "application/json");
|
|
302
|
+
res.end(JSON.stringify({ error: "Internal server error" }));
|
|
303
|
+
}
|
|
304
|
+
})
|
|
305
|
+
);
|
|
306
|
+
};
|
|
307
|
+
},
|
|
308
|
+
async handleHotUpdate({ file, server, modules }) {
|
|
309
|
+
const fileName = file.split("/").pop() || "";
|
|
310
|
+
if (fileName === "routes.ts" || fileName === "routes.tsx" || fileName === "routes.js" || isProgrammaticRoutesFileName(fileName)) {
|
|
311
|
+
log(`Root routes file updated: ${fileName}`);
|
|
312
|
+
for (const mod of modules) {
|
|
313
|
+
server.moduleGraph.invalidateModule(mod);
|
|
314
|
+
}
|
|
315
|
+
for (const [routePath, route] of apiRoutesCache) {
|
|
316
|
+
if (route.filePath === file) {
|
|
317
|
+
apiRoutesCache.delete(routePath);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
try {
|
|
321
|
+
const routesModule = await server.ssrLoadModule(file);
|
|
322
|
+
for (const [exportName, exportValue] of Object.entries(routesModule)) {
|
|
323
|
+
const endpoint = exportValue;
|
|
324
|
+
if (endpoint && endpoint.__path) {
|
|
325
|
+
const routePath = endpoint.__path;
|
|
326
|
+
const method = String(endpoint.__method || "GET").toUpperCase();
|
|
327
|
+
addEndpoint(routePath, file, method, endpoint);
|
|
328
|
+
log(`Root route reloaded: ${method} ${routePath}`);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
const manifest = getProgrammaticRouteManifest(routesModule);
|
|
332
|
+
if (manifest) {
|
|
333
|
+
for (const definition of manifest.routes) {
|
|
334
|
+
if (definition.kind !== "api") continue;
|
|
335
|
+
for (const [method, endpoint] of Object.entries(definition.methods)) {
|
|
336
|
+
if (endpoint) {
|
|
337
|
+
addEndpoint(definition.path, file, method, endpoint);
|
|
338
|
+
log(`Programmatic route reloaded: ${method} ${definition.path}`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
await createRouter();
|
|
344
|
+
log(`API router recreated`);
|
|
345
|
+
} catch (e) {
|
|
346
|
+
log(`Root routes.ts HMR failed: ${e.message}`);
|
|
347
|
+
}
|
|
348
|
+
return [];
|
|
349
|
+
}
|
|
350
|
+
if (file.includes("/api/") && fileName.startsWith("route.")) {
|
|
351
|
+
const shortPath = file.split("/api/")[1] || file;
|
|
352
|
+
log(`API route updated: ${shortPath}`);
|
|
353
|
+
for (const mod of modules) {
|
|
354
|
+
server.moduleGraph.invalidateModule(mod);
|
|
355
|
+
}
|
|
356
|
+
let routePathToUpdate = null;
|
|
357
|
+
for (const [routePath, route] of apiRoutesCache) {
|
|
358
|
+
if (route.filePath === file) {
|
|
359
|
+
routePathToUpdate = routePath;
|
|
360
|
+
break;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
if (routePathToUpdate) {
|
|
364
|
+
try {
|
|
365
|
+
const routeModule = await server.ssrLoadModule(file);
|
|
366
|
+
const endpoints = {};
|
|
367
|
+
const availableMethods = [];
|
|
368
|
+
for (const method of API_ROUTE_METHODS) {
|
|
369
|
+
if (routeModule[method]) {
|
|
370
|
+
availableMethods.push(method);
|
|
371
|
+
endpoints[method] = routeModule[method];
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
if (availableMethods.length > 0) {
|
|
375
|
+
apiRoutesCache.set(routePathToUpdate, {
|
|
376
|
+
path: routePathToUpdate,
|
|
377
|
+
filePath: file,
|
|
378
|
+
methods: availableMethods,
|
|
379
|
+
endpoints
|
|
380
|
+
});
|
|
381
|
+
log(`API route reloaded: ${routePathToUpdate}`);
|
|
382
|
+
await createRouter();
|
|
383
|
+
log(`API router recreated`);
|
|
384
|
+
}
|
|
385
|
+
} catch (e) {
|
|
386
|
+
log(`API route HMR failed: ${e.message}`);
|
|
387
|
+
}
|
|
388
|
+
} else {
|
|
389
|
+
try {
|
|
390
|
+
const path = await import("path");
|
|
391
|
+
const apiDir = path.join(server.config.root, srcDir, "api");
|
|
392
|
+
const relativePath = path.relative(apiDir, path.dirname(file));
|
|
393
|
+
const routePath = "/api/" + (relativePath === "." ? "" : relativePath.replace(/\\/g, "/"));
|
|
394
|
+
const routeModule = await server.ssrLoadModule(file);
|
|
395
|
+
const endpoints = {};
|
|
396
|
+
const availableMethods = [];
|
|
397
|
+
for (const method of API_ROUTE_METHODS) {
|
|
398
|
+
if (routeModule[method]) {
|
|
399
|
+
availableMethods.push(method);
|
|
400
|
+
endpoints[method] = routeModule[method];
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
if (availableMethods.length > 0) {
|
|
404
|
+
apiRoutesCache.set(routePath, {
|
|
405
|
+
path: routePath,
|
|
406
|
+
filePath: file,
|
|
407
|
+
methods: availableMethods,
|
|
408
|
+
endpoints
|
|
409
|
+
});
|
|
410
|
+
log(`New API route discovered: ${routePath}`);
|
|
411
|
+
await createRouter();
|
|
412
|
+
}
|
|
413
|
+
} catch (e) {
|
|
414
|
+
log(`New API route load failed: ${e.message}`);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
return [];
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
__name(farmApiPlugin, "farmApiPlugin");
|
|
423
|
+
|
|
424
|
+
export {
|
|
425
|
+
farmApiPlugin
|
|
426
|
+
};
|
|
427
|
+
//# sourceMappingURL=chunk-JDEOUK5V.mjs.map
|