@farm.js/core 0.1.0-beta.5 → 0.1.0-beta.6
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/package.json +1 -1
- package/dist/after.cjs +0 -227
- package/dist/after.cjs.map +0 -1
- package/dist/after.d.mts +0 -25
- package/dist/after.d.ts +0 -25
- package/dist/after.mjs +0 -14
- package/dist/after.mjs.map +0 -1
- package/dist/agent-runtime.cjs +0 -2379
- package/dist/agent-runtime.cjs.map +0 -1
- package/dist/agent-runtime.d.mts +0 -94
- package/dist/agent-runtime.d.ts +0 -94
- package/dist/agent-runtime.mjs +0 -479
- package/dist/agent-runtime.mjs.map +0 -1
- package/dist/api/route-manager.d.mts +0 -66
- package/dist/api/route-manager.d.ts +0 -66
- package/dist/api/runtime.d.mts +0 -3
- package/dist/api/runtime.d.ts +0 -3
- package/dist/api.cjs +0 -4100
- package/dist/api.cjs.map +0 -1
- package/dist/api.d.mts +0 -48
- package/dist/api.d.ts +0 -48
- package/dist/api.mjs +0 -93
- package/dist/api.mjs.map +0 -1
- package/dist/app-BjN-da13.d.ts +0 -300
- package/dist/app-CakAr8Be.d.mts +0 -300
- package/dist/app-markdown.cjs +0 -220
- package/dist/app-markdown.cjs.map +0 -1
- package/dist/app-markdown.d.mts +0 -22
- package/dist/app-markdown.d.ts +0 -22
- package/dist/app-markdown.mjs +0 -26
- package/dist/app-markdown.mjs.map +0 -1
- package/dist/cache.cjs +0 -945
- package/dist/cache.cjs.map +0 -1
- package/dist/cache.d.mts +0 -192
- package/dist/cache.d.ts +0 -192
- package/dist/cache.mjs +0 -46
- package/dist/cache.mjs.map +0 -1
- package/dist/chunk-2CUKEMVR.mjs +0 -872
- package/dist/chunk-2CUKEMVR.mjs.map +0 -1
- package/dist/chunk-2ED5Q2GH.mjs +0 -422
- package/dist/chunk-2ED5Q2GH.mjs.map +0 -1
- package/dist/chunk-2NHCNRF6.mjs +0 -6241
- package/dist/chunk-2NHCNRF6.mjs.map +0 -1
- package/dist/chunk-32W4QEJP.mjs +0 -158
- package/dist/chunk-32W4QEJP.mjs.map +0 -1
- package/dist/chunk-3XNTL3FQ.mjs +0 -452
- package/dist/chunk-3XNTL3FQ.mjs.map +0 -1
- package/dist/chunk-44ZCFSKE.mjs +0 -84
- package/dist/chunk-44ZCFSKE.mjs.map +0 -1
- package/dist/chunk-4S3ORGFA.mjs +0 -44
- package/dist/chunk-4S3ORGFA.mjs.map +0 -1
- package/dist/chunk-5BY76U2M.mjs +0 -1
- package/dist/chunk-5BY76U2M.mjs.map +0 -1
- package/dist/chunk-5ZGPRGWV.mjs +0 -136
- package/dist/chunk-5ZGPRGWV.mjs.map +0 -1
- package/dist/chunk-65A7QIKI.mjs +0 -142
- package/dist/chunk-65A7QIKI.mjs.map +0 -1
- package/dist/chunk-74YTBPTY.mjs +0 -450
- package/dist/chunk-74YTBPTY.mjs.map +0 -1
- package/dist/chunk-7HO6AEOP.mjs +0 -74
- package/dist/chunk-7HO6AEOP.mjs.map +0 -1
- package/dist/chunk-7MABZJIM.mjs +0 -29
- package/dist/chunk-7MABZJIM.mjs.map +0 -1
- package/dist/chunk-7N62DNSO.mjs +0 -41
- package/dist/chunk-7N62DNSO.mjs.map +0 -1
- package/dist/chunk-7ZY5AIJO.mjs +0 -161
- package/dist/chunk-7ZY5AIJO.mjs.map +0 -1
- package/dist/chunk-A2LUXHD2.mjs +0 -7631
- package/dist/chunk-A2LUXHD2.mjs.map +0 -1
- package/dist/chunk-ALCLXXTY.mjs +0 -187
- package/dist/chunk-ALCLXXTY.mjs.map +0 -1
- package/dist/chunk-AZ7YUVNR.mjs +0 -65
- package/dist/chunk-AZ7YUVNR.mjs.map +0 -1
- package/dist/chunk-B232I2GP.mjs +0 -163
- package/dist/chunk-B232I2GP.mjs.map +0 -1
- package/dist/chunk-BHG3LVHH.mjs +0 -176
- package/dist/chunk-BHG3LVHH.mjs.map +0 -1
- package/dist/chunk-C2ROET2V.mjs +0 -718
- package/dist/chunk-C2ROET2V.mjs.map +0 -1
- package/dist/chunk-C3DLZMBU.mjs +0 -597
- package/dist/chunk-C3DLZMBU.mjs.map +0 -1
- package/dist/chunk-CGILA3WO.mjs +0 -14
- package/dist/chunk-CGILA3WO.mjs.map +0 -1
- package/dist/chunk-E2MPIBRE.mjs +0 -149
- package/dist/chunk-E2MPIBRE.mjs.map +0 -1
- package/dist/chunk-E6EPN5BT.mjs +0 -203
- package/dist/chunk-E6EPN5BT.mjs.map +0 -1
- package/dist/chunk-EEABSBKK.mjs +0 -10
- package/dist/chunk-EEABSBKK.mjs.map +0 -1
- package/dist/chunk-EJ7T4TPB.mjs +0 -622
- package/dist/chunk-EJ7T4TPB.mjs.map +0 -1
- package/dist/chunk-FQYDHKKU.mjs +0 -128
- package/dist/chunk-FQYDHKKU.mjs.map +0 -1
- package/dist/chunk-FRPWCMMG.mjs +0 -299
- package/dist/chunk-FRPWCMMG.mjs.map +0 -1
- package/dist/chunk-GN72QAIH.mjs +0 -146
- package/dist/chunk-GN72QAIH.mjs.map +0 -1
- package/dist/chunk-GQVGIUSN.mjs +0 -149
- package/dist/chunk-GQVGIUSN.mjs.map +0 -1
- package/dist/chunk-GS6K5OCM.mjs +0 -407
- package/dist/chunk-GS6K5OCM.mjs.map +0 -1
- package/dist/chunk-GXASWWJU.mjs +0 -364
- package/dist/chunk-GXASWWJU.mjs.map +0 -1
- package/dist/chunk-GY2STC2S.mjs +0 -180
- package/dist/chunk-GY2STC2S.mjs.map +0 -1
- package/dist/chunk-H2FA2SBS.mjs +0 -51
- package/dist/chunk-H2FA2SBS.mjs.map +0 -1
- package/dist/chunk-HNIQFZKB.mjs +0 -3550
- package/dist/chunk-HNIQFZKB.mjs.map +0 -1
- package/dist/chunk-ITN462YM.mjs +0 -98
- package/dist/chunk-ITN462YM.mjs.map +0 -1
- package/dist/chunk-J23HNLFY.mjs +0 -72
- package/dist/chunk-J23HNLFY.mjs.map +0 -1
- package/dist/chunk-J4FNJ5IU.mjs +0 -179
- package/dist/chunk-J4FNJ5IU.mjs.map +0 -1
- package/dist/chunk-J5YWQVI5.mjs +0 -211
- package/dist/chunk-J5YWQVI5.mjs.map +0 -1
- package/dist/chunk-JDEOUK5V.mjs +0 -427
- package/dist/chunk-JDEOUK5V.mjs.map +0 -1
- package/dist/chunk-JK25YEN6.mjs +0 -219
- package/dist/chunk-JK25YEN6.mjs.map +0 -1
- package/dist/chunk-K4667E2Q.mjs +0 -1916
- package/dist/chunk-K4667E2Q.mjs.map +0 -1
- package/dist/chunk-LGHEOHBU.mjs +0 -218
- package/dist/chunk-LGHEOHBU.mjs.map +0 -1
- package/dist/chunk-LLC7BNXW.mjs +0 -275
- package/dist/chunk-LLC7BNXW.mjs.map +0 -1
- package/dist/chunk-LM2YNO4U.mjs +0 -24
- package/dist/chunk-LM2YNO4U.mjs.map +0 -1
- package/dist/chunk-MIUW47JX.mjs +0 -639
- package/dist/chunk-MIUW47JX.mjs.map +0 -1
- package/dist/chunk-NM3CRAAL.mjs +0 -467
- package/dist/chunk-NM3CRAAL.mjs.map +0 -1
- package/dist/chunk-NNLCAVB6.mjs +0 -391
- package/dist/chunk-NNLCAVB6.mjs.map +0 -1
- package/dist/chunk-P7QDS5AT.mjs +0 -191
- package/dist/chunk-P7QDS5AT.mjs.map +0 -1
- package/dist/chunk-PFE6GMNE.mjs +0 -603
- package/dist/chunk-PFE6GMNE.mjs.map +0 -1
- package/dist/chunk-QGOHVJ6J.mjs +0 -63
- package/dist/chunk-QGOHVJ6J.mjs.map +0 -1
- package/dist/chunk-QGQX7SFC.mjs +0 -180
- package/dist/chunk-QGQX7SFC.mjs.map +0 -1
- package/dist/chunk-QKVUNGAH.mjs +0 -39
- package/dist/chunk-QKVUNGAH.mjs.map +0 -1
- package/dist/chunk-QM746KUO.mjs +0 -56
- package/dist/chunk-QM746KUO.mjs.map +0 -1
- package/dist/chunk-QTZZ2ISQ.mjs +0 -753
- package/dist/chunk-QTZZ2ISQ.mjs.map +0 -1
- package/dist/chunk-RBRLLZL5.mjs +0 -81
- package/dist/chunk-RBRLLZL5.mjs.map +0 -1
- package/dist/chunk-RHIFZZUI.mjs +0 -69
- package/dist/chunk-RHIFZZUI.mjs.map +0 -1
- package/dist/chunk-RSKVYESE.mjs +0 -187
- package/dist/chunk-RSKVYESE.mjs.map +0 -1
- package/dist/chunk-SCFX4UTD.mjs +0 -28
- package/dist/chunk-SCFX4UTD.mjs.map +0 -1
- package/dist/chunk-SL6HTIOK.mjs +0 -66
- package/dist/chunk-SL6HTIOK.mjs.map +0 -1
- package/dist/chunk-SPBBQLXI.mjs +0 -207
- package/dist/chunk-SPBBQLXI.mjs.map +0 -1
- package/dist/chunk-T4QJQK76.mjs +0 -459
- package/dist/chunk-T4QJQK76.mjs.map +0 -1
- package/dist/chunk-TQAEEJB4.mjs +0 -157
- package/dist/chunk-TQAEEJB4.mjs.map +0 -1
- package/dist/chunk-UB5UOSHB.mjs +0 -458
- package/dist/chunk-UB5UOSHB.mjs.map +0 -1
- package/dist/chunk-USWZZUEH.mjs +0 -25
- package/dist/chunk-USWZZUEH.mjs.map +0 -1
- package/dist/chunk-UVCIEUJC.mjs +0 -16
- package/dist/chunk-UVCIEUJC.mjs.map +0 -1
- package/dist/chunk-UXUAWNO5.mjs +0 -396
- package/dist/chunk-UXUAWNO5.mjs.map +0 -1
- package/dist/chunk-V3XURYJO.mjs +0 -756
- package/dist/chunk-V3XURYJO.mjs.map +0 -1
- package/dist/chunk-V6WE6JSZ.mjs +0 -352
- package/dist/chunk-V6WE6JSZ.mjs.map +0 -1
- package/dist/chunk-V7RBCSDJ.mjs +0 -170
- package/dist/chunk-V7RBCSDJ.mjs.map +0 -1
- package/dist/chunk-VCANOYFI.mjs +0 -588
- package/dist/chunk-VCANOYFI.mjs.map +0 -1
- package/dist/chunk-VY2UYN5R.mjs +0 -224
- package/dist/chunk-VY2UYN5R.mjs.map +0 -1
- package/dist/chunk-W2CRQFF6.mjs +0 -1352
- package/dist/chunk-W2CRQFF6.mjs.map +0 -1
- package/dist/chunk-WZ5QFROO.mjs +0 -23
- package/dist/chunk-WZ5QFROO.mjs.map +0 -1
- package/dist/chunk-XIVV5IWN.mjs +0 -541
- package/dist/chunk-XIVV5IWN.mjs.map +0 -1
- package/dist/chunk-YW7OBE6Q.mjs +0 -119
- package/dist/chunk-YW7OBE6Q.mjs.map +0 -1
- package/dist/chunk-Z5CQMP54.mjs +0 -365
- package/dist/chunk-Z5CQMP54.mjs.map +0 -1
- package/dist/chunk-ZBE6MLHL.mjs +0 -230
- package/dist/chunk-ZBE6MLHL.mjs.map +0 -1
- package/dist/chunk-ZZ57EH5Z.mjs +0 -173
- package/dist/chunk-ZZ57EH5Z.mjs.map +0 -1
- package/dist/client-BT1mFQas.d.mts +0 -447
- package/dist/client-Nn0q4eO4.d.ts +0 -447
- package/dist/client-cache-CIlyBlmx.d.ts +0 -6
- package/dist/client-cache-D-EZ7XVW.d.mts +0 -6
- package/dist/client-plugins-Cw4qUGsw.d.ts +0 -1855
- package/dist/client-plugins-DQQ1adXM.d.mts +0 -1855
- package/dist/client-plugins.cjs +0 -415
- package/dist/client-plugins.cjs.map +0 -1
- package/dist/client-plugins.d.mts +0 -22
- package/dist/client-plugins.d.ts +0 -22
- package/dist/client-plugins.mjs +0 -10
- package/dist/client-plugins.mjs.map +0 -1
- package/dist/client.cjs +0 -5402
- package/dist/client.cjs.map +0 -1
- package/dist/client.d.mts +0 -447
- package/dist/client.d.ts +0 -447
- package/dist/client.mjs +0 -110
- package/dist/client.mjs.map +0 -1
- package/dist/config.cjs +0 -38
- package/dist/config.cjs.map +0 -1
- package/dist/config.d.mts +0 -29
- package/dist/config.d.ts +0 -29
- package/dist/config.mjs +0 -10
- package/dist/config.mjs.map +0 -1
- package/dist/cron.cjs +0 -406
- package/dist/cron.cjs.map +0 -1
- package/dist/cron.d.mts +0 -78
- package/dist/cron.d.ts +0 -78
- package/dist/cron.mjs +0 -30
- package/dist/cron.mjs.map +0 -1
- package/dist/deferred.cjs +0 -438
- package/dist/deferred.cjs.map +0 -1
- package/dist/deferred.d.mts +0 -42
- package/dist/deferred.d.ts +0 -42
- package/dist/deferred.mjs +0 -28
- package/dist/deferred.mjs.map +0 -1
- package/dist/deployment.cjs +0 -199
- package/dist/deployment.cjs.map +0 -1
- package/dist/deployment.d.mts +0 -34
- package/dist/deployment.d.ts +0 -34
- package/dist/deployment.mjs +0 -38
- package/dist/deployment.mjs.map +0 -1
- package/dist/devtools-LVC3VB5P.mjs +0 -370
- package/dist/devtools-LVC3VB5P.mjs.map +0 -1
- package/dist/devtools-client-3XRTBND5.mjs +0 -216
- package/dist/devtools-client-3XRTBND5.mjs.map +0 -1
- package/dist/devtools-ui-NJKFORTG.mjs +0 -1349
- package/dist/devtools-ui-NJKFORTG.mjs.map +0 -1
- package/dist/docs.cjs +0 -5553
- package/dist/docs.cjs.map +0 -1
- package/dist/docs.d.mts +0 -69
- package/dist/docs.d.ts +0 -69
- package/dist/docs.mjs +0 -46
- package/dist/docs.mjs.map +0 -1
- package/dist/env-types.cjs +0 -223
- package/dist/env-types.cjs.map +0 -1
- package/dist/env-types.d.mts +0 -11
- package/dist/env-types.d.ts +0 -11
- package/dist/env-types.mjs +0 -9
- package/dist/env-types.mjs.map +0 -1
- package/dist/env.cjs +0 -215
- package/dist/env.cjs.map +0 -1
- package/dist/env.d.mts +0 -45
- package/dist/env.d.ts +0 -45
- package/dist/env.mjs +0 -22
- package/dist/env.mjs.map +0 -1
- package/dist/environment/vite.d.mts +0 -22
- package/dist/environment/vite.d.ts +0 -22
- package/dist/environment.cjs +0 -96
- package/dist/environment.cjs.map +0 -1
- package/dist/environment.d.mts +0 -18
- package/dist/environment.d.ts +0 -18
- package/dist/environment.mjs +0 -14
- package/dist/environment.mjs.map +0 -1
- package/dist/headers.cjs +0 -126
- package/dist/headers.cjs.map +0 -1
- package/dist/headers.d.mts +0 -22
- package/dist/headers.d.ts +0 -22
- package/dist/headers.mjs +0 -12
- package/dist/headers.mjs.map +0 -1
- package/dist/i18n/client.d.mts +0 -32
- package/dist/i18n/client.d.ts +0 -32
- package/dist/i18n/index.d.mts +0 -20
- package/dist/i18n/index.d.ts +0 -20
- package/dist/i18n/server.d.mts +0 -30
- package/dist/i18n/server.d.ts +0 -30
- package/dist/image/server.d.mts +0 -37
- package/dist/image/server.d.ts +0 -37
- package/dist/image/sharp.d.mts +0 -7
- package/dist/image/sharp.d.ts +0 -7
- package/dist/image-config-Duob7wER.d.mts +0 -50
- package/dist/image-config-Duob7wER.d.ts +0 -50
- package/dist/image.cjs +0 -209
- package/dist/image.cjs.map +0 -1
- package/dist/image.d.mts +0 -39
- package/dist/image.d.ts +0 -39
- package/dist/image.mjs +0 -165
- package/dist/image.mjs.map +0 -1
- package/dist/index.cjs +0 -41822
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.mts +0 -451
- package/dist/index.d.ts +0 -451
- package/dist/index.mjs +0 -973
- package/dist/index.mjs.map +0 -1
- package/dist/integration-api-CHT2OKAf.d.mts +0 -93
- package/dist/integration-api-CHT2OKAf.d.ts +0 -93
- package/dist/integration-orm-GQLGU66X.mjs +0 -13
- package/dist/integration-orm-GQLGU66X.mjs.map +0 -1
- package/dist/integrations.cjs +0 -2820
- package/dist/integrations.cjs.map +0 -1
- package/dist/integrations.d.mts +0 -22
- package/dist/integrations.d.ts +0 -22
- package/dist/integrations.mjs +0 -51
- package/dist/integrations.mjs.map +0 -1
- package/dist/internal/build-runtime.d.mts +0 -39
- package/dist/internal/build-runtime.d.ts +0 -39
- package/dist/internal/client-runtime.d.mts +0 -2
- package/dist/internal/client-runtime.d.ts +0 -2
- package/dist/internal/config-runtime.d.mts +0 -39
- package/dist/internal/config-runtime.d.ts +0 -39
- package/dist/internal/production-node-env.d.mts +0 -12
- package/dist/internal/production-node-env.d.ts +0 -12
- package/dist/internal/production-runtime.d.mts +0 -39
- package/dist/internal/production-runtime.d.ts +0 -39
- package/dist/layers-VWVDTPUZ.mjs +0 -16
- package/dist/layers-VWVDTPUZ.mjs.map +0 -1
- package/dist/manager-THKFTOFE.mjs +0 -10
- package/dist/manager-THKFTOFE.mjs.map +0 -1
- package/dist/markdown.cjs +0 -299
- package/dist/markdown.cjs.map +0 -1
- package/dist/markdown.d.mts +0 -43
- package/dist/markdown.d.ts +0 -43
- package/dist/markdown.mjs +0 -14
- package/dist/markdown.mjs.map +0 -1
- package/dist/metadata-BAPg_Nmo.d.ts +0 -22
- package/dist/metadata-_6i9oFG3.d.mts +0 -22
- package/dist/middleware.cjs +0 -2148
- package/dist/middleware.cjs.map +0 -1
- package/dist/middleware.d.mts +0 -164
- package/dist/middleware.d.ts +0 -164
- package/dist/middleware.mjs +0 -49
- package/dist/middleware.mjs.map +0 -1
- package/dist/navigation-errors-Dvwpzaer.d.mts +0 -13
- package/dist/navigation-errors-Dvwpzaer.d.ts +0 -13
- package/dist/navigation.cjs +0 -1329
- package/dist/navigation.cjs.map +0 -1
- package/dist/navigation.d.mts +0 -14
- package/dist/navigation.d.ts +0 -14
- package/dist/navigation.mjs +0 -33
- package/dist/navigation.mjs.map +0 -1
- package/dist/nitro-QO5LV6QK.mjs +0 -689
- package/dist/nitro-QO5LV6QK.mjs.map +0 -1
- package/dist/observability.cjs +0 -186
- package/dist/observability.cjs.map +0 -1
- package/dist/observability.d.mts +0 -335
- package/dist/observability.d.ts +0 -335
- package/dist/observability.mjs +0 -16
- package/dist/observability.mjs.map +0 -1
- package/dist/params-BALtrRim.d.ts +0 -15
- package/dist/params-ry-lxqmy.d.mts +0 -15
- package/dist/plugin-BJDf43dc.d.mts +0 -165
- package/dist/plugin-BJDf43dc.d.ts +0 -165
- package/dist/plugin.cjs +0 -23225
- package/dist/plugin.d.mts +0 -22
- package/dist/plugin.d.ts +0 -22
- package/dist/production-runtime-BoJDc5mc.d.ts +0 -79
- package/dist/production-runtime-C_B79w2P.d.mts +0 -28
- package/dist/production-runtime-DDEM1D2q.d.ts +0 -28
- package/dist/production-runtime-DPfgMV9Y.d.mts +0 -79
- package/dist/query/client.d.mts +0 -61
- package/dist/query/client.d.ts +0 -61
- package/dist/query/index.d.mts +0 -90
- package/dist/query/index.d.ts +0 -90
- package/dist/query/parsers.d.mts +0 -25
- package/dist/query/parsers.d.ts +0 -25
- package/dist/query/server.d.mts +0 -55
- package/dist/query/server.d.ts +0 -55
- package/dist/request-BrFBuc8G.d.mts +0 -6
- package/dist/request-BslSZIRz.d.ts +0 -6
- package/dist/request.d.mts +0 -2
- package/dist/request.d.ts +0 -2
- package/dist/resolver-C6iecsDV.d.ts +0 -14
- package/dist/resolver-DlOPpjkB.d.mts +0 -14
- package/dist/route-runtime-DoOHzCAD.d.mts +0 -38
- package/dist/route-runtime-DoOHzCAD.d.ts +0 -38
- package/dist/router.d.mts +0 -36
- package/dist/router.d.ts +0 -36
- package/dist/routes.d.mts +0 -224
- package/dist/routes.d.ts +0 -224
- package/dist/runtime-9nQjVM7X.d.mts +0 -206
- package/dist/runtime-B6GvwDS1.d.ts +0 -27
- package/dist/runtime-DeAAZ6gO.d.mts +0 -27
- package/dist/runtime-DgeS2skB.d.ts +0 -206
- package/dist/server-action-security.d.mts +0 -43
- package/dist/server-action-security.d.ts +0 -43
- package/dist/server-fn-client.d.mts +0 -32
- package/dist/server-fn-client.d.ts +0 -32
- package/dist/server-fn.d.mts +0 -93
- package/dist/server-fn.d.ts +0 -93
- package/dist/server-plugins.d.mts +0 -55
- package/dist/server-plugins.d.ts +0 -55
- package/dist/server-query-client.d.mts +0 -50
- package/dist/server-query-client.d.ts +0 -50
- package/dist/server-query.d.mts +0 -36
- package/dist/server-query.d.ts +0 -36
- package/dist/server.d.mts +0 -48
- package/dist/server.d.ts +0 -48
- package/dist/storage.d.mts +0 -52
- package/dist/storage.d.ts +0 -52
- package/dist/testing.d.mts +0 -101
- package/dist/testing.d.ts +0 -101
- package/dist/transport-BmbGTXA5.d.mts +0 -49
- package/dist/transport-BmbGTXA5.d.ts +0 -49
- package/dist/types-BH1lhg5G.d.mts +0 -81
- package/dist/types-BH1lhg5G.d.ts +0 -81
- package/dist/types-C9N-nk5R.d.mts +0 -53
- package/dist/types-C9N-nk5R.d.ts +0 -53
- package/dist/types-D1A6-XvH.d.mts +0 -73
- package/dist/types-D1A6-XvH.d.ts +0 -73
- package/dist/utils-CHXlMDkg.d.mts +0 -23
- package/dist/utils-Drsyz1Vj.d.ts +0 -23
- package/dist/version.d.mts +0 -3
- package/dist/version.d.ts +0 -3
- package/dist/vite.d.mts +0 -22
- package/dist/vite.d.ts +0 -22
- package/dist/workflows.d.mts +0 -110
- package/dist/workflows.d.ts +0 -110
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mutation-client.ts","../src/fetcher-client.tsx","../src/store.ts","../src/client/link.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport { isAPIRouteRef, type APIResult, type ClientOptions } from \"./api/client\";\n\nexport type MutationStatus = \"idle\" | \"pending\" | \"success\" | \"error\";\n\nexport type AnyMutationTarget = (...args: any[]) => Promise<any>;\n\nexport type InferMutationVariables<TTarget extends AnyMutationTarget> =\n Parameters<TTarget> extends [] ? undefined : Parameters<TTarget>[0];\n\nexport type InferMutationData<TTarget extends AnyMutationTarget> = TTarget extends {\n readonly __farmRouteData: infer TData;\n}\n ? TData\n : Awaited<ReturnType<TTarget>>;\n\nexport type InferMutationError<TTarget extends AnyMutationTarget> = TTarget extends (\n ...args: any[]\n) => Promise<APIResult<any, infer TError>>\n ? TError\n : Error;\n\nexport type MutationOptimisticContext<TVariables, TData> = {\n variables: TVariables | undefined;\n current: TData | null;\n};\n\nexport type UseMutationOptions<TVariables, TData, TError = Error> = {\n initialData?: TData | null;\n resetOnMutate?: boolean;\n optimistic?: (context: MutationOptimisticContext<TVariables, TData>) => TData | null | undefined;\n rollbackOnError?: boolean;\n /**\n * Options forwarded to generated `api.route.method` clients.\n * Server functions ignore this field.\n */\n request?: ClientOptions<TData, TError>;\n onSuccess?: (data: TData, variables: TVariables | undefined) => void;\n onError?: (error: TError, variables: TVariables | undefined) => void;\n onSettled?: (data: TData | null, error: TError | null, variables: TVariables | undefined) => void;\n};\n\ntype MutationInput<TTarget extends AnyMutationTarget> = InferMutationVariables<TTarget>;\n\ntype MutationData<TTarget extends AnyMutationTarget> = InferMutationData<TTarget>;\n\ntype MutationError<TTarget extends AnyMutationTarget> = InferMutationError<TTarget>;\n\nexport type MutationAsync<TTarget extends AnyMutationTarget, TData = MutationData<TTarget>> =\n [] extends Parameters<TTarget>\n ? (variables?: MutationInput<TTarget>) => Promise<TData>\n : (variables: MutationInput<TTarget>) => Promise<TData>;\n\nexport type MutationTrigger<TTarget extends AnyMutationTarget> =\n [] extends Parameters<TTarget>\n ? (variables?: MutationInput<TTarget>) => void\n : (variables: MutationInput<TTarget>) => void;\n\nexport type UseMutationReturn<\n TTarget extends AnyMutationTarget,\n TData = MutationData<TTarget>,\n TError = MutationError<TTarget>,\n> = {\n pending: boolean;\n status: MutationStatus;\n data: TData | null;\n error: TError | null;\n variables: MutationInput<TTarget> | undefined;\n mutate: MutationTrigger<TTarget>;\n mutateAsync: MutationAsync<TTarget, TData>;\n reset: () => void;\n};\n\ntype MutationState<TVariables, TData, TError> = {\n pendingCount: number;\n status: MutationStatus;\n data: TData | null;\n error: TError | null;\n variables: TVariables | undefined;\n};\n\n/**\n * Track a generated API route mutation or a Farm server function with one\n * React lifecycle.\n *\n * API routes keep using their existing fetch transport and request options.\n * Server functions keep using their configured server-function transport.\n */\nexport function useMutation<TTarget extends AnyMutationTarget>(\n target: TTarget,\n options: UseMutationOptions<\n MutationInput<TTarget>,\n MutationData<TTarget>,\n MutationError<TTarget>\n > = {},\n): UseMutationReturn<TTarget> {\n type TVariables = MutationInput<TTarget>;\n type TData = MutationData<TTarget>;\n type TError = MutationError<TTarget>;\n\n const initialData = options.initialData ?? null;\n const optionsRef = useRef(options);\n const targetRef = useRef(target);\n const requestIdRef = useRef(0);\n const initialState: MutationState<TVariables, TData, TError> = {\n pendingCount: 0,\n status: \"idle\",\n data: initialData,\n error: null,\n variables: undefined,\n };\n const stateRef = useRef(initialState);\n const [state, setState] = useState<MutationState<TVariables, TData, TError>>(initialState);\n\n optionsRef.current = options;\n targetRef.current = target;\n\n const setMutationState = useCallback(\n (\n value:\n | MutationState<TVariables, TData, TError>\n | ((\n current: MutationState<TVariables, TData, TError>,\n ) => MutationState<TVariables, TData, TError>),\n ) => {\n setState((current) => {\n const next = typeof value === \"function\" ? value(current) : value;\n stateRef.current = next;\n return next;\n });\n },\n [],\n );\n\n const mutateAsync = useCallback(\n async (variables?: TVariables) => {\n const requestId = ++requestIdRef.current;\n const currentOptions = optionsRef.current;\n const previousData = stateRef.current.data;\n const optimisticData = currentOptions.optimistic?.({\n variables,\n current: previousData,\n });\n const hasOptimisticData = optimisticData !== undefined;\n\n setMutationState((current) => ({\n pendingCount: current.pendingCount + 1,\n status: \"pending\",\n data: hasOptimisticData\n ? optimisticData\n : currentOptions.resetOnMutate === false\n ? current.data\n : null,\n error: null,\n variables,\n }));\n\n try {\n const mutationTarget = targetRef.current;\n const rawResult = isAPIRouteRef(mutationTarget)\n ? await mutationTarget(variables, currentOptions.request)\n : await mutationTarget(variables);\n const data = unwrapMutationResult<TData, TError>(rawResult, isAPIRouteRef(mutationTarget));\n const isLatestRequest = requestId === requestIdRef.current;\n\n setMutationState((current) => {\n const pendingCount = Math.max(0, current.pendingCount - 1);\n if (!isLatestRequest) {\n return {\n ...current,\n pendingCount,\n status: pendingCount > 0 ? \"pending\" : current.status,\n };\n }\n\n return {\n pendingCount,\n status: \"success\",\n data,\n error: null,\n variables,\n };\n });\n\n if (isLatestRequest) {\n currentOptions.onSuccess?.(data, variables);\n currentOptions.onSettled?.(data, null, variables);\n }\n\n return data;\n } catch (cause) {\n const error = normalizeMutationError(cause) as TError;\n const isLatestRequest = requestId === requestIdRef.current;\n\n setMutationState((current) => {\n const pendingCount = Math.max(0, current.pendingCount - 1);\n if (!isLatestRequest) {\n return {\n ...current,\n pendingCount,\n status: pendingCount > 0 ? \"pending\" : current.status,\n };\n }\n\n return {\n pendingCount,\n status: \"error\",\n data:\n hasOptimisticData && currentOptions.rollbackOnError\n ? previousData\n : currentOptions.resetOnMutate === false\n ? current.data\n : null,\n error,\n variables,\n };\n });\n\n if (isLatestRequest) {\n currentOptions.onError?.(error, variables);\n currentOptions.onSettled?.(null, error, variables);\n }\n\n throw error;\n }\n },\n [setMutationState],\n ) as MutationAsync<TTarget, TData>;\n\n const mutate = useCallback(\n (variables?: TVariables) => {\n void mutateAsync(variables as never).catch(() => {});\n },\n [mutateAsync],\n ) as MutationTrigger<TTarget>;\n\n const reset = useCallback(() => {\n requestIdRef.current += 1;\n setMutationState({\n pendingCount: 0,\n status: \"idle\",\n data: optionsRef.current.initialData ?? null,\n error: null,\n variables: undefined,\n });\n }, [setMutationState]);\n\n return useMemo(\n () => ({\n pending: state.pendingCount > 0,\n status: state.status,\n data: state.data,\n error: state.error,\n variables: state.variables,\n mutate,\n mutateAsync,\n reset,\n }),\n [\n mutate,\n mutateAsync,\n reset,\n state.data,\n state.error,\n state.pendingCount,\n state.status,\n state.variables,\n ],\n );\n}\n\nfunction unwrapMutationResult<TData, TError>(result: unknown, apiRoute: boolean): TData {\n if (!apiRoute) return result as TData;\n\n const apiResult = result as APIResult<TData, TError>;\n if (apiResult.error) {\n throw apiResult.error;\n }\n\n return apiResult.data as TData;\n}\n\nfunction normalizeMutationError(error: unknown): Error {\n if (error instanceof Error) return error;\n\n const normalized = new Error(typeof error === \"string\" ? error : \"Mutation failed\");\n (normalized as Error & { cause?: unknown }).cause = error;\n return normalized;\n}\n","\"use client\";\n\nimport {\n createElement,\n useCallback,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type FormEvent,\n type FormHTMLAttributes,\n} from \"react\";\nimport { getAPIRouteRefMetadata, isAPIRouteRef } from \"./api/client\";\nimport {\n useMutation,\n type AnyMutationTarget,\n type InferMutationData,\n type InferMutationError,\n type InferMutationVariables,\n type MutationStatus,\n type UseMutationOptions,\n} from \"./mutation-client\";\n\nexport type FetcherState = \"idle\" | \"submitting\";\n\nexport type FetcherFormDataContext = {\n form: HTMLFormElement | null;\n submitter: HTMLElement | null;\n};\n\nexport type UseFetcherOptions<TTarget extends AnyMutationTarget> = UseMutationOptions<\n InferMutationVariables<TTarget>,\n InferMutationData<TTarget>,\n InferMutationError<TTarget>\n> & {\n /**\n * Convert browser FormData into the target's typed variables.\n *\n * Generated API routes default to `{ body: Object.fromEntries(formData) }`\n * (or `{ query: ... }` for GET/HEAD). Server functions receive FormData\n * directly so their input schema remains authoritative.\n */\n mapFormData?: (\n formData: FormData,\n context: FetcherFormDataContext,\n ) => InferMutationVariables<TTarget>;\n};\n\nexport type FetcherFormProps = Omit<FormHTMLAttributes<HTMLFormElement>, \"action\" | \"onSubmit\"> & {\n /**\n * Override the native form fallback. By default server functions remain the\n * action and generated GET/POST API routes use their real URL.\n */\n action?: string | ((formData: FormData) => void | Promise<void>);\n onSubmit?: (event: FormEvent<HTMLFormElement>) => void;\n};\n\ntype FetcherInput<TTarget extends AnyMutationTarget> = InferMutationVariables<TTarget> | FormData;\n\nexport type FetcherSubmitAsync<TTarget extends AnyMutationTarget> =\n [] extends Parameters<TTarget>\n ? (input?: FetcherInput<TTarget>) => Promise<InferMutationData<TTarget>>\n : (input: FetcherInput<TTarget>) => Promise<InferMutationData<TTarget>>;\n\nexport type FetcherSubmit<TTarget extends AnyMutationTarget> =\n [] extends Parameters<TTarget>\n ? (input?: FetcherInput<TTarget>) => void\n : (input: FetcherInput<TTarget>) => void;\n\nexport type UseFetcherReturn<TTarget extends AnyMutationTarget> = {\n state: FetcherState;\n status: MutationStatus;\n pending: boolean;\n data: InferMutationData<TTarget> | null;\n error: InferMutationError<TTarget> | null;\n variables: InferMutationVariables<TTarget> | undefined;\n formData: FormData | null;\n submit: FetcherSubmit<TTarget>;\n submitAsync: FetcherSubmitAsync<TTarget>;\n Form: ComponentType<FetcherFormProps>;\n reset: () => void;\n};\n\nconst formDataContexts = new WeakMap<FormData, FetcherFormDataContext>();\n\n/**\n * Run a typed server function or generated API operation without navigating.\n *\n * `fetcher.Form` progressively keeps a server function as the native form\n * action, while hydration intercepts submissions into this fetcher lifecycle.\n */\nexport function useFetcher<TTarget extends AnyMutationTarget>(\n target: TTarget,\n options: UseFetcherOptions<TTarget> = {},\n): UseFetcherReturn<TTarget> {\n const targetRef = useRef(target);\n const optionsRef = useRef(options);\n const submissionIdRef = useRef(0);\n const [formData, setFormData] = useState<FormData | null>(null);\n const mutation = useMutation(target, options);\n\n targetRef.current = target;\n optionsRef.current = options;\n\n const submitAsync = useCallback(\n async (input?: FetcherInput<TTarget>) => {\n const submissionId = ++submissionIdRef.current;\n const submittedFormData = isFormData(input) ? input : null;\n setFormData(submittedFormData);\n\n try {\n const variables = submittedFormData\n ? mapFetcherFormData(targetRef.current, submittedFormData, optionsRef.current)\n : input;\n return await mutation.mutateAsync(variables as InferMutationVariables<TTarget>);\n } finally {\n if (submissionId === submissionIdRef.current) {\n setFormData(null);\n }\n }\n },\n [mutation.mutateAsync],\n ) as FetcherSubmitAsync<TTarget>;\n\n const submit = useCallback(\n (input?: FetcherInput<TTarget>) => {\n void submitAsync(input as never).catch(() => {});\n },\n [submitAsync],\n ) as FetcherSubmit<TTarget>;\n\n const Form = useMemo(() => {\n const FetcherForm = ({ action, method, encType, onSubmit, ...props }: FetcherFormProps) => {\n const targetValue = targetRef.current;\n const metadata = getAPIRouteRefMetadata(targetValue);\n const nativeAction = action ?? resolveFetcherFormAction(targetValue, metadata);\n const nativeMethod =\n method ??\n (metadata && (metadata.method === \"GET\" || metadata.method === \"POST\")\n ? metadata.method.toLowerCase()\n : metadata\n ? \"post\"\n : undefined);\n const functionAction = typeof nativeAction === \"function\";\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>) => {\n onSubmit?.(event);\n if (event.defaultPrevented) return;\n\n event.preventDefault();\n const submitter = getSubmitter(event);\n const nextFormData = createSubmitterFormData(event.currentTarget, submitter);\n formDataContexts.set(nextFormData, {\n form: event.currentTarget,\n submitter,\n });\n void submitAsync(nextFormData as never).catch(() => {});\n };\n\n return createElement(\"form\", {\n ...props,\n action: nativeAction as FormHTMLAttributes<HTMLFormElement>[\"action\"],\n method: functionAction ? undefined : nativeMethod,\n encType: functionAction ? undefined : encType,\n onSubmit: handleSubmit,\n });\n };\n\n FetcherForm.displayName = \"FetcherForm\";\n return FetcherForm;\n }, [submitAsync]);\n\n const reset = useCallback(() => {\n submissionIdRef.current += 1;\n setFormData(null);\n mutation.reset();\n }, [mutation.reset]);\n\n return useMemo(\n () => ({\n state: mutation.pending ? \"submitting\" : \"idle\",\n status: mutation.status,\n pending: mutation.pending,\n data: mutation.data,\n error: mutation.error,\n variables: mutation.variables,\n formData,\n submit,\n submitAsync,\n Form,\n reset,\n }),\n [\n Form,\n formData,\n mutation.data,\n mutation.error,\n mutation.pending,\n mutation.status,\n mutation.variables,\n reset,\n submit,\n submitAsync,\n ],\n );\n}\n\nfunction mapFetcherFormData<TTarget extends AnyMutationTarget>(\n target: TTarget,\n formData: FormData,\n options: UseFetcherOptions<TTarget>,\n): InferMutationVariables<TTarget> | FormData {\n const context = formDataContexts.get(formData) ?? { form: null, submitter: null };\n if (options.mapFormData) {\n return options.mapFormData(formData, context);\n }\n if (!isAPIRouteRef(target)) {\n return formData;\n }\n\n const values = formDataToObject(formData);\n const method = getAPIRouteRefMetadata(target)?.method;\n return (\n method === \"GET\" || method === \"HEAD\" ? { query: values } : { body: values }\n ) as InferMutationVariables<TTarget>;\n}\n\nfunction resolveFetcherFormAction(\n target: AnyMutationTarget,\n metadata: ReturnType<typeof getAPIRouteRefMetadata>,\n): string | AnyMutationTarget | undefined {\n if (!metadata) return isProgressiveFormAction(target) ? target : undefined;\n if (metadata.sameOrigin) return metadata.path;\n\n return new URL(metadata.path, metadata.baseURL).href;\n}\n\nfunction formDataToObject(\n formData: FormData,\n): Record<string, FormDataEntryValue | FormDataEntryValue[]> {\n const output: Record<string, FormDataEntryValue | FormDataEntryValue[]> = Object.create(null);\n for (const [key, value] of formData.entries()) {\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") continue;\n const current = output[key];\n if (current === undefined) {\n output[key] = value;\n } else if (Array.isArray(current)) {\n current.push(value);\n } else {\n output[key] = [current, value];\n }\n }\n return output;\n}\n\nfunction createSubmitterFormData(form: HTMLFormElement, submitter: HTMLElement | null): FormData {\n try {\n return new FormData(form, submitter as HTMLElement | undefined);\n } catch {\n const formData = new FormData(form);\n const candidate = submitter as\n | (HTMLElement & { disabled?: boolean; name?: string; value?: string })\n | null;\n if (candidate && !candidate.disabled && candidate.name) {\n formData.append(candidate.name, candidate.value ?? \"\");\n }\n return formData;\n }\n}\n\nfunction getSubmitter(event: FormEvent<HTMLFormElement>): HTMLElement | null {\n const nativeEvent = event.nativeEvent as SubmitEvent;\n return nativeEvent.submitter instanceof HTMLElement ? nativeEvent.submitter : null;\n}\n\nfunction isProgressiveFormAction(target: AnyMutationTarget): boolean {\n const candidate = target as AnyMutationTarget & {\n __farmServerFn?: unknown;\n $$FORM_ACTION?: unknown;\n $$typeof?: unknown;\n };\n return (\n candidate.__farmServerFn === true ||\n typeof candidate.$$FORM_ACTION === \"function\" ||\n candidate.$$typeof === Symbol.for(\"react.server.reference\")\n );\n}\n\nfunction isFormData(value: unknown): value is FormData {\n if (!value || typeof value !== \"object\") return false;\n return (\n (typeof FormData !== \"undefined\" && value instanceof FormData) ||\n (Object.prototype.toString.call(value) === \"[object FormData]\" &&\n typeof (value as { entries?: unknown }).entries === \"function\")\n );\n}\n","import { useSyncExternalStore } from \"react\";\n\nexport type StoreState = Record<string, any>;\nexport type StoreValueUpdater<T> = T | ((previous: T) => T);\nexport type StorePatch<T extends StoreState> = Partial<T> | ((state: T) => Partial<T>);\nexport type StoreListener<T extends StoreState> = (state: T, previousState: T) => void;\nexport type StoreKeyListener<T extends StoreState, K extends keyof T> = (\n value: T[K],\n previousValue: T[K],\n) => void;\nexport type StoreKeysListener<T extends StoreState, K extends keyof T> = (\n value: Pick<T, K>,\n previousValue: Pick<T, K>,\n) => void;\n\ntype StoreSubscription<T extends StoreState> = {\n keys: readonly (keyof T)[] | null;\n notify: (state: T, previousState: T) => void;\n};\n\ntype ReservedStoreKey = \"use\" | \"get\" | \"set\" | \"replace\" | \"reset\" | \"subscribe\";\n\ntype FieldAccessor<T extends StoreState, K extends keyof T> = {\n (): T[K];\n get(): T[K];\n set(value: StoreValueUpdater<T[K]>): T[K];\n subscribe(listener: StoreKeyListener<T, K>): () => void;\n};\n\nexport type StoreFields<T extends StoreState> = {\n [K in keyof T]: FieldAccessor<T, K>;\n};\n\nexport interface StoreApi<T extends StoreState> {\n use(): T;\n use<K extends keyof T>(key: K): T[K];\n use<K extends keyof T>(keys: readonly K[]): Pick<T, K>;\n get(): T;\n get<K extends keyof T>(key: K): T[K];\n set<K extends keyof T>(key: K, value: StoreValueUpdater<T[K]>): T[K];\n set(patch: StorePatch<T>): T;\n replace(nextState: T | ((state: T) => T)): T;\n reset(): T;\n subscribe(listener: StoreListener<T>): () => void;\n subscribe<K extends keyof T>(key: K, listener: StoreKeyListener<T, K>): () => void;\n subscribe<K extends keyof T>(keys: readonly K[], listener: StoreKeysListener<T, K>): () => void;\n}\n\nexport type Store<T extends StoreState, TMethods extends Record<string, any> = {}> = StoreApi<T> &\n StoreFields<T> &\n TMethods;\n\nconst RESERVED_STORE_KEYS = new Set<ReservedStoreKey>([\n \"use\",\n \"get\",\n \"set\",\n \"replace\",\n \"reset\",\n \"subscribe\",\n]);\n\nfunction cloneState<T extends StoreState>(state: T): T {\n return { ...state };\n}\n\nfunction pickState<T extends StoreState, K extends keyof T>(\n state: T,\n keys: readonly K[],\n): Pick<T, K> {\n const slice = {} as Pick<T, K>;\n\n for (const key of keys) {\n slice[key] = state[key];\n }\n\n return slice;\n}\n\nfunction getChangedKeys<T extends StoreState>(state: T, previousState: T): (keyof T)[] {\n const keys = new Set<keyof T>([\n ...(Object.keys(state) as (keyof T)[]),\n ...(Object.keys(previousState) as (keyof T)[]),\n ]);\n\n return [...keys].filter((key) => !Object.is(state[key], previousState[key]));\n}\n\nfunction normalizeKeys<T extends StoreState, K extends keyof T>(keys: readonly K[]): readonly K[] {\n return Array.from(new Set(keys));\n}\n\nfunction resolveValue<T>(value: StoreValueUpdater<T>, previousValue: T): T {\n return typeof value === \"function\" ? (value as (previousValue: T) => T)(previousValue) : value;\n}\n\nfunction isStoreKey(value: unknown): value is string | number | symbol {\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"symbol\";\n}\n\nexport function createStore<T extends StoreState, TMethods extends Record<string, any> = {}>(\n initialState: T,\n extend?: (store: Store<T>) => TMethods,\n): Store<T, TMethods> {\n const initialSnapshot = cloneState(initialState);\n let state = cloneState(initialState);\n const subscriptions = new Set<StoreSubscription<T>>();\n\n const addSubscription = (\n keys: readonly (keyof T)[] | null,\n notify: (state: T, previousState: T) => void,\n ) => {\n const subscription: StoreSubscription<T> = { keys, notify };\n subscriptions.add(subscription);\n return () => {\n subscriptions.delete(subscription);\n };\n };\n\n const emit = (nextState: T, previousState: T) => {\n const changedKeys = getChangedKeys(nextState, previousState);\n\n if (changedKeys.length === 0) {\n return;\n }\n\n const changedKeySet = new Set(changedKeys);\n\n for (const subscription of subscriptions) {\n if (subscription.keys === null || subscription.keys.some((key) => changedKeySet.has(key))) {\n subscription.notify(nextState, previousState);\n }\n }\n };\n\n const getState = (key?: keyof T) => {\n return key === undefined ? state : state[key];\n };\n\n const replaceState = (nextState: T | ((state: T) => T)) => {\n const previousState = state;\n const resolvedState =\n typeof nextState === \"function\" ? (nextState as (state: T) => T)(previousState) : nextState;\n state = resolvedState;\n emit(state, previousState);\n return state;\n };\n\n const setState = (keyOrPatch: keyof T | StorePatch<T>, value?: StoreValueUpdater<T[keyof T]>) => {\n const previousState = state;\n let nextState: T;\n\n if (isStoreKey(keyOrPatch)) {\n const key = keyOrPatch as keyof T;\n const nextValue = resolveValue(value as StoreValueUpdater<T[keyof T]>, previousState[key]);\n\n if (Object.is(previousState[key], nextValue)) {\n return nextValue;\n }\n\n nextState = {\n ...previousState,\n [key]: nextValue,\n };\n state = nextState;\n emit(nextState, previousState);\n return nextValue;\n }\n\n const patch: Partial<T> =\n typeof keyOrPatch === \"function\"\n ? (keyOrPatch as (state: T) => Partial<T>)(previousState)\n : (keyOrPatch as Partial<T>);\n\n nextState = {\n ...previousState,\n ...patch,\n };\n state = nextState;\n emit(nextState, previousState);\n return nextState;\n };\n\n const subscribeState = (\n keyOrListener: keyof T | readonly (keyof T)[] | StoreListener<T>,\n listener?: StoreKeyListener<T, keyof T> | StoreKeysListener<T, keyof T>,\n ) => {\n if (typeof keyOrListener === \"function\") {\n return addSubscription(null, (nextState, previousState) => {\n (keyOrListener as StoreListener<T>)(nextState, previousState);\n });\n }\n\n if (Array.isArray(keyOrListener)) {\n const keys = normalizeKeys(keyOrListener);\n return addSubscription(keys, (nextState, previousState) => {\n (listener as StoreKeysListener<T, keyof T>)(\n pickState(nextState, keys),\n pickState(previousState, keys),\n );\n });\n }\n\n const key = keyOrListener as keyof T;\n return addSubscription([key], (nextState, previousState) => {\n (listener as StoreKeyListener<T, keyof T>)(nextState[key], previousState[key]);\n });\n };\n\n const useStateValue = <K extends keyof T>(keyOrKeys?: K | readonly K[]) => {\n if (Array.isArray(keyOrKeys)) {\n const keys = normalizeKeys(keyOrKeys);\n let lastState = state;\n let lastSlice = pickState(state, keys);\n const getSnapshot = () => {\n if (lastState !== state) {\n lastState = state;\n lastSlice = pickState(state, keys);\n }\n\n return lastSlice;\n };\n\n return useSyncExternalStore(\n (notify) => addSubscription(keys, () => notify()),\n getSnapshot,\n getSnapshot,\n );\n }\n\n if (typeof keyOrKeys === \"string\") {\n return useSyncExternalStore(\n (notify) => addSubscription([keyOrKeys], () => notify()),\n () => state[keyOrKeys],\n () => state[keyOrKeys],\n );\n }\n\n return useSyncExternalStore(\n (notify) => addSubscription(null, () => notify()),\n () => state,\n () => state,\n );\n };\n\n const store = {\n use: useStateValue,\n get: getState,\n set: setState,\n replace: replaceState,\n reset: () => replaceState(cloneState(initialSnapshot)),\n subscribe: subscribeState,\n } as Store<T>;\n\n for (const key of Object.keys(initialSnapshot) as (keyof T)[]) {\n if (RESERVED_STORE_KEYS.has(key as ReservedStoreKey)) {\n throw new Error(\n `createStore does not allow the reserved key \"${String(key)}\" in the initial state.`,\n );\n }\n\n const field = (() => useStateValue(key)) as FieldAccessor<T, typeof key>;\n field.get = () => state[key];\n field.set = (value) => setState(key, value) as T[typeof key];\n field.subscribe = (listener) => subscribeState(key, listener as StoreKeyListener<T, keyof T>);\n\n Object.defineProperty(store, key, {\n configurable: false,\n enumerable: true,\n value: field,\n writable: false,\n });\n }\n\n if (extend) {\n const methods = extend(store);\n\n for (const [name, method] of Object.entries(methods)) {\n if (name in store) {\n throw new Error(\n `createStore cannot attach the method \"${name}\" because it already exists.`,\n );\n }\n\n Object.defineProperty(store, name, {\n configurable: false,\n enumerable: true,\n value: method,\n writable: false,\n });\n }\n }\n\n return store as Store<T, TMethods>;\n}\n","\"use client\";\n\nimport type React from \"react\";\nimport { forwardRef, useEffect, useRef, useCallback, type AnchorHTMLAttributes } from \"react\";\nimport {\n buildFarmRoutePath,\n type FarmRouterBuildOptions,\n type FarmRouterPathParam,\n type FarmRouterPathParams,\n} from \"../router\";\nimport type { FarmViewTransitionMode } from \"./spa-router\";\nimport { isFarmLocaleChangeHref, localizeActiveFarmHref } from \"../i18n/client-runtime\";\nimport type { FarmI18nLocale } from \"../i18n/types\";\n\n/**\n * Prefetch strategy (TanStack Router–style):\n * - \"intent\": prefetch on hover and touchstart (with prefetchDelay)\n * - \"viewport\": prefetch when link enters viewport (IntersectionObserver)\n * - \"render\": prefetch as soon as the link is mounted\n * - \"none\" | false: no prefetch\n */\nexport type PrefetchBehavior = false | \"intent\" | \"viewport\" | \"render\" | \"none\";\n\n/** @internal Legacy prefetch mode for backward compatibility */\ntype PrefetchLegacy = boolean | \"hover\" | \"viewport\" | \"none\";\n\n/**\n * Augment this interface via your generated farm-routes.d.ts so Link href is typed\n * without passing a generic. Defaults to string when not augmented.\n */\nexport interface LinkDefaultRoute {}\n\nexport type DefaultRoutePath = LinkDefaultRoute extends { _: infer TRoute extends string }\n ? TRoute\n : string;\n\nexport type DefaultRoutePattern = LinkDefaultRoute extends {\n pattern: infer TRoute extends string;\n}\n ? TRoute\n : DefaultRoutePath;\n\nexport type DefaultRouteHref = DefaultRoutePath | DefaultRoutePattern;\n\nexport type RouteHref<TRoute extends string> =\n | TRoute\n | `${TRoute}?${string}`\n | `${TRoute}#${string}`\n | `${TRoute}?${string}#${string}`;\n\n/** A generated route with params already filled into its pathname. */\nexport type ResolvedRouteHref = RouteHref<DefaultRoutePath>;\n\nexport type RouteParamValue = Exclude<FarmRouterPathParam, null | undefined>;\nexport type RouteOptionalParamValue = FarmRouterPathParam;\nexport type RouteParams<TRoute extends string> = string extends TRoute\n ? FarmRouterPathParams\n : ExtractRouteParams<StripRouteSuffix<TRoute>>;\n\n/** External URLs; these are never type-checked as routes. */\nexport type ExternalHref =\n | `http://${string}`\n | `https://${string}`\n | `//${string}`\n | `mailto:${string}`;\n\ntype StripRouteSuffix<TRoute extends string> = TRoute extends `${infer Path}?${string}`\n ? StripRouteSuffix<Path>\n : TRoute extends `${infer Path}#${string}`\n ? StripRouteSuffix<Path>\n : TRoute;\n\ntype ExtractRouteParams<TRoute extends string> = Simplify<\n ExtractOptionalCatchAllParams<TRoute> &\n ExtractCatchAllParams<TRoute> &\n ExtractDynamicParams<TRoute>\n>;\n\ntype ExtractOptionalCatchAllParams<TRoute extends string> =\n TRoute extends `${string}[[...${infer Param}]]${infer Rest}`\n ? { [Key in Param]?: RouteOptionalParamValue } & ExtractOptionalCatchAllParams<Rest>\n : {};\n\ntype ExtractCatchAllParams<TRoute extends string> =\n TRoute extends `${string}[...${infer Param}]${infer Rest}`\n ? Param extends `[...${string}`\n ? ExtractCatchAllParams<Rest>\n : { [Key in Param]: RouteParamValue } & ExtractCatchAllParams<Rest>\n : {};\n\ntype ExtractDynamicParams<TRoute extends string> =\n TRoute extends `${string}[${infer Param}]${infer Rest}`\n ? Param extends `...${string}` | `[...${string}`\n ? ExtractDynamicParams<Rest>\n : { [Key in Param]: RouteParamValue } & ExtractDynamicParams<Rest>\n : {};\n\ntype Simplify<T> = { [Key in keyof T]: T[Key] } & {};\n\ntype HasRouteParams<TRoute extends string> = keyof RouteParams<TRoute> extends never ? false : true;\n\ntype RoutesWithRequiredParams<TRoute extends string> = TRoute extends string\n ? HasRouteParams<TRoute> extends true\n ? TRoute\n : never\n : never;\n\ntype LinkRouteParamsProps<TRoute extends string> = string extends TRoute\n ? { params?: FarmRouterPathParams }\n : HasRouteParams<TRoute> extends true\n ? { params: RouteParams<TRoute> }\n : { params?: FarmRouterPathParams };\n\ntype LinkRouteTargetProps<TRoute extends string> = [RoutesWithRequiredParams<TRoute>] extends [\n never,\n]\n ? {\n /** Internal route path with all params already resolved. */\n href: RouteHref<TRoute>;\n params?: FarmRouterPathParams;\n }\n : TRoute extends string\n ? {\n /** Internal route path or route pattern. */\n href: RouteHref<TRoute>;\n } & LinkRouteParamsProps<TRoute>\n : never;\n\ntype LinkExternalTargetProps = {\n /** External URL; these are never type-checked as app routes. */\n href: ExternalHref;\n params?: never;\n};\n\ntype LinkTargetProps<TRoute extends string> =\n | LinkExternalTargetProps\n | LinkRouteTargetProps<TRoute>;\n\nexport type LinkProps<TRoute extends string = DefaultRouteHref> = Omit<\n AnchorHTMLAttributes<HTMLAnchorElement>,\n \"href\"\n> &\n LinkTargetProps<TRoute> & {\n /**\n * When to prefetch. TanStack-style: \"intent\" (hover+touch), \"viewport\", \"render\", or \"none\".\n * Legacy: true (intent+viewport), \"hover\" (intent), \"viewport\", false/\"none\".\n */\n prefetch?: PrefetchBehavior | PrefetchLegacy;\n /** Search params appended after route params are resolved. */\n query?: FarmRouterBuildOptions[\"query\"];\n /** Hash appended after route params and search params are resolved. */\n hash?: string;\n /** Add a trailing slash to the generated internal href. */\n trailingSlash?: boolean;\n /** Delay in ms before intent-based prefetch (hover/touch). Default 50. */\n prefetchDelay?: number;\n /** Replace current history entry instead of pushing */\n replace?: boolean;\n /** Scroll to top after navigation (default: true) */\n scroll?: boolean;\n /** Wrap this SPA navigation in a browser View Transition when supported. */\n viewTransition?: FarmViewTransitionMode;\n /** Preserve the active locale by default, or navigate using this locale. */\n locale?: FarmI18nLocale;\n };\n\nfunction isModifierEvent(e: React.MouseEvent): boolean {\n return !!(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey);\n}\n\nfunction isExternalUrl(href: string): boolean {\n return href.startsWith(\"http://\") || href.startsWith(\"https://\") || href.startsWith(\"//\");\n}\n\nfunction getRouter(): {\n prefetch(href: string): Promise<void>;\n observeForPrefetch(el: HTMLAnchorElement): void;\n unobserveForPrefetch(el: HTMLAnchorElement): void;\n navigate(\n href: string,\n opts: { replace?: boolean; scroll?: boolean; viewTransition?: FarmViewTransitionMode },\n ): void;\n} | null {\n if (typeof window !== \"undefined\" && (window as any).__FARM_SPA_ROUTER__) {\n return (window as any).__FARM_SPA_ROUTER__;\n }\n return null;\n}\n\nfunction normalizePrefetch(prefetch: LinkProps[\"prefetch\"]): {\n intent: boolean;\n viewport: boolean;\n render: boolean;\n} {\n if (prefetch === false || prefetch === \"none\") {\n return { intent: false, viewport: false, render: false };\n }\n if (prefetch === true) {\n return { intent: true, viewport: true, render: false };\n }\n if (prefetch === \"hover\") {\n return { intent: true, viewport: false, render: false };\n }\n if (prefetch === \"intent\") {\n return { intent: true, viewport: false, render: false };\n }\n if (prefetch === \"viewport\") {\n return { intent: false, viewport: true, render: false };\n }\n if (prefetch === \"render\") {\n return { intent: false, viewport: false, render: true };\n }\n return { intent: false, viewport: false, render: false };\n}\n\nfunction LinkInner<TRoute extends string = DefaultRouteHref>(\n {\n href,\n params,\n query,\n hash,\n trailingSlash,\n prefetch = true,\n prefetchDelay = 50,\n replace = false,\n scroll = true,\n viewTransition = false,\n locale,\n onClick,\n target,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n onBlur,\n onTouchStart,\n ...props\n }: LinkProps<TRoute>,\n ref: React.ForwardedRef<HTMLAnchorElement>,\n) {\n const elementRef = useRef<HTMLAnchorElement | null>(null);\n const intentTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hasPrefetched = useRef(false);\n\n const { intent, viewport, render } = normalizePrefetch(prefetch);\n const baseHref = resolveLinkHref(href, params, {\n query,\n hash,\n trailingSlash,\n });\n const resolvedHref = localizeActiveFarmHref(baseHref, locale);\n const isExternal = isExternalUrl(resolvedHref);\n\n const doPrefetch = useCallback(() => {\n if (isExternal || hasPrefetched.current) return;\n const router = getRouter();\n if (!router) return;\n hasPrefetched.current = true;\n router.prefetch(resolvedHref);\n }, [resolvedHref, isExternal]);\n\n useEffect(() => {\n hasPrefetched.current = false;\n }, [resolvedHref]);\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element || isExternal) return;\n\n const router = getRouter();\n if (!router) return;\n\n if (viewport) {\n router.observeForPrefetch(element);\n return () => router.unobserveForPrefetch(element);\n }\n }, [resolvedHref, viewport, isExternal]);\n\n useEffect(() => {\n if (!render || isExternal) return;\n\n let cancelled = false;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const tryRenderPrefetch = () => {\n if (cancelled || hasPrefetched.current) return;\n\n const router = getRouter();\n if (!router) {\n timeoutId = setTimeout(tryRenderPrefetch, 30);\n return;\n }\n\n hasPrefetched.current = true;\n router.prefetch(resolvedHref);\n };\n\n tryRenderPrefetch();\n\n return () => {\n cancelled = true;\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n }, [render, isExternal, resolvedHref]);\n\n useEffect(() => {\n return () => {\n if (intentTimeoutRef.current) {\n clearTimeout(intentTimeoutRef.current);\n intentTimeoutRef.current = null;\n }\n };\n }, []);\n\n const cancelIntent = useCallback(() => {\n if (intentTimeoutRef.current) {\n clearTimeout(intentTimeoutRef.current);\n intentTimeoutRef.current = null;\n }\n }, []);\n\n const scheduleIntentPrefetch = useCallback(() => {\n if (isExternal || !intent || hasPrefetched.current) return;\n cancelIntent();\n intentTimeoutRef.current = setTimeout(() => {\n intentTimeoutRef.current = null;\n doPrefetch();\n }, prefetchDelay);\n }, [intent, isExternal, prefetchDelay, doPrefetch, cancelIntent]);\n\n const handleMouseEnter = useCallback(\n (event: React.MouseEvent<HTMLAnchorElement>) => {\n onMouseEnter?.(event);\n scheduleIntentPrefetch();\n },\n [onMouseEnter, scheduleIntentPrefetch],\n );\n\n const handleMouseLeave = useCallback(\n (event: React.MouseEvent<HTMLAnchorElement>) => {\n onMouseLeave?.(event);\n cancelIntent();\n },\n [onMouseLeave, cancelIntent],\n );\n\n const handleTouchStart = useCallback(\n (event: React.TouchEvent<HTMLAnchorElement>) => {\n onTouchStart?.(event);\n scheduleIntentPrefetch();\n },\n [onTouchStart, scheduleIntentPrefetch],\n );\n\n const handleFocus = useCallback(\n (event: React.FocusEvent<HTMLAnchorElement>) => {\n onFocus?.(event);\n scheduleIntentPrefetch();\n },\n [onFocus, scheduleIntentPrefetch],\n );\n\n const handleBlur = useCallback(\n (event: React.FocusEvent<HTMLAnchorElement>) => {\n onBlur?.(event);\n cancelIntent();\n },\n [onBlur, cancelIntent],\n );\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLAnchorElement>) => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n if (isExternal) return;\n if (target && target !== \"_self\") return;\n if (isModifierEvent(event)) return;\n if (event.button !== 0) return;\n\n if (typeof window !== \"undefined\") {\n event.preventDefault();\n if (isFarmLocaleChangeHref(resolvedHref)) {\n window.location.assign(resolvedHref);\n return;\n }\n const router = getRouter();\n if (router) {\n router.navigate(resolvedHref, { replace, scroll, viewTransition });\n } else {\n if (replace) window.location.replace(resolvedHref);\n else window.location.href = resolvedHref;\n }\n }\n },\n [resolvedHref, replace, scroll, viewTransition, target, isExternal, onClick],\n );\n\n const setRefs = useCallback(\n (node: HTMLAnchorElement | null) => {\n elementRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLAnchorElement | null>).current = node;\n },\n [ref],\n );\n\n return (\n <a\n ref={setRefs}\n href={resolvedHref}\n target={target}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onTouchStart={handleTouchStart}\n {...props}\n data-farm-link=\"\"\n data-replace={replace ? \"\" : undefined}\n data-no-scroll={!scroll ? \"\" : undefined}\n data-view-transition={\n viewTransition === \"auto\" ? \"auto\" : viewTransition ? \"true\" : undefined\n }\n />\n );\n}\n\nconst LinkWithRef = forwardRef(LinkInner);\nLinkWithRef.displayName = \"Link\";\n\ntype LinkComponentType = <TRoute extends string = DefaultRouteHref>(\n props: LinkProps<TRoute> & { ref?: React.ForwardedRef<HTMLAnchorElement> },\n) => React.ReactElement;\n\nexport const Link = LinkWithRef as unknown as LinkComponentType;\n\nfunction resolveLinkHref(\n href: string,\n params: FarmRouterPathParams | undefined,\n options: FarmRouterBuildOptions,\n) {\n if (isExternalUrl(href)) return href;\n\n const { pathname, query, hash } = splitInternalHref(href);\n\n const resolvedHref = buildFarmRoutePath(pathname, params, {\n query: mergeQueryParams(query, options.query),\n hash: options.hash ?? hash,\n trailingSlash: options.trailingSlash,\n });\n\n return applyPreservedSearchParams(resolvedHref);\n}\n\nfunction splitInternalHref(href: string) {\n try {\n const url = new URL(href, \"http://farm.local\");\n return {\n pathname: url.pathname || \"/\",\n query: url.searchParams,\n hash: url.hash ? url.hash.slice(1) : undefined,\n };\n } catch {\n const [withoutHash, rawHash] = href.split(\"#\", 2);\n const [pathname, rawQuery] = withoutHash.split(\"?\", 2);\n return {\n pathname: pathname || \"/\",\n query: new URLSearchParams(rawQuery || \"\"),\n hash: rawHash,\n };\n }\n}\n\nfunction mergeQueryParams(\n current: URLSearchParams,\n next: FarmRouterBuildOptions[\"query\"],\n): URLSearchParams | undefined {\n const merged = new URLSearchParams(current);\n\n if (next instanceof URLSearchParams) {\n for (const [key, value] of next.entries()) {\n merged.append(key, value);\n }\n } else if (next) {\n for (const [key, value] of Object.entries(next)) {\n const values = Array.isArray(value) ? value : [value];\n for (const item of values) {\n if (item == null) continue;\n merged.append(key, String(item));\n }\n }\n }\n\n return merged.toString() ? merged : undefined;\n}\n\nfunction applyPreservedSearchParams(href: string): string {\n if (typeof window === \"undefined\") return href;\n\n const manifest = (window as any).__FARM_MANIFEST__;\n const routes =\n manifest?.routes && typeof manifest.routes === \"object\" ? Object.values(manifest.routes) : [];\n if (routes.length === 0) return href;\n\n const url = new URL(href, window.location.origin);\n const route = routes.find((candidate: any) => matchManifestRoute(url.pathname, candidate));\n const preserve = Array.isArray((route as any)?.search?.preserve)\n ? ((route as any).search.preserve as string[])\n : [];\n if (preserve.length === 0) return href;\n\n const current = new URLSearchParams(window.location.search);\n let changed = false;\n\n for (const key of preserve) {\n if (url.searchParams.has(key) || !current.has(key)) continue;\n for (const value of current.getAll(key)) {\n url.searchParams.append(key, value);\n changed = true;\n }\n }\n\n if (!changed) return href;\n return `${url.pathname}${url.search}${url.hash}`;\n}\n\nfunction matchManifestRoute(pathname: string, route: any): boolean {\n if (!route || !Array.isArray(route.segments)) return false;\n const routeSegments = route.segments;\n const normalized = pathname === \"/\" ? \"\" : pathname.replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n const pathSegments = normalized ? normalized.split(\"/\") : [];\n const hasCatchAll = routeSegments.some((segment: any) => segment.isCatchAll);\n\n if (!hasCatchAll && pathSegments.length !== routeSegments.length) {\n return false;\n }\n\n for (let index = 0; index < routeSegments.length; index++) {\n const routeSegment = routeSegments[index];\n const pathSegment = pathSegments[index];\n\n if (routeSegment.isCatchAll) {\n return true;\n }\n\n if (pathSegment === undefined) {\n if (routeSegment.isOptional) continue;\n return false;\n }\n\n if (!routeSegment.isDynamic && routeSegment.segment !== pathSegment) {\n return false;\n }\n }\n\n return pathSegments.length === routeSegments.length || hasCatchAll;\n}\n"],"mappings":"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","names":["useCallback","useMemo","useRef","useState","useRef","useState","useCallback","useMemo","replaceState","useRef","useCallback","prefetch","useRef","useCallback"]}
|
package/dist/chunk-2ED5Q2GH.mjs
DELETED
|
@@ -1,422 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
resolveFarmLocaleRequest
|
|
3
|
-
} from "./chunk-GN72QAIH.mjs";
|
|
4
|
-
import {
|
|
5
|
-
resolveFarmI18nMessagePath
|
|
6
|
-
} from "./chunk-FQYDHKKU.mjs";
|
|
7
|
-
import {
|
|
8
|
-
getFarmLocaleDirection
|
|
9
|
-
} from "./chunk-44ZCFSKE.mjs";
|
|
10
|
-
import {
|
|
11
|
-
_setFarmI18nSnapshotResolver
|
|
12
|
-
} from "./chunk-WZ5QFROO.mjs";
|
|
13
|
-
import {
|
|
14
|
-
__name
|
|
15
|
-
} from "./chunk-CGILA3WO.mjs";
|
|
16
|
-
|
|
17
|
-
// src/i18n/server.ts
|
|
18
|
-
import { AsyncLocalStorage } from "async_hooks";
|
|
19
|
-
|
|
20
|
-
// src/i18n/runtime.ts
|
|
21
|
-
import IntlMessageFormat from "intl-messageformat";
|
|
22
|
-
|
|
23
|
-
// src/i18n/catalog.ts
|
|
24
|
-
import { readFile } from "fs/promises";
|
|
25
|
-
import { TYPE, parse } from "@formatjs/icu-messageformat-parser";
|
|
26
|
-
async function readFarmI18nCatalogs(config) {
|
|
27
|
-
if (!config.enabled) {
|
|
28
|
-
return { catalogs: {}, signatures: {} };
|
|
29
|
-
}
|
|
30
|
-
const catalogs = {};
|
|
31
|
-
for (const locale of config.locales) {
|
|
32
|
-
const filePath = resolveFarmI18nMessagePath(config, locale);
|
|
33
|
-
let source;
|
|
34
|
-
try {
|
|
35
|
-
source = await readFile(filePath, "utf8");
|
|
36
|
-
} catch (error) {
|
|
37
|
-
throw new Error(
|
|
38
|
-
`Unable to read Farm i18n catalog for "${locale}" at ${filePath}: ${messageOf(error)}`
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
let parsed;
|
|
42
|
-
try {
|
|
43
|
-
parsed = JSON.parse(source);
|
|
44
|
-
} catch (error) {
|
|
45
|
-
throw new Error(`Invalid JSON in Farm i18n catalog ${filePath}: ${messageOf(error)}`);
|
|
46
|
-
}
|
|
47
|
-
catalogs[locale] = flattenFarmI18nCatalog(parsed, filePath);
|
|
48
|
-
}
|
|
49
|
-
const reference = catalogs[config.defaultLocale] || {};
|
|
50
|
-
const signatures = {};
|
|
51
|
-
for (const [key, message] of Object.entries(reference)) {
|
|
52
|
-
signatures[key] = analyzeFarmI18nMessage(message, `${config.defaultLocale}:${key}`);
|
|
53
|
-
}
|
|
54
|
-
validateFarmI18nCatalogs(config, catalogs, signatures);
|
|
55
|
-
return { catalogs, signatures };
|
|
56
|
-
}
|
|
57
|
-
__name(readFarmI18nCatalogs, "readFarmI18nCatalogs");
|
|
58
|
-
function flattenFarmI18nCatalog(input, source = "i18n catalog") {
|
|
59
|
-
if (!isPlainObject(input)) {
|
|
60
|
-
throw new Error(`${source} must contain a JSON object at its root.`);
|
|
61
|
-
}
|
|
62
|
-
const output = {};
|
|
63
|
-
const visit = /* @__PURE__ */ __name((value, segments) => {
|
|
64
|
-
if (typeof value === "string") {
|
|
65
|
-
const key = segments.join(".");
|
|
66
|
-
if (!key) throw new Error(`${source} contains an empty message key.`);
|
|
67
|
-
if (key in output) throw new Error(`${source} contains duplicate message key "${key}".`);
|
|
68
|
-
output[key] = value;
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
if (!isPlainObject(value)) {
|
|
72
|
-
const key = segments.join(".") || "<root>";
|
|
73
|
-
throw new Error(`${source} message "${key}" must be a string or nested object.`);
|
|
74
|
-
}
|
|
75
|
-
for (const [key, nested] of Object.entries(value)) {
|
|
76
|
-
if (!key.trim()) throw new Error(`${source} contains an empty message key.`);
|
|
77
|
-
visit(nested, [...segments, key]);
|
|
78
|
-
}
|
|
79
|
-
}, "visit");
|
|
80
|
-
visit(input, []);
|
|
81
|
-
return output;
|
|
82
|
-
}
|
|
83
|
-
__name(flattenFarmI18nCatalog, "flattenFarmI18nCatalog");
|
|
84
|
-
function analyzeFarmI18nMessage(message, label = "message") {
|
|
85
|
-
let ast;
|
|
86
|
-
try {
|
|
87
|
-
ast = parse(message, { captureLocation: false });
|
|
88
|
-
} catch (error) {
|
|
89
|
-
throw new Error(`Invalid ICU syntax in ${label}: ${messageOf(error)}`);
|
|
90
|
-
}
|
|
91
|
-
const signature = {};
|
|
92
|
-
collectArguments(ast, signature, label);
|
|
93
|
-
return signature;
|
|
94
|
-
}
|
|
95
|
-
__name(analyzeFarmI18nMessage, "analyzeFarmI18nMessage");
|
|
96
|
-
function validateFarmI18nCatalogs(config, catalogs, signatures) {
|
|
97
|
-
const referenceKeys = Object.keys(catalogs[config.defaultLocale] || {}).sort();
|
|
98
|
-
for (const locale of config.locales) {
|
|
99
|
-
const catalog = catalogs[locale] || {};
|
|
100
|
-
const localeKeys = Object.keys(catalog).sort();
|
|
101
|
-
const missing = referenceKeys.filter((key) => !(key in catalog));
|
|
102
|
-
const extra = localeKeys.filter((key) => !(key in signatures));
|
|
103
|
-
if (config.strict && (missing.length > 0 || extra.length > 0)) {
|
|
104
|
-
const details = [
|
|
105
|
-
missing.length ? `missing: ${missing.join(", ")}` : "",
|
|
106
|
-
extra.length ? `extra: ${extra.join(", ")}` : ""
|
|
107
|
-
].filter(Boolean).join("; ");
|
|
108
|
-
throw new Error(
|
|
109
|
-
`Farm i18n catalog "${locale}" does not match the default catalog (${details}).`
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
for (const [key, message] of Object.entries(catalog)) {
|
|
113
|
-
const actual = analyzeFarmI18nMessage(message, `${locale}:${key}`);
|
|
114
|
-
const expected = signatures[key];
|
|
115
|
-
if (!expected || sameSignature(expected, actual)) continue;
|
|
116
|
-
throw new Error(
|
|
117
|
-
`Farm i18n message "${key}" in "${locale}" uses different variables than "${config.defaultLocale}".`
|
|
118
|
-
);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
__name(validateFarmI18nCatalogs, "validateFarmI18nCatalogs");
|
|
123
|
-
function collectArguments(elements, signature, label) {
|
|
124
|
-
for (const element of elements) {
|
|
125
|
-
switch (element.type) {
|
|
126
|
-
case TYPE.argument:
|
|
127
|
-
addArgument(signature, element.value, "string", label);
|
|
128
|
-
break;
|
|
129
|
-
case TYPE.number:
|
|
130
|
-
case TYPE.plural:
|
|
131
|
-
addArgument(signature, element.value, "number", label);
|
|
132
|
-
break;
|
|
133
|
-
case TYPE.date:
|
|
134
|
-
case TYPE.time:
|
|
135
|
-
addArgument(signature, element.value, "date", label);
|
|
136
|
-
break;
|
|
137
|
-
case TYPE.select:
|
|
138
|
-
addArgument(signature, element.value, "select", label);
|
|
139
|
-
break;
|
|
140
|
-
case TYPE.tag:
|
|
141
|
-
addArgument(signature, element.value, "rich", label);
|
|
142
|
-
collectArguments(element.children, signature, label);
|
|
143
|
-
break;
|
|
144
|
-
}
|
|
145
|
-
if (element.type === TYPE.plural || element.type === TYPE.select) {
|
|
146
|
-
for (const option of Object.values(element.options)) {
|
|
147
|
-
collectArguments(option.value, signature, label);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
__name(collectArguments, "collectArguments");
|
|
153
|
-
function addArgument(signature, name, kind, label) {
|
|
154
|
-
const existing = signature[name];
|
|
155
|
-
if (existing && existing !== kind) {
|
|
156
|
-
throw new Error(`Farm i18n ${label} uses variable "${name}" as both ${existing} and ${kind}.`);
|
|
157
|
-
}
|
|
158
|
-
signature[name] = kind;
|
|
159
|
-
}
|
|
160
|
-
__name(addArgument, "addArgument");
|
|
161
|
-
function sameSignature(expected, actual) {
|
|
162
|
-
const expectedEntries = Object.entries(expected).sort(([a], [b]) => a.localeCompare(b));
|
|
163
|
-
const actualEntries = Object.entries(actual).sort(([a], [b]) => a.localeCompare(b));
|
|
164
|
-
return JSON.stringify(expectedEntries) === JSON.stringify(actualEntries);
|
|
165
|
-
}
|
|
166
|
-
__name(sameSignature, "sameSignature");
|
|
167
|
-
function isPlainObject(value) {
|
|
168
|
-
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
169
|
-
}
|
|
170
|
-
__name(isPlainObject, "isPlainObject");
|
|
171
|
-
function messageOf(error) {
|
|
172
|
-
return error instanceof Error ? error.message : String(error);
|
|
173
|
-
}
|
|
174
|
-
__name(messageOf, "messageOf");
|
|
175
|
-
|
|
176
|
-
// src/i18n/runtime.ts
|
|
177
|
-
var _FarmI18nRuntime = class _FarmI18nRuntime {
|
|
178
|
-
constructor(config, catalogs = {}) {
|
|
179
|
-
this.compiled = /* @__PURE__ */ new Map();
|
|
180
|
-
this.warnedMissing = /* @__PURE__ */ new Set();
|
|
181
|
-
this.config = config;
|
|
182
|
-
this.catalogs = catalogs;
|
|
183
|
-
}
|
|
184
|
-
async initialize() {
|
|
185
|
-
if (!this.config.enabled) return;
|
|
186
|
-
const bundle = await readFarmI18nCatalogs(this.config);
|
|
187
|
-
this.replaceCatalogs(bundle.catalogs);
|
|
188
|
-
}
|
|
189
|
-
async reload() {
|
|
190
|
-
await this.initialize();
|
|
191
|
-
}
|
|
192
|
-
replaceCatalogs(catalogs) {
|
|
193
|
-
this.catalogs = catalogs;
|
|
194
|
-
this.compiled.clear();
|
|
195
|
-
this.warnedMissing.clear();
|
|
196
|
-
}
|
|
197
|
-
getCatalogs() {
|
|
198
|
-
return Object.fromEntries(
|
|
199
|
-
Object.entries(this.catalogs).map(([locale, catalog]) => [locale, { ...catalog }])
|
|
200
|
-
);
|
|
201
|
-
}
|
|
202
|
-
resolveRequest(request, options = {}) {
|
|
203
|
-
return resolveFarmLocaleRequest(request, this.config, options);
|
|
204
|
-
}
|
|
205
|
-
translate(locale, key, values) {
|
|
206
|
-
const result = this.formatMessage(locale, key, values);
|
|
207
|
-
if (Array.isArray(result) && result.some((part) => typeof part !== "string")) {
|
|
208
|
-
throw new Error(`Farm i18n message "${key}" contains rich content. Render it with t.rich().`);
|
|
209
|
-
}
|
|
210
|
-
return Array.isArray(result) ? result.join("") : String(result);
|
|
211
|
-
}
|
|
212
|
-
translateRich(locale, key, values) {
|
|
213
|
-
const result = this.formatMessage(locale, key, values);
|
|
214
|
-
return Array.isArray(result) && result.length === 1 ? result[0] : result;
|
|
215
|
-
}
|
|
216
|
-
getRawMessage(locale, key) {
|
|
217
|
-
return this.resolveMessage(locale, key);
|
|
218
|
-
}
|
|
219
|
-
hasMessage(locale, key) {
|
|
220
|
-
return (this.catalogs[locale]?.[key] ?? this.catalogs[this.config.fallbackLocale]?.[key]) !== void 0;
|
|
221
|
-
}
|
|
222
|
-
getClientSnapshot(resolution) {
|
|
223
|
-
return {
|
|
224
|
-
locale: resolution.locale,
|
|
225
|
-
source: resolution.source,
|
|
226
|
-
locales: this.config.locales,
|
|
227
|
-
defaultLocale: this.config.defaultLocale,
|
|
228
|
-
routing: this.config.routing,
|
|
229
|
-
cookie: this.config.cookie,
|
|
230
|
-
direction: getFarmLocaleDirection(resolution.locale, this.config.direction),
|
|
231
|
-
messages: {
|
|
232
|
-
...this.catalogs[this.config.fallbackLocale],
|
|
233
|
-
...this.catalogs[resolution.locale]
|
|
234
|
-
}
|
|
235
|
-
};
|
|
236
|
-
}
|
|
237
|
-
formatMessage(locale, key, values) {
|
|
238
|
-
const message = this.resolveMessage(locale, key);
|
|
239
|
-
const cacheKey = `${locale}\0${key}\0${message}`;
|
|
240
|
-
let formatter = this.compiled.get(cacheKey);
|
|
241
|
-
if (!formatter) {
|
|
242
|
-
formatter = new IntlMessageFormat(message, locale);
|
|
243
|
-
this.compiled.set(cacheKey, formatter);
|
|
244
|
-
}
|
|
245
|
-
return formatter.format(values);
|
|
246
|
-
}
|
|
247
|
-
resolveMessage(locale, key) {
|
|
248
|
-
const message = this.catalogs[locale]?.[key] ?? this.catalogs[this.config.fallbackLocale]?.[key];
|
|
249
|
-
if (message !== void 0) return message;
|
|
250
|
-
if (this.config.strict) {
|
|
251
|
-
throw new Error(`Missing Farm i18n message "${key}" for locale "${locale}".`);
|
|
252
|
-
}
|
|
253
|
-
const warningKey = `${locale}:${key}`;
|
|
254
|
-
if (!this.warnedMissing.has(warningKey)) {
|
|
255
|
-
this.warnedMissing.add(warningKey);
|
|
256
|
-
console.warn(`[Farm.js] Missing i18n message "${key}" for locale "${locale}".`);
|
|
257
|
-
}
|
|
258
|
-
return key;
|
|
259
|
-
}
|
|
260
|
-
};
|
|
261
|
-
__name(_FarmI18nRuntime, "FarmI18nRuntime");
|
|
262
|
-
var FarmI18nRuntime = _FarmI18nRuntime;
|
|
263
|
-
function createFarmI18nRuntime(config, catalogs) {
|
|
264
|
-
return new FarmI18nRuntime(config, catalogs);
|
|
265
|
-
}
|
|
266
|
-
__name(createFarmI18nRuntime, "createFarmI18nRuntime");
|
|
267
|
-
|
|
268
|
-
// src/i18n/server.ts
|
|
269
|
-
var FARM_I18N_REQUEST_STORE = /* @__PURE__ */ Symbol.for("farm.i18n.requestStore");
|
|
270
|
-
var FARM_I18N_DEFAULT_RUNTIME = /* @__PURE__ */ Symbol.for("farm.i18n.defaultRuntime");
|
|
271
|
-
function getRequestStore() {
|
|
272
|
-
const state = globalThis;
|
|
273
|
-
return state[FARM_I18N_REQUEST_STORE] ?? (state[FARM_I18N_REQUEST_STORE] = new AsyncLocalStorage());
|
|
274
|
-
}
|
|
275
|
-
__name(getRequestStore, "getRequestStore");
|
|
276
|
-
function getState() {
|
|
277
|
-
const state = getRequestStore().getStore();
|
|
278
|
-
if (!state) {
|
|
279
|
-
throw new Error(
|
|
280
|
-
"No Farm i18n request context is active. Use this API while rendering, inside an API route, or use createTranslator(locale)."
|
|
281
|
-
);
|
|
282
|
-
}
|
|
283
|
-
return state;
|
|
284
|
-
}
|
|
285
|
-
__name(getState, "getState");
|
|
286
|
-
function _setDefaultFarmI18nRuntime(runtime) {
|
|
287
|
-
globalThis[FARM_I18N_DEFAULT_RUNTIME] = runtime;
|
|
288
|
-
}
|
|
289
|
-
__name(_setDefaultFarmI18nRuntime, "_setDefaultFarmI18nRuntime");
|
|
290
|
-
async function _runWithFarmI18nRequest(runtime, request, fn, options = {}) {
|
|
291
|
-
const resolution = runtime.resolveRequest(request, options);
|
|
292
|
-
const state = {
|
|
293
|
-
runtime,
|
|
294
|
-
resolution,
|
|
295
|
-
snapshot: runtime.getClientSnapshot(resolution)
|
|
296
|
-
};
|
|
297
|
-
return getRequestStore().run(state, () => fn(resolution));
|
|
298
|
-
}
|
|
299
|
-
__name(_runWithFarmI18nRequest, "_runWithFarmI18nRequest");
|
|
300
|
-
async function runWithLocale(locale, fn) {
|
|
301
|
-
const runtime = getDefaultRuntime();
|
|
302
|
-
assertLocale(runtime, locale);
|
|
303
|
-
const resolution = {
|
|
304
|
-
locale,
|
|
305
|
-
source: "explicit",
|
|
306
|
-
pathname: "/",
|
|
307
|
-
persist: false
|
|
308
|
-
};
|
|
309
|
-
const state = {
|
|
310
|
-
runtime,
|
|
311
|
-
resolution,
|
|
312
|
-
snapshot: runtime.getClientSnapshot(resolution)
|
|
313
|
-
};
|
|
314
|
-
return getRequestStore().run(state, fn);
|
|
315
|
-
}
|
|
316
|
-
__name(runWithLocale, "runWithLocale");
|
|
317
|
-
function getLocale() {
|
|
318
|
-
return getState().resolution.locale;
|
|
319
|
-
}
|
|
320
|
-
__name(getLocale, "getLocale");
|
|
321
|
-
function getLocaleSource() {
|
|
322
|
-
return getState().resolution.source;
|
|
323
|
-
}
|
|
324
|
-
__name(getLocaleSource, "getLocaleSource");
|
|
325
|
-
var t = createTranslatorFromState(() => getState());
|
|
326
|
-
function createTranslator(locale) {
|
|
327
|
-
const runtime = getDefaultRuntime();
|
|
328
|
-
assertLocale(runtime, locale);
|
|
329
|
-
return createTranslatorFromState(() => ({
|
|
330
|
-
runtime,
|
|
331
|
-
resolution: {
|
|
332
|
-
locale,
|
|
333
|
-
source: "explicit",
|
|
334
|
-
pathname: "/",
|
|
335
|
-
persist: false
|
|
336
|
-
},
|
|
337
|
-
snapshot: runtime.getClientSnapshot({
|
|
338
|
-
locale,
|
|
339
|
-
source: "explicit",
|
|
340
|
-
pathname: "/",
|
|
341
|
-
persist: false
|
|
342
|
-
})
|
|
343
|
-
}));
|
|
344
|
-
}
|
|
345
|
-
__name(createTranslator, "createTranslator");
|
|
346
|
-
function getFarmI18nClientSnapshot() {
|
|
347
|
-
return getRequestStore().getStore()?.snapshot;
|
|
348
|
-
}
|
|
349
|
-
__name(getFarmI18nClientSnapshot, "getFarmI18nClientSnapshot");
|
|
350
|
-
var format = {
|
|
351
|
-
number(value, options) {
|
|
352
|
-
return new Intl.NumberFormat(getLocale(), options).format(value);
|
|
353
|
-
},
|
|
354
|
-
currency(value, currency, options = {}) {
|
|
355
|
-
return new Intl.NumberFormat(getLocale(), {
|
|
356
|
-
...options,
|
|
357
|
-
style: "currency",
|
|
358
|
-
currency
|
|
359
|
-
}).format(value);
|
|
360
|
-
},
|
|
361
|
-
date(value, options) {
|
|
362
|
-
return new Intl.DateTimeFormat(getLocale(), options).format(value);
|
|
363
|
-
},
|
|
364
|
-
relativeTime(value, unit, options) {
|
|
365
|
-
return new Intl.RelativeTimeFormat(getLocale(), options).format(value, unit);
|
|
366
|
-
},
|
|
367
|
-
list(values, options) {
|
|
368
|
-
const ListFormat = Intl.ListFormat;
|
|
369
|
-
return new ListFormat(getLocale(), options).format(Array.from(values));
|
|
370
|
-
}
|
|
371
|
-
};
|
|
372
|
-
function getDefaultRuntime() {
|
|
373
|
-
const runtime = globalThis[FARM_I18N_DEFAULT_RUNTIME];
|
|
374
|
-
if (!runtime?.config.enabled) {
|
|
375
|
-
throw new Error("Farm i18n is not configured for this application.");
|
|
376
|
-
}
|
|
377
|
-
return runtime;
|
|
378
|
-
}
|
|
379
|
-
__name(getDefaultRuntime, "getDefaultRuntime");
|
|
380
|
-
function assertLocale(runtime, locale) {
|
|
381
|
-
if (!runtime.config.locales.includes(locale)) {
|
|
382
|
-
throw new Error(`Unsupported Farm i18n locale "${locale}".`);
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
__name(assertLocale, "assertLocale");
|
|
386
|
-
function createTranslatorFromState(resolveState) {
|
|
387
|
-
const translator = /* @__PURE__ */ __name(((key, values) => {
|
|
388
|
-
const state = resolveState();
|
|
389
|
-
return state.runtime.translate(state.resolution.locale, key, values);
|
|
390
|
-
}), "translator");
|
|
391
|
-
translator.rich = (key, values) => {
|
|
392
|
-
const state = resolveState();
|
|
393
|
-
return state.runtime.translateRich(state.resolution.locale, key, values);
|
|
394
|
-
};
|
|
395
|
-
translator.raw = (key) => {
|
|
396
|
-
const state = resolveState();
|
|
397
|
-
return state.runtime.getRawMessage(state.resolution.locale, key);
|
|
398
|
-
};
|
|
399
|
-
translator.has = (key) => {
|
|
400
|
-
const state = resolveState();
|
|
401
|
-
return state.runtime.hasMessage(state.resolution.locale, key);
|
|
402
|
-
};
|
|
403
|
-
return translator;
|
|
404
|
-
}
|
|
405
|
-
__name(createTranslatorFromState, "createTranslatorFromState");
|
|
406
|
-
_setFarmI18nSnapshotResolver(() => getFarmI18nClientSnapshot());
|
|
407
|
-
|
|
408
|
-
export {
|
|
409
|
-
readFarmI18nCatalogs,
|
|
410
|
-
FarmI18nRuntime,
|
|
411
|
-
createFarmI18nRuntime,
|
|
412
|
-
_setDefaultFarmI18nRuntime,
|
|
413
|
-
_runWithFarmI18nRequest,
|
|
414
|
-
runWithLocale,
|
|
415
|
-
getLocale,
|
|
416
|
-
getLocaleSource,
|
|
417
|
-
t,
|
|
418
|
-
createTranslator,
|
|
419
|
-
getFarmI18nClientSnapshot,
|
|
420
|
-
format
|
|
421
|
-
};
|
|
422
|
-
//# sourceMappingURL=chunk-2ED5Q2GH.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/i18n/server.ts","../src/i18n/runtime.ts","../src/i18n/catalog.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { FarmLocaleResolution } from \"./resolver\";\nimport { _setFarmI18nSnapshotResolver } from \"./bridge\";\nimport { FarmI18nRuntime, createFarmI18nRuntime } from \"./runtime\";\nimport type {\n FarmI18nClientSnapshot,\n FarmI18nLocale,\n FarmI18nLocaleSource,\n FarmI18nMessageArgs,\n FarmI18nMessageKey,\n FarmTranslator,\n} from \"./types\";\n\ninterface FarmI18nRequestState {\n runtime: FarmI18nRuntime;\n resolution: FarmLocaleResolution;\n snapshot: FarmI18nClientSnapshot;\n}\n\ninterface FarmListFormatOptions {\n localeMatcher?: \"lookup\" | \"best fit\";\n type?: \"conjunction\" | \"disjunction\" | \"unit\";\n style?: \"long\" | \"short\" | \"narrow\";\n}\n\nconst FARM_I18N_REQUEST_STORE = Symbol.for(\"farm.i18n.requestStore\");\nconst FARM_I18N_DEFAULT_RUNTIME = Symbol.for(\"farm.i18n.defaultRuntime\");\n\ntype GlobalFarmI18nState = typeof globalThis & {\n [FARM_I18N_REQUEST_STORE]?: AsyncLocalStorage<FarmI18nRequestState>;\n [FARM_I18N_DEFAULT_RUNTIME]?: FarmI18nRuntime;\n};\n\nfunction getRequestStore(): AsyncLocalStorage<FarmI18nRequestState> {\n const state = globalThis as GlobalFarmI18nState;\n return (state[FARM_I18N_REQUEST_STORE] ??= new AsyncLocalStorage<FarmI18nRequestState>());\n}\n\nfunction getState(): FarmI18nRequestState {\n const state = getRequestStore().getStore();\n if (!state) {\n throw new Error(\n \"No Farm i18n request context is active. Use this API while rendering, inside an API route, or use createTranslator(locale).\",\n );\n }\n return state;\n}\n\nexport function _setDefaultFarmI18nRuntime(runtime: FarmI18nRuntime | undefined): void {\n (globalThis as GlobalFarmI18nState)[FARM_I18N_DEFAULT_RUNTIME] = runtime;\n}\n\nexport async function _runWithFarmI18nRequest<T>(\n runtime: FarmI18nRuntime,\n request: Request,\n fn: (resolution: FarmLocaleResolution) => T | Promise<T>,\n options: { redirect?: boolean } = {},\n): Promise<T> {\n const resolution = runtime.resolveRequest(request, options);\n const state: FarmI18nRequestState = {\n runtime,\n resolution,\n snapshot: runtime.getClientSnapshot(resolution),\n };\n return getRequestStore().run(state, () => fn(resolution));\n}\n\nexport async function runWithLocale<T>(\n locale: FarmI18nLocale,\n fn: () => T | Promise<T>,\n): Promise<T> {\n const runtime = getDefaultRuntime();\n assertLocale(runtime, locale);\n const resolution: FarmLocaleResolution = {\n locale,\n source: \"explicit\",\n pathname: \"/\",\n persist: false,\n };\n const state: FarmI18nRequestState = {\n runtime,\n resolution,\n snapshot: runtime.getClientSnapshot(resolution),\n };\n return getRequestStore().run(state, fn);\n}\n\nexport function getLocale(): FarmI18nLocale {\n return getState().resolution.locale as FarmI18nLocale;\n}\n\nexport function getLocaleSource(): FarmI18nLocaleSource {\n return getState().resolution.source;\n}\n\nexport const t = createTranslatorFromState(() => getState());\n\nexport function createTranslator(locale: FarmI18nLocale): FarmTranslator {\n const runtime = getDefaultRuntime();\n assertLocale(runtime, locale);\n return createTranslatorFromState(() => ({\n runtime,\n resolution: {\n locale,\n source: \"explicit\",\n pathname: \"/\",\n persist: false,\n },\n snapshot: runtime.getClientSnapshot({\n locale,\n source: \"explicit\",\n pathname: \"/\",\n persist: false,\n }),\n }));\n}\n\nexport function getFarmI18nClientSnapshot(): FarmI18nClientSnapshot | undefined {\n return getRequestStore().getStore()?.snapshot;\n}\n\nexport const format = {\n number(value: number, options?: Intl.NumberFormatOptions): string {\n return new Intl.NumberFormat(getLocale(), options).format(value);\n },\n currency(\n value: number,\n currency: string,\n options: Omit<Intl.NumberFormatOptions, \"style\" | \"currency\"> = {},\n ): string {\n return new Intl.NumberFormat(getLocale(), {\n ...options,\n style: \"currency\",\n currency,\n }).format(value);\n },\n date(value: Date | number, options?: Intl.DateTimeFormatOptions): string {\n return new Intl.DateTimeFormat(getLocale(), options).format(value);\n },\n relativeTime(\n value: number,\n unit: Intl.RelativeTimeFormatUnit,\n options?: Intl.RelativeTimeFormatOptions,\n ): string {\n return new Intl.RelativeTimeFormat(getLocale(), options).format(value, unit);\n },\n list(values: Iterable<string>, options?: FarmListFormatOptions): string {\n const ListFormat = (Intl as any).ListFormat;\n return new ListFormat(getLocale(), options).format(Array.from(values));\n },\n};\n\nfunction getDefaultRuntime(): FarmI18nRuntime {\n const runtime = (globalThis as GlobalFarmI18nState)[FARM_I18N_DEFAULT_RUNTIME];\n if (!runtime?.config.enabled) {\n throw new Error(\"Farm i18n is not configured for this application.\");\n }\n return runtime;\n}\n\nfunction assertLocale(runtime: FarmI18nRuntime, locale: string): void {\n if (!runtime.config.locales.includes(locale)) {\n throw new Error(`Unsupported Farm i18n locale \"${locale}\".`);\n }\n}\n\nfunction createTranslatorFromState(resolveState: () => FarmI18nRequestState): FarmTranslator {\n const translator = ((key: string, values?: Record<string, unknown>) => {\n const state = resolveState();\n return state.runtime.translate(state.resolution.locale, key, values);\n }) as FarmTranslator;\n translator.rich = (key: string, values?: Record<string, unknown>) => {\n const state = resolveState();\n return state.runtime.translateRich(state.resolution.locale, key, values);\n };\n translator.raw = (key: string) => {\n const state = resolveState();\n return state.runtime.getRawMessage(state.resolution.locale, key);\n };\n translator.has = (key: string) => {\n const state = resolveState();\n return state.runtime.hasMessage(state.resolution.locale, key);\n };\n return translator;\n}\n\n_setFarmI18nSnapshotResolver(() => getFarmI18nClientSnapshot());\n\nexport { FarmI18nRuntime, createFarmI18nRuntime };\nexport type { FarmI18nClientSnapshot, FarmI18nLocale, FarmI18nMessageArgs, FarmI18nMessageKey };\n","import IntlMessageFormat from \"intl-messageformat\";\nimport { readFarmI18nCatalogs } from \"./catalog\";\nimport { getFarmLocaleDirection } from \"./routing\";\nimport { resolveFarmLocaleRequest, type FarmLocaleResolution } from \"./resolver\";\nimport type { FarmI18nCatalogs, FarmI18nClientSnapshot, ResolvedFarmI18nConfig } from \"./types\";\n\nexport class FarmI18nRuntime {\n readonly config: ResolvedFarmI18nConfig;\n private catalogs: FarmI18nCatalogs;\n private compiled = new Map<string, IntlMessageFormat>();\n private warnedMissing = new Set<string>();\n\n constructor(config: ResolvedFarmI18nConfig, catalogs: FarmI18nCatalogs = {}) {\n this.config = config;\n this.catalogs = catalogs;\n }\n\n async initialize(): Promise<void> {\n if (!this.config.enabled) return;\n const bundle = await readFarmI18nCatalogs(this.config);\n this.replaceCatalogs(bundle.catalogs);\n }\n\n async reload(): Promise<void> {\n await this.initialize();\n }\n\n replaceCatalogs(catalogs: FarmI18nCatalogs): void {\n this.catalogs = catalogs;\n this.compiled.clear();\n this.warnedMissing.clear();\n }\n\n getCatalogs(): FarmI18nCatalogs {\n return Object.fromEntries(\n Object.entries(this.catalogs).map(([locale, catalog]) => [locale, { ...catalog }]),\n );\n }\n\n resolveRequest(request: Request, options: { redirect?: boolean } = {}): FarmLocaleResolution {\n return resolveFarmLocaleRequest(request, this.config, options);\n }\n\n translate(locale: string, key: string, values?: Record<string, unknown>): string {\n const result = this.formatMessage(locale, key, values);\n if (Array.isArray(result) && result.some((part) => typeof part !== \"string\")) {\n throw new Error(`Farm i18n message \"${key}\" contains rich content. Render it with t.rich().`);\n }\n return Array.isArray(result) ? result.join(\"\") : String(result);\n }\n\n translateRich(locale: string, key: string, values?: Record<string, unknown>): unknown {\n const result = this.formatMessage(locale, key, values);\n return Array.isArray(result) && result.length === 1 ? result[0] : result;\n }\n\n getRawMessage(locale: string, key: string): string {\n return this.resolveMessage(locale, key);\n }\n\n hasMessage(locale: string, key: string): boolean {\n return (\n (this.catalogs[locale]?.[key] ?? this.catalogs[this.config.fallbackLocale]?.[key]) !==\n undefined\n );\n }\n\n getClientSnapshot(resolution: FarmLocaleResolution): FarmI18nClientSnapshot {\n return {\n locale: resolution.locale,\n source: resolution.source,\n locales: this.config.locales,\n defaultLocale: this.config.defaultLocale,\n routing: this.config.routing,\n cookie: this.config.cookie,\n direction: getFarmLocaleDirection(resolution.locale, this.config.direction),\n messages: {\n ...this.catalogs[this.config.fallbackLocale],\n ...this.catalogs[resolution.locale],\n },\n };\n }\n\n private formatMessage(locale: string, key: string, values?: Record<string, unknown>): unknown {\n const message = this.resolveMessage(locale, key);\n const cacheKey = `${locale}\\u0000${key}\\u0000${message}`;\n let formatter = this.compiled.get(cacheKey);\n if (!formatter) {\n formatter = new IntlMessageFormat(message, locale);\n this.compiled.set(cacheKey, formatter);\n }\n return formatter.format(values as any);\n }\n\n private resolveMessage(locale: string, key: string): string {\n const message =\n this.catalogs[locale]?.[key] ?? this.catalogs[this.config.fallbackLocale]?.[key];\n if (message !== undefined) return message;\n if (this.config.strict) {\n throw new Error(`Missing Farm i18n message \"${key}\" for locale \"${locale}\".`);\n }\n const warningKey = `${locale}:${key}`;\n if (!this.warnedMissing.has(warningKey)) {\n this.warnedMissing.add(warningKey);\n console.warn(`[Farm.js] Missing i18n message \"${key}\" for locale \"${locale}\".`);\n }\n return key;\n }\n}\n\nexport function createFarmI18nRuntime(\n config: ResolvedFarmI18nConfig,\n catalogs?: FarmI18nCatalogs,\n): FarmI18nRuntime {\n return new FarmI18nRuntime(config, catalogs);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { TYPE, parse, type MessageFormatElement } from \"@formatjs/icu-messageformat-parser\";\nimport { resolveFarmI18nMessagePath } from \"./config\";\nimport type { FarmI18nCatalog, FarmI18nCatalogs, ResolvedFarmI18nConfig } from \"./types\";\n\nexport type FarmI18nArgumentKind = \"string\" | \"number\" | \"date\" | \"select\" | \"rich\";\nexport type FarmI18nMessageSignature = Record<string, FarmI18nArgumentKind>;\n\nexport interface FarmI18nCatalogBundle {\n catalogs: FarmI18nCatalogs;\n signatures: Record<string, FarmI18nMessageSignature>;\n}\n\nexport async function readFarmI18nCatalogs(\n config: ResolvedFarmI18nConfig,\n): Promise<FarmI18nCatalogBundle> {\n if (!config.enabled) {\n return { catalogs: {}, signatures: {} };\n }\n\n const catalogs: FarmI18nCatalogs = {};\n for (const locale of config.locales) {\n const filePath = resolveFarmI18nMessagePath(config, locale);\n let source: string;\n try {\n source = await readFile(filePath, \"utf8\");\n } catch (error) {\n throw new Error(\n `Unable to read Farm i18n catalog for \"${locale}\" at ${filePath}: ${messageOf(error)}`,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch (error) {\n throw new Error(`Invalid JSON in Farm i18n catalog ${filePath}: ${messageOf(error)}`);\n }\n catalogs[locale] = flattenFarmI18nCatalog(parsed, filePath);\n }\n\n const reference = catalogs[config.defaultLocale] || {};\n const signatures: Record<string, FarmI18nMessageSignature> = {};\n for (const [key, message] of Object.entries(reference)) {\n signatures[key] = analyzeFarmI18nMessage(message, `${config.defaultLocale}:${key}`);\n }\n\n validateFarmI18nCatalogs(config, catalogs, signatures);\n return { catalogs, signatures };\n}\n\nexport function flattenFarmI18nCatalog(input: unknown, source = \"i18n catalog\"): FarmI18nCatalog {\n if (!isPlainObject(input)) {\n throw new Error(`${source} must contain a JSON object at its root.`);\n }\n\n const output: FarmI18nCatalog = {};\n const visit = (value: unknown, segments: string[]) => {\n if (typeof value === \"string\") {\n const key = segments.join(\".\");\n if (!key) throw new Error(`${source} contains an empty message key.`);\n if (key in output) throw new Error(`${source} contains duplicate message key \"${key}\".`);\n output[key] = value;\n return;\n }\n\n if (!isPlainObject(value)) {\n const key = segments.join(\".\") || \"<root>\";\n throw new Error(`${source} message \"${key}\" must be a string or nested object.`);\n }\n\n for (const [key, nested] of Object.entries(value)) {\n if (!key.trim()) throw new Error(`${source} contains an empty message key.`);\n visit(nested, [...segments, key]);\n }\n };\n\n visit(input, []);\n return output;\n}\n\nexport function analyzeFarmI18nMessage(\n message: string,\n label = \"message\",\n): FarmI18nMessageSignature {\n let ast: MessageFormatElement[];\n try {\n ast = parse(message, { captureLocation: false });\n } catch (error) {\n throw new Error(`Invalid ICU syntax in ${label}: ${messageOf(error)}`);\n }\n\n const signature: FarmI18nMessageSignature = {};\n collectArguments(ast, signature, label);\n return signature;\n}\n\nfunction validateFarmI18nCatalogs(\n config: ResolvedFarmI18nConfig,\n catalogs: FarmI18nCatalogs,\n signatures: Record<string, FarmI18nMessageSignature>,\n): void {\n const referenceKeys = Object.keys(catalogs[config.defaultLocale] || {}).sort();\n\n for (const locale of config.locales) {\n const catalog = catalogs[locale] || {};\n const localeKeys = Object.keys(catalog).sort();\n const missing = referenceKeys.filter((key) => !(key in catalog));\n const extra = localeKeys.filter((key) => !(key in signatures));\n\n if (config.strict && (missing.length > 0 || extra.length > 0)) {\n const details = [\n missing.length ? `missing: ${missing.join(\", \")}` : \"\",\n extra.length ? `extra: ${extra.join(\", \")}` : \"\",\n ]\n .filter(Boolean)\n .join(\"; \");\n throw new Error(\n `Farm i18n catalog \"${locale}\" does not match the default catalog (${details}).`,\n );\n }\n\n for (const [key, message] of Object.entries(catalog)) {\n const actual = analyzeFarmI18nMessage(message, `${locale}:${key}`);\n const expected = signatures[key];\n if (!expected || sameSignature(expected, actual)) continue;\n throw new Error(\n `Farm i18n message \"${key}\" in \"${locale}\" uses different variables than \"${config.defaultLocale}\".`,\n );\n }\n }\n}\n\nfunction collectArguments(\n elements: MessageFormatElement[],\n signature: FarmI18nMessageSignature,\n label: string,\n): void {\n for (const element of elements) {\n switch (element.type) {\n case TYPE.argument:\n addArgument(signature, element.value, \"string\", label);\n break;\n case TYPE.number:\n case TYPE.plural:\n addArgument(signature, element.value, \"number\", label);\n break;\n case TYPE.date:\n case TYPE.time:\n addArgument(signature, element.value, \"date\", label);\n break;\n case TYPE.select:\n addArgument(signature, element.value, \"select\", label);\n break;\n case TYPE.tag:\n addArgument(signature, element.value, \"rich\", label);\n collectArguments(element.children, signature, label);\n break;\n }\n\n if (element.type === TYPE.plural || element.type === TYPE.select) {\n for (const option of Object.values(element.options)) {\n collectArguments(option.value, signature, label);\n }\n }\n }\n}\n\nfunction addArgument(\n signature: FarmI18nMessageSignature,\n name: string,\n kind: FarmI18nArgumentKind,\n label: string,\n): void {\n const existing = signature[name];\n if (existing && existing !== kind) {\n throw new Error(`Farm i18n ${label} uses variable \"${name}\" as both ${existing} and ${kind}.`);\n }\n signature[name] = kind;\n}\n\nfunction sameSignature(\n expected: FarmI18nMessageSignature,\n actual: FarmI18nMessageSignature,\n): boolean {\n const expectedEntries = Object.entries(expected).sort(([a], [b]) => a.localeCompare(b));\n const actualEntries = Object.entries(actual).sort(([a], [b]) => a.localeCompare(b));\n return JSON.stringify(expectedEntries) === JSON.stringify(actualEntries);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction messageOf(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"mappings":"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","names":[]}
|