@farm.js/core 0.1.0-beta.96 → 0.1.0-beta.97
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/after.cjs +1 -1
- package/dist/after.mjs +1 -1
- package/dist/agent-runtime.d.mts +3 -2
- package/dist/agent-runtime.d.ts +3 -2
- package/dist/api/route-manager.cjs +43 -4
- package/dist/api/route-manager.d.mts +4 -3
- package/dist/api/route-manager.d.ts +4 -3
- package/dist/api/route-manager.mjs +6 -6
- package/dist/api/runtime.cjs +43 -4
- package/dist/api/runtime.d.mts +1 -1
- package/dist/api/runtime.d.ts +1 -1
- package/dist/api/runtime.mjs +4 -4
- package/dist/api.cjs +239 -70
- package/dist/api.d.mts +7 -6
- package/dist/api.d.ts +7 -6
- package/dist/api.mjs +17 -11
- package/dist/{app-CIIEvA4r.d.ts → app-CIOx3LvY.d.ts} +4 -4
- package/dist/{app-O4AEC1OH.d.mts → app-DBd6437H.d.mts} +4 -4
- package/dist/app-markdown.d.mts +4 -3
- package/dist/app-markdown.d.ts +4 -3
- package/dist/cache.cjs +42 -4
- package/dist/cache.d.mts +68 -1
- package/dist/cache.d.ts +68 -1
- package/dist/cache.mjs +3 -3
- package/dist/{chunk-AXVJCMVF.mjs → chunk-2HDOV47R.mjs} +3 -3
- package/dist/chunk-2HDOV47R.mjs.map +1 -0
- package/dist/{chunk-RBRLLZL5.mjs → chunk-34IAPZBG.mjs} +16 -3
- package/dist/chunk-34IAPZBG.mjs.map +1 -0
- package/dist/{chunk-VV24CC42.mjs → chunk-35NPLKQJ.mjs} +2 -2
- package/dist/{chunk-MM46HTX6.mjs → chunk-3TWQERDE.mjs} +4 -3
- package/dist/chunk-3TWQERDE.mjs.map +1 -0
- package/dist/{chunk-RWYRFCLG.mjs → chunk-4X57GXQA.mjs} +2 -2
- package/dist/{chunk-3I55IGXU.mjs → chunk-52BR7LTX.mjs} +14 -15
- package/dist/chunk-52BR7LTX.mjs.map +1 -0
- package/dist/{chunk-RAGSHKDC.mjs → chunk-6EJHNHH4.mjs} +38 -3
- package/dist/chunk-6EJHNHH4.mjs.map +1 -0
- package/dist/{chunk-ZFNK77WN.mjs → chunk-6JNGOC37.mjs} +2 -2
- package/dist/{after.cjs.map → chunk-6JNGOC37.mjs.map} +1 -1
- package/dist/{chunk-MOW47IF5.mjs → chunk-6UYVU46O.mjs} +2 -2
- package/dist/{chunk-7MABZJIM.mjs → chunk-7PYVLJ4J.mjs} +1 -1
- package/dist/chunk-7PYVLJ4J.mjs.map +1 -0
- package/dist/{chunk-54XSGLKT.mjs → chunk-D7F7YZ7L.mjs} +93 -67
- package/dist/chunk-D7F7YZ7L.mjs.map +1 -0
- package/dist/{chunk-SCFX4UTD.mjs → chunk-EHTUKVSW.mjs} +1 -1
- package/dist/chunk-EHTUKVSW.mjs.map +1 -0
- package/dist/{chunk-LZTGDH3H.mjs → chunk-EPDIF432.mjs} +424 -10
- package/dist/chunk-EPDIF432.mjs.map +1 -0
- package/dist/{chunk-GZHKWHCH.mjs → chunk-FP5Q67FO.mjs} +167 -96
- package/dist/chunk-FP5Q67FO.mjs.map +1 -0
- package/dist/{chunk-HHZAOTQD.mjs → chunk-GJ7W6LNK.mjs} +7 -6
- package/dist/chunk-GJ7W6LNK.mjs.map +1 -0
- package/dist/{chunk-RLGUZ3HS.mjs → chunk-I3OOUWO5.mjs} +3 -3
- package/dist/{chunk-LKKMI7JG.mjs → chunk-IZBX2TEU.mjs} +153 -68
- package/dist/chunk-IZBX2TEU.mjs.map +1 -0
- package/dist/{chunk-74QPONAN.mjs → chunk-J3MPQ4MQ.mjs} +2 -2
- package/dist/{chunk-74QPONAN.mjs.map → chunk-J3MPQ4MQ.mjs.map} +1 -1
- package/dist/{chunk-ODJGAWDH.mjs → chunk-JV7JUD7Q.mjs} +4 -4
- package/dist/{chunk-Q3OX763A.mjs → chunk-LXDASSTE.mjs} +2 -2
- package/dist/{chunk-ZRBCBOEX.mjs → chunk-N2FY2QZ7.mjs} +28 -3
- package/dist/chunk-N2FY2QZ7.mjs.map +1 -0
- package/dist/{chunk-MRVJCLYQ.mjs → chunk-PSQ7N4XP.mjs} +4 -2
- package/dist/chunk-PSQ7N4XP.mjs.map +1 -0
- package/dist/{chunk-HVG3HLQZ.mjs → chunk-Q7WGOOAI.mjs} +3 -3
- package/dist/{chunk-WTYAPO5I.mjs → chunk-RCNWMEBT.mjs} +3 -2
- package/dist/{chunk-WTYAPO5I.mjs.map → chunk-RCNWMEBT.mjs.map} +1 -1
- package/dist/{chunk-3INDBMUU.mjs → chunk-TGDIACZT.mjs} +2 -2
- package/dist/{chunk-WB75GIX2.mjs → chunk-TQTB33JS.mjs} +14 -3
- package/dist/chunk-TQTB33JS.mjs.map +1 -0
- package/dist/{chunk-WMAYETRD.mjs → chunk-TT3E2JOF.mjs} +3 -3
- package/dist/{chunk-FVAM43KI.mjs → chunk-UMUWR5XA.mjs} +2 -2
- package/dist/{chunk-VOUJW4FL.mjs → chunk-WD2EBM3I.mjs} +70 -15
- package/dist/chunk-WD2EBM3I.mjs.map +1 -0
- package/dist/{chunk-ZPG6SNHH.mjs → chunk-WMJGA32P.mjs} +47 -5
- package/dist/chunk-WMJGA32P.mjs.map +1 -0
- package/dist/{chunk-TKQCJMY7.mjs → chunk-X4SFHKFH.mjs} +7 -4
- package/dist/{chunk-TKQCJMY7.mjs.map → chunk-X4SFHKFH.mjs.map} +1 -1
- package/dist/{chunk-Q7GPJZCO.mjs → chunk-YIBV77KZ.mjs} +26 -7
- package/dist/chunk-YIBV77KZ.mjs.map +1 -0
- package/dist/client/lifecycle.mjs +2 -2
- package/dist/{client-mcMC334J.d.mts → client-DWoLZ3QU.d.mts} +52 -5
- package/dist/{client-d5ONQ-Pd.d.ts → client-DuQuQC1h.d.ts} +52 -5
- package/dist/client-cache-BMxuFqwH.d.ts +18 -0
- package/dist/client-cache-CCK-fCe0.d.mts +18 -0
- package/dist/{client-plugins-BvClItiL.d.mts → client-plugins-B6-07YmP.d.mts} +52 -99
- package/dist/{client-plugins-B9Sq-iMg.d.ts → client-plugins-By6MVUX-.d.ts} +52 -99
- package/dist/client-plugins.cjs +1 -1
- package/dist/client-plugins.d.mts +3 -2
- package/dist/client-plugins.d.ts +3 -2
- package/dist/client-plugins.mjs +2 -2
- package/dist/client.cjs +757 -104
- package/dist/client.d.mts +124 -16
- package/dist/client.d.ts +124 -16
- package/dist/client.mjs +28 -14
- package/dist/config.d.mts +3 -2
- package/dist/config.d.ts +3 -2
- package/dist/{devtools-S52RRRMN.mjs → devtools-XWZX6CCL.mjs} +5 -5
- package/dist/{devtools-client-EOVDBPOI.mjs → devtools-client-Z7QQA3Q2.mjs} +2 -2
- package/dist/{devtools-ui-NJKFORTG.mjs → devtools-ui-2HG5M4EL.mjs} +3 -1
- package/dist/devtools-ui-2HG5M4EL.mjs.map +1 -0
- package/dist/docs.cjs +24 -5
- package/dist/docs.mjs +5 -5
- package/dist/i18n/server.cjs +13 -2
- package/dist/i18n/server.d.mts +2 -2
- package/dist/i18n/server.d.ts +2 -2
- package/dist/i18n/server.mjs +1 -1
- package/dist/index.cjs +1578 -772
- package/dist/index.d.mts +28 -20
- package/dist/index.d.ts +28 -20
- package/dist/index.mjs +53 -33
- package/dist/index.mjs.map +1 -1
- package/dist/integration-api-BT024nuJ.d.mts +97 -0
- package/dist/integration-api-BT024nuJ.d.ts +97 -0
- package/dist/integrations.d.mts +3 -2
- package/dist/integrations.d.ts +3 -2
- package/dist/internal/build-runtime.cjs +710 -532
- package/dist/internal/build-runtime.d.mts +5 -4
- package/dist/internal/build-runtime.d.ts +5 -4
- package/dist/internal/build-runtime.mjs +15 -15
- package/dist/internal/client-runtime.cjs +1 -1
- package/dist/internal/client-runtime.mjs +2 -2
- package/dist/internal/config-runtime.cjs +4 -1
- package/dist/internal/config-runtime.d.mts +4 -3
- package/dist/internal/config-runtime.d.ts +4 -3
- package/dist/internal/config-runtime.mjs +4 -4
- package/dist/internal/product-telemetry-runtime.cjs +1 -1
- package/dist/internal/product-telemetry-runtime.mjs +1 -1
- package/dist/internal/production-runtime.cjs +29 -3
- package/dist/internal/production-runtime.d.mts +8 -7
- package/dist/internal/production-runtime.d.ts +8 -7
- package/dist/internal/production-runtime.mjs +5 -5
- package/dist/{metadata-route-yV4U6X8h.d.ts → metadata-route-8_V3UonT.d.ts} +1 -1
- package/dist/{metadata-route-p4K1l92V.d.mts → metadata-route-CWP_HjGU.d.mts} +1 -1
- package/dist/middleware.cjs +28 -2
- package/dist/middleware.d.mts +5 -4
- package/dist/middleware.d.ts +5 -4
- package/dist/middleware.mjs +4 -4
- package/dist/navigation.cjs +3 -1
- package/dist/navigation.mjs +3 -3
- package/dist/observability.cjs +27 -2
- package/dist/observability.mjs +1 -1
- package/dist/plugin.cjs +474 -334
- package/dist/plugin.d.mts +3 -2
- package/dist/plugin.d.ts +3 -2
- package/dist/plugin.mjs +12 -12
- package/dist/{production-runtime-IkB0Qj4i.d.mts → production-runtime-BGRH1dKG.d.mts} +1 -1
- package/dist/{production-runtime-0JTch4_d.d.ts → production-runtime-CdmzsDax.d.ts} +1 -1
- package/dist/query/client.cjs +11 -3
- package/dist/query/client.mjs +12 -4
- package/dist/query/client.mjs.map +1 -1
- package/dist/{render-plan-Dc8CjNI7.d.ts → render-plan-0GeHiGVZ.d.ts} +1 -1
- package/dist/{render-plan-CU31j-Jk.d.mts → render-plan-DLxJYAA5.d.mts} +1 -1
- package/dist/renderer-client.cjs +140 -26
- package/dist/renderer-client.d.mts +7 -6
- package/dist/renderer-client.d.ts +7 -6
- package/dist/renderer-client.mjs +16 -19
- package/dist/renderer-client.mjs.map +1 -1
- package/dist/{request-BXa1KY8i.d.mts → request-BCNXSXLh.d.mts} +1 -1
- package/dist/{request-CUUBujZt.d.ts → request-BstWbZ6O.d.ts} +1 -1
- package/dist/request.d.mts +4 -3
- package/dist/request.d.ts +4 -3
- package/dist/{route-Y8lfz1wF.d.ts → route-4pd-EVtw.d.ts} +45 -50
- package/dist/{route-Cq3aObmj.d.mts → route-CvEr4Uc9.d.mts} +45 -50
- package/dist/routes.cjs +27 -2
- package/dist/routes.d.mts +3 -2
- package/dist/routes.d.ts +3 -2
- package/dist/routes.mjs +4 -4
- package/dist/{runtime-j1S3sDTh.d.ts → runtime-BgDQzBiu.d.ts} +1 -0
- package/dist/{runtime-DDwvDtS4.d.mts → runtime-CV2UCV-5.d.mts} +1 -0
- package/dist/server-action-security.mjs +2 -2
- package/dist/server-fn-client.cjs +34 -2
- package/dist/server-fn-client.d.mts +6 -0
- package/dist/server-fn-client.d.ts +6 -0
- package/dist/server-fn-client.mjs +1 -1
- package/dist/server-fn.cjs +42 -4
- package/dist/server-fn.mjs +5 -5
- package/dist/server-plugins.d.mts +4 -3
- package/dist/server-plugins.d.ts +4 -3
- package/dist/server-query-client.cjs +146 -27
- package/dist/server-query-client.d.mts +3 -3
- package/dist/server-query-client.d.ts +3 -3
- package/dist/server-query-client.mjs +7 -7
- package/dist/{server-query-runtime-3zAj77yv.d.ts → server-query-runtime-DXRNhX_3.d.ts} +2 -0
- package/dist/{server-query-runtime-B50KAcj5.d.mts → server-query-runtime-aP52iuL5.d.mts} +2 -0
- package/dist/server-query.cjs +44 -5
- package/dist/server-query.d.mts +4 -0
- package/dist/server-query.d.ts +4 -0
- package/dist/server-query.mjs +7 -7
- package/dist/server.cjs +499 -355
- package/dist/server.d.mts +11 -10
- package/dist/server.d.ts +11 -10
- package/dist/server.mjs +16 -16
- package/dist/{spa-router-CyLkwst6.d.mts → spa-router-BeyAVSc6.d.mts} +1 -1
- package/dist/{spa-router-BkqGXaV_.d.ts → spa-router-COgu4txb.d.ts} +1 -1
- package/dist/testing.cjs +27 -2
- package/dist/testing.d.mts +3 -2
- package/dist/testing.d.ts +3 -2
- package/dist/testing.mjs +8 -8
- package/dist/{utils-NKR6SoNv.d.mts → utils-DL2VwDQl.d.mts} +1 -1
- package/dist/{utils-B2OHrb9F.d.ts → utils-DkU2c_1B.d.ts} +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.mjs +1 -1
- package/dist/vite.cjs +482 -338
- package/dist/vite.d.mts +3 -2
- package/dist/vite.d.ts +3 -2
- package/dist/vite.mjs +16 -12
- package/package.json +17 -17
- package/types/client.d.ts +87 -1
- package/dist/agent-runtime.cjs.map +0 -1
- package/dist/api/route-manager.cjs.map +0 -1
- package/dist/api/runtime.cjs.map +0 -1
- package/dist/api.cjs.map +0 -1
- package/dist/app-markdown.cjs.map +0 -1
- package/dist/cache.cjs.map +0 -1
- package/dist/chunk-3I55IGXU.mjs.map +0 -1
- package/dist/chunk-54XSGLKT.mjs.map +0 -1
- package/dist/chunk-7MABZJIM.mjs.map +0 -1
- package/dist/chunk-AXVJCMVF.mjs.map +0 -1
- package/dist/chunk-GZHKWHCH.mjs.map +0 -1
- package/dist/chunk-HHZAOTQD.mjs.map +0 -1
- package/dist/chunk-LKKMI7JG.mjs.map +0 -1
- package/dist/chunk-LZTGDH3H.mjs.map +0 -1
- package/dist/chunk-MM46HTX6.mjs.map +0 -1
- package/dist/chunk-MRVJCLYQ.mjs.map +0 -1
- package/dist/chunk-Q7GPJZCO.mjs.map +0 -1
- package/dist/chunk-RAGSHKDC.mjs.map +0 -1
- package/dist/chunk-RBRLLZL5.mjs.map +0 -1
- package/dist/chunk-SCFX4UTD.mjs.map +0 -1
- package/dist/chunk-VOUJW4FL.mjs.map +0 -1
- package/dist/chunk-WB75GIX2.mjs.map +0 -1
- package/dist/chunk-ZFNK77WN.mjs.map +0 -1
- package/dist/chunk-ZPG6SNHH.mjs.map +0 -1
- package/dist/chunk-ZRBCBOEX.mjs.map +0 -1
- package/dist/client/lifecycle.cjs.map +0 -1
- package/dist/client-cache-CopR_MaI.d.mts +0 -6
- package/dist/client-cache-Djy_TlE8.d.ts +0 -6
- package/dist/client-plugins.cjs.map +0 -1
- package/dist/client.cjs.map +0 -1
- package/dist/config.cjs.map +0 -1
- package/dist/cron.cjs.map +0 -1
- package/dist/deferred.cjs.map +0 -1
- package/dist/deployment.cjs.map +0 -1
- package/dist/devtools-ui-NJKFORTG.mjs.map +0 -1
- package/dist/docs.cjs.map +0 -1
- package/dist/env-types.cjs.map +0 -1
- package/dist/env.cjs.map +0 -1
- package/dist/environment/vite.cjs.map +0 -1
- package/dist/environment.cjs.map +0 -1
- package/dist/font.cjs.map +0 -1
- package/dist/headers.cjs.map +0 -1
- package/dist/i18n/client.cjs.map +0 -1
- package/dist/i18n/index.cjs.map +0 -1
- package/dist/i18n/server.cjs.map +0 -1
- package/dist/image/server.cjs.map +0 -1
- package/dist/image/sharp.cjs.map +0 -1
- package/dist/image.cjs.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/instrumentation.cjs.map +0 -1
- package/dist/integrations.cjs.map +0 -1
- package/dist/internal/build-runtime.cjs.map +0 -1
- package/dist/internal/client-runtime.cjs.map +0 -1
- package/dist/internal/config-runtime.cjs.map +0 -1
- package/dist/internal/isolated-boundary.cjs.map +0 -1
- package/dist/internal/metadata-image-runtime.cjs.map +0 -1
- package/dist/internal/product-telemetry-runtime.cjs.map +0 -1
- package/dist/internal/production-node-env.cjs.map +0 -1
- package/dist/internal/production-runtime.cjs.map +0 -1
- package/dist/markdown.cjs.map +0 -1
- package/dist/middleware.cjs.map +0 -1
- package/dist/navigation.cjs.map +0 -1
- package/dist/observability.cjs.map +0 -1
- package/dist/plugin.cjs.map +0 -1
- package/dist/query/client.cjs.map +0 -1
- package/dist/query/index.cjs.map +0 -1
- package/dist/query/parsers.cjs.map +0 -1
- package/dist/query/server.cjs.map +0 -1
- package/dist/renderer/react/client.cjs.map +0 -1
- package/dist/renderer/react/server.cjs.map +0 -1
- package/dist/renderer/react/vite.cjs.map +0 -1
- package/dist/renderer-client.cjs.map +0 -1
- package/dist/renderer.cjs.map +0 -1
- package/dist/request.cjs.map +0 -1
- package/dist/router.cjs.map +0 -1
- package/dist/routes.cjs.map +0 -1
- package/dist/server-action-security.cjs.map +0 -1
- package/dist/server-fn-client.cjs.map +0 -1
- package/dist/server-fn.cjs.map +0 -1
- package/dist/server-plugins.cjs.map +0 -1
- package/dist/server-query-client.cjs.map +0 -1
- package/dist/server-query.cjs.map +0 -1
- package/dist/server.cjs.map +0 -1
- package/dist/storage.cjs.map +0 -1
- package/dist/testing.cjs.map +0 -1
- package/dist/theme/client.cjs.map +0 -1
- package/dist/theme/index.cjs.map +0 -1
- package/dist/theme/runtime.cjs.map +0 -1
- package/dist/theme/server.cjs.map +0 -1
- package/dist/version.cjs.map +0 -1
- package/dist/vite.cjs.map +0 -1
- package/dist/workflows.cjs.map +0 -1
- /package/dist/{chunk-VV24CC42.mjs.map → chunk-35NPLKQJ.mjs.map} +0 -0
- /package/dist/{chunk-RWYRFCLG.mjs.map → chunk-4X57GXQA.mjs.map} +0 -0
- /package/dist/{chunk-MOW47IF5.mjs.map → chunk-6UYVU46O.mjs.map} +0 -0
- /package/dist/{chunk-RLGUZ3HS.mjs.map → chunk-I3OOUWO5.mjs.map} +0 -0
- /package/dist/{chunk-ODJGAWDH.mjs.map → chunk-JV7JUD7Q.mjs.map} +0 -0
- /package/dist/{chunk-Q3OX763A.mjs.map → chunk-LXDASSTE.mjs.map} +0 -0
- /package/dist/{chunk-HVG3HLQZ.mjs.map → chunk-Q7WGOOAI.mjs.map} +0 -0
- /package/dist/{chunk-3INDBMUU.mjs.map → chunk-TGDIACZT.mjs.map} +0 -0
- /package/dist/{chunk-WMAYETRD.mjs.map → chunk-TT3E2JOF.mjs.map} +0 -0
- /package/dist/{chunk-FVAM43KI.mjs.map → chunk-UMUWR5XA.mjs.map} +0 -0
- /package/dist/{devtools-S52RRRMN.mjs.map → devtools-XWZX6CCL.mjs.map} +0 -0
- /package/dist/{devtools-client-EOVDBPOI.mjs.map → devtools-client-Z7QQA3Q2.mjs.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/middleware/production-runtime.ts"],"sourcesContent":["import type {\n CookieJar,\n CookieOptions,\n FarmMiddlewareConfig,\n MiddlewareConfig,\n MiddlewareContext,\n MiddlewareFunction,\n MiddlewareMatcher,\n MiddlewareModule,\n MiddlewareResult,\n} from \"./types\";\nimport { emitFarmEvent } from \"../observability\";\nimport { decodeRouteSegment } from \"../utils/decode\";\nimport { normalizeMiddlewareModule } from \"./module\";\nimport { stripFarmLocaleFromPathname } from \"../i18n/routing\";\nimport type { ResolvedFarmI18nConfig } from \"../i18n/types\";\nimport type { ResolvedFarmServerConfig } from \"../server-http\";\nimport { parseMiddlewareCookieHeader } from \"./cookie-header\";\n\nexport interface ProductionMiddlewareModuleEntry {\n path: string;\n filePath?: string;\n module: MiddlewareModule | Record<string, any>;\n}\n\nexport interface ProductionMiddlewareRunnerOptions {\n config?: FarmMiddlewareConfig | null;\n modules?: ProductionMiddlewareModuleEntry[];\n i18n?: ResolvedFarmI18nConfig;\n server?: Pick<ResolvedFarmServerConfig, \"trustProxy\">;\n}\n\nexport interface ProductionMiddlewareResult {\n request: Request;\n response: Response | null;\n data: Map<string, any>;\n context: Map<string, any>;\n headers: Headers;\n handled: boolean;\n}\n\ninterface ProductionMiddlewareEntry {\n path: string;\n filePath: string;\n handlers: MiddlewareFunction[];\n config?: MiddlewareConfig;\n source: \"config\" | \"file\";\n}\n\ninterface WebMiddlewareContextState {\n ctx: MiddlewareContext;\n headers: WebResponseHeaderMap;\n getRequest(): Request;\n getResponse(): Response | null;\n}\n\nconst FARM_SET_COOKIE_HEADERS = Symbol(\"farm.setCookieHeaders\");\n\ntype InternalMiddlewareParent = MiddlewareContext[\"parent\"] & {\n [FARM_SET_COOKIE_HEADERS]?: string[];\n};\n\nclass WebResponseHeaderMap extends Map<string, string> {\n private setCookies: string[] = [];\n\n override set(key: string, value: string): this {\n if (key.toLowerCase() === \"set-cookie\") {\n this.setCookies = [value];\n super.set(\"Set-Cookie\", value);\n return this;\n }\n return super.set(key, value);\n }\n\n override delete(key: string): boolean {\n if (key.toLowerCase() === \"set-cookie\") {\n this.setCookies = [];\n return super.delete(\"Set-Cookie\") || super.delete(\"set-cookie\");\n }\n return super.delete(key);\n }\n\n override clear(): void {\n this.setCookies = [];\n super.clear();\n }\n\n appendSetCookie(value: string): void {\n this.setCookies.push(value);\n super.set(\"Set-Cookie\", value);\n }\n\n replaceSetCookies(values: readonly string[]): void {\n this.setCookies = [...values];\n super.delete(\"Set-Cookie\");\n super.delete(\"set-cookie\");\n if (this.setCookies.length > 0) {\n super.set(\"Set-Cookie\", this.setCookies[this.setCookies.length - 1]);\n }\n }\n\n getSetCookies(): readonly string[] {\n return this.setCookies;\n }\n}\n\nfunction serializeCookie(name: string, value: string, options: CookieOptions = {}): string {\n let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\n\n if (options.maxAge != null) cookie += `; Max-Age=${options.maxAge}`;\n if (options.expires) cookie += `; Expires=${options.expires.toUTCString()}`;\n cookie += `; Path=${options.path || \"/\"}`;\n if (options.domain) cookie += `; Domain=${options.domain}`;\n if (options.secure) cookie += \"; Secure\";\n if (options.httpOnly) cookie += \"; HttpOnly\";\n if (options.sameSite) {\n cookie += `; SameSite=${options.sameSite.charAt(0).toUpperCase()}${options.sameSite.slice(1)}`;\n }\n\n return cookie;\n}\n\nclass WebCookieJar implements CookieJar {\n private cookies: Record<string, string>;\n\n constructor(\n request: Request,\n private headers: WebResponseHeaderMap,\n ) {\n this.cookies = parseMiddlewareCookieHeader(request.headers.get(\"cookie\"));\n }\n\n get(name: string): string | undefined {\n return this.cookies[name];\n }\n\n set(name: string, value: string, options: CookieOptions = {}): void {\n this.cookies[name] = value;\n const cookieString = serializeCookie(name, value, options);\n this.headers.appendSetCookie(cookieString);\n }\n\n delete(name: string): void {\n delete this.cookies[name];\n const cookieString = serializeCookie(name, \"\", {\n maxAge: 0,\n expires: new Date(0),\n });\n this.headers.appendSetCookie(cookieString);\n }\n\n getAll(): Record<string, string> {\n return { ...this.cookies };\n }\n}\n\nfunction mapToHeaders(map: WebResponseHeaderMap): Headers {\n const headers = new Headers();\n for (const [key, value] of map) {\n if (key.toLowerCase() === \"set-cookie\") continue;\n headers.set(key, value);\n }\n for (const cookie of map.getSetCookies()) {\n headers.append(\"Set-Cookie\", cookie);\n }\n return headers;\n}\n\nfunction headersToRecord(headers: Map<string, string>): Record<string, string> {\n return Object.fromEntries(headers);\n}\n\nfunction isMiddlewareResponse(value: unknown): value is Response {\n return value instanceof Response;\n}\n\nfunction createResponseShim(headers: WebResponseHeaderMap): Record<string, any> {\n return {\n headersSent: false,\n writableEnded: false,\n setHeader(name: string, value: string | string[]) {\n if (name.toLowerCase() === \"set-cookie\") {\n headers.replaceSetCookies(Array.isArray(value) ? value.map(String) : [String(value)]);\n } else {\n headers.set(name, Array.isArray(value) ? value.join(\", \") : String(value));\n }\n },\n getHeader(name: string) {\n return headers.get(name);\n },\n writeHead(status: number, responseHeaders?: Record<string, string>) {\n this.statusCode = status;\n if (responseHeaders) {\n for (const [key, value] of Object.entries(responseHeaders)) {\n headers.set(key, value);\n }\n }\n this.headersSent = true;\n },\n end() {\n this.writableEnded = true;\n },\n };\n}\n\nfunction withNodeRequestShape(request: Request, trustProxy: boolean): Request {\n const requestWithShape = request as Request & {\n socket?: { remoteAddress?: string };\n };\n\n if (!requestWithShape.socket) {\n const forwardedFor = trustProxy\n ? request.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim()\n : undefined;\n try {\n requestWithShape.socket = {\n remoteAddress: forwardedFor || \"127.0.0.1\",\n };\n } catch {\n // Some Request implementations may not be extensible.\n }\n }\n\n return requestWithShape;\n}\n\nfunction createHandledResponse(\n body: BodyInit | null,\n init: ResponseInit,\n headers: WebResponseHeaderMap,\n): Response {\n const responseHeaders = new Headers(init.headers);\n for (const [key, value] of headers) {\n if (key.toLowerCase() === \"set-cookie\") continue;\n responseHeaders.set(key, value);\n }\n for (const cookie of headers.getSetCookies()) {\n responseHeaders.append(\"Set-Cookie\", cookie);\n }\n return new Response(body, { ...init, headers: responseHeaders });\n}\n\nfunction createWebMiddlewareContext(\n request: Request,\n parent?: MiddlewareContext[\"parent\"],\n trustProxy = false,\n): WebMiddlewareContextState {\n let currentRequest = withNodeRequestShape(request, trustProxy);\n let handledResponse: Response | null = null;\n const url = new URL(currentRequest.url);\n const data = parent?.data ? new Map(parent.data) : new Map<string, any>();\n const locals = parent?.locals ? new Map(parent.locals) : new Map<string, any>();\n const headers = new WebResponseHeaderMap();\n\n if (parent?.headers) {\n for (const [key, value] of Object.entries(parent.headers)) {\n if (key.toLowerCase() === \"set-cookie\") continue;\n headers.set(key, value);\n }\n }\n const parentCookies = (parent as InternalMiddlewareParent | undefined)?.[FARM_SET_COOKIE_HEADERS];\n if (parentCookies) headers.replaceSetCookies(parentCookies);\n\n const ctx = {\n request: currentRequest as any,\n response: createResponseShim(headers) as any,\n url,\n pathname: url.pathname,\n searchParams: url.searchParams,\n method: currentRequest.method || \"GET\",\n params: {},\n route: url.pathname,\n parent,\n vite: {\n isDev: false,\n hmr: false,\n },\n data,\n locals,\n headers,\n cookies: new WebCookieJar(currentRequest, headers),\n _handled: false as boolean,\n _redirectUrl: undefined as string | undefined,\n _rewriteUrl: undefined as string | undefined,\n\n redirect(redirectUrl: string, status = 307): void {\n ctx._redirectUrl = redirectUrl;\n ctx._handled = true;\n handledResponse = createHandledResponse(\n `Redirecting to ${redirectUrl}`,\n {\n status,\n headers: {\n Location: redirectUrl,\n \"Content-Type\": \"text/plain\",\n },\n },\n headers,\n );\n },\n\n rewrite(rewriteUrl: string): void {\n ctx._rewriteUrl = rewriteUrl;\n const nextUrl = new URL(rewriteUrl, currentRequest.url);\n currentRequest = withNodeRequestShape(new Request(nextUrl, currentRequest), trustProxy);\n ctx.request = currentRequest as any;\n ctx.url = nextUrl;\n ctx.pathname = nextUrl.pathname;\n ctx.searchParams = nextUrl.searchParams;\n ctx.route = nextUrl.pathname;\n },\n\n json(jsonData: any, status = 200): void {\n ctx._handled = true;\n handledResponse = createHandledResponse(\n JSON.stringify(jsonData),\n {\n status,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n },\n headers,\n );\n },\n\n text(content: string, status = 200): void {\n ctx._handled = true;\n handledResponse = createHandledResponse(\n content,\n {\n status,\n headers: {\n \"Content-Type\": \"text/plain\",\n },\n },\n headers,\n );\n },\n\n html(content: string, status = 200): void {\n ctx._handled = true;\n handledResponse = createHandledResponse(\n content,\n {\n status,\n headers: {\n \"Content-Type\": \"text/html\",\n },\n },\n headers,\n );\n },\n } satisfies MiddlewareContext;\n\n return {\n ctx,\n headers,\n getRequest: () => currentRequest,\n getResponse: () => handledResponse,\n };\n}\n\nfunction toMatcherList(matcher: MiddlewareConfig[\"matcher\"]): MiddlewareMatcher[] {\n if (!matcher) return [];\n return Array.isArray(matcher) ? matcher : [matcher];\n}\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\");\n}\n\nfunction parseColonParam(segment: string): { name: string; modifier?: string } {\n const raw = segment.slice(1);\n const last = raw[raw.length - 1];\n const modifier = last === \"*\" || last === \"+\" || last === \"?\" ? last : undefined;\n return {\n name: modifier ? raw.slice(0, -1) : raw,\n modifier,\n };\n}\n\nfunction compilePathPattern(pattern: string): { regex: RegExp; params: string[] } {\n const params: string[] = [];\n const segments = pattern.split(\"/\").filter(Boolean);\n\n if (segments.length === 0) {\n return { regex: /^\\/$/, params };\n }\n\n const parts = segments.map((segment) => {\n if (segment === \"**\") {\n return \"(?:/.*)?\";\n }\n\n if (segment === \"*\") {\n return \"/[^/]+\";\n }\n\n if (segment.startsWith(\":\")) {\n const { name, modifier } = parseColonParam(segment);\n params.push(name);\n\n if (modifier === \"*\") {\n return \"(?:/(.*))?\";\n }\n if (modifier === \"+\") {\n return \"/(.+)\";\n }\n return \"/([^/]+)\";\n }\n\n if (segment.startsWith(\"[...\") && segment.endsWith(\"]\")) {\n params.push(segment.slice(4, -1));\n return \"(?:/(.*))?\";\n }\n\n if (segment.startsWith(\"[\") && segment.endsWith(\"]\")) {\n params.push(segment.slice(1, -1));\n return \"/([^/]+)\";\n }\n\n return `/${escapeRegex(segment).replace(/\\\\\\*/g, \"[^/]*\")}`;\n });\n\n return {\n regex: new RegExp(`^${parts.join(\"\")}$`),\n params,\n };\n}\n\nfunction matchPattern(\n pattern: string | RegExp,\n pathname: string,\n): { matched: boolean; params?: Record<string, string> } {\n if (pattern instanceof RegExp) {\n pattern.lastIndex = 0;\n const match = pattern.exec(pathname);\n return {\n matched: !!match,\n params: match?.groups ? { ...match.groups } : undefined,\n };\n }\n\n if (pattern === \"*\" || pattern === \"/(.*)\") {\n return { matched: true };\n }\n\n if (pattern.endsWith(\"(.*)\")) {\n const prefix = pattern.slice(0, -4);\n return { matched: pathname === prefix || pathname.startsWith(`${prefix}/`) };\n }\n\n const { regex, params } = compilePathPattern(pattern);\n const match = regex.exec(pathname);\n if (!match) {\n return { matched: false };\n }\n\n const values: Record<string, string> = {};\n params.forEach((param, index) => {\n values[param] = decodeRouteSegment(match[index + 1] || \"\");\n });\n\n return {\n matched: true,\n params: Object.keys(values).length > 0 ? values : undefined,\n };\n}\n\nfunction matchesConfig(\n pathname: string,\n config: MiddlewareConfig,\n ctx: MiddlewareContext,\n): { matched: boolean; params?: Record<string, string> } {\n if (config.exclude) {\n for (const pattern of config.exclude) {\n if (matchPattern(pattern, pathname).matched) {\n return { matched: false };\n }\n }\n }\n\n if (config.matcher) {\n for (const matcher of toMatcherList(config.matcher)) {\n if (typeof matcher === \"string\" || matcher instanceof RegExp) {\n const result = matchPattern(matcher, pathname);\n if (result.matched) {\n return result;\n }\n } else if (typeof matcher === \"function\" && matcher(ctx)) {\n return { matched: true };\n }\n }\n return { matched: false };\n }\n\n return { matched: true };\n}\n\nfunction matchRoutePath(\n pathname: string,\n middlewarePath: string,\n): { matched: boolean; params?: Record<string, string> } {\n if (middlewarePath === \"/\") return { matched: true };\n\n const exactMatch = matchPattern(middlewarePath, pathname);\n if (exactMatch.matched) {\n return exactMatch;\n }\n\n const nestedMatch = matchPattern(`${middlewarePath}/:__farmRest*`, pathname);\n if (!nestedMatch.matched) {\n return { matched: false };\n }\n\n const params = { ...nestedMatch.params };\n delete params.__farmRest;\n return {\n matched: true,\n params: Object.keys(params).length > 0 ? params : undefined,\n };\n}\n\nfunction getConfigHandlers(\n entry: MiddlewareConfig & {\n handler?: MiddlewareFunction;\n handlers?: MiddlewareFunction[];\n },\n): MiddlewareFunction[] {\n const handlers: MiddlewareFunction[] = [];\n if (\"handler\" in entry && typeof entry.handler === \"function\") {\n handlers.push(entry.handler);\n }\n if (\"handlers\" in entry && Array.isArray(entry.handlers)) {\n handlers.push(...entry.handlers.filter((handler) => typeof handler === \"function\"));\n }\n return handlers;\n}\n\nfunction toMiddlewareConfig(\n entry: MiddlewareConfig & {\n handler?: MiddlewareFunction;\n handlers?: MiddlewareFunction[];\n },\n): MiddlewareConfig {\n const { matcher, exclude, runtime } = entry;\n return { matcher, exclude, runtime };\n}\n\nfunction normalizeConfigMiddleware(config?: FarmMiddlewareConfig | null): {\n entries: ProductionMiddlewareEntry[];\n globalConfig?: MiddlewareConfig;\n} {\n const entries: ProductionMiddlewareEntry[] = [];\n let globalConfig: MiddlewareConfig | undefined;\n\n if (!config) {\n return { entries, globalConfig };\n }\n\n const configEntries = Array.isArray(config) ? config : [config];\n for (const [index, entry] of configEntries.entries()) {\n const handlers = getConfigHandlers(entry);\n const middlewareConfig = toMiddlewareConfig(entry);\n\n if (handlers.length === 0) {\n globalConfig = middlewareConfig;\n continue;\n }\n\n entries.push({\n path: \"/\",\n filePath: `farm.config.ts#middleware-${index}`,\n handlers,\n config: middlewareConfig,\n source: \"config\",\n });\n }\n\n return { entries, globalConfig };\n}\n\nfunction normalizeFileMiddleware(\n modules: ProductionMiddlewareModuleEntry[] = [],\n): ProductionMiddlewareEntry[] {\n const entries: ProductionMiddlewareEntry[] = [];\n\n for (const moduleEntry of modules) {\n const normalized = normalizeMiddlewareModule(moduleEntry.module, moduleEntry.path);\n if (!normalized) {\n continue;\n }\n\n entries.push({\n path: moduleEntry.path,\n filePath: moduleEntry.filePath || moduleEntry.path,\n handlers: normalized.handlers,\n config: normalized.config,\n source: \"file\",\n });\n }\n\n return entries;\n}\n\nasync function executeHandlers(\n handlers: MiddlewareFunction[],\n ctx: MiddlewareContext,\n): Promise<Response | undefined> {\n let handlerIndex = 0;\n let returnedResponse: Response | undefined;\n const executeNext = async (): Promise<MiddlewareResult> => {\n if (handlerIndex < handlers.length) {\n const handler = handlers[handlerIndex++];\n const result = await handler(ctx, executeNext);\n if (isMiddlewareResponse(result)) {\n returnedResponse = result;\n return result;\n }\n }\n return returnedResponse;\n };\n\n const result = await executeNext();\n return isMiddlewareResponse(result) ? result : returnedResponse;\n}\n\nfunction emptyResult(request: Request): ProductionMiddlewareResult {\n return {\n request,\n response: null,\n data: new Map(),\n context: new Map(),\n headers: new Headers(),\n handled: false,\n };\n}\n\nexport function createProductionMiddlewareRunner(options: ProductionMiddlewareRunnerOptions = {}) {\n const configMiddleware = normalizeConfigMiddleware(options.config);\n const fileMiddleware = normalizeFileMiddleware(options.modules);\n const entries = [...configMiddleware.entries, ...fileMiddleware];\n const globalConfig = configMiddleware.globalConfig;\n\n return async function runProductionMiddleware(\n request: Request,\n ): Promise<ProductionMiddlewareResult> {\n if (!globalConfig && entries.length === 0) {\n return emptyResult(request);\n }\n\n let contextState = createWebMiddlewareContext(\n request,\n undefined,\n options.server?.trustProxy === true,\n );\n let ctx = contextState.ctx;\n let currentRequest = contextState.getRequest();\n const initialPathname = options.i18n?.enabled\n ? stripFarmLocaleFromPathname(ctx.pathname, options.i18n)\n : ctx.pathname;\n let parentData: MiddlewareContext[\"parent\"] | undefined;\n\n if (globalConfig) {\n const globalMatch = matchesConfig(initialPathname, globalConfig, ctx);\n if (!globalMatch.matched) {\n return emptyResult(request);\n }\n if (globalMatch.params) {\n ctx.params = { ...ctx.params, ...globalMatch.params };\n }\n }\n\n const applicable = entries\n .map((entry) => ({\n entry,\n routeMatch:\n entry.source === \"config\"\n ? { matched: true }\n : matchRoutePath(initialPathname, entry.path),\n }))\n .filter((candidate) => candidate.routeMatch.matched);\n\n if (applicable.length === 0) {\n return {\n request: currentRequest,\n response: null,\n data: new Map(ctx.data),\n context: new Map(ctx.locals),\n headers: mapToHeaders(contextState.headers),\n handled: false,\n };\n }\n\n for (const candidate of applicable) {\n const { entry, routeMatch } = candidate;\n const configMatch = entry.config\n ? matchesConfig(initialPathname, entry.config, ctx)\n : { matched: true };\n if (!configMatch.matched) {\n continue;\n }\n\n if (parentData) {\n contextState = createWebMiddlewareContext(\n currentRequest,\n parentData,\n options.server?.trustProxy === true,\n );\n ctx = contextState.ctx;\n }\n\n if (routeMatch.params) {\n ctx.params = { ...ctx.params, ...routeMatch.params };\n }\n if (configMatch.params) {\n ctx.params = { ...ctx.params, ...configMatch.params };\n }\n\n const middlewareStartTime = Date.now();\n const middlewareEvent = {\n route: entry.path,\n pathname: initialPathname,\n name: entry.filePath,\n };\n emitFarmEvent({ type: \"middleware.start\", ...middlewareEvent });\n\n try {\n const returnedResponse = await executeHandlers(entry.handlers, ctx);\n currentRequest = contextState.getRequest();\n\n if (returnedResponse) {\n const response = applyProductionMiddlewareHeaders(\n returnedResponse,\n mapToHeaders(contextState.headers),\n );\n emitFarmEvent({\n type: \"middleware.shortCircuit\",\n ...middlewareEvent,\n status: response.status,\n });\n return {\n request: currentRequest,\n response,\n data: new Map(ctx.data),\n context: new Map(ctx.locals),\n headers: mapToHeaders(contextState.headers),\n handled: true,\n };\n }\n\n if (ctx._handled) {\n const response = contextState.getResponse() || new Response(null);\n emitFarmEvent({\n type: \"middleware.shortCircuit\",\n ...middlewareEvent,\n status: response.status,\n });\n return {\n request: currentRequest,\n response,\n data: new Map(ctx.data),\n context: new Map(ctx.locals),\n headers: mapToHeaders(contextState.headers),\n handled: true,\n };\n }\n\n emitFarmEvent({\n type: \"middleware.complete\",\n ...middlewareEvent,\n durationMs: Date.now() - middlewareStartTime,\n });\n } catch (error) {\n emitFarmEvent({\n type: \"middleware.error\",\n ...middlewareEvent,\n error,\n });\n throw error;\n }\n\n parentData = {\n data: new Map(ctx.data),\n locals: new Map(ctx.locals),\n headers: headersToRecord(contextState.headers),\n [FARM_SET_COOKIE_HEADERS]: [...contextState.headers.getSetCookies()],\n } as InternalMiddlewareParent;\n }\n\n return {\n request: currentRequest,\n response: null,\n data: new Map(ctx.data),\n context: new Map(ctx.locals),\n headers: mapToHeaders(contextState.headers),\n handled: false,\n };\n };\n}\n\nexport function applyProductionMiddlewareHeaders(\n response: Response,\n middlewareHeaders?: Headers | null,\n): Response {\n if (!middlewareHeaders || Array.from(middlewareHeaders.keys()).length === 0) {\n return response;\n }\n\n const headers = new Headers(response.headers);\n const getSetCookie = (middlewareHeaders as Headers & { getSetCookie?: () => string[] })\n .getSetCookie;\n const setCookies = getSetCookie\n ? getSetCookie.call(middlewareHeaders)\n : middlewareHeaders.get(\"set-cookie\")\n ? [middlewareHeaders.get(\"set-cookie\")!]\n : [];\n for (const [key, value] of middlewareHeaders) {\n if (key.toLowerCase() === \"set-cookie\") continue;\n headers.set(key, value);\n }\n for (const cookie of setCookies) {\n headers.append(\"Set-Cookie\", cookie);\n }\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n"],"mappings":"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","names":["match","result"]}
|
|
1
|
+
{"version":3,"sources":["../src/middleware/production-runtime.ts"],"sourcesContent":["import type {\n CookieJar,\n CookieOptions,\n FarmMiddlewareConfig,\n MiddlewareConfig,\n MiddlewareContext,\n MiddlewareFunction,\n MiddlewareMatcher,\n MiddlewareModule,\n MiddlewareResult,\n} from \"./types\";\nimport { emitFarmEvent } from \"../observability\";\nimport { decodeRouteSegment } from \"../utils/decode\";\nimport { normalizeMiddlewareModule } from \"./module\";\nimport { stripFarmLocaleFromPathname } from \"../i18n/routing\";\nimport type { ResolvedFarmI18nConfig } from \"../i18n/types\";\nimport type { ResolvedFarmServerConfig } from \"../server-http\";\nimport { parseMiddlewareCookieHeader } from \"./cookie-header\";\n\nexport interface ProductionMiddlewareModuleEntry {\n path: string;\n filePath?: string;\n module: MiddlewareModule | Record<string, any>;\n}\n\nexport interface ProductionMiddlewareRunnerOptions {\n config?: FarmMiddlewareConfig | null;\n modules?: ProductionMiddlewareModuleEntry[];\n i18n?: ResolvedFarmI18nConfig;\n server?: Pick<ResolvedFarmServerConfig, \"trustProxy\">;\n}\n\nexport interface ProductionMiddlewareResult {\n request: Request;\n response: Response | null;\n data: Map<string, any>;\n context: Map<string, any>;\n headers: Headers;\n handled: boolean;\n}\n\ninterface ProductionMiddlewareEntry {\n path: string;\n filePath: string;\n handlers: MiddlewareFunction[];\n config?: MiddlewareConfig;\n source: \"config\" | \"file\";\n}\n\ninterface WebMiddlewareContextState {\n ctx: MiddlewareContext;\n headers: WebResponseHeaderMap;\n getRequest(): Request;\n getResponse(): Response | null;\n}\n\nconst FARM_SET_COOKIE_HEADERS = Symbol(\"farm.setCookieHeaders\");\n\ntype InternalMiddlewareParent = MiddlewareContext[\"parent\"] & {\n [FARM_SET_COOKIE_HEADERS]?: string[];\n};\n\nclass WebResponseHeaderMap extends Map<string, string> {\n private setCookies: string[] = [];\n\n override set(key: string, value: string): this {\n if (key.toLowerCase() === \"set-cookie\") {\n this.setCookies = [value];\n super.set(\"Set-Cookie\", value);\n return this;\n }\n return super.set(key, value);\n }\n\n override delete(key: string): boolean {\n if (key.toLowerCase() === \"set-cookie\") {\n this.setCookies = [];\n return super.delete(\"Set-Cookie\") || super.delete(\"set-cookie\");\n }\n return super.delete(key);\n }\n\n override clear(): void {\n this.setCookies = [];\n super.clear();\n }\n\n appendSetCookie(value: string): void {\n this.setCookies.push(value);\n super.set(\"Set-Cookie\", value);\n }\n\n replaceSetCookies(values: readonly string[]): void {\n this.setCookies = [...values];\n super.delete(\"Set-Cookie\");\n super.delete(\"set-cookie\");\n if (this.setCookies.length > 0) {\n super.set(\"Set-Cookie\", this.setCookies[this.setCookies.length - 1]);\n }\n }\n\n getSetCookies(): readonly string[] {\n return this.setCookies;\n }\n}\n\nfunction serializeCookie(name: string, value: string, options: CookieOptions = {}): string {\n let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\n\n if (options.maxAge != null) cookie += `; Max-Age=${options.maxAge}`;\n if (options.expires) cookie += `; Expires=${options.expires.toUTCString()}`;\n cookie += `; Path=${options.path || \"/\"}`;\n if (options.domain) cookie += `; Domain=${options.domain}`;\n if (options.secure) cookie += \"; Secure\";\n if (options.httpOnly) cookie += \"; HttpOnly\";\n if (options.sameSite) {\n cookie += `; SameSite=${options.sameSite.charAt(0).toUpperCase()}${options.sameSite.slice(1)}`;\n }\n\n return cookie;\n}\n\nclass WebCookieJar implements CookieJar {\n private cookies: Record<string, string>;\n\n constructor(\n request: Request,\n private headers: WebResponseHeaderMap,\n ) {\n this.cookies = parseMiddlewareCookieHeader(request.headers.get(\"cookie\"));\n }\n\n get(name: string): string | undefined {\n return this.cookies[name];\n }\n\n set(name: string, value: string, options: CookieOptions = {}): void {\n this.cookies[name] = value;\n const cookieString = serializeCookie(name, value, options);\n this.headers.appendSetCookie(cookieString);\n }\n\n delete(name: string): void {\n delete this.cookies[name];\n const cookieString = serializeCookie(name, \"\", {\n maxAge: 0,\n expires: new Date(0),\n });\n this.headers.appendSetCookie(cookieString);\n }\n\n getAll(): Record<string, string> {\n return { ...this.cookies };\n }\n}\n\nfunction mapToHeaders(map: WebResponseHeaderMap): Headers {\n const headers = new Headers();\n for (const [key, value] of map) {\n if (key.toLowerCase() === \"set-cookie\") continue;\n headers.set(key, value);\n }\n for (const cookie of map.getSetCookies()) {\n headers.append(\"Set-Cookie\", cookie);\n }\n return headers;\n}\n\nfunction headersToRecord(headers: Map<string, string>): Record<string, string> {\n return Object.fromEntries(headers);\n}\n\nfunction isMiddlewareResponse(value: unknown): value is Response {\n return value instanceof Response;\n}\n\nfunction createResponseShim(headers: WebResponseHeaderMap): Record<string, any> {\n return {\n headersSent: false,\n writableEnded: false,\n setHeader(name: string, value: string | string[]) {\n if (name.toLowerCase() === \"set-cookie\") {\n headers.replaceSetCookies(Array.isArray(value) ? value.map(String) : [String(value)]);\n } else {\n headers.set(name, Array.isArray(value) ? value.join(\", \") : String(value));\n }\n },\n getHeader(name: string) {\n return headers.get(name);\n },\n writeHead(status: number, responseHeaders?: Record<string, string>) {\n this.statusCode = status;\n if (responseHeaders) {\n for (const [key, value] of Object.entries(responseHeaders)) {\n headers.set(key, value);\n }\n }\n this.headersSent = true;\n },\n end() {\n this.writableEnded = true;\n },\n };\n}\n\nfunction withNodeRequestShape(request: Request, trustProxy: boolean): Request {\n const requestWithShape = request as Request & {\n socket?: { remoteAddress?: string };\n };\n\n if (!requestWithShape.socket) {\n const forwardedFor = trustProxy\n ? request.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim()\n : undefined;\n try {\n requestWithShape.socket = {\n remoteAddress: forwardedFor || \"127.0.0.1\",\n };\n } catch {\n // Some Request implementations may not be extensible.\n }\n }\n\n return requestWithShape;\n}\n\nfunction createHandledResponse(\n body: BodyInit | null,\n init: ResponseInit,\n headers: WebResponseHeaderMap,\n): Response {\n const responseHeaders = new Headers(init.headers);\n for (const [key, value] of headers) {\n if (key.toLowerCase() === \"set-cookie\") continue;\n responseHeaders.set(key, value);\n }\n for (const cookie of headers.getSetCookies()) {\n responseHeaders.append(\"Set-Cookie\", cookie);\n }\n return new Response(body, { ...init, headers: responseHeaders });\n}\n\nfunction createWebMiddlewareContext(\n request: Request,\n parent?: MiddlewareContext[\"parent\"],\n trustProxy = false,\n): WebMiddlewareContextState {\n let currentRequest = withNodeRequestShape(request, trustProxy);\n let handledResponse: Response | null = null;\n const url = new URL(currentRequest.url);\n const data = parent?.data ? new Map(parent.data) : new Map<string, any>();\n const locals = parent?.locals ? new Map(parent.locals) : new Map<string, any>();\n const headers = new WebResponseHeaderMap();\n\n if (parent?.headers) {\n for (const [key, value] of Object.entries(parent.headers)) {\n if (key.toLowerCase() === \"set-cookie\") continue;\n headers.set(key, value);\n }\n }\n const parentCookies = (parent as InternalMiddlewareParent | undefined)?.[FARM_SET_COOKIE_HEADERS];\n if (parentCookies) headers.replaceSetCookies(parentCookies);\n\n const ctx = {\n request: currentRequest as any,\n response: createResponseShim(headers) as any,\n url,\n pathname: url.pathname,\n searchParams: url.searchParams,\n method: currentRequest.method || \"GET\",\n params: {},\n route: url.pathname,\n parent,\n vite: {\n isDev: false,\n hmr: false,\n },\n data,\n locals,\n headers,\n cookies: new WebCookieJar(currentRequest, headers),\n _handled: false as boolean,\n _redirectUrl: undefined as string | undefined,\n _rewriteUrl: undefined as string | undefined,\n\n redirect(redirectUrl: string, status = 307): void {\n ctx._redirectUrl = redirectUrl;\n ctx._handled = true;\n handledResponse = createHandledResponse(\n `Redirecting to ${redirectUrl}`,\n {\n status,\n headers: {\n Location: redirectUrl,\n \"Content-Type\": \"text/plain\",\n },\n },\n headers,\n );\n },\n\n rewrite(rewriteUrl: string): void {\n ctx._rewriteUrl = rewriteUrl;\n const nextUrl = new URL(rewriteUrl, currentRequest.url);\n currentRequest = withNodeRequestShape(new Request(nextUrl, currentRequest), trustProxy);\n ctx.request = currentRequest as any;\n ctx.url = nextUrl;\n ctx.pathname = nextUrl.pathname;\n ctx.searchParams = nextUrl.searchParams;\n ctx.route = nextUrl.pathname;\n },\n\n json(jsonData: any, status = 200): void {\n ctx._handled = true;\n handledResponse = createHandledResponse(\n JSON.stringify(jsonData),\n {\n status,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n },\n headers,\n );\n },\n\n text(content: string, status = 200): void {\n ctx._handled = true;\n handledResponse = createHandledResponse(\n content,\n {\n status,\n headers: {\n \"Content-Type\": \"text/plain\",\n },\n },\n headers,\n );\n },\n\n html(content: string, status = 200): void {\n ctx._handled = true;\n handledResponse = createHandledResponse(\n content,\n {\n status,\n headers: {\n \"Content-Type\": \"text/html\",\n },\n },\n headers,\n );\n },\n } satisfies MiddlewareContext;\n\n return {\n ctx,\n headers,\n getRequest: () => currentRequest,\n getResponse: () => handledResponse,\n };\n}\n\nfunction toMatcherList(matcher: MiddlewareConfig[\"matcher\"]): MiddlewareMatcher[] {\n if (!matcher) return [];\n return Array.isArray(matcher) ? matcher : [matcher];\n}\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\");\n}\n\nfunction parseColonParam(segment: string): { name: string; modifier?: string } {\n const raw = segment.slice(1);\n const last = raw[raw.length - 1];\n const modifier = last === \"*\" || last === \"+\" || last === \"?\" ? last : undefined;\n return {\n name: modifier ? raw.slice(0, -1) : raw,\n modifier,\n };\n}\n\nfunction compilePathPattern(pattern: string): { regex: RegExp; params: string[] } {\n const params: string[] = [];\n const segments = pattern.split(\"/\").filter(Boolean);\n\n if (segments.length === 0) {\n return { regex: /^\\/$/, params };\n }\n\n const parts = segments.map((segment) => {\n if (segment === \"**\") {\n return \"(?:/.*)?\";\n }\n\n if (segment === \"*\") {\n return \"/[^/]+\";\n }\n\n if (segment.startsWith(\":\")) {\n const { name, modifier } = parseColonParam(segment);\n params.push(name);\n\n if (modifier === \"*\") {\n return \"(?:/(.*))?\";\n }\n if (modifier === \"+\") {\n return \"/(.+)\";\n }\n return \"/([^/]+)\";\n }\n\n if (segment.startsWith(\"[...\") && segment.endsWith(\"]\")) {\n params.push(segment.slice(4, -1));\n return \"(?:/(.*))?\";\n }\n\n if (segment.startsWith(\"[\") && segment.endsWith(\"]\")) {\n params.push(segment.slice(1, -1));\n return \"/([^/]+)\";\n }\n\n return `/${escapeRegex(segment).replace(/\\\\\\*/g, \"[^/]*\")}`;\n });\n\n return {\n regex: new RegExp(`^${parts.join(\"\")}$`),\n params,\n };\n}\n\nfunction matchPattern(\n pattern: string | RegExp,\n pathname: string,\n): { matched: boolean; params?: Record<string, string> } {\n if (pattern instanceof RegExp) {\n pattern.lastIndex = 0;\n const match = pattern.exec(pathname);\n return {\n matched: !!match,\n params: match?.groups ? { ...match.groups } : undefined,\n };\n }\n\n if (pattern === \"*\" || pattern === \"/(.*)\") {\n return { matched: true };\n }\n\n if (pattern.endsWith(\"(.*)\")) {\n const prefix = pattern.slice(0, -4);\n return { matched: pathname === prefix || pathname.startsWith(`${prefix}/`) };\n }\n\n const { regex, params } = compilePathPattern(pattern);\n const match = regex.exec(pathname);\n if (!match) {\n return { matched: false };\n }\n\n const values: Record<string, string> = {};\n params.forEach((param, index) => {\n values[param] = decodeRouteSegment(match[index + 1] || \"\");\n });\n\n return {\n matched: true,\n params: Object.keys(values).length > 0 ? values : undefined,\n };\n}\n\nfunction matchesConfig(\n pathname: string,\n config: MiddlewareConfig,\n ctx: MiddlewareContext,\n): { matched: boolean; params?: Record<string, string> } {\n if (config.exclude) {\n for (const pattern of config.exclude) {\n if (matchPattern(pattern, pathname).matched) {\n return { matched: false };\n }\n }\n }\n\n if (config.matcher) {\n for (const matcher of toMatcherList(config.matcher)) {\n if (typeof matcher === \"string\" || matcher instanceof RegExp) {\n const result = matchPattern(matcher, pathname);\n if (result.matched) {\n return result;\n }\n } else if (typeof matcher === \"function\" && matcher(ctx)) {\n return { matched: true };\n }\n }\n return { matched: false };\n }\n\n return { matched: true };\n}\n\nfunction matchRoutePath(\n pathname: string,\n middlewarePath: string,\n): { matched: boolean; params?: Record<string, string> } {\n if (middlewarePath === \"/\") return { matched: true };\n\n const exactMatch = matchPattern(middlewarePath, pathname);\n if (exactMatch.matched) {\n return exactMatch;\n }\n\n const nestedMatch = matchPattern(`${middlewarePath}/:__farmRest*`, pathname);\n if (!nestedMatch.matched) {\n return { matched: false };\n }\n\n const params = { ...nestedMatch.params };\n delete params.__farmRest;\n return {\n matched: true,\n params: Object.keys(params).length > 0 ? params : undefined,\n };\n}\n\nfunction getConfigHandlers(\n entry: MiddlewareConfig & {\n handler?: MiddlewareFunction;\n handlers?: MiddlewareFunction[];\n },\n): MiddlewareFunction[] {\n const handlers: MiddlewareFunction[] = [];\n if (\"handler\" in entry && typeof entry.handler === \"function\") {\n handlers.push(entry.handler);\n }\n if (\"handlers\" in entry && Array.isArray(entry.handlers)) {\n handlers.push(...entry.handlers.filter((handler) => typeof handler === \"function\"));\n }\n return handlers;\n}\n\nfunction toMiddlewareConfig(\n entry: MiddlewareConfig & {\n handler?: MiddlewareFunction;\n handlers?: MiddlewareFunction[];\n },\n): MiddlewareConfig {\n const { matcher, exclude, runtime } = entry;\n return { matcher, exclude, runtime };\n}\n\nfunction normalizeConfigMiddleware(config?: FarmMiddlewareConfig | null): {\n entries: ProductionMiddlewareEntry[];\n globalConfig?: MiddlewareConfig;\n} {\n const entries: ProductionMiddlewareEntry[] = [];\n let globalConfig: MiddlewareConfig | undefined;\n\n if (!config) {\n return { entries, globalConfig };\n }\n\n const configEntries = Array.isArray(config) ? config : [config];\n for (const [index, entry] of configEntries.entries()) {\n const handlers = getConfigHandlers(entry);\n const middlewareConfig = toMiddlewareConfig(entry);\n\n if (handlers.length === 0) {\n globalConfig = middlewareConfig;\n continue;\n }\n\n entries.push({\n path: \"/\",\n filePath: `farm.config.ts#middleware-${index}`,\n handlers,\n config: middlewareConfig,\n source: \"config\",\n });\n }\n\n return { entries, globalConfig };\n}\n\nfunction normalizeFileMiddleware(\n modules: ProductionMiddlewareModuleEntry[] = [],\n): ProductionMiddlewareEntry[] {\n const entries: ProductionMiddlewareEntry[] = [];\n\n for (const moduleEntry of modules) {\n const normalized = normalizeMiddlewareModule(moduleEntry.module, moduleEntry.path);\n if (!normalized) {\n continue;\n }\n\n entries.push({\n path: moduleEntry.path,\n filePath: moduleEntry.filePath || moduleEntry.path,\n handlers: normalized.handlers,\n config: normalized.config,\n source: \"file\",\n });\n }\n\n return entries;\n}\n\nasync function executeHandlers(\n handlers: MiddlewareFunction[],\n ctx: MiddlewareContext,\n): Promise<Response | undefined> {\n let handlerIndex = 0;\n let returnedResponse: Response | undefined;\n const executeNext = async (): Promise<MiddlewareResult> => {\n if (handlerIndex < handlers.length) {\n const handler = handlers[handlerIndex++];\n const result = await handler(ctx, executeNext);\n if (isMiddlewareResponse(result)) {\n returnedResponse = result;\n return result;\n }\n }\n return returnedResponse;\n };\n\n const result = await executeNext();\n return isMiddlewareResponse(result) ? result : returnedResponse;\n}\n\nfunction emptyResult(request: Request): ProductionMiddlewareResult {\n return {\n request,\n response: null,\n data: new Map(),\n context: new Map(),\n headers: new Headers(),\n handled: false,\n };\n}\n\nexport function createProductionMiddlewareRunner(options: ProductionMiddlewareRunnerOptions = {}) {\n const configMiddleware = normalizeConfigMiddleware(options.config);\n const fileMiddleware = normalizeFileMiddleware(options.modules);\n const entries = [...configMiddleware.entries, ...fileMiddleware];\n const globalConfig = configMiddleware.globalConfig;\n\n return async function runProductionMiddleware(\n request: Request,\n ): Promise<ProductionMiddlewareResult> {\n if (!globalConfig && entries.length === 0) {\n return emptyResult(request);\n }\n\n let contextState = createWebMiddlewareContext(\n request,\n undefined,\n options.server?.trustProxy === true,\n );\n let ctx = contextState.ctx;\n let currentRequest = contextState.getRequest();\n const initialPathname = options.i18n?.enabled\n ? stripFarmLocaleFromPathname(ctx.pathname, options.i18n)\n : ctx.pathname;\n let parentData: MiddlewareContext[\"parent\"] | undefined;\n\n if (globalConfig) {\n const globalMatch = matchesConfig(initialPathname, globalConfig, ctx);\n if (!globalMatch.matched) {\n return emptyResult(request);\n }\n if (globalMatch.params) {\n ctx.params = { ...ctx.params, ...globalMatch.params };\n }\n }\n\n const applicable = entries\n .map((entry) => ({\n entry,\n routeMatch:\n entry.source === \"config\"\n ? { matched: true }\n : matchRoutePath(initialPathname, entry.path),\n }))\n .filter((candidate) => candidate.routeMatch.matched);\n\n if (applicable.length === 0) {\n return {\n request: currentRequest,\n response: null,\n data: new Map(ctx.data),\n context: new Map(ctx.locals),\n headers: mapToHeaders(contextState.headers),\n handled: false,\n };\n }\n\n for (const candidate of applicable) {\n const { entry, routeMatch } = candidate;\n const configMatch = entry.config\n ? matchesConfig(initialPathname, entry.config, ctx)\n : { matched: true };\n if (!configMatch.matched) {\n continue;\n }\n\n if (parentData) {\n contextState = createWebMiddlewareContext(\n currentRequest,\n parentData,\n options.server?.trustProxy === true,\n );\n ctx = contextState.ctx;\n }\n\n if (routeMatch.params) {\n ctx.params = { ...ctx.params, ...routeMatch.params };\n }\n if (configMatch.params) {\n ctx.params = { ...ctx.params, ...configMatch.params };\n }\n\n const middlewareStartTime = Date.now();\n const middlewareEvent = {\n route: entry.path,\n pathname: initialPathname,\n name: entry.filePath,\n };\n emitFarmEvent({ type: \"middleware.start\", ...middlewareEvent });\n\n try {\n const returnedResponse = await executeHandlers(entry.handlers, ctx);\n currentRequest = contextState.getRequest();\n\n if (returnedResponse) {\n const response = applyProductionMiddlewareHeaders(\n returnedResponse,\n mapToHeaders(contextState.headers),\n );\n emitFarmEvent({\n type: \"middleware.shortCircuit\",\n ...middlewareEvent,\n status: response.status,\n });\n return {\n request: currentRequest,\n response,\n data: new Map(ctx.data),\n context: new Map(ctx.locals),\n headers: mapToHeaders(contextState.headers),\n handled: true,\n };\n }\n\n if (ctx._handled) {\n const response = contextState.getResponse() || new Response(null);\n emitFarmEvent({\n type: \"middleware.shortCircuit\",\n ...middlewareEvent,\n status: response.status,\n });\n return {\n request: currentRequest,\n response,\n data: new Map(ctx.data),\n context: new Map(ctx.locals),\n headers: mapToHeaders(contextState.headers),\n handled: true,\n };\n }\n\n emitFarmEvent({\n type: \"middleware.complete\",\n ...middlewareEvent,\n durationMs: Date.now() - middlewareStartTime,\n });\n } catch (error) {\n emitFarmEvent({\n type: \"middleware.error\",\n ...middlewareEvent,\n error,\n });\n throw error;\n }\n\n parentData = {\n data: new Map(ctx.data),\n locals: new Map(ctx.locals),\n headers: headersToRecord(contextState.headers),\n [FARM_SET_COOKIE_HEADERS]: [...contextState.headers.getSetCookies()],\n } as InternalMiddlewareParent;\n }\n\n return {\n request: currentRequest,\n response: null,\n data: new Map(ctx.data),\n context: new Map(ctx.locals),\n headers: mapToHeaders(contextState.headers),\n handled: false,\n };\n };\n}\n\nexport function applyProductionMiddlewareHeaders(\n response: Response,\n middlewareHeaders?: Headers | null,\n): Response {\n if (!middlewareHeaders || Array.from(middlewareHeaders.keys()).length === 0) {\n return response;\n }\n\n const headers = new Headers(response.headers);\n const getSetCookie = (middlewareHeaders as Headers & { getSetCookie?: () => string[] })\n .getSetCookie;\n const setCookies = getSetCookie\n ? getSetCookie.call(middlewareHeaders)\n : middlewareHeaders.get(\"set-cookie\")\n ? [middlewareHeaders.get(\"set-cookie\")!]\n : [];\n for (const [key, value] of middlewareHeaders) {\n if (key.toLowerCase() === \"set-cookie\") continue;\n // A returned Response's headers are authoritative and preserved (matching\n // the dev runtime, where the Response is applied after ctx.headers). ctx\n // headers only add keys the Response did not already set.\n if (headers.has(key)) continue;\n headers.set(key, value);\n }\n for (const cookie of setCookies) {\n headers.append(\"Set-Cookie\", cookie);\n }\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n}\n"],"mappings":"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","names":["match","result"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MiddlewareManager
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-4X57GXQA.mjs";
|
|
4
4
|
import {
|
|
5
5
|
__name
|
|
6
6
|
} from "./chunk-CGILA3WO.mjs";
|
|
@@ -455,4 +455,4 @@ export {
|
|
|
455
455
|
hasMiddlewareData,
|
|
456
456
|
farmMiddlewarePlugin
|
|
457
457
|
};
|
|
458
|
-
//# sourceMappingURL=chunk-
|
|
458
|
+
//# sourceMappingURL=chunk-TGDIACZT.mjs.map
|
|
@@ -223,7 +223,7 @@ var _FarmI18nRuntime = class _FarmI18nRuntime {
|
|
|
223
223
|
return this.resolveMessage(locale, key);
|
|
224
224
|
}
|
|
225
225
|
hasMessage(locale, key) {
|
|
226
|
-
return
|
|
226
|
+
return this.readOwnMessage(locale, key) !== void 0;
|
|
227
227
|
}
|
|
228
228
|
getClientSnapshot(resolution) {
|
|
229
229
|
return {
|
|
@@ -251,8 +251,19 @@ var _FarmI18nRuntime = class _FarmI18nRuntime {
|
|
|
251
251
|
}
|
|
252
252
|
return formatter.format(values);
|
|
253
253
|
}
|
|
254
|
+
// Look up a message by own-property only. A key named after an
|
|
255
|
+
// Object.prototype member (toString, valueOf, constructor, ...) must resolve
|
|
256
|
+
// to a real catalog entry or undefined, never the inherited prototype value
|
|
257
|
+
// (mirrors the own-property handling added to catalog.ts in #454).
|
|
258
|
+
readOwnMessage(locale, key) {
|
|
259
|
+
const direct = this.catalogs[locale];
|
|
260
|
+
if (direct && Object.prototype.hasOwnProperty.call(direct, key)) return direct[key];
|
|
261
|
+
const fallback = this.catalogs[this.config.fallbackLocale];
|
|
262
|
+
if (fallback && Object.prototype.hasOwnProperty.call(fallback, key)) return fallback[key];
|
|
263
|
+
return void 0;
|
|
264
|
+
}
|
|
254
265
|
resolveMessage(locale, key) {
|
|
255
|
-
const message = this.
|
|
266
|
+
const message = this.readOwnMessage(locale, key);
|
|
256
267
|
if (message !== void 0) return message;
|
|
257
268
|
if (this.config.strict) {
|
|
258
269
|
throw new Error(`Missing Farm i18n message "${key}" for locale "${locale}".`);
|
|
@@ -426,4 +437,4 @@ export {
|
|
|
426
437
|
getFarmI18nClientSnapshot,
|
|
427
438
|
format
|
|
428
439
|
};
|
|
429
|
-
//# sourceMappingURL=chunk-
|
|
440
|
+
//# sourceMappingURL=chunk-TQTB33JS.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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 this.readOwnMessage(locale, key) !== undefined;\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 basePath: this.config.basePath,\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 // Look up a message by own-property only. A key named after an\n // Object.prototype member (toString, valueOf, constructor, ...) must resolve\n // to a real catalog entry or undefined, never the inherited prototype value\n // (mirrors the own-property handling added to catalog.ts in #454).\n private readOwnMessage(locale: string, key: string): string | undefined {\n const direct = this.catalogs[locale];\n if (direct && Object.prototype.hasOwnProperty.call(direct, key)) return direct[key];\n const fallback = this.catalogs[this.config.fallbackLocale];\n if (fallback && Object.prototype.hasOwnProperty.call(fallback, key)) return fallback[key];\n return undefined;\n }\n\n private resolveMessage(locale: string, key: string): string {\n const message = this.readOwnMessage(locale, 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 // Own-property check: `in` would see Object.prototype members, falsely\n // rejecting legitimate keys like \"toString\" as duplicates.\n if (Object.prototype.hasOwnProperty.call(output, key)) {\n throw new Error(`${source} contains duplicate message key \"${key}\".`);\n }\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(\n (key) => !Object.prototype.hasOwnProperty.call(catalog, key),\n );\n const extra = localeKeys.filter(\n (key) => !Object.prototype.hasOwnProperty.call(signatures, key),\n );\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":[]}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-NXV52RNX.mjs";
|
|
4
4
|
import {
|
|
5
5
|
_runWithFarmI18nRequest
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-TQTB33JS.mjs";
|
|
7
7
|
import {
|
|
8
8
|
PROGRAMMATIC_ROUTE_FILE_NAMES,
|
|
9
9
|
createProgrammaticRouteModuleId,
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
matchAPIRouteAtBasePath,
|
|
23
23
|
mergePluginAPIRoutes,
|
|
24
24
|
resolveAPIRouteEndpoint
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-3TWQERDE.mjs";
|
|
26
26
|
import {
|
|
27
27
|
registerAPIRouteShape
|
|
28
28
|
} from "./chunk-4OAR7CTF.mjs";
|
|
@@ -461,4 +461,4 @@ export {
|
|
|
461
461
|
API_ROUTE_METHODS,
|
|
462
462
|
APIRouteManager
|
|
463
463
|
};
|
|
464
|
-
//# sourceMappingURL=chunk-
|
|
464
|
+
//# sourceMappingURL=chunk-TT3E2JOF.mjs.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-FXG2PS27.mjs";
|
|
4
4
|
import {
|
|
5
5
|
FARM_VERSION
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-J3MPQ4MQ.mjs";
|
|
7
7
|
import {
|
|
8
8
|
__name
|
|
9
9
|
} from "./chunk-CGILA3WO.mjs";
|
|
@@ -1495,4 +1495,4 @@ export {
|
|
|
1495
1495
|
FarmClientPluginManager,
|
|
1496
1496
|
createClientPluginManager
|
|
1497
1497
|
};
|
|
1498
|
-
//# sourceMappingURL=chunk-
|
|
1498
|
+
//# sourceMappingURL=chunk-UMUWR5XA.mjs.map
|
|
@@ -1,17 +1,32 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getFarmClientDataCache,
|
|
3
3
|
trackFarmClientCacheInvalidations
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-WMJGA32P.mjs";
|
|
5
5
|
import {
|
|
6
6
|
isFarmServerQueryResult
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-EHTUKVSW.mjs";
|
|
8
8
|
import {
|
|
9
9
|
createFarmCacheKey
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-2HDOV47R.mjs";
|
|
11
11
|
import {
|
|
12
12
|
__name
|
|
13
13
|
} from "./chunk-CGILA3WO.mjs";
|
|
14
14
|
|
|
15
|
+
// src/client-revalidation.ts
|
|
16
|
+
function attachRevalidationListeners(refresh, options = {}) {
|
|
17
|
+
if (typeof window === "undefined") return () => {
|
|
18
|
+
};
|
|
19
|
+
const onFocus = options.refetchOnWindowFocus === false ? void 0 : refresh;
|
|
20
|
+
const onOnline = options.refetchOnReconnect === false ? void 0 : refresh;
|
|
21
|
+
if (onFocus) window.addEventListener("focus", onFocus);
|
|
22
|
+
if (onOnline) window.addEventListener("online", onOnline);
|
|
23
|
+
return () => {
|
|
24
|
+
if (onFocus) window.removeEventListener("focus", onFocus);
|
|
25
|
+
if (onOnline) window.removeEventListener("online", onOnline);
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
__name(attachRevalidationListeners, "attachRevalidationListeners");
|
|
29
|
+
|
|
15
30
|
// src/server-query-runtime.ts
|
|
16
31
|
var FARM_SERVER_QUERY_CLIENT_STATE = /* @__PURE__ */ Symbol.for("farm.serverQueryClientState");
|
|
17
32
|
var serverQueryClientGlobal = globalThis;
|
|
@@ -19,9 +34,30 @@ var serverQueryClientState = serverQueryClientGlobal[FARM_SERVER_QUERY_CLIENT_ST
|
|
|
19
34
|
functionIds: /* @__PURE__ */ new WeakMap(),
|
|
20
35
|
nextFunctionId: 0,
|
|
21
36
|
active: [],
|
|
22
|
-
latestOwners: /* @__PURE__ */ new Map()
|
|
37
|
+
latestOwners: /* @__PURE__ */ new Map(),
|
|
38
|
+
owners: /* @__PURE__ */ new Set()
|
|
23
39
|
});
|
|
24
40
|
serverQueryClientState.latestOwners ?? (serverQueryClientState.latestOwners = /* @__PURE__ */ new Map());
|
|
41
|
+
serverQueryClientState.owners ?? (serverQueryClientState.owners = /* @__PURE__ */ new Set());
|
|
42
|
+
function isServerQueryOwnerSuperseded(owner, key) {
|
|
43
|
+
const cache = getFarmClientDataCache();
|
|
44
|
+
const resolved = cache.resolveKey(key);
|
|
45
|
+
for (const superseded of owner.supersededKeys ?? []) {
|
|
46
|
+
if (cache.resolveKey(superseded) === resolved) return true;
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
__name(isServerQueryOwnerSuperseded, "isServerQueryOwnerSuperseded");
|
|
51
|
+
function claimServerQueryKey(owner, key) {
|
|
52
|
+
if (isServerQueryOwnerSuperseded(owner, key)) return false;
|
|
53
|
+
const resolved = getFarmClientDataCache().resolveKey(key);
|
|
54
|
+
for (const older of serverQueryClientState.owners) {
|
|
55
|
+
if (older === owner) break;
|
|
56
|
+
older.supersededKeys.add(resolved);
|
|
57
|
+
}
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
__name(claimServerQueryKey, "claimServerQueryKey");
|
|
25
61
|
var RAW_SERVER_QUERY_SYMBOL = /* @__PURE__ */ Symbol.for("farm.server-query");
|
|
26
62
|
function assertNotRawServerQueryInBrowser(query) {
|
|
27
63
|
if (typeof window === "undefined" || typeof document === "undefined") return;
|
|
@@ -55,6 +91,10 @@ function completeFarmServerQueryAction(invocation, value) {
|
|
|
55
91
|
if (invocation.provisionalKey) {
|
|
56
92
|
cache.alias(invocation.provisionalKey, metadata.key);
|
|
57
93
|
}
|
|
94
|
+
const owner = invocation.owner;
|
|
95
|
+
if (owner && serverQueryClientState.owners.has(owner) && !claimServerQueryKey(owner, metadata.key)) {
|
|
96
|
+
return value.data;
|
|
97
|
+
}
|
|
58
98
|
const invalidated = invocation.owner?.invalidations?.has(
|
|
59
99
|
metadata.key
|
|
60
100
|
);
|
|
@@ -64,16 +104,21 @@ function completeFarmServerQueryAction(invocation, value) {
|
|
|
64
104
|
staleAt: invalidated ? 0 : metadata.staleTime === false ? Number.POSITIVE_INFINITY : metadata.updatedAt + metadata.staleTime,
|
|
65
105
|
status: "success",
|
|
66
106
|
error: null,
|
|
67
|
-
fetching: false
|
|
107
|
+
fetching: false,
|
|
108
|
+
persist: metadata.persist === true ? true : void 0
|
|
68
109
|
});
|
|
69
110
|
return value.data;
|
|
70
111
|
}
|
|
71
112
|
__name(completeFarmServerQueryAction, "completeFarmServerQueryAction");
|
|
72
113
|
function shouldApplyFarmServerQueryActionResult(invocation) {
|
|
73
114
|
if (!invocation.provisionalKey || !invocation.owner) return true;
|
|
74
|
-
return
|
|
115
|
+
return isCurrentServerQueryOwner(invocation.provisionalKey, invocation.owner);
|
|
75
116
|
}
|
|
76
117
|
__name(shouldApplyFarmServerQueryActionResult, "shouldApplyFarmServerQueryActionResult");
|
|
118
|
+
function isCurrentServerQueryOwner(provisionalKey, owner) {
|
|
119
|
+
return serverQueryClientState.latestOwners.get(provisionalKey) === owner && !isServerQueryOwnerSuperseded(owner, provisionalKey);
|
|
120
|
+
}
|
|
121
|
+
__name(isCurrentServerQueryOwner, "isCurrentServerQueryOwner");
|
|
77
122
|
function createServerQueryCallKey(query, input) {
|
|
78
123
|
let id = serverQueryClientState.functionIds.get(query);
|
|
79
124
|
if (!id) {
|
|
@@ -89,12 +134,14 @@ async function fetchServerQuery(query, input, options = {}) {
|
|
|
89
134
|
const entry = cache.get(provisionalKey);
|
|
90
135
|
const stale = cache.isStale(provisionalKey);
|
|
91
136
|
const inflight = cache.getInflight(provisionalKey);
|
|
92
|
-
if (
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
137
|
+
if (!options.force && entry && stale && (entry.status !== "pending" || entry.updatedAt !== 0) && entry.status !== "error" && (options.swr ?? true)) {
|
|
138
|
+
if (!inflight) {
|
|
139
|
+
void executeServerQuery(query, input, provisionalKey, options).catch(() => void 0);
|
|
140
|
+
}
|
|
96
141
|
return entry.data;
|
|
97
142
|
}
|
|
143
|
+
if (inflight && !options.force) return inflight;
|
|
144
|
+
if (!options.force && entry && !stale && entry.status !== "error") return entry.data;
|
|
98
145
|
return executeServerQuery(query, input, provisionalKey, options);
|
|
99
146
|
}
|
|
100
147
|
__name(fetchServerQuery, "fetchServerQuery");
|
|
@@ -107,8 +154,13 @@ async function executeServerQuery(query, input, provisionalKey, options) {
|
|
|
107
154
|
const cache = getFarmClientDataCache();
|
|
108
155
|
const inflight = cache.getInflight(provisionalKey);
|
|
109
156
|
if (inflight && !options.force) return inflight;
|
|
110
|
-
const owner = {
|
|
157
|
+
const owner = {
|
|
158
|
+
invalidations: trackFarmClientCacheInvalidations(cache),
|
|
159
|
+
supersededKeys: /* @__PURE__ */ new Set()
|
|
160
|
+
};
|
|
111
161
|
serverQueryClientState.latestOwners.set(provisionalKey, owner);
|
|
162
|
+
serverQueryClientState.owners.add(owner);
|
|
163
|
+
claimServerQueryKey(owner, provisionalKey);
|
|
112
164
|
const previous = cache.get(provisionalKey);
|
|
113
165
|
cache.set(provisionalKey, {
|
|
114
166
|
data: previous?.data,
|
|
@@ -133,7 +185,7 @@ async function executeServerQuery(query, input, provisionalKey, options) {
|
|
|
133
185
|
}
|
|
134
186
|
const data = await pending;
|
|
135
187
|
const transported = cache.get(provisionalKey);
|
|
136
|
-
if (
|
|
188
|
+
if (isCurrentServerQueryOwner(provisionalKey, owner) && (!transported || transported.fetching)) {
|
|
137
189
|
const updatedAt = Date.now();
|
|
138
190
|
cache.set(provisionalKey, {
|
|
139
191
|
data,
|
|
@@ -147,7 +199,7 @@ async function executeServerQuery(query, input, provisionalKey, options) {
|
|
|
147
199
|
return data;
|
|
148
200
|
} catch (cause) {
|
|
149
201
|
const error = normalizeServerQueryError(cause);
|
|
150
|
-
if (
|
|
202
|
+
if (isCurrentServerQueryOwner(provisionalKey, owner)) {
|
|
151
203
|
const current = cache.get(provisionalKey);
|
|
152
204
|
cache.set(provisionalKey, {
|
|
153
205
|
data: current?.data,
|
|
@@ -162,8 +214,10 @@ async function executeServerQuery(query, input, provisionalKey, options) {
|
|
|
162
214
|
}
|
|
163
215
|
throw error;
|
|
164
216
|
} finally {
|
|
165
|
-
const invalidated =
|
|
217
|
+
const invalidated = isCurrentServerQueryOwner(provisionalKey, owner) && owner.invalidations.has(provisionalKey);
|
|
166
218
|
owner.invalidations.dispose();
|
|
219
|
+
serverQueryClientState.owners.delete(owner);
|
|
220
|
+
owner.supersededKeys.clear();
|
|
167
221
|
if (cache.getInflight(provisionalKey) === promise) {
|
|
168
222
|
cache.deleteInflight(provisionalKey);
|
|
169
223
|
}
|
|
@@ -186,6 +240,7 @@ function normalizeServerQueryError(cause) {
|
|
|
186
240
|
__name(normalizeServerQueryError, "normalizeServerQueryError");
|
|
187
241
|
|
|
188
242
|
export {
|
|
243
|
+
attachRevalidationListeners,
|
|
189
244
|
beginFarmServerQueryAction,
|
|
190
245
|
completeFarmServerQueryAction,
|
|
191
246
|
shouldApplyFarmServerQueryActionResult,
|
|
@@ -193,4 +248,4 @@ export {
|
|
|
193
248
|
fetchServerQuery,
|
|
194
249
|
prefetchServerQuery
|
|
195
250
|
};
|
|
196
|
-
//# sourceMappingURL=chunk-
|
|
251
|
+
//# sourceMappingURL=chunk-WD2EBM3I.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client-revalidation.ts","../src/server-query-runtime.ts"],"sourcesContent":["export type FarmRevalidationListenerOptions = {\n refetchOnWindowFocus?: boolean;\n refetchOnReconnect?: boolean;\n};\n\n/**\n * Attach the shared window focus/reconnect revalidation listeners used by every\n * query consumer (React `useServerQuery` and the renderer-neutral\n * `createRendererQuery`). Connectivity-driven refresh behavior must live here\n * so all renderers observe the same triggers.\n *\n * Returns a disposer; a no-op outside the browser.\n */\nexport function attachRevalidationListeners(\n refresh: () => void,\n options: FarmRevalidationListenerOptions = {},\n): () => void {\n if (typeof window === \"undefined\") return () => {};\n\n const onFocus = options.refetchOnWindowFocus === false ? undefined : refresh;\n const onOnline = options.refetchOnReconnect === false ? undefined : refresh;\n\n if (onFocus) window.addEventListener(\"focus\", onFocus);\n if (onOnline) window.addEventListener(\"online\", onOnline);\n return () => {\n if (onFocus) window.removeEventListener(\"focus\", onFocus);\n if (onOnline) window.removeEventListener(\"online\", onOnline);\n };\n}\n","\"use client\";\n\nimport { createFarmCacheKey } from \"./cache\";\nimport { getFarmClientDataCache, trackFarmClientCacheInvalidations } from \"./client-cache\";\nimport type { ServerQuery } from \"./server-query\";\nimport { isFarmServerQueryResult, type FarmServerQueryResult } from \"./server-query-protocol\";\n\nexport type ServerQueryFetchOptions = {\n /** Used only when a non-Farm transport returns plain data. Farm transports use the declaration. */\n staleTime?: number | false;\n /** Return stale data immediately while refreshing it in the background. Default true. */\n swr?: boolean;\n /** Always wait for a new result. */\n force?: boolean;\n};\n\nexport type FarmServerQueryActionInvocation = {\n actionId: string;\n args: readonly unknown[];\n provisionalKey?: string;\n owner?: object;\n};\n\ntype ActiveServerQueryInvocation = {\n provisionalKey: string;\n owner: object;\n};\n\ntype ServerQueryOwner = {\n invalidations: ReturnType<typeof trackFarmClientCacheInvalidations>;\n supersededKeys: Set<string>;\n};\n\ntype ServerQueryClientState = {\n functionIds: WeakMap<Function, number>;\n nextFunctionId: number;\n active: ActiveServerQueryInvocation[];\n latestOwners: Map<string, object>;\n owners: Set<ServerQueryOwner>;\n};\n\nconst FARM_SERVER_QUERY_CLIENT_STATE = Symbol.for(\"farm.serverQueryClientState\");\nconst serverQueryClientGlobal = globalThis as typeof globalThis & {\n [FARM_SERVER_QUERY_CLIENT_STATE]?: ServerQueryClientState;\n};\nconst serverQueryClientState: ServerQueryClientState = (serverQueryClientGlobal[\n FARM_SERVER_QUERY_CLIENT_STATE\n] ??= {\n functionIds: new WeakMap(),\n nextFunctionId: 0,\n active: [],\n latestOwners: new Map(),\n owners: new Set(),\n});\nserverQueryClientState.latestOwners ??= new Map();\nserverQueryClientState.owners ??= new Set();\n\nfunction isServerQueryOwnerSuperseded(owner: ServerQueryOwner, key: string): boolean {\n const cache = getFarmClientDataCache();\n const resolved = cache.resolveKey(key);\n for (const superseded of owner.supersededKeys ?? []) {\n if (cache.resolveKey(superseded) === resolved) return true;\n }\n return false;\n}\n\nfunction claimServerQueryKey(owner: ServerQueryOwner, key: string): boolean {\n if (isServerQueryOwnerSuperseded(owner, key)) return false;\n const resolved = getFarmClientDataCache().resolveKey(key);\n // Set iteration follows request start order, not response timestamps. Record\n // the claim on older live requests so it survives this owner's completion,\n // even when an older reference only learns its canonical key afterward.\n for (const older of serverQueryClientState.owners) {\n if (older === owner) break;\n older.supersededKeys.add(resolved);\n }\n return true;\n}\n\n// Global symbol registry key set on raw server query implementations by\n// createServerQuery. Referenced via Symbol.for instead of importing\n// server-query.ts, which would pull the server handler pipeline into the\n// client bundle.\nconst RAW_SERVER_QUERY_SYMBOL = Symbol.for(\"farm.server-query\");\n\n/**\n * A query reaching the browser should be a transformed server reference. The\n * raw implementation carries the server query symbol; executing it here would\n * run the server handler in the browser (#408). During SSR the raw\n * implementation is expected and runs directly.\n */\nfunction assertNotRawServerQueryInBrowser(query: unknown): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n if (!(query as Record<symbol, unknown> | null)?.[RAW_SERVER_QUERY_SYMBOL]) return;\n throw new Error(\n [\n \"useServerQuery received a raw server query implementation in the browser.\",\n \"Server query handlers run only on the server. Enable the server-function transform (add @farm.js/plugin/rsc and set experimental.serverActions: true in farm.config.ts) so client imports become server references,\",\n \"or call the query from server code / an API route (createAPIClient) instead.\",\n ].join(\"\\n\"),\n );\n}\n\nexport function beginFarmServerQueryAction(\n actionId: string,\n args: readonly unknown[],\n): FarmServerQueryActionInvocation {\n const active = serverQueryClientState.active.at(-1);\n return {\n actionId,\n args,\n provisionalKey: active?.provisionalKey,\n owner: active?.owner,\n };\n}\n\nexport function completeFarmServerQueryAction<TData>(\n invocation: FarmServerQueryActionInvocation,\n value: TData | FarmServerQueryResult<TData>,\n): TData {\n if (!isFarmServerQueryResult(value)) return value as TData;\n\n const cache = getFarmClientDataCache();\n const metadata = value.__farmServerQuery;\n if (!shouldApplyFarmServerQueryActionResult(invocation)) {\n return value.data as TData;\n }\n if (invocation.provisionalKey) {\n cache.alias(invocation.provisionalKey, metadata.key);\n }\n const owner = invocation.owner as ServerQueryOwner | undefined;\n if (\n owner &&\n serverQueryClientState.owners.has(owner) &&\n !claimServerQueryKey(owner, metadata.key)\n ) {\n return value.data as TData;\n }\n const invalidated = (invocation.owner as ServerQueryOwner | undefined)?.invalidations?.has(\n metadata.key,\n );\n\n cache.set(metadata.key, {\n data: value.data,\n updatedAt: metadata.updatedAt,\n staleAt: invalidated\n ? 0\n : metadata.staleTime === false\n ? Number.POSITIVE_INFINITY\n : metadata.updatedAt + metadata.staleTime,\n status: \"success\",\n error: null,\n fetching: false,\n persist: metadata.persist === true ? true : undefined,\n });\n\n return value.data as TData;\n}\n\nexport function shouldApplyFarmServerQueryActionResult(\n invocation: FarmServerQueryActionInvocation,\n): boolean {\n if (!invocation.provisionalKey || !invocation.owner) return true;\n return isCurrentServerQueryOwner(invocation.provisionalKey, invocation.owner);\n}\n\nfunction isCurrentServerQueryOwner(provisionalKey: string, owner: object): boolean {\n return (\n serverQueryClientState.latestOwners.get(provisionalKey) === owner &&\n !isServerQueryOwnerSuperseded(owner as ServerQueryOwner, provisionalKey)\n );\n}\n\nexport function createServerQueryCallKey<TInput, TData>(\n query: ServerQuery<TInput, TData>,\n input: TInput,\n): string {\n let id = serverQueryClientState.functionIds.get(query);\n if (!id) {\n id = ++serverQueryClientState.nextFunctionId;\n serverQueryClientState.functionIds.set(query, id);\n }\n return createFarmCacheKey([\"server-query-call\", id, input]);\n}\n\nexport async function fetchServerQuery<TInput, TData>(\n query: ServerQuery<TInput, TData>,\n input: TInput,\n options: ServerQueryFetchOptions = {},\n): Promise<TData> {\n const cache = getFarmClientDataCache();\n const provisionalKey = createServerQueryCallKey(query, input);\n const entry = cache.get<TData>(provisionalKey);\n const stale = cache.isStale(provisionalKey);\n const inflight = cache.getInflight<TData>(provisionalKey);\n\n if (\n !options.force &&\n entry &&\n stale &&\n (entry.status !== \"pending\" || entry.updatedAt !== 0) &&\n entry.status !== \"error\" &&\n (options.swr ?? true)\n ) {\n // Every SWR reader can use the previous value, including while another\n // reader owns the refresh. Initial pending reads still wait below.\n if (!inflight) {\n void executeServerQuery(query, input, provisionalKey, options).catch(() => undefined);\n }\n return entry.data;\n }\n\n if (inflight && !options.force) return inflight;\n if (!options.force && entry && !stale && entry.status !== \"error\") return entry.data;\n\n return executeServerQuery(query, input, provisionalKey, options);\n}\n\nexport function prefetchServerQuery<TInput, TData>(\n query: ServerQuery<TInput, TData>,\n input: TInput,\n options: Omit<ServerQueryFetchOptions, \"force\"> = {},\n): Promise<TData> {\n return fetchServerQuery(query, input, options);\n}\n\nasync function executeServerQuery<TInput, TData>(\n query: ServerQuery<TInput, TData>,\n input: TInput,\n provisionalKey: string,\n options: ServerQueryFetchOptions,\n): Promise<TData> {\n assertNotRawServerQueryInBrowser(query);\n const cache = getFarmClientDataCache();\n const inflight = cache.getInflight<TData>(provisionalKey);\n if (inflight && !options.force) return inflight;\n\n const owner: ServerQueryOwner = {\n invalidations: trackFarmClientCacheInvalidations(cache),\n supersededKeys: new Set(),\n };\n serverQueryClientState.latestOwners.set(provisionalKey, owner);\n serverQueryClientState.owners.add(owner);\n claimServerQueryKey(owner, provisionalKey);\n\n const previous = cache.get<TData>(provisionalKey);\n cache.set(provisionalKey, {\n data: previous?.data as TData,\n updatedAt: previous?.updatedAt ?? 0,\n staleAt: previous?.staleAt ?? 0,\n gcAt: previous?.gcAt,\n invalidatedAt: previous?.invalidatedAt,\n status: \"pending\",\n error: null,\n fetching: true,\n });\n\n let promise!: Promise<TData>;\n promise = (async () => {\n // Let the promise be assigned and registered before a query implementation\n // can throw synchronously and enter the cleanup path.\n await Promise.resolve();\n try {\n serverQueryClientState.active.push({ provisionalKey, owner });\n let pending: Promise<TData>;\n try {\n pending = query(input);\n } finally {\n serverQueryClientState.active.pop();\n }\n\n const data = await pending;\n const transported = cache.get<TData>(provisionalKey);\n if (\n isCurrentServerQueryOwner(provisionalKey, owner) &&\n (!transported || transported.fetching)\n ) {\n const updatedAt = Date.now();\n cache.set(provisionalKey, {\n data,\n updatedAt,\n staleAt: owner.invalidations.has(provisionalKey)\n ? 0\n : options.staleTime === false\n ? Number.POSITIVE_INFINITY\n : updatedAt + (options.staleTime ?? 0),\n status: \"success\",\n error: null,\n fetching: false,\n });\n }\n return data;\n } catch (cause) {\n const error = normalizeServerQueryError(cause);\n if (isCurrentServerQueryOwner(provisionalKey, owner)) {\n const current = cache.get<TData>(provisionalKey);\n cache.set(provisionalKey, {\n data: current?.data as TData,\n updatedAt: current?.updatedAt ?? 0,\n staleAt: current?.staleAt ?? 0,\n gcAt: current?.gcAt,\n invalidatedAt: current?.invalidatedAt,\n status: \"error\",\n error,\n fetching: false,\n });\n }\n throw error;\n } finally {\n const invalidated =\n isCurrentServerQueryOwner(provisionalKey, owner) && owner.invalidations.has(provisionalKey);\n owner.invalidations.dispose();\n serverQueryClientState.owners.delete(owner);\n owner.supersededKeys.clear();\n if (cache.getInflight(provisionalKey) === promise) {\n cache.deleteInflight(provisionalKey);\n }\n if (serverQueryClientState.latestOwners.get(provisionalKey) === owner) {\n serverQueryClientState.latestOwners.delete(provisionalKey);\n }\n // Notify only after retiring old work: mounted consumers must start a new\n // read, not rejoin the promise whose result has just been invalidated.\n if (invalidated) cache.invalidate(provisionalKey);\n }\n })();\n\n cache.setInflight(provisionalKey, promise);\n return promise;\n}\n\nfunction normalizeServerQueryError(cause: unknown): Error {\n if (cause instanceof Error) return cause;\n const error = new Error(typeof cause === \"string\" ? cause : \"Server query failed\");\n (error as Error & { cause?: unknown }).cause = cause;\n return error;\n}\n"],"mappings":"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","names":[]}
|