@farm.js/core 0.1.0-beta.97 → 0.1.0-beta.99
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.map +1 -0
- package/dist/agent-runtime.cjs +7 -3
- package/dist/agent-runtime.cjs.map +1 -0
- package/dist/agent-runtime.d.mts +2 -2
- package/dist/agent-runtime.d.ts +2 -2
- package/dist/agent-runtime.mjs +2 -1
- package/dist/agent-runtime.mjs.map +1 -1
- package/dist/api/route-manager.cjs.map +1 -0
- package/dist/api/route-manager.d.mts +2 -2
- package/dist/api/route-manager.d.ts +2 -2
- package/dist/api/runtime.cjs.map +1 -0
- package/dist/api.cjs +26 -1
- package/dist/api.cjs.map +1 -0
- package/dist/api.d.mts +3 -3
- package/dist/api.d.ts +3 -3
- package/dist/api.mjs +2 -2
- package/dist/{app-CIOx3LvY.d.ts → app-CGjrKNoN.d.ts} +4 -4
- package/dist/{app-DBd6437H.d.mts → app-DOcLs_iq.d.mts} +4 -4
- package/dist/app-markdown.cjs +21 -0
- package/dist/app-markdown.cjs.map +1 -0
- package/dist/app-markdown.d.mts +19 -4
- package/dist/app-markdown.d.ts +19 -4
- package/dist/app-markdown.mjs +7 -1
- package/dist/cache.cjs.map +1 -0
- package/dist/{chunk-VMCHLH3Y.mjs → chunk-26BCDVJS.mjs} +19 -1
- package/dist/chunk-26BCDVJS.mjs.map +1 -0
- package/dist/{chunk-FP5Q67FO.mjs → chunk-2HYYZCCI.mjs} +308 -19
- package/dist/chunk-2HYYZCCI.mjs.map +1 -0
- package/dist/{chunk-WKDAA6V2.mjs → chunk-3BTAMIQE.mjs} +100 -41
- package/dist/chunk-3BTAMIQE.mjs.map +1 -0
- package/dist/{chunk-WD2EBM3I.mjs → chunk-3CQJV3NC.mjs} +2 -2
- package/dist/{chunk-I3OOUWO5.mjs → chunk-3GDRV7SG.mjs} +2 -2
- package/dist/{chunk-YIBV77KZ.mjs → chunk-4WLAVHCY.mjs} +2 -2
- package/dist/{chunk-KDP5ZSWP.mjs → chunk-7PS5NKOM.mjs} +26 -11
- package/dist/chunk-7PS5NKOM.mjs.map +1 -0
- package/dist/{chunk-X4SFHKFH.mjs → chunk-BU65A3LZ.mjs} +10 -6
- package/dist/chunk-BU65A3LZ.mjs.map +1 -0
- package/dist/{chunk-WMJGA32P.mjs → chunk-BXVOHG6B.mjs} +27 -2
- package/dist/{chunk-WMJGA32P.mjs.map → chunk-BXVOHG6B.mjs.map} +1 -1
- package/dist/{chunk-BZAIS65C.mjs → chunk-DIHNOVZZ.mjs} +40 -13
- package/dist/chunk-DIHNOVZZ.mjs.map +1 -0
- package/dist/{chunk-ISSFLGJ5.mjs → chunk-FDWECN3W.mjs} +8 -4
- package/dist/chunk-FDWECN3W.mjs.map +1 -0
- package/dist/chunk-FDWXXTWR.mjs +114 -0
- package/dist/chunk-FDWXXTWR.mjs.map +1 -0
- package/dist/{chunk-FSIXEIOB.mjs → chunk-L7FSTPGS.mjs} +2 -2
- package/dist/{chunk-J3MPQ4MQ.mjs → chunk-LG4XB6RN.mjs} +2 -2
- package/dist/{chunk-J3MPQ4MQ.mjs.map → chunk-LG4XB6RN.mjs.map} +1 -1
- package/dist/{chunk-AAC66ILR.mjs → chunk-LXXG3K2Y.mjs} +61 -2
- package/dist/chunk-LXXG3K2Y.mjs.map +1 -0
- package/dist/{chunk-GJ7W6LNK.mjs → chunk-N5RK4LK6.mjs} +3 -3
- package/dist/{chunk-D7F7YZ7L.mjs → chunk-NCVFPT67.mjs} +100 -40
- package/dist/{chunk-D7F7YZ7L.mjs.map → chunk-NCVFPT67.mjs.map} +1 -1
- package/dist/{chunk-UMUWR5XA.mjs → chunk-PURU7FXR.mjs} +2 -2
- package/dist/{chunk-2SKCXYLB.mjs → chunk-QQCCBMTH.mjs} +60 -6
- package/dist/chunk-QQCCBMTH.mjs.map +1 -0
- package/dist/chunk-RKUPOYQV.mjs +28 -0
- package/dist/chunk-RKUPOYQV.mjs.map +1 -0
- package/dist/{chunk-52BR7LTX.mjs → chunk-STSPSJUI.mjs} +3 -3
- package/dist/{chunk-EPDIF432.mjs → chunk-UOGX6UNO.mjs} +37 -17
- package/dist/chunk-UOGX6UNO.mjs.map +1 -0
- package/dist/{chunk-IZBX2TEU.mjs → chunk-VQG3QWWK.mjs} +2 -2
- package/dist/{chunk-35NPLKQJ.mjs → chunk-XWM2C267.mjs} +21 -105
- package/dist/chunk-XWM2C267.mjs.map +1 -0
- package/dist/{chunk-7ZVN3YZI.mjs → chunk-Z5ARESQG.mjs} +43 -1
- package/dist/chunk-Z5ARESQG.mjs.map +1 -0
- package/dist/client/lifecycle.cjs.map +1 -0
- package/dist/client/lifecycle.mjs +2 -2
- package/dist/{client-plugins-B6-07YmP.d.mts → client-plugins-BqtHoJ9C.d.mts} +91 -3
- package/dist/{client-plugins-By6MVUX-.d.ts → client-plugins-DYprkCKN.d.ts} +91 -3
- package/dist/client-plugins.cjs +1 -1
- package/dist/client-plugins.cjs.map +1 -0
- package/dist/client-plugins.d.mts +2 -2
- package/dist/client-plugins.d.ts +2 -2
- package/dist/client-plugins.mjs +2 -2
- package/dist/client.cjs +61 -16
- package/dist/client.cjs.map +1 -0
- package/dist/client.d.mts +5 -5
- package/dist/client.d.ts +5 -5
- package/dist/client.mjs +7 -7
- package/dist/config.cjs.map +1 -0
- package/dist/config.d.mts +2 -2
- package/dist/config.d.ts +2 -2
- package/dist/cron.cjs +48 -12
- package/dist/cron.cjs.map +1 -0
- package/dist/cron.mjs +2 -1
- package/dist/deferred.cjs.map +1 -0
- package/dist/deployment.cjs.map +1 -0
- package/dist/{devtools-XWZX6CCL.mjs → devtools-24N3U5IG.mjs} +9 -7
- package/dist/{devtools-XWZX6CCL.mjs.map → devtools-24N3U5IG.mjs.map} +1 -1
- package/dist/docs.cjs +7 -3
- package/dist/docs.cjs.map +1 -0
- package/dist/docs.mjs +9 -7
- package/dist/env-types.cjs.map +1 -0
- package/dist/env.cjs.map +1 -0
- package/dist/environment/vite.cjs.map +1 -0
- package/dist/environment.cjs.map +1 -0
- package/dist/font.cjs.map +1 -0
- package/dist/headers.cjs.map +1 -0
- package/dist/i18n/client.cjs.map +1 -0
- package/dist/i18n/index.cjs.map +1 -0
- package/dist/i18n/server.cjs.map +1 -0
- package/dist/image/server.cjs +99 -40
- package/dist/image/server.cjs.map +1 -0
- package/dist/image/server.d.mts +6 -0
- package/dist/image/server.d.ts +6 -0
- package/dist/image/server.mjs +1 -1
- package/dist/image/sharp.cjs +1 -0
- package/dist/image/sharp.cjs.map +1 -0
- package/dist/image/sharp.d.mts +1 -1
- package/dist/image/sharp.d.ts +1 -1
- package/dist/image/sharp.mjs +1 -1
- package/dist/image/sharp.mjs.map +1 -1
- package/dist/image.cjs.map +1 -0
- package/dist/index.cjs +943 -231
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +11 -11
- package/dist/index.d.ts +11 -11
- package/dist/index.mjs +38 -24
- package/dist/index.mjs.map +1 -1
- package/dist/instrumentation.cjs.map +1 -0
- package/dist/{integration-orm-LLW6WZNK.mjs → integration-orm-G5BPBT5X.mjs} +3 -3
- package/dist/integrations.cjs +168 -5
- package/dist/integrations.cjs.map +1 -0
- package/dist/integrations.d.mts +2 -2
- package/dist/integrations.d.ts +2 -2
- package/dist/integrations.mjs +10 -3
- package/dist/internal/build-runtime.cjs +745 -139
- package/dist/internal/build-runtime.cjs.map +1 -0
- package/dist/internal/build-runtime.d.mts +4 -4
- package/dist/internal/build-runtime.d.ts +4 -4
- package/dist/internal/build-runtime.mjs +16 -14
- package/dist/internal/client-runtime.cjs +7 -2
- package/dist/internal/client-runtime.cjs.map +1 -0
- package/dist/internal/client-runtime.mjs +8 -3
- package/dist/internal/client-runtime.mjs.map +1 -1
- package/dist/internal/config-runtime.cjs +59 -42
- package/dist/internal/config-runtime.cjs.map +1 -0
- package/dist/internal/config-runtime.d.mts +3 -3
- package/dist/internal/config-runtime.d.ts +3 -3
- package/dist/internal/config-runtime.mjs +8 -6
- package/dist/internal/isolated-boundary.cjs.map +1 -0
- package/dist/internal/metadata-image-runtime.cjs.map +1 -0
- package/dist/internal/product-telemetry-runtime.cjs +52 -5
- package/dist/internal/product-telemetry-runtime.cjs.map +1 -0
- package/dist/internal/product-telemetry-runtime.d.mts +12 -1
- package/dist/internal/product-telemetry-runtime.d.ts +12 -1
- package/dist/internal/product-telemetry-runtime.mjs +50 -5
- package/dist/internal/product-telemetry-runtime.mjs.map +1 -1
- package/dist/internal/production-node-env.cjs.map +1 -0
- package/dist/internal/production-runtime.cjs +56 -10
- package/dist/internal/production-runtime.cjs.map +1 -0
- package/dist/internal/production-runtime.d.mts +8 -8
- package/dist/internal/production-runtime.d.ts +8 -8
- package/dist/internal/production-runtime.mjs +2 -2
- package/dist/markdown.cjs.map +1 -0
- package/dist/{metadata-route-8_V3UonT.d.ts → metadata-route-D2be_0kC.d.ts} +17 -2
- package/dist/{metadata-route-CWP_HjGU.d.mts → metadata-route-Dw5CrDIZ.d.mts} +17 -2
- package/dist/middleware.cjs.map +1 -0
- package/dist/middleware.d.mts +4 -4
- package/dist/middleware.d.ts +4 -4
- package/dist/navigation.cjs.map +1 -0
- package/dist/{nitro-EGRNOB5P.mjs → nitro-YJEP3FWM.mjs} +4 -3
- package/dist/{nitro-EGRNOB5P.mjs.map → nitro-YJEP3FWM.mjs.map} +1 -1
- package/dist/observability.cjs.map +1 -0
- package/dist/plugin.cjs +599 -104
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.d.mts +2 -2
- package/dist/plugin.d.ts +2 -2
- package/dist/plugin.mjs +13 -11
- package/dist/{production-runtime-CdmzsDax.d.ts → production-runtime-CTqpD1C8.d.ts} +2 -2
- package/dist/{production-runtime-BGRH1dKG.d.mts → production-runtime-HNqNZd4D.d.mts} +2 -2
- package/dist/query/client.cjs.map +1 -0
- package/dist/query/index.cjs.map +1 -0
- package/dist/query/parsers.cjs.map +1 -0
- package/dist/query/server.cjs.map +1 -0
- package/dist/{render-plan-DLxJYAA5.d.mts → render-plan-COscpW-i.d.mts} +1 -1
- package/dist/{render-plan-0GeHiGVZ.d.ts → render-plan-Z4kSxaT_.d.ts} +1 -1
- package/dist/renderer/react/client.cjs.map +1 -0
- package/dist/renderer/react/server.cjs.map +1 -0
- package/dist/renderer/react/vite.cjs.map +1 -0
- package/dist/renderer-client.cjs +26 -1
- package/dist/renderer-client.cjs.map +1 -0
- package/dist/renderer-client.d.mts +4 -4
- package/dist/renderer-client.d.ts +4 -4
- package/dist/renderer-client.mjs +2 -2
- package/dist/renderer.cjs.map +1 -0
- package/dist/{request-BstWbZ6O.d.ts → request-BEDb2jE9.d.ts} +1 -1
- package/dist/{request-BCNXSXLh.d.mts → request-CbIAqJY9.d.mts} +1 -1
- package/dist/request.cjs.map +1 -0
- package/dist/request.d.mts +3 -3
- package/dist/request.d.ts +3 -3
- package/dist/router.cjs.map +1 -0
- package/dist/routes.cjs.map +1 -0
- package/dist/routes.d.mts +2 -2
- package/dist/routes.d.ts +2 -2
- package/dist/server-action-security.cjs +117 -104
- package/dist/server-action-security.cjs.map +1 -0
- package/dist/server-action-security.mjs +2 -1
- package/dist/server-fn-client.cjs.map +1 -0
- package/dist/server-fn.cjs.map +1 -0
- package/dist/server-fn.mjs +3 -2
- package/dist/server-plugins.cjs.map +1 -0
- package/dist/server-plugins.d.mts +3 -3
- package/dist/server-plugins.d.ts +3 -3
- package/dist/server-query-client.cjs +26 -1
- package/dist/server-query-client.cjs.map +1 -0
- package/dist/server-query-client.mjs +3 -3
- package/dist/server-query.cjs.map +1 -0
- package/dist/server-query.mjs +4 -3
- package/dist/server.cjs +686 -170
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.mts +8 -8
- package/dist/server.d.ts +8 -8
- package/dist/server.mjs +16 -14
- package/dist/server.mjs.map +1 -1
- package/dist/{spa-router-COgu4txb.d.ts → spa-router-CjeQites.d.ts} +1 -1
- package/dist/{spa-router-BeyAVSc6.d.mts → spa-router-FJbNou1a.d.mts} +1 -1
- package/dist/storage.cjs +7 -3
- package/dist/storage.cjs.map +1 -0
- package/dist/storage.mjs +1 -1
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.mts +2 -2
- package/dist/testing.d.ts +2 -2
- package/dist/testing.mjs +2 -1
- package/dist/testing.mjs.map +1 -1
- package/dist/theme/client.cjs.map +1 -0
- package/dist/theme/index.cjs.map +1 -0
- package/dist/theme/runtime.cjs.map +1 -0
- package/dist/theme/server.cjs.map +1 -0
- package/dist/{utils-DL2VwDQl.d.mts → utils-BiMJv9Ys.d.mts} +1 -1
- package/dist/{utils-DkU2c_1B.d.ts → utils-BpnKRFv9.d.ts} +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -0
- package/dist/version.mjs +1 -1
- package/dist/vite.cjs +599 -104
- package/dist/vite.cjs.map +1 -0
- package/dist/vite.d.mts +2 -2
- package/dist/vite.d.ts +2 -2
- package/dist/vite.mjs +13 -11
- package/dist/{workflows-ChyK_oTu.d.mts → workflows-BantWytQ.d.mts} +7 -0
- package/dist/{workflows-ChyK_oTu.d.ts → workflows-BantWytQ.d.ts} +7 -0
- package/dist/workflows.cjs +73 -5
- package/dist/workflows.cjs.map +1 -0
- package/dist/workflows.d.mts +1 -1
- package/dist/workflows.d.ts +1 -1
- package/dist/workflows.mjs +2 -1
- package/package.json +17 -17
- package/dist/chunk-2SKCXYLB.mjs.map +0 -1
- package/dist/chunk-35NPLKQJ.mjs.map +0 -1
- package/dist/chunk-7ZVN3YZI.mjs.map +0 -1
- package/dist/chunk-AAC66ILR.mjs.map +0 -1
- package/dist/chunk-BZAIS65C.mjs.map +0 -1
- package/dist/chunk-EPDIF432.mjs.map +0 -1
- package/dist/chunk-FP5Q67FO.mjs.map +0 -1
- package/dist/chunk-ISSFLGJ5.mjs.map +0 -1
- package/dist/chunk-KDP5ZSWP.mjs.map +0 -1
- package/dist/chunk-VMCHLH3Y.mjs.map +0 -1
- package/dist/chunk-WKDAA6V2.mjs.map +0 -1
- package/dist/chunk-X4SFHKFH.mjs.map +0 -1
- /package/dist/{chunk-WD2EBM3I.mjs.map → chunk-3CQJV3NC.mjs.map} +0 -0
- /package/dist/{chunk-I3OOUWO5.mjs.map → chunk-3GDRV7SG.mjs.map} +0 -0
- /package/dist/{chunk-YIBV77KZ.mjs.map → chunk-4WLAVHCY.mjs.map} +0 -0
- /package/dist/{chunk-FSIXEIOB.mjs.map → chunk-L7FSTPGS.mjs.map} +0 -0
- /package/dist/{chunk-GJ7W6LNK.mjs.map → chunk-N5RK4LK6.mjs.map} +0 -0
- /package/dist/{chunk-UMUWR5XA.mjs.map → chunk-PURU7FXR.mjs.map} +0 -0
- /package/dist/{chunk-52BR7LTX.mjs.map → chunk-STSPSJUI.mjs.map} +0 -0
- /package/dist/{chunk-IZBX2TEU.mjs.map → chunk-VQG3QWWK.mjs.map} +0 -0
- /package/dist/{integration-orm-LLW6WZNK.mjs.map → integration-orm-G5BPBT5X.mjs.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/nitro/production-runtime.ts","../../src/after.ts","../../src/routing/specificity.ts","../../src/server-http.ts","../../src/production-lifecycle.ts","../../src/server/request.ts","../../src/server/request-bridge.ts","../../src/api/server-context.ts","../../src/api/server-client-bridge.ts","../../src/tracing.ts","../../src/observability.ts","../../src/cache.ts","../../src/base-path.ts","../../src/i18n/routing.ts","../../src/i18n/resolver.ts","../../src/agent-config.ts","../../src/metadata.ts","../../src/response-body.ts","../../src/metadata-route.ts","../../src/utils/decode.ts","../../src/middleware/module.ts","../../src/middleware/cookie-header.ts","../../src/middleware/production-runtime.ts","../../src/middleware/server.ts","../../src/navigation-errors.ts","../../src/instrumentation-runtime.ts","../../src/route-context.ts","../../src/theme/bridge.ts","../../src/theme/config.ts","../../src/theme/server.ts","../../src/theme/server-runtime.ts","../../src/components/error-styles.ts","../../src/components/error-page.ts","../../src/preload.ts","../../src/search-params.ts","../../src/utils.ts","../../src/nitro/legacy-request.ts","../../src/nitro/legacy-runtime.ts","../../src/trailing-slash.ts","../../src/redirect-query.ts"],"sourcesContent":["export { _runWithAfterRequest } from \"../after\";\nexport type { FarmServerConfig } from \"../server-http\";\nexport {\n bufferFarmRequestBody,\n createFarmNodeRequestAbortSignal,\n createFarmRequestBodyErrorResponse,\n matchesFarmIfNoneMatch,\n readFarmRequestBody,\n readNodeRequestBody,\n resolveFarmServerConfig,\n} from \"../server-http\";\nexport { createFarmProductionLifecycle } from \"../production-lifecycle\";\nexport { _runWithCurrentRequest, getCurrentRequest } from \"../server/request\";\nexport { _runWithAPIRequestRuntime } from \"../api/server-context\";\nexport {\n configureFarmCache,\n createFarmCacheKey,\n getFarmDataCache,\n normalizeRevalidatePath,\n} from \"../cache\";\nexport { createFarmLocaleCookie, getFarmLocaleVaryHeaders } from \"../i18n/resolver\";\nexport {\n localizeFarmHref,\n localizeFarmPathname,\n stripFarmLocaleFromPathname,\n} from \"../i18n/routing\";\nexport { addMetadataImageReference, mergeMetadata, renderMetadataHead } from \"../metadata\";\nexport { createFarmMetadataRouteResponse } from \"../metadata-route\";\nexport {\n applyProductionMiddlewareHeaders,\n createProductionMiddlewareRunner,\n} from \"../middleware/production-runtime\";\nexport { _runWithMiddlewareContext, _runWithMiddlewareData } from \"../middleware/server\";\nexport {\n getFarmRedirectError,\n isFarmNotFoundError,\n isFarmRedirectError,\n} from \"../navigation-errors\";\nexport {\n configureFarmObservability,\n emitFarmEvent,\n runWithFarmRequestSpan,\n} from \"../observability\";\nexport {\n createFarmInstrumentationLifecycle,\n resolveFarmInstrumentationRuntime,\n} from \"../instrumentation-runtime\";\nexport { resolveFarmRouteContext, withFarmRouteContext } from \"../route-context\";\nexport { _setDefaultFarmThemeConfig, getTheme } from \"../theme/server\";\nexport { applyFarmThemeDocument, createFarmThemeDocumentParts } from \"../theme/server-runtime\";\nexport {\n createDefaultErrorMarkup,\n getDefaultErrorStatusText,\n resolveDefaultErrorStatus,\n} from \"../components/error-page\";\nexport {\n manageFarmDocumentPreloads,\n manageFarmHtmlPreloads,\n manageFarmLinkHeaderPreloads,\n reportFarmPreloadWarnings,\n} from \"../preload\";\nexport { searchParamsToObject } from \"../search-params\";\nexport { parseRoutePath, matchRoute as matchFarmPageRoute } from \"../utils\";\nexport { compareRouteSpecificity, getRoutePatternSpecificity } from \"../routing/specificity\";\nexport { createFarmLegacyRequest } from \"./legacy-request\";\nexport {\n renderFarmLegacyErrorHtml,\n renderFarmLegacyHtml,\n serializeFarmInlineValue,\n} from \"./legacy-runtime\";\nexport {\n resolveFarmTrailingSlashRedirect,\n setFarmTrailingSlashPreference,\n} from \"../trailing-slash\";\nexport { applyFarmBasePath, setFarmBasePath, stripFarmBasePath } from \"../base-path\";\nexport { appendFarmRedirectQuery } from \"../redirect-query\";\n\nexport function appendFarmLinkHeader(headers: Headers, value: string): void {\n const current = headers.get(\"Link\");\n if (!current) {\n headers.set(\"Link\", value);\n return;\n }\n if (current !== value && !current.endsWith(`, ${value}`)) {\n headers.set(\"Link\", `${current}, ${value}`);\n }\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\n\nexport type AfterCallback = () => void | Promise<void>;\n\n/** Runtime hooks supplied by a deployment adapter. */\nexport interface FarmAfterPlatformContext {\n /** Keep a serverless invocation alive until the scheduled work settles. */\n waitUntil?: (promise: Promise<void>) => void;\n /** Register a callback that runs once the response has finished. */\n onResponseFinished?: (callback: () => void) => void;\n}\n\ninterface AfterTask {\n result: Promise<void>;\n start: () => void;\n}\n\ninterface AfterRequestState {\n completion: Promise<void>;\n finishResponse: () => void;\n phase: \"open\" | \"running\" | \"closed\";\n reportError: (error: unknown) => void;\n tasks: AfterTask[];\n}\n\nconst AFTER_STORAGE = Symbol.for(\"@farm.js/core/after-storage\");\n\nfunction getAfterStorage(): AsyncLocalStorage<AfterRequestState> {\n const runtime = globalThis as typeof globalThis & Record<PropertyKey, unknown>;\n const existing = runtime[AFTER_STORAGE];\n if (existing instanceof AsyncLocalStorage) {\n return existing as AsyncLocalStorage<AfterRequestState>;\n }\n\n const storage = new AsyncLocalStorage<AfterRequestState>();\n runtime[AFTER_STORAGE] = storage;\n return storage;\n}\n\nconst afterStorage = getAfterStorage();\n\nfunction defaultAfterErrorReporter(error: unknown): void {\n console.error(\"[Farm.js] after() callback failed:\", error);\n}\n\nfunction reportAfterError(state: AfterRequestState, error: unknown): void {\n try {\n state.reportError(error);\n } catch {\n // Error reporting must never interrupt the remaining post-response work.\n }\n}\n\nfunction createAfterRequestState(\n reportError: (error: unknown) => void = defaultAfterErrorReporter,\n): AfterRequestState {\n let resolveResponseFinished!: () => void;\n let responseFinished = false;\n const responseFinishedPromise = new Promise<void>((resolve) => {\n resolveResponseFinished = resolve;\n });\n\n const state: AfterRequestState = {\n completion: Promise.resolve(),\n finishResponse: () => {\n if (responseFinished) return;\n responseFinished = true;\n resolveResponseFinished();\n },\n phase: \"open\",\n reportError,\n tasks: [],\n };\n\n state.completion = responseFinishedPromise.then(() =>\n afterStorage.run(state, async () => {\n state.phase = \"running\";\n\n for (let index = 0; index < state.tasks.length; index++) {\n const task = state.tasks[index];\n task.start();\n try {\n await task.result;\n } catch (error) {\n reportAfterError(state, error);\n }\n }\n\n state.phase = \"closed\";\n }),\n );\n\n return state;\n}\n\nfunction registerPlatformLifetime(\n state: AfterRequestState,\n context: FarmAfterPlatformContext | undefined,\n): void {\n if (!context?.waitUntil) return;\n\n try {\n context.waitUntil(state.completion);\n } catch (error) {\n reportAfterError(state, error);\n }\n}\n\nfunction registerResponseFinishedHook(\n state: AfterRequestState,\n context: FarmAfterPlatformContext | undefined,\n): boolean {\n if (!context?.onResponseFinished) return false;\n\n try {\n context.onResponseFinished(state.finishResponse);\n return true;\n } catch (error) {\n reportAfterError(state, error);\n return false;\n }\n}\n\nfunction finishSoon(state: AfterRequestState): void {\n setTimeout(state.finishResponse, 0);\n}\n\nfunction wrapResponseBody(\n response: Response,\n request: Request,\n state: AfterRequestState,\n): Response {\n if (\n request.method === \"HEAD\" ||\n response.status < 200 ||\n response.status > 599 ||\n !response.body ||\n response.bodyUsed ||\n response.body.locked\n ) {\n finishSoon(state);\n return response;\n }\n\n const reader = response.body.getReader();\n let released = false;\n const releaseReader = () => {\n if (released) return;\n released = true;\n reader.releaseLock();\n };\n\n const body = new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const chunk = await reader.read();\n if (chunk.done) {\n releaseReader();\n controller.close();\n finishSoon(state);\n return;\n }\n controller.enqueue(chunk.value);\n } catch (error) {\n releaseReader();\n controller.error(error);\n finishSoon(state);\n }\n },\n cancel(reason) {\n try {\n // Preserve the caller's cleanup promise, but response completion must\n // not depend on whether producer-owned cancellation ever settles.\n return reader.cancel(reason);\n } finally {\n releaseReader();\n finishSoon(state);\n }\n },\n });\n\n return new Response(body, {\n headers: response.headers,\n status: response.status,\n statusText: response.statusText,\n });\n}\n\n/**\n * Schedule non-blocking work for after the current response finishes.\n *\n * Callbacks run in registration order. A callback failure is reported without\n * changing the response or preventing later callbacks from running.\n */\nexport function after(callback: AfterCallback): void {\n if (typeof callback !== \"function\") {\n throw new TypeError(\"after() expects a callback function.\");\n }\n\n const state = afterStorage.getStore();\n if (!state) {\n throw new Error(\"after() can only be used while Farm is handling a server request.\");\n }\n if (state.phase === \"closed\") {\n throw new Error(\"after() cannot schedule work after the request lifecycle has completed.\");\n }\n\n let start!: () => void;\n const ready = new Promise<void>((resolve) => {\n start = resolve;\n });\n\n // Registering the continuation here preserves every request AsyncLocalStorage\n // context that is active at the after() call site.\n const result = ready.then(callback);\n state.tasks.push({ result, start });\n}\n\n/** @internal Run a Web Request handler inside Farm's post-response lifecycle. */\nexport async function _runWithAfterRequest(\n request: Request,\n handler: () => Response | Promise<Response>,\n context?: FarmAfterPlatformContext,\n): Promise<Response> {\n if (afterStorage.getStore()) {\n return await handler();\n }\n\n const state = createAfterRequestState();\n registerPlatformLifetime(state, context);\n const hasResponseHook = registerResponseFinishedHook(state, context);\n\n try {\n const response = await afterStorage.run(state, handler);\n return hasResponseHook ? response : wrapResponseBody(response, request, state);\n } catch (error) {\n // The handler threw, so there is no successful response for a\n // response-finished hook to fire on. Run the after-lifecycle now regardless\n // of the hook; otherwise a spec-compliant adapter (whose hook only fires on\n // a real response) never runs the registered after() callbacks and\n // waitUntil(state.completion) hangs forever. finishResponse is idempotent,\n // so a later hook firing (e.g. a Node error response's close) is a no-op.\n finishSoon(state);\n throw error;\n }\n}\n\n/** @internal Run a Node response handler inside Farm's post-response lifecycle. */\nexport async function _runWithAfterNodeResponse<T>(\n response: ServerResponse,\n handler: () => T | Promise<T>,\n context?: Pick<FarmAfterPlatformContext, \"waitUntil\">,\n): Promise<T> {\n if (afterStorage.getStore()) {\n return await handler();\n }\n\n const state = createAfterRequestState();\n let finished = false;\n const finish = () => {\n if (finished) return;\n finished = true;\n response.off(\"finish\", finish);\n response.off(\"close\", finish);\n state.finishResponse();\n };\n\n response.once(\"finish\", finish);\n response.once(\"close\", finish);\n if (response.writableEnded) finishSoon(state);\n registerPlatformLifetime(state, context);\n\n return await afterStorage.run(state, handler);\n}\n\n/** @internal Add Farm's post-response lifecycle to a Node middleware. */\nexport function _withAfterNodeMiddleware(\n handler: (\n request: IncomingMessage,\n response: ServerResponse,\n next: (error?: unknown) => void,\n ) => void | Promise<void>,\n): (\n request: IncomingMessage,\n response: ServerResponse,\n next: (error?: unknown) => void,\n) => Promise<void> {\n return async (request, response, next) => {\n await _runWithAfterNodeResponse(response, () => handler(request, response, next));\n };\n}\n","export type RouteSegmentSpecificity = \"static\" | \"dynamic\" | \"catch-all\" | \"optional-catch-all\";\n\nexport class AmbiguousRouteError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AmbiguousRouteError\";\n }\n}\n\nexport class NonTerminalCatchAllRouteError extends TypeError {\n constructor(message: string) {\n super(message);\n this.name = \"NonTerminalCatchAllRouteError\";\n }\n}\n\nexport class DuplicateRouteParameterError extends AmbiguousRouteError {\n constructor(message: string) {\n super(message);\n this.name = \"DuplicateRouteParameterError\";\n }\n}\n\nexport class ReservedRouteParameterError extends AmbiguousRouteError {\n constructor(message: string) {\n super(message);\n this.name = \"ReservedRouteParameterError\";\n }\n}\n\nexport class BrowserUnstableRouteError extends TypeError {\n constructor(message: string) {\n super(message);\n this.name = \"BrowserUnstableRouteError\";\n }\n}\n\nconst SEGMENT_RANK: Record<RouteSegmentSpecificity, number> = {\n static: 4,\n dynamic: 3,\n \"catch-all\": 1,\n \"optional-catch-all\": 0,\n};\n\n// Ending a route is more specific than consuming the same path through a\n// catch-all, while a following static or dynamic segment remains more specific.\nconst ROUTE_END_RANK = 2;\n\n/** Sort route patterns from the most specific segment sequence to the least specific. */\nexport function compareRouteSpecificity(\n left: readonly RouteSegmentSpecificity[],\n right: readonly RouteSegmentSpecificity[],\n): number {\n const length = Math.max(left.length, right.length);\n\n for (let index = 0; index < length; index++) {\n const leftRank = index < left.length ? SEGMENT_RANK[left[index]!] : ROUTE_END_RANK;\n const rightRank = index < right.length ? SEGMENT_RANK[right[index]!] : ROUTE_END_RANK;\n if (leftRank !== rightRank) return rightRank - leftRank;\n }\n\n return 0;\n}\n\nexport type RoutePatternSyntax = \"page\" | \"router\" | \"api\";\n\nconst ROUTER_PARAMETER_NAME = \"[A-Za-z0-9_$-]+\";\nconst PAGE_PARAMETER_PATTERN = /^(?:\\[\\[\\.\\.\\.(.+)\\]\\]|\\[\\.\\.\\.(.+)\\]|\\[(.+)\\])$/;\nconst ROUTER_PARAMETER_PATTERN =\n /^(?:\\[\\[\\.\\.\\.([A-Za-z0-9_$-]+)\\]\\]|\\[\\.\\.\\.([A-Za-z0-9_$-]+)\\]|\\[([A-Za-z0-9_$-]+)\\]|:([A-Za-z0-9_$-]+)|\\*([A-Za-z0-9_$-]+)\\??)$/;\nconst RESERVED_PARAMETER_NAMES = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nexport function assertBrowserStableRoutePath(pattern: string): void {\n if (pattern.includes(\"\\\\\") || hasControlCharacter(pattern)) {\n throw new BrowserUnstableRouteError(\n `Route path \"${pattern}\" cannot contain backslashes or control characters.`,\n );\n }\n\n for (const segment of pattern.split(\"/\").filter(Boolean)) {\n if (\n (segment.startsWith(\"(\") && segment.endsWith(\")\")) ||\n (segment.startsWith(\"[\") && segment.endsWith(\"]\"))\n ) {\n continue;\n }\n\n let decoded = segment;\n try {\n decoded = decodeURIComponent(segment);\n } catch {\n // Malformed escapes stay literal in browser pathnames.\n }\n if (\n decoded === \".\" ||\n decoded === \"..\" ||\n decoded.includes(\"/\") ||\n decoded.includes(\"\\\\\") ||\n hasControlCharacter(decoded)\n ) {\n throw new BrowserUnstableRouteError(\n `Route path \"${pattern}\" contains browser-unstable segment \"${segment}\".`,\n );\n }\n }\n}\n\nfunction hasControlCharacter(value: string): boolean {\n return Array.from(value).some((character) => {\n const code = character.charCodeAt(0);\n return code <= 31 || (code >= 127 && code <= 159);\n });\n}\n\nexport function assertUniqueRouteParameters(\n pattern: string,\n syntax: RoutePatternSyntax = \"page\",\n): void {\n const parameterPattern = syntax === \"router\" ? ROUTER_PARAMETER_PATTERN : PAGE_PARAMETER_PATTERN;\n const names = new Set<string>();\n\n for (const segment of splitRoutePattern(pattern, syntax)) {\n const match = parameterPattern.exec(segment);\n const name = match?.slice(1).find(Boolean);\n if (!name) continue;\n if (RESERVED_PARAMETER_NAMES.has(name)) {\n throw new ReservedRouteParameterError(\n `Route parameter \"${name}\" in route \"${pattern}\" is reserved. Use a different parameter name.`,\n );\n }\n if (names.has(name)) {\n throw new DuplicateRouteParameterError(\n `Duplicate route parameter \"${name}\" in route \"${pattern}\". Each dynamic segment must use a unique name.`,\n );\n }\n names.add(name);\n }\n}\n\nfunction splitRoutePattern(pattern: string, syntax: RoutePatternSyntax): string[] {\n return pattern\n .replace(/\\\\/g, \"/\")\n .split(\"/\")\n .filter(Boolean)\n .filter((segment) =>\n syntax === \"api\" ? true : !(segment.startsWith(\"(\") && segment.endsWith(\")\")),\n );\n}\n\nexport function assertTerminalCatchAll(pattern: string, syntax: RoutePatternSyntax = \"page\"): void {\n const segments = splitRoutePattern(pattern, syntax);\n const parameterName = syntax === \"router\" ? ROUTER_PARAMETER_NAME : \".+\";\n const catchAllPattern = new RegExp(\n syntax === \"router\"\n ? `^(?:\\\\[\\\\[\\\\.\\\\.\\\\.${parameterName}\\\\]\\\\]|\\\\[\\\\.\\\\.\\\\.${parameterName}\\\\]|\\\\*${parameterName}\\\\??)$`\n : `^(?:\\\\[\\\\[\\\\.\\\\.\\\\.${parameterName}\\\\]\\\\]|\\\\[\\\\.\\\\.\\\\.${parameterName}\\\\])$`,\n );\n const catchAllIndex = segments.findIndex((segment) => catchAllPattern.test(segment));\n if (catchAllIndex >= 0 && catchAllIndex !== segments.length - 1) {\n throw new NonTerminalCatchAllRouteError(\n `Catch-all segment \"${segments[catchAllIndex]}\" must be the final segment in route \"${pattern}\".`,\n );\n }\n}\n\n/** Return the URL-matching shape of a route without its parameter names. */\nexport function getRoutePatternShape(pattern: string, syntax: RoutePatternSyntax = \"page\"): string {\n assertTerminalCatchAll(pattern, syntax);\n const segments = splitRoutePattern(pattern, syntax).map((segment) => {\n const specificity = getPatternSegmentSpecificity(segment, syntax);\n if (specificity !== \"static\") return specificity;\n\n try {\n return `static:${decodeURIComponent(segment)}`;\n } catch {\n return `static:${segment}`;\n }\n });\n\n return segments.length === 0 ? \"/\" : JSON.stringify(segments);\n}\n\n/** Return the specificity of every URL-consuming segment in a route pattern. */\nexport function getRoutePatternSpecificity(\n pattern: string,\n syntax: RoutePatternSyntax = \"page\",\n): RouteSegmentSpecificity[] {\n assertTerminalCatchAll(pattern, syntax);\n return splitRoutePattern(pattern, syntax).map((segment) =>\n getPatternSegmentSpecificity(segment, syntax),\n );\n}\n\nfunction getPatternSegmentSpecificity(\n segment: string,\n syntax: RoutePatternSyntax,\n): RouteSegmentSpecificity {\n const parameterName = syntax === \"router\" ? ROUTER_PARAMETER_NAME : \".+\";\n const supportsColonAndStar = syntax === \"router\";\n if (\n new RegExp(`^\\\\[\\\\[\\\\.\\\\.\\\\.${parameterName}\\\\]\\\\]$`).test(segment) ||\n (supportsColonAndStar && new RegExp(`^\\\\*${parameterName}\\\\?$`).test(segment))\n ) {\n return \"optional-catch-all\";\n }\n if (\n new RegExp(`^\\\\[\\\\.\\\\.\\\\.${parameterName}\\\\]$`).test(segment) ||\n (supportsColonAndStar && new RegExp(`^\\\\*${parameterName}$`).test(segment))\n ) {\n return \"catch-all\";\n }\n if (\n new RegExp(`^\\\\[${parameterName}\\\\]$`).test(segment) ||\n (supportsColonAndStar && new RegExp(`^:${parameterName}$`).test(segment))\n ) {\n return \"dynamic\";\n }\n\n return \"static\";\n}\n","import { assertBrowserStableRoutePath } from \"./routing/specificity\";\n\ninterface FarmNodeAbortRequest {\n aborted?: boolean;\n once(event: \"aborted\", listener: () => void): unknown;\n off(event: \"aborted\", listener: () => void): unknown;\n}\n\ninterface FarmNodeAbortResponse {\n writableEnded: boolean;\n once(event: \"close\" | \"finish\", listener: () => void): unknown;\n off(event: \"close\" | \"finish\", listener: () => void): unknown;\n}\n\n/** Share disconnect semantics between development and production Node requests. */\nexport function createFarmNodeRequestAbortSignal(\n req: FarmNodeAbortRequest,\n res: FarmNodeAbortResponse,\n): AbortSignal {\n const controller = new AbortController();\n let disposed = false;\n const dispose = () => {\n if (disposed) return;\n disposed = true;\n req.off(\"aborted\", abort);\n res.off(\"close\", abortOnEarlyClose);\n res.off(\"finish\", dispose);\n controller.signal.removeEventListener(\"abort\", dispose);\n };\n const abort = () => controller.abort();\n const abortOnEarlyClose = () => {\n if (!res.writableEnded) abort();\n dispose();\n };\n\n if (req.aborted) {\n controller.abort();\n return controller.signal;\n }\n\n req.once(\"aborted\", abort);\n res.once(\"close\", abortOnEarlyClose);\n res.once(\"finish\", dispose);\n controller.signal.addEventListener(\"abort\", dispose, { once: true });\n return controller.signal;\n}\n\nexport const DEFAULT_FARM_SERVER_BODY_SIZE_LIMIT = 10_000_000;\nexport const DEFAULT_FARM_SERVER_HEADERS_TIMEOUT = 60_000;\nexport const DEFAULT_FARM_SERVER_REQUEST_TIMEOUT = 300_000;\nexport const DEFAULT_FARM_SERVER_KEEP_ALIVE_TIMEOUT = 5_000;\nexport const DEFAULT_FARM_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT = 30_000;\nconst MAX_FARM_SERVER_TIMEOUT = 2_147_483_647;\n\nexport type FarmServerDuration = number | `${number}${\"ms\" | \"s\" | \"m\" | \"h\"}`;\n\nexport interface FarmServerHealthConfig {\n /** Liveness endpoint. It remains healthy while a production process drains. */\n livenessPath?: string;\n /** Readiness endpoint. It returns 503 until startup completes and while draining. */\n readinessPath?: string;\n}\n\nexport interface ResolvedFarmServerHealthConfig {\n enabled: boolean;\n livenessPath: string;\n readinessPath: string;\n}\n\nexport interface FarmServerConfig {\n /** Maximum request body size for API routes, integrations, workflows, and uploads. */\n bodySizeLimit?: number | string;\n /** Trust proxy-provided client address and request authority headers. Enable only behind a trusted proxy. */\n trustProxy?: boolean;\n /** Maximum time for a Node client to send complete request headers. */\n headersTimeout?: FarmServerDuration;\n /** Maximum time for a Node client to send the complete request. */\n requestTimeout?: FarmServerDuration;\n /** How long an idle Node keep-alive connection remains open after a response. */\n keepAliveTimeout?: FarmServerDuration;\n /** Maximum time the Node adapter drains traffic before forcing shutdown. */\n gracefulShutdownTimeout?: FarmServerDuration;\n /** Production liveness and readiness endpoints. Set to false to disable them. */\n health?: false | FarmServerHealthConfig;\n}\n\nexport interface ResolvedFarmServerConfig {\n bodySizeLimit: number;\n trustProxy: boolean;\n headersTimeout: number;\n requestTimeout: number;\n keepAliveTimeout: number;\n gracefulShutdownTimeout: number;\n health: ResolvedFarmServerHealthConfig;\n}\n\nexport type FarmRequestBodyErrorCode = \"BODY_TOO_LARGE\" | \"INVALID_CONTENT_LENGTH\";\n\n/** Apply the weak entity-tag comparison required by If-None-Match. */\nexport function matchesFarmIfNoneMatch(\n value: string | readonly string[] | null | undefined,\n etag: string,\n): boolean {\n const expected = parseEntityTag(trimOptionalWhitespace(etag));\n if (!expected) return false;\n\n const values = Array.isArray(value) ? value : [value];\n const combined = values\n .filter((header): header is string => typeof header === \"string\")\n .join(\",\");\n const fieldValue = trimOptionalWhitespace(combined);\n if (!fieldValue) return false;\n if (fieldValue === \"*\") return true;\n\n let matched = false;\n let hasEntityTag = false;\n for (const candidate of splitEntityTags(fieldValue)) {\n const token = trimOptionalWhitespace(candidate);\n if (!token) continue;\n\n const parsed = parseEntityTag(token);\n if (!parsed) return false;\n hasEntityTag = true;\n if (parsed === expected) matched = true;\n }\n\n return hasEntityTag && matched;\n}\n\nfunction trimOptionalWhitespace(value: string): string {\n return value.replace(/^[\\t ]+|[\\t ]+$/g, \"\");\n}\n\nfunction parseEntityTag(value: string): string | null {\n const opaqueTag = value.startsWith(\"W/\") ? value.slice(2) : value;\n if (opaqueTag.length < 2 || opaqueTag[0] !== '\"' || opaqueTag.at(-1) !== '\"') return null;\n\n for (let index = 1; index < opaqueTag.length - 1; index++) {\n const code = opaqueTag.charCodeAt(index);\n if (code === 0x21 || (code >= 0x23 && code <= 0x7e) || code >= 0x80) continue;\n return null;\n }\n\n return opaqueTag;\n}\n\nfunction splitEntityTags(value: string): string[] {\n const tags: string[] = [];\n let start = 0;\n let quoted = false;\n\n for (let index = 0; index < value.length; index++) {\n const character = value[index];\n if (character === '\"') {\n quoted = !quoted;\n } else if (character === \",\" && !quoted) {\n tags.push(value.slice(start, index));\n start = index + 1;\n }\n }\n\n tags.push(value.slice(start));\n return tags;\n}\n\nexport class FarmRequestBodyError extends Error {\n readonly code: FarmRequestBodyErrorCode;\n readonly status: number;\n\n constructor(code: FarmRequestBodyErrorCode, status: number, message: string) {\n super(message);\n this.name = \"FarmRequestBodyError\";\n this.code = code;\n this.status = status;\n }\n}\n\nexport function resolveFarmServerConfig(\n config: FarmServerConfig | ResolvedFarmServerConfig | undefined,\n): ResolvedFarmServerConfig {\n const headersTimeout = parseFarmServerDuration(\n config?.headersTimeout ?? DEFAULT_FARM_SERVER_HEADERS_TIMEOUT,\n \"server.headersTimeout\",\n );\n const requestTimeout = parseFarmServerDuration(\n config?.requestTimeout ?? DEFAULT_FARM_SERVER_REQUEST_TIMEOUT,\n \"server.requestTimeout\",\n );\n if (headersTimeout > requestTimeout) {\n throw new TypeError(\"server.headersTimeout must not exceed server.requestTimeout\");\n }\n\n return Object.freeze({\n bodySizeLimit: parseBodySizeLimit(\n config?.bodySizeLimit ?? DEFAULT_FARM_SERVER_BODY_SIZE_LIMIT,\n \"server.bodySizeLimit\",\n ),\n trustProxy: config?.trustProxy === true,\n headersTimeout,\n requestTimeout,\n keepAliveTimeout: parseFarmServerDuration(\n config?.keepAliveTimeout ?? DEFAULT_FARM_SERVER_KEEP_ALIVE_TIMEOUT,\n \"server.keepAliveTimeout\",\n ),\n gracefulShutdownTimeout: parseFarmServerDuration(\n config?.gracefulShutdownTimeout ?? DEFAULT_FARM_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT,\n \"server.gracefulShutdownTimeout\",\n ),\n health: resolveFarmServerHealthConfig(config?.health),\n });\n}\n\nexport function parseFarmServerDuration(\n value: FarmServerDuration,\n optionName = \"duration\",\n): number {\n if (typeof value === \"number\") {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new TypeError(`${optionName} must be a positive safe integer`);\n }\n if (value > MAX_FARM_SERVER_TIMEOUT) {\n throw new TypeError(`${optionName} must not exceed ${MAX_FARM_SERVER_TIMEOUT} milliseconds`);\n }\n return value;\n }\n\n const match = value\n .trim()\n .toLowerCase()\n .match(/^(\\d+(?:\\.\\d+)?)\\s*(ms|s|m|h)$/);\n if (!match) {\n throw new TypeError(`${optionName} must be milliseconds or a duration such as \"30s\" or \"2m\"`);\n }\n\n const amount = Number(match[1]);\n const unit = match[2];\n const multiplier = unit === \"ms\" ? 1 : unit === \"s\" ? 1_000 : unit === \"m\" ? 60_000 : 3_600_000;\n const milliseconds = Math.floor(amount * multiplier);\n if (!Number.isSafeInteger(milliseconds) || milliseconds <= 0) {\n throw new TypeError(`${optionName} must resolve to a positive safe integer`);\n }\n if (milliseconds > MAX_FARM_SERVER_TIMEOUT) {\n throw new TypeError(`${optionName} must not exceed ${MAX_FARM_SERVER_TIMEOUT} milliseconds`);\n }\n return milliseconds;\n}\n\nfunction resolveFarmServerHealthConfig(\n config: false | FarmServerHealthConfig | ResolvedFarmServerHealthConfig | undefined,\n): ResolvedFarmServerHealthConfig {\n if (config === false || (config && \"enabled\" in config && config.enabled === false)) {\n return Object.freeze({\n enabled: false,\n livenessPath: \"/_farm/health/live\",\n readinessPath: \"/_farm/health/ready\",\n });\n }\n\n const livenessPath = normalizeHealthPath(\n config?.livenessPath ?? \"/_farm/health/live\",\n \"server.health.livenessPath\",\n );\n const readinessPath = normalizeHealthPath(\n config?.readinessPath ?? \"/_farm/health/ready\",\n \"server.health.readinessPath\",\n );\n if (livenessPath === readinessPath) {\n throw new TypeError(\"server.health livenessPath and readinessPath must be different\");\n }\n\n return Object.freeze({ enabled: true, livenessPath, readinessPath });\n}\n\nfunction normalizeHealthPath(value: string, optionName: string): string {\n const path = value.trim();\n if (!path.startsWith(\"/\") || path.includes(\"?\") || path.includes(\"#\") || path.includes(\"*\")) {\n throw new TypeError(`${optionName} must be an absolute pathname without a query or wildcard`);\n }\n const normalized = path.length > 1 ? path.replace(/\\/+$/, \"\") || \"/\" : path;\n assertBrowserStableRoutePath(normalized);\n return normalized;\n}\n\nexport function parseBodySizeLimit(value: number | string, optionName = \"bodySizeLimit\"): number {\n if (typeof value === \"number\") {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new TypeError(`${optionName} must be a positive safe integer`);\n }\n return value;\n }\n\n const match = value\n .trim()\n .toLowerCase()\n .match(/^(\\d+(?:\\.\\d+)?)\\s*(b|kb|mb|gb|kib|mib|gib)?$/);\n if (!match) {\n throw new TypeError(`${optionName} must be bytes or a size string such as \"500kb\" or \"10mb\"`);\n }\n\n const amount = Number(match[1]);\n const unit = match[2] ?? \"b\";\n const multiplier: Record<string, number> = {\n b: 1,\n kb: 1_000,\n mb: 1_000_000,\n gb: 1_000_000_000,\n kib: 1_024,\n mib: 1_048_576,\n gib: 1_073_741_824,\n };\n const bytes = Math.floor(amount * multiplier[unit]);\n\n if (!Number.isSafeInteger(bytes) || bytes <= 0) {\n throw new TypeError(`${optionName} must resolve to a positive safe integer`);\n }\n\n return bytes;\n}\n\nexport async function bufferFarmRequestBody(request: Request, limit: number): Promise<Request> {\n if (request.method === \"GET\" || request.method === \"HEAD\" || request.body === null) {\n return request;\n }\n\n const bytes = await readFarmRequestBody(request, limit);\n const body = new Uint8Array(bytes.byteLength);\n body.set(bytes);\n return new Request(request, {\n // oxlint-disable-next-line unicorn/no-invalid-fetch-options -- GET and HEAD return above.\n body: body.buffer,\n });\n}\n\nexport async function readFarmRequestBody(request: Request, limit: number): Promise<Uint8Array> {\n try {\n validateContentLength(request.headers.get(\"content-length\"), limit);\n } catch (error) {\n // A cloned Request is a tee branch: its cancellation may wait for the\n // untouched branch. Rejection must not wait for producer-owned cleanup.\n void request.body?.cancel(error).catch(() => {});\n throw error;\n }\n throwIfAborted(request.signal);\n if (!request.body) return new Uint8Array();\n\n const reader = request.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n const cancelBodyRead = () => {\n void reader.cancel(request.signal.reason).catch(() => {});\n };\n request.signal.addEventListener(\"abort\", cancelBodyRead, { once: true });\n\n try {\n while (true) {\n throwIfAborted(request.signal);\n const { done, value } = await reader.read();\n // Cancellation resolves a pending read as EOF, not necessarily an error.\n throwIfAborted(request.signal);\n if (done) break;\n if (!value) continue;\n\n total += value.byteLength;\n if (total > limit) {\n const error = new FarmRequestBodyError(\"BODY_TOO_LARGE\", 413, \"Request body is too large\");\n void reader.cancel(error).catch(() => {});\n throw error;\n }\n chunks.push(value);\n }\n } catch (error) {\n if (request.signal.aborted) throwIfAborted(request.signal);\n throw error;\n } finally {\n request.signal.removeEventListener(\"abort\", cancelBodyRead);\n reader.releaseLock();\n }\n\n const body = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return body;\n}\n\nexport async function readNodeRequestBody(\n request: {\n headers: Record<string, string | string[] | undefined>;\n on(event: \"data\", listener: (chunk: unknown) => void): unknown;\n on(event: \"end\", listener: () => void): unknown;\n on(event: \"error\", listener: (error: Error) => void): unknown;\n removeListener?(event: string, listener: (...args: any[]) => void): unknown;\n resume?(): unknown;\n },\n limit: number,\n): Promise<Buffer> {\n const rawContentLength = request.headers[\"content-length\"];\n const contentLength = Array.isArray(rawContentLength) ? rawContentLength[0] : rawContentLength;\n try {\n validateContentLength(contentLength, limit);\n } catch (error) {\n request.resume?.();\n throw error;\n }\n\n return await new Promise<Buffer>((resolve, reject) => {\n const chunks: Buffer[] = [];\n let total = 0;\n let settled = false;\n\n const cleanup = () => {\n request.removeListener?.(\"data\", onData);\n request.removeListener?.(\"end\", onEnd);\n request.removeListener?.(\"error\", onError);\n };\n const rejectOnce = (error: Error) => {\n if (settled) return;\n settled = true;\n cleanup();\n request.resume?.();\n reject(error);\n };\n const onData = (chunk: unknown) => {\n const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk as any);\n total += bytes.byteLength;\n if (total > limit) {\n rejectOnce(new FarmRequestBodyError(\"BODY_TOO_LARGE\", 413, \"Request body is too large\"));\n return;\n }\n chunks.push(bytes);\n };\n const onEnd = () => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(Buffer.concat(chunks, total));\n };\n const onError = (error: Error) => rejectOnce(error);\n\n request.on(\"data\", onData);\n request.on(\"end\", onEnd);\n request.on(\"error\", onError);\n });\n}\n\nexport function createFarmRequestBodyErrorResponse(error: unknown): Response | null {\n if (!(error instanceof FarmRequestBodyError)) return null;\n\n return new Response(error.status === 413 ? \"Payload Too Large\" : \"Bad Request\", {\n status: error.status,\n headers: {\n \"cache-control\": \"no-store\",\n \"content-type\": \"text/plain; charset=utf-8\",\n \"x-content-type-options\": \"nosniff\",\n },\n });\n}\n\nfunction validateContentLength(value: string | null | undefined, limit: number): void {\n const contentLength = value?.trim();\n if (!contentLength) return;\n if (!/^\\d+$/.test(contentLength)) {\n throw new FarmRequestBodyError(\"INVALID_CONTENT_LENGTH\", 400, \"Invalid content-length header\");\n }\n if (Number(contentLength) > limit) {\n throw new FarmRequestBodyError(\"BODY_TOO_LARGE\", 413, \"Request body is too large\");\n }\n}\n\nfunction throwIfAborted(signal: AbortSignal): void {\n if (!signal.aborted) return;\n if (signal.reason !== undefined) throw signal.reason;\n throw new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n","import type { ResolvedFarmServerConfig } from \"./server-http\";\n\nexport type FarmProductionLifecycleState = \"starting\" | \"ready\" | \"draining\" | \"failed\" | \"closed\";\n\nexport interface FarmProductionLifecycleOptions {\n server: ResolvedFarmServerConfig;\n start?: () => void | Promise<void>;\n close?: (reason: string) => void | Promise<void>;\n}\n\nexport interface FarmResponseCompletionContext {\n onResponseFinished?: (callback: () => void) => void;\n}\n\nexport interface FarmProductionLifecycle {\n readonly state: FarmProductionLifecycleState;\n readonly activeRequests: number;\n start(): Promise<void>;\n beginDrain(reason?: string): void;\n waitForIdle(timeoutMs?: number): Promise<boolean>;\n close(reason?: string): Promise<void>;\n forceClose(reason?: string): Promise<void>;\n handleHealthRequest(request: Request): Promise<Response | null>;\n runRequest(\n handler: () => Response | Promise<Response>,\n context?: FarmResponseCompletionContext,\n ): Promise<Response>;\n}\n\nexport function createFarmProductionLifecycle(\n options: FarmProductionLifecycleOptions,\n): FarmProductionLifecycle {\n let state: FarmProductionLifecycleState = \"starting\";\n let activeRequests = 0;\n let startPromise: Promise<void> | undefined;\n let closePromise: Promise<void> | undefined;\n let resourceClosePromise: Promise<void> | undefined;\n let resolveForcedCloseWait!: () => void;\n const forcedCloseWait = new Promise<void>((resolve) => {\n resolveForcedCloseWait = resolve;\n });\n const idleWaiters = new Set<() => void>();\n\n const notifyIdle = () => {\n if (activeRequests !== 0) return;\n for (const resolve of idleWaiters) resolve();\n idleWaiters.clear();\n };\n\n const start = async () => {\n if (state === \"ready\") return;\n if (startPromise) return startPromise;\n if (state === \"draining\" || state === \"closed\") {\n throw new Error(\"Farm production runtime is shutting down\");\n }\n if (state === \"failed\") {\n throw new Error(\"Farm production runtime failed to start\");\n }\n\n startPromise = Promise.resolve()\n .then(() => options.start?.())\n .then(\n () => {\n if (state === \"starting\") state = \"ready\";\n },\n (error) => {\n if (state !== \"closed\") state = \"failed\";\n throw error;\n },\n );\n return startPromise;\n };\n\n const beginDrain = (_reason = \"production-server-draining\") => {\n if (state === \"closed\" || state === \"failed\") return;\n state = \"draining\";\n };\n\n const waitForIdle = async (\n timeoutMs = options.server.gracefulShutdownTimeout,\n ): Promise<boolean> => {\n if (activeRequests === 0) return true;\n\n return await new Promise<boolean>((resolve) => {\n let settled = false;\n const finish = (drained: boolean) => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n idleWaiters.delete(onIdle);\n resolve(drained);\n };\n const onIdle = () => finish(true);\n const timeout = setTimeout(() => finish(false), timeoutMs);\n timeout.unref?.();\n idleWaiters.add(onIdle);\n });\n };\n\n const closeResources = async (reason: string) => {\n if (resourceClosePromise) return resourceClosePromise;\n resourceClosePromise = Promise.resolve()\n .then(() => options.close?.(reason))\n .then(\n () => {\n state = \"closed\";\n },\n (error) => {\n state = \"closed\";\n throw error;\n },\n );\n return resourceClosePromise;\n };\n\n const close = async (reason = \"production-server-closed\") => {\n if (resourceClosePromise) return resourceClosePromise;\n if (closePromise) return closePromise;\n beginDrain(reason);\n closePromise = Promise.race([\n Promise.resolve(startPromise).catch(() => {\n // Startup may have partially initialized resources. The close hook\n // still owns their cleanup, while the original start caller keeps the\n // startup failure.\n }),\n forcedCloseWait,\n ]).then(() => closeResources(reason));\n return closePromise;\n };\n\n const forceClose = async (reason = \"production-server-closed\") => {\n beginDrain(reason);\n resolveForcedCloseWait();\n const forcedClose = closeResources(reason);\n closePromise ??= forcedClose;\n return forcedClose;\n };\n\n const handleHealthRequest = async (request: Request): Promise<Response | null> => {\n const health = options.server.health;\n if (!health.enabled) return null;\n\n const pathname = new URL(request.url).pathname.replace(/\\/+$/, \"\") || \"/\";\n const isLiveness = pathname === health.livenessPath;\n const isReadiness = pathname === health.readinessPath;\n if (!isLiveness && !isReadiness) return null;\n\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return new Response(null, {\n status: 405,\n headers: createHealthHeaders({ allow: \"GET, HEAD\" }),\n });\n }\n\n if (isReadiness && state === \"starting\") {\n try {\n await start();\n } catch {\n // The readiness response below intentionally does not expose startup details.\n }\n }\n\n const healthy = isLiveness ? state !== \"failed\" && state !== \"closed\" : state === \"ready\";\n const body =\n request.method === \"HEAD\" ? null : JSON.stringify({ status: healthy ? \"ok\" : \"unavailable\" });\n return new Response(body, {\n status: healthy ? 200 : 503,\n headers: createHealthHeaders(healthy ? undefined : { retryAfter: \"1\" }),\n });\n };\n\n const runRequest = async (\n handler: () => Response | Promise<Response>,\n context: FarmResponseCompletionContext = {},\n ): Promise<Response> => {\n if (state === \"draining\" || state === \"closed\") return createDrainingResponse();\n await start();\n if (state !== \"ready\") return createDrainingResponse();\n\n activeRequests++;\n let finished = false;\n const finish = () => {\n if (finished) return;\n finished = true;\n activeRequests--;\n notifyIdle();\n };\n\n try {\n const response = await handler();\n return trackResponseCompletion(response, finish, context.onResponseFinished);\n } catch (error) {\n finish();\n throw error;\n }\n };\n\n return {\n get state() {\n return state;\n },\n get activeRequests() {\n return activeRequests;\n },\n start,\n beginDrain,\n waitForIdle,\n close,\n forceClose,\n handleHealthRequest,\n runRequest,\n };\n}\n\nfunction createHealthHeaders(options: { allow?: string; retryAfter?: string } = {}): Headers {\n const headers = new Headers({\n \"cache-control\": \"no-store\",\n \"content-type\": \"application/json; charset=utf-8\",\n \"x-content-type-options\": \"nosniff\",\n });\n if (options.allow) headers.set(\"allow\", options.allow);\n if (options.retryAfter) headers.set(\"retry-after\", options.retryAfter);\n return headers;\n}\n\nfunction createDrainingResponse(): Response {\n return new Response(\"Service Unavailable\", {\n status: 503,\n headers: {\n \"cache-control\": \"no-store\",\n connection: \"close\",\n \"content-type\": \"text/plain; charset=utf-8\",\n \"retry-after\": \"1\",\n \"x-content-type-options\": \"nosniff\",\n },\n });\n}\n\nfunction trackResponseCompletion(\n response: Response,\n finish: () => void,\n onResponseFinished?: (callback: () => void) => void,\n): Response {\n if (onResponseFinished) {\n try {\n onResponseFinished(finish);\n return response;\n } catch {\n // Fall through to Web Stream tracking when an adapter rejects registration.\n }\n }\n\n if (!response.body || response.bodyUsed || response.body.locked) {\n finish();\n return response;\n }\n\n const reader = response.body.getReader();\n let released = false;\n const releaseReader = () => {\n if (released) return;\n released = true;\n reader.releaseLock();\n };\n const body = new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const result = await reader.read();\n if (result.done) {\n releaseReader();\n finish();\n controller.close();\n return;\n }\n controller.enqueue(result.value);\n } catch (error) {\n releaseReader();\n finish();\n controller.error(error);\n }\n },\n cancel(reason) {\n try {\n // Cancellation closes the response now; producer cleanup may finish later.\n return reader.cancel(reason);\n } finally {\n releaseReader();\n finish();\n }\n },\n });\n\n return new Response(body, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { Readable } from \"node:stream\";\nimport type { FarmRequest } from \"../types\";\nimport { _setCurrentRequestResolver } from \"./request-bridge\";\n\nconst REQUEST_STORAGE_KEY = Symbol.for(\"@farm.js/core/request-storage\");\n\nfunction getRequestStore(): AsyncLocalStorage<Request> {\n const runtime = globalThis as typeof globalThis & Record<PropertyKey, unknown>;\n const existing = runtime[REQUEST_STORAGE_KEY];\n if (existing instanceof AsyncLocalStorage) {\n return existing as AsyncLocalStorage<Request>;\n }\n\n const storage = new AsyncLocalStorage<Request>();\n runtime[REQUEST_STORAGE_KEY] = storage;\n return storage;\n}\n\nconst requestStore = getRequestStore();\n\n_setCurrentRequestResolver(() => requestStore.getStore());\n\nexport interface FarmRequestURLOptions {\n origin?: string | URL;\n trustProxy?: boolean;\n}\n\nexport function resolveFarmRequestURL(req: FarmRequest, options: FarmRequestURLOptions = {}): URL {\n if (options.origin) {\n return new URL(req.url || \"/\", options.origin);\n }\n\n const forwardedHost = options.trustProxy\n ? firstForwardedHeaderValue(req.headers[\"x-forwarded-host\"])\n : undefined;\n const fallbackHost = firstForwardedHeaderValue(req.headers.host) || \"localhost\";\n const forwardedProto = options.trustProxy\n ? firstForwardedHeaderValue(req.headers[\"x-forwarded-proto\"])\n : undefined;\n const normalizedProto = forwardedProto?.toLowerCase();\n const proto =\n normalizedProto === \"https\" || normalizedProto === \"http\"\n ? normalizedProto\n : isEncryptedFarmRequest(req)\n ? \"https\"\n : \"http\";\n return new URL(req.url || \"/\", resolveRequestOrigin(proto, forwardedHost, fallbackHost));\n}\n\nexport function createWebRequestFromFarmRequest(\n req: FarmRequest,\n options: FarmRequestURLOptions = {},\n): Request {\n const fullUrl = resolveFarmRequestURL(req, options).toString();\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value == null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n headers.append(key, item);\n }\n continue;\n }\n\n headers.set(key, value);\n }\n\n const method = (req.method || \"GET\").toUpperCase();\n const init: RequestInit & { duplex?: \"half\" } = {\n method: req.method,\n headers,\n };\n\n if (method !== \"GET\" && method !== \"HEAD\") {\n init.body = Readable.toWeb(req) as ReadableStream<Uint8Array>;\n init.duplex = \"half\";\n }\n\n return new Request(fullUrl, init);\n}\n\nfunction isEncryptedFarmRequest(req: FarmRequest): boolean {\n return Boolean((req.socket as { encrypted?: boolean } | undefined)?.encrypted);\n}\n\nfunction firstForwardedHeaderValue(value: string | string[] | undefined): string | undefined {\n const first = Array.isArray(value) ? value[0] : value;\n const token = first?.split(\",\", 1)[0]?.trim();\n return token || undefined;\n}\n\nfunction resolveRequestOrigin(proto: \"http\" | \"https\", host: string | undefined, fallback: string) {\n for (const candidate of [host, fallback, \"localhost\"]) {\n if (!candidate) continue;\n if (/[\\s/?#@\\\\]/u.test(candidate)) continue;\n try {\n const url = new URL(`${proto}://${candidate}`);\n if (url.username || url.password || url.pathname !== \"/\" || url.search || url.hash) continue;\n return url.origin;\n } catch {\n // Try the next host instead of turning an untrusted proxy header into a 500.\n }\n }\n return `${proto}://localhost`;\n}\n\nexport async function _runWithCurrentRequest<T>(\n request: Request,\n fn: () => Promise<T> | T,\n): Promise<T> {\n return requestStore.run(request, fn);\n}\n\nexport function getCurrentRequest(): Request {\n const request = requestStore.getStore();\n if (!request) {\n throw new Error(\n \"No current request is available. getCurrentRequest() can only be used during server rendering.\",\n );\n }\n\n return request;\n}\n\n// Some runtimes (StackBlitz WebContainers among them) lose AsyncLocalStorage\n// context across async boundaries mid-render. Callers whose feature can\n// degrade gracefully should use this instead of getCurrentRequest() so a\n// missing store never turns into a 500.\nexport function getCurrentRequestOrNull(): Request | null {\n return requestStore.getStore() ?? null;\n}\n","type CurrentRequestResolver = () => Request | undefined;\n\nconst CURRENT_REQUEST_RESOLVER_KEY = Symbol.for(\"farm.currentRequestResolver\");\n\ntype GlobalWithCurrentRequestResolver = typeof globalThis & {\n [CURRENT_REQUEST_RESOLVER_KEY]?: CurrentRequestResolver;\n};\n\nfunction getGlobalState(): GlobalWithCurrentRequestResolver {\n return globalThis as GlobalWithCurrentRequestResolver;\n}\n\nexport function _setCurrentRequestResolver(resolver: CurrentRequestResolver | undefined): void {\n getGlobalState()[CURRENT_REQUEST_RESOLVER_KEY] = resolver;\n}\n\nexport function _resolveCurrentRequest(): Request | undefined {\n return getGlobalState()[CURRENT_REQUEST_RESOLVER_KEY]?.();\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { setAPIRequestRuntimeResolver, type APIRequestRuntime } from \"./server-client-bridge\";\n\nconst API_RUNTIME_STORAGE = Symbol.for(\"@farm.js/core/api-request-storage\");\nconst runtimeGlobal = globalThis as typeof globalThis & {\n [API_RUNTIME_STORAGE]?: AsyncLocalStorage<APIRequestRuntime>;\n};\nconst storage = (runtimeGlobal[API_RUNTIME_STORAGE] ??= new AsyncLocalStorage<APIRequestRuntime>());\nsetAPIRequestRuntimeResolver(() => storage.getStore());\n\n/** Bind the owning app's live route dispatcher, never a process-wide route table. */\nexport function _runWithAPIRequestRuntime<T>(runtime: APIRequestRuntime, run: () => T): T {\n return storage.run(runtime, run);\n}\n","/** Browser-safe bridge: neither handlers nor Node.js imports cross this boundary. */\nexport interface APIRequestRuntime {\n basePath: string;\n dispatch(request: Request): Promise<Response>;\n}\n\nconst API_RUNTIME_RESOLVER = Symbol.for(\"farm.apiRequestRuntimeResolver\");\ntype RuntimeGlobal = typeof globalThis & {\n [API_RUNTIME_RESOLVER]?: () => APIRequestRuntime | undefined;\n};\n\nexport function setAPIRequestRuntimeResolver(resolver: () => APIRequestRuntime | undefined): void {\n (globalThis as RuntimeGlobal)[API_RUNTIME_RESOLVER] = resolver;\n}\n\nexport function resolveAPIRequestRuntime(): APIRequestRuntime | undefined {\n return (globalThis as RuntimeGlobal)[API_RUNTIME_RESOLVER]?.();\n}\n","import {\n context,\n createContextKey,\n isSpanContextValid,\n propagation,\n SpanKind,\n SpanStatusCode,\n trace,\n type Attributes,\n type Context,\n type Span,\n} from \"@opentelemetry/api\";\nimport type { FarmEvent } from \"./observability\";\n\nexport const FARM_TRACER_NAME = \"@farm.js/core\";\n\nexport type FarmTraceSpanKind =\n | \"request\"\n | \"render\"\n | \"middleware\"\n | \"api\"\n | \"integration\"\n | \"storage\"\n | \"ppr\"\n | \"build\"\n | \"plugin\";\n\nexport interface FarmTracingConfig {\n /** Enable Farm's OpenTelemetry spans. */\n enabled?: boolean;\n /** Span families to record. All families are enabled by default. */\n spans?: readonly FarmTraceSpanKind[];\n /** Add Farm lifecycle events to the active span. Defaults to true. */\n recordEvents?: boolean;\n /** Static attributes added to every Farm-created span. */\n attributes?: Attributes;\n /** Path prefixes that should not create request spans. */\n ignorePaths?: readonly string[];\n}\n\nexport type FarmTracingUserConfig = boolean | FarmTracingConfig;\n\nexport interface FarmResolvedTracingConfig {\n enabled: boolean;\n spans: ReadonlySet<FarmTraceSpanKind>;\n recordEvents: boolean;\n attributes: Attributes;\n ignorePaths: readonly string[];\n}\n\nexport interface FarmTraceContext {\n traceId: string;\n spanId: string;\n traceSampled: boolean;\n}\n\nexport interface FarmRequestSpanOptions {\n getStatusCode?: () => number | undefined;\n onStart?: () => void;\n onComplete?: (status: number, durationMs: number) => void;\n onError?: (error: unknown, durationMs: number) => void;\n}\n\nexport interface FarmSpanOptions {\n kind?: FarmTraceSpanKind;\n attributes?: Attributes;\n spanKind?: SpanKind;\n}\n\nconst ALL_SPAN_KINDS: readonly FarmTraceSpanKind[] = [\n \"request\",\n \"render\",\n \"middleware\",\n \"api\",\n \"integration\",\n \"storage\",\n \"ppr\",\n \"build\",\n \"plugin\",\n];\n\nconst DEFAULT_IGNORED_PATHS = [\n \"/@vite/\",\n \"/@fs/\",\n \"/@id/\",\n \"/@react-refresh\",\n \"/node_modules/\",\n \"/__vite\",\n \"/.well-known/appspecific/\",\n];\nconst FARM_REQUEST_METHOD_CONTEXT_KEY = createContextKey(\"@farm.js/core/request-method\");\n\nlet tracingState: FarmResolvedTracingConfig = normalizeFarmTracingConfig(false);\n\nexport function normalizeFarmTracingConfig(\n config: FarmTracingUserConfig | undefined,\n): FarmResolvedTracingConfig {\n if (!config) {\n return {\n enabled: false,\n spans: new Set(ALL_SPAN_KINDS),\n recordEvents: true,\n attributes: {},\n ignorePaths: DEFAULT_IGNORED_PATHS,\n };\n }\n\n if (config === true) {\n return {\n enabled: true,\n spans: new Set(ALL_SPAN_KINDS),\n recordEvents: true,\n attributes: {},\n ignorePaths: DEFAULT_IGNORED_PATHS,\n };\n }\n\n return {\n enabled: config.enabled ?? true,\n spans: new Set(config.spans ?? ALL_SPAN_KINDS),\n recordEvents: config.recordEvents ?? true,\n attributes: { ...config.attributes },\n ignorePaths: [...DEFAULT_IGNORED_PATHS, ...(config.ignorePaths ?? [])],\n };\n}\n\nexport function configureFarmTracing(\n config: FarmTracingUserConfig | FarmResolvedTracingConfig | undefined,\n): void {\n if (isResolvedFarmTracingConfig(config)) {\n tracingState = {\n ...config,\n spans: new Set(config.spans),\n attributes: { ...config.attributes },\n ignorePaths: [...config.ignorePaths],\n };\n return;\n }\n tracingState = normalizeFarmTracingConfig(config as FarmTracingUserConfig | undefined);\n}\n\nfunction isResolvedFarmTracingConfig(\n config: FarmTracingUserConfig | FarmResolvedTracingConfig | undefined,\n): config is FarmResolvedTracingConfig {\n return (\n !!config &&\n typeof config === \"object\" &&\n typeof config.enabled === \"boolean\" &&\n config.spans instanceof Set &&\n typeof config.recordEvents === \"boolean\" &&\n Array.isArray(config.ignorePaths)\n );\n}\n\nexport function getFarmTracingConfig(): FarmResolvedTracingConfig {\n return tracingState;\n}\n\nexport function resetFarmTracing(): void {\n tracingState = normalizeFarmTracingConfig(false);\n}\n\nexport function getFarmTraceContext(): FarmTraceContext | undefined {\n return getSpanTraceContext(trace.getSpan(context.active()));\n}\n\nexport async function runWithFarmSpan<T>(\n name: string,\n handler: () => T | Promise<T>,\n options: FarmSpanOptions = {},\n): Promise<T> {\n const spanFamily = options.kind;\n if (!tracingState.enabled || (spanFamily !== undefined && !tracingState.spans.has(spanFamily))) {\n return await handler();\n }\n\n const tracer = trace.getTracer(FARM_TRACER_NAME);\n return await tracer.startActiveSpan(\n name,\n {\n kind: options.spanKind ?? SpanKind.INTERNAL,\n attributes: {\n ...tracingState.attributes,\n ...options.attributes,\n },\n },\n async (span) => {\n try {\n return await handler();\n } catch (error) {\n recordSpanError(span, error);\n throw error;\n } finally {\n span.end();\n }\n },\n );\n}\n\nexport async function _runWithFarmRequestSpan<T>(\n request: Request,\n handler: () => T | Promise<T>,\n options: FarmRequestSpanOptions = {},\n): Promise<T> {\n const startedAt = Date.now();\n const url = new URL(request.url);\n const shouldTrace =\n tracingState.enabled &&\n tracingState.spans.has(\"request\") &&\n !tracingState.ignorePaths.some((prefix) => url.pathname.startsWith(prefix));\n\n if (!shouldTrace) {\n options.onStart?.();\n try {\n const result = await handler();\n options.onComplete?.(resolveResultStatus(result, options), Date.now() - startedAt);\n return result;\n } catch (error) {\n options.onError?.(error, Date.now() - startedAt);\n throw error;\n }\n }\n\n const extractedContext = propagation.extract(context.active(), request.headers, {\n keys(carrier) {\n return Array.from(carrier.keys());\n },\n get(carrier, key) {\n return carrier.get(key) ?? undefined;\n },\n });\n const requestContext = extractedContext.setValue(FARM_REQUEST_METHOD_CONTEXT_KEY, request.method);\n const tracer = trace.getTracer(FARM_TRACER_NAME);\n const attributes: Attributes = {\n ...tracingState.attributes,\n \"http.request.method\": request.method,\n \"url.path\": url.pathname,\n \"url.scheme\": url.protocol.replace(/:$/, \"\"),\n \"server.address\": url.hostname,\n };\n if (url.port) attributes[\"server.port\"] = Number(url.port);\n\n return await tracer.startActiveSpan(\n `${request.method} ${url.pathname}`,\n { kind: SpanKind.SERVER, attributes },\n requestContext,\n async (span) => {\n options.onStart?.();\n try {\n const result = await handler();\n const status = resolveResultStatus(result, options);\n setResponseStatus(span, status);\n options.onComplete?.(status, Date.now() - startedAt);\n return result;\n } catch (error) {\n recordSpanError(span, error);\n options.onError?.(error, Date.now() - startedAt);\n throw error;\n } finally {\n span.end();\n }\n },\n );\n}\n\nexport function recordFarmEventTrace(event: FarmEvent): FarmTraceContext | undefined {\n if (!tracingState.enabled) return undefined;\n\n const activeContext = context.active();\n const activeSpan = trace.getSpan(activeContext);\n const traceContext = getSpanTraceContext(activeSpan);\n if (activeSpan && traceContext) {\n if (event.type === \"route.matched\") {\n const method =\n (activeContext.getValue(FARM_REQUEST_METHOD_CONTEXT_KEY) as string | undefined) ?? \"HTTP\";\n activeSpan.updateName(`${method} ${event.route}`);\n activeSpan.setAttribute(\"http.route\", event.route);\n activeSpan.setAttribute(\"farm.route\", event.route);\n }\n\n if (tracingState.recordEvents) {\n activeSpan.addEvent(event.type, toEventAttributes(event), event.timestamp);\n }\n\n const error = event.type === \"request.error\" ? undefined : getEventError(event);\n if (error !== undefined) {\n // A recoverable render error (caught by an error boundary) still fires\n // React's onError while the request returns a valid response, so record\n // the exception for visibility but let the actual response status\n // (setResponseStatus) decide the span status instead of forcing the whole\n // request trace to ERROR. A genuinely fatal render error surfaces through\n // the request outcome (a thrown handler or a >= 500 status) and is marked\n // there.\n if (event.type === \"render.error\") {\n recordSpanException(activeSpan, error);\n } else {\n recordSpanError(activeSpan, error);\n }\n }\n }\n\n const completedTraceContext = recordCompletedEventSpan(event, activeContext);\n return traceContext ?? completedTraceContext;\n}\n\nfunction recordCompletedEventSpan(\n event: FarmEvent,\n parentContext: Context,\n): FarmTraceContext | undefined {\n const descriptor = getCompletedSpanDescriptor(event);\n if (!descriptor || !tracingState.spans.has(descriptor.kind)) return undefined;\n\n const tracer = trace.getTracer(FARM_TRACER_NAME);\n const span = tracer.startSpan(\n descriptor.name,\n {\n kind: SpanKind.INTERNAL,\n startTime: event.timestamp - descriptor.durationMs,\n attributes: {\n ...tracingState.attributes,\n ...toEventAttributes(event),\n \"farm.event.type\": event.type,\n },\n },\n parentContext,\n );\n\n const status = \"status\" in event && typeof event.status === \"number\" ? event.status : undefined;\n if (status !== undefined) setResponseStatus(span, status);\n const error = getEventError(event);\n if (error !== undefined) recordSpanError(span, error);\n const traceContext = getSpanTraceContext(span);\n span.end(event.timestamp);\n return traceContext;\n}\n\nfunction getCompletedSpanDescriptor(\n event: FarmEvent,\n): { kind: FarmTraceSpanKind; name: string; durationMs: number } | undefined {\n if (!(\"durationMs\" in event) || typeof event.durationMs !== \"number\") return undefined;\n\n switch (event.type) {\n case \"render.complete\":\n return { kind: \"render\", name: `farm.render ${event.route}`, durationMs: event.durationMs };\n case \"render.stream.shellReady\":\n return {\n kind: \"render\",\n name: `farm.render.shell ${event.route}`,\n durationMs: event.durationMs,\n };\n case \"render.stream.complete\":\n return {\n kind: \"render\",\n name: `farm.render.stream ${event.route}`,\n durationMs: event.durationMs,\n };\n case \"middleware.complete\":\n return {\n kind: \"middleware\",\n name: `farm.middleware ${event.name ?? event.route ?? \"anonymous\"}`,\n durationMs: event.durationMs,\n };\n case \"api.request.complete\":\n case \"api.error\":\n return {\n kind: \"api\",\n name: `farm.api ${event.method} ${event.route}`,\n durationMs: event.durationMs,\n };\n case \"integration.api.call.complete\":\n return {\n kind: \"integration\",\n name: `farm.integration ${event.integration}.${event.operation}`,\n durationMs: event.durationMs,\n };\n case \"storage.query.complete\":\n return {\n kind: \"storage\",\n name: `farm.storage ${event.operation}`,\n durationMs: event.durationMs,\n };\n case \"ppr.refresh.complete\":\n return {\n kind: \"ppr\",\n name: `farm.ppr.refresh ${event.route}`,\n durationMs: event.durationMs,\n };\n case \"build.complete\":\n return {\n kind: \"build\",\n name: `farm.build${event.target ? ` ${event.target}` : \"\"}`,\n durationMs: event.durationMs,\n };\n case \"plugin.hook.complete\":\n return {\n kind: \"plugin\",\n name: `farm.plugin ${event.plugin}.${event.hook}`,\n durationMs: event.durationMs,\n };\n default:\n return undefined;\n }\n}\n\n// A runtime-agnostic, non-cryptographic digest (FNV-1a). This module is bundled\n// into browser and edge runtimes, so it must not import node:crypto; the digest\n// only needs to redact the raw cache key while keeping cache events correlatable,\n// which does not require a cryptographic hash.\nfunction hashFarmCacheKey(value: string): string {\n let hash = 0x811c9dc5;\n for (let index = 0; index < value.length; index++) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n\nfunction toEventAttributes(event: FarmEvent): Attributes {\n const attributes: Attributes = {};\n // A cache event's `key` embeds the serialized arguments of the cached call\n // (e.g. `unstable_cache(getUser)(email)` serializes the email into the key),\n // so it must never be exported verbatim to a tracing backend. Emit a stable\n // digest under `farm.key_hash` instead, preserving cross-event correlation\n // without shipping the sensitive payload.\n const redactKey = typeof event.type === \"string\" && event.type.startsWith(\"cache.\");\n for (const [key, value] of Object.entries(event)) {\n if (\n key === \"timestamp\" ||\n key === \"level\" ||\n key === \"error\" ||\n key === \"traceId\" ||\n key === \"spanId\" ||\n key === \"traceSampled\" ||\n value === undefined\n ) {\n continue;\n }\n if (redactKey && key === \"key\" && typeof value === \"string\") {\n attributes[\"farm.key_hash\"] = hashFarmCacheKey(value);\n continue;\n }\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n attributes[`farm.${key}`] = value;\n } else if (Array.isArray(value)) {\n if (value.every((entry) => typeof entry === \"string\")) {\n attributes[`farm.${key}`] = value as string[];\n } else if (value.every((entry) => typeof entry === \"number\")) {\n attributes[`farm.${key}`] = value as number[];\n } else if (value.every((entry) => typeof entry === \"boolean\")) {\n attributes[`farm.${key}`] = value as boolean[];\n }\n }\n }\n return attributes;\n}\n\nfunction getEventError(event: FarmEvent): unknown {\n return \"error\" in event ? event.error : undefined;\n}\n\nfunction recordSpanException(span: Span, error: unknown): Error {\n const normalized = error instanceof Error ? error : new Error(String(error));\n span.recordException(normalized);\n return normalized;\n}\n\nfunction recordSpanError(span: Span, error: unknown): void {\n const normalized = recordSpanException(span, error);\n span.setStatus({ code: SpanStatusCode.ERROR, message: normalized.message });\n}\n\nfunction setResponseStatus(span: Span, status: number): void {\n span.setAttribute(\"http.response.status_code\", status);\n if (status >= 500) {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n}\n\nfunction resolveResultStatus<T>(result: T, options: FarmRequestSpanOptions): number {\n if (result instanceof Response) return result.status;\n return options.getStatusCode?.() ?? 200;\n}\n\nfunction getSpanTraceContext(span: Span | undefined): FarmTraceContext | undefined {\n if (!span) return undefined;\n const spanContext = span.spanContext();\n if (!isSpanContextValid(spanContext)) return undefined;\n return {\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n traceSampled: (spanContext.traceFlags & 0x01) === 0x01,\n };\n}\n","import {\n _runWithFarmRequestSpan,\n configureFarmTracing,\n getFarmTraceContext,\n normalizeFarmTracingConfig,\n recordFarmEventTrace,\n resetFarmTracing,\n runWithFarmSpan,\n type FarmRequestSpanOptions,\n type FarmResolvedTracingConfig,\n type FarmSpanOptions,\n type FarmTraceContext,\n type FarmTraceSpanKind,\n type FarmTracingConfig,\n type FarmTracingUserConfig,\n} from \"./tracing\";\n\nexport type FarmEventLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface FarmEventBase {\n type: string;\n timestamp: number;\n level: FarmEventLevel;\n requestId?: string;\n traceId?: string;\n spanId?: string;\n traceSampled?: boolean;\n route?: string;\n pathname?: string;\n}\n\nexport type FarmRequestEvent =\n | (FarmEventBase & { type: \"request.start\"; method: string; pathname: string })\n | (FarmEventBase & {\n type: \"request.complete\";\n method: string;\n pathname: string;\n status: number;\n durationMs: number;\n })\n | (FarmEventBase & {\n type: \"request.error\";\n method: string;\n pathname: string;\n durationMs: number;\n error: unknown;\n });\n\nexport type FarmServerEvent =\n | (FarmEventBase & {\n type: \"server.start\";\n mode: \"dev\" | \"preview\" | \"production\";\n port?: number;\n })\n | (FarmEventBase & { type: \"server.ready\"; url?: string })\n | (FarmEventBase & { type: \"server.shutdown\"; reason?: string });\n\nexport type FarmRouteEvent =\n | (FarmEventBase & { type: \"route.discovered\"; route: string; filePath: string })\n | (FarmEventBase & {\n type: \"route.matched\";\n pathname: string;\n route: string;\n params?: Record<string, string>;\n })\n | (FarmEventBase & { type: \"route.notFound\"; pathname: string })\n | (FarmEventBase & { type: \"route.redirect\"; from: string; to: string; status?: number })\n | (FarmEventBase & { type: \"route.rewrite\"; from: string; to: string });\n\nexport type FarmRenderEvent =\n | (FarmEventBase & { type: \"render.start\"; route: string; pathname?: string })\n | (FarmEventBase & {\n type: \"render.complete\";\n route: string;\n durationMs: number;\n status?: number;\n })\n | (FarmEventBase & { type: \"render.error\"; route?: string; error: unknown })\n | (FarmEventBase & { type: \"render.stream.start\"; route: string })\n | (FarmEventBase & { type: \"render.stream.shellReady\"; route: string; durationMs: number })\n | (FarmEventBase & { type: \"render.stream.complete\"; route: string; durationMs: number });\n\nexport type FarmCacheEvent =\n | (FarmEventBase & {\n type: \"cache.hit\";\n key: string;\n route?: string;\n tags?: readonly string[];\n revalidate?: number | false;\n stale?: boolean;\n })\n | (FarmEventBase & { type: \"cache.miss\"; key: string; route?: string; reason?: string })\n | (FarmEventBase & {\n type: \"cache.set\";\n key: string;\n route?: string;\n tags?: readonly string[];\n revalidate?: number | false;\n })\n | (FarmEventBase & { type: \"cache.dedupe\"; key: string })\n | (FarmEventBase & { type: \"cache.bypass\"; key?: string; route?: string; reason: string })\n | (FarmEventBase & {\n type: \"cache.stale\";\n key: string;\n route?: string;\n tags?: readonly string[];\n revalidate?: number | false;\n })\n | (FarmEventBase & { type: \"cache.revalidatePath\"; path: string; count: number })\n | (FarmEventBase & {\n type: \"cache.revalidateTag\";\n tag: string;\n profile?: unknown;\n count: number;\n })\n | (FarmEventBase & { type: \"cache.updateTag\"; tag: string; count: number })\n | (FarmEventBase & {\n type: \"cache.invalidated\";\n key?: string;\n route?: string;\n tag?: string;\n reason?: string;\n count?: number;\n })\n | (FarmEventBase & { type: \"cache.delete\"; key: string; deleted: boolean })\n | (FarmEventBase & { type: \"cache.clear\"; count: number })\n | (FarmEventBase & {\n type: \"cache.error\";\n key?: string;\n operation: \"get\" | \"set\" | \"delete\" | \"revalidate\";\n error: unknown;\n });\n\nexport type FarmPPREvent =\n | (FarmEventBase & { type: \"ppr.shell.hit\"; route: string; key: string })\n | (FarmEventBase & { type: \"ppr.shell.miss\"; route: string; key: string })\n | (FarmEventBase & {\n type: \"ppr.shell.cached\";\n route: string;\n key: string;\n revalidate?: number;\n })\n | (FarmEventBase & { type: \"ppr.shell.bypass\"; route: string; reason: string })\n | (FarmEventBase & {\n type: \"ppr.shell.invalidated\";\n route: string;\n reason?: string;\n count?: number;\n })\n | (FarmEventBase & { type: \"ppr.suspense.holeDetected\"; route: string })\n | (FarmEventBase & { type: \"ppr.refresh.start\"; route: string })\n | (FarmEventBase & { type: \"ppr.refresh.complete\"; route: string; durationMs: number })\n | (FarmEventBase & { type: \"ppr.refresh.error\"; route: string; error: unknown });\n\nexport type FarmAPIEvent =\n | (FarmEventBase & { type: \"api.request.start\"; route: string; method: string })\n | (FarmEventBase & {\n type: \"api.request.complete\";\n route: string;\n method: string;\n status: number;\n durationMs: number;\n })\n | (FarmEventBase & {\n type: \"api.validation.failed\";\n route: string;\n method: string;\n issues?: unknown;\n })\n | (FarmEventBase & {\n type: \"api.error\";\n route: string;\n method: string;\n durationMs: number;\n error: unknown;\n });\n\nexport type FarmIntegrationEvent =\n | (FarmEventBase & { type: \"integration.registered\"; name: string })\n | (FarmEventBase & { type: \"integration.config.validated\"; name: string })\n | (FarmEventBase & { type: \"integration.ready\"; name: string })\n | (FarmEventBase & { type: \"integration.disposed\"; name: string })\n | (FarmEventBase & {\n type: \"integration.api.call.start\";\n integration: string;\n operation: string;\n })\n | (FarmEventBase & {\n type: \"integration.api.call.complete\";\n integration: string;\n operation: string;\n durationMs: number;\n })\n | (FarmEventBase & {\n type: \"integration.api.call.error\";\n integration: string;\n operation: string;\n error: unknown;\n })\n | (FarmEventBase & { type: \"integration.webhook.received\"; integration: string; event?: string })\n | (FarmEventBase & { type: \"integration.webhook.verified\"; integration: string; event?: string })\n | (FarmEventBase & { type: \"integration.webhook.failed\"; integration: string; reason: string });\n\nexport type FarmMiddlewareEvent =\n | (FarmEventBase & { type: \"middleware.start\"; route?: string; name?: string })\n | (FarmEventBase & {\n type: \"middleware.complete\";\n route?: string;\n name?: string;\n durationMs: number;\n })\n | (FarmEventBase & {\n type: \"middleware.shortCircuit\";\n route?: string;\n name?: string;\n status?: number;\n })\n | (FarmEventBase & { type: \"middleware.error\"; route?: string; name?: string; error: unknown });\n\nexport type FarmStorageEvent =\n | (FarmEventBase & { type: \"storage.query.start\"; integration?: string; operation: string })\n | (FarmEventBase & {\n type: \"storage.query.complete\";\n integration?: string;\n operation: string;\n durationMs: number;\n })\n | (FarmEventBase & {\n type: \"storage.query.error\";\n integration?: string;\n operation: string;\n error: unknown;\n })\n | (FarmEventBase & { type: \"storage.schema.ready\"; integration?: string })\n | (FarmEventBase & { type: \"storage.schema.error\"; integration?: string; error: unknown });\n\nexport type FarmBuildEvent =\n | (FarmEventBase & { type: \"build.start\"; target?: string })\n | (FarmEventBase & { type: \"build.complete\"; target?: string; durationMs: number })\n | (FarmEventBase & { type: \"build.error\"; target?: string; error: unknown })\n | (FarmEventBase & { type: \"routes.generated\"; pageCount: number; apiCount?: number })\n | (FarmEventBase & { type: \"types.generated\"; filePath: string })\n | (FarmEventBase & { type: \"manifest.generated\"; routeCount: number });\n\nexport type FarmPluginEvent =\n | (FarmEventBase & { type: \"plugin.hook.start\"; plugin: string; hook: string })\n | (FarmEventBase & {\n type: \"plugin.hook.complete\";\n plugin: string;\n hook: string;\n durationMs: number;\n })\n | (FarmEventBase & { type: \"plugin.hook.error\"; plugin: string; hook: string; error: unknown });\n\nexport type FarmErrorEvent = FarmEventBase & {\n type: \"error\";\n source: string;\n error: unknown;\n route?: string;\n};\n\nexport type FarmEvent =\n | FarmRequestEvent\n | FarmServerEvent\n | FarmRouteEvent\n | FarmRenderEvent\n | FarmCacheEvent\n | FarmPPREvent\n | FarmAPIEvent\n | FarmIntegrationEvent\n | FarmMiddlewareEvent\n | FarmStorageEvent\n | FarmBuildEvent\n | FarmPluginEvent\n | FarmErrorEvent;\n\nexport type FarmEventType = FarmEvent[\"type\"];\nexport type FarmEventHandler = (event: FarmEvent) => void | Promise<void>;\n\nexport type FarmEventInput = FarmEvent extends infer T\n ? T extends FarmEvent\n ? Omit<T, \"timestamp\" | \"level\"> & Partial<Pick<T, \"timestamp\" | \"level\">>\n : never\n : never;\n\nexport type FarmObservabilityUserConfig =\n | boolean\n | {\n logs?: boolean;\n onEvent?: FarmEventHandler | readonly FarmEventHandler[];\n events?: readonly FarmEventType[];\n tracing?: FarmTracingUserConfig;\n };\n\nexport interface FarmResolvedObservabilityConfig {\n logs: boolean;\n handlers: FarmEventHandler[];\n events?: Set<FarmEventType>;\n tracing: FarmResolvedTracingConfig;\n}\n\nexport interface FarmEventSubscriptionOptions {\n /** Receive events even when they are excluded by `observability.events`. */\n unfiltered?: boolean;\n}\n\nconst runtimeHandlers = new Set<FarmEventHandler>();\nconst unfilteredRuntimeHandlers = new Set<FarmEventHandler>();\nlet observabilityState: FarmResolvedObservabilityConfig = {\n logs: false,\n handlers: [],\n tracing: normalizeFarmTracingConfig(false),\n};\n\nexport function configureFarmObservability(config: FarmObservabilityUserConfig | undefined): void {\n observabilityState = normalizeFarmObservabilityConfig(config);\n configureFarmTracing(observabilityState.tracing);\n}\n\nexport function normalizeFarmObservabilityConfig(\n config: FarmObservabilityUserConfig | undefined,\n): FarmResolvedObservabilityConfig {\n if (config === undefined || config === false) {\n return { logs: false, handlers: [], tracing: normalizeFarmTracingConfig(false) };\n }\n\n if (config === true) {\n return { logs: true, handlers: [], tracing: normalizeFarmTracingConfig(false) };\n }\n\n const handlers = config.onEvent\n ? Array.isArray(config.onEvent)\n ? [...config.onEvent]\n : [config.onEvent]\n : [];\n\n return {\n logs: config.logs ?? false,\n handlers,\n events: config.events ? new Set(config.events) : undefined,\n tracing: normalizeFarmTracingConfig(config.tracing),\n };\n}\n\nexport function onFarmEvent(\n handler: FarmEventHandler,\n options: FarmEventSubscriptionOptions = {},\n): () => void {\n const handlers = options.unfiltered ? unfilteredRuntimeHandlers : runtimeHandlers;\n handlers.add(handler);\n return () => {\n handlers.delete(handler);\n };\n}\n\nexport function resetFarmObservability(): void {\n runtimeHandlers.clear();\n unfilteredRuntimeHandlers.clear();\n observabilityState = {\n logs: false,\n handlers: [],\n tracing: normalizeFarmTracingConfig(false),\n };\n resetFarmTracing();\n}\n\nexport function emitFarmEvent(input: FarmEventInput): FarmEvent {\n const event = {\n timestamp: Date.now(),\n level: inferFarmEventLevel(input.type),\n ...input,\n } as FarmEvent;\n\n const traceContext = recordFarmEventTrace(event);\n if (traceContext) {\n event.traceId = traceContext.traceId;\n event.spanId = traceContext.spanId;\n event.traceSampled = traceContext.traceSampled;\n }\n\n notifyFarmEventHandlers(event, unfilteredRuntimeHandlers);\n\n if (!shouldEmitFarmEvent(event)) return event;\n\n if (observabilityState.logs) {\n logFarmEvent(event);\n }\n\n notifyFarmEventHandlers(event, [...observabilityState.handlers, ...runtimeHandlers]);\n\n return event;\n}\n\nfunction notifyFarmEventHandlers(event: FarmEvent, handlers: Iterable<FarmEventHandler>): void {\n for (const handler of handlers) {\n try {\n Promise.resolve(handler(event)).catch((error) => {\n console.warn(`[farm:observability] event handler failed: ${formatError(error)}`);\n });\n } catch (error) {\n console.warn(`[farm:observability] event handler failed: ${formatError(error)}`);\n }\n }\n}\n\nexport async function runWithFarmRequestSpan<T>(\n request: Request,\n handler: () => T | Promise<T>,\n options: FarmRequestSpanOptions = {},\n): Promise<T> {\n const url = new URL(request.url);\n const method = request.method || \"GET\";\n return await _runWithFarmRequestSpan(request, handler, {\n ...options,\n onStart() {\n emitFarmEvent({ type: \"request.start\", method, pathname: url.pathname });\n options.onStart?.();\n },\n onComplete(status, durationMs) {\n emitFarmEvent({\n type: \"request.complete\",\n method,\n pathname: url.pathname,\n status,\n durationMs,\n });\n options.onComplete?.(status, durationMs);\n },\n onError(error, durationMs) {\n emitFarmEvent({\n type: \"request.error\",\n method,\n pathname: url.pathname,\n durationMs,\n error,\n });\n options.onError?.(error, durationMs);\n },\n });\n}\n\nexport { configureFarmTracing, getFarmTraceContext, normalizeFarmTracingConfig, runWithFarmSpan };\nexport type {\n FarmRequestSpanOptions,\n FarmResolvedTracingConfig,\n FarmSpanOptions,\n FarmTraceContext,\n FarmTraceSpanKind,\n FarmTracingConfig,\n FarmTracingUserConfig,\n};\n\nfunction shouldEmitFarmEvent(event: FarmEvent): boolean {\n if (\n !observabilityState.logs &&\n observabilityState.handlers.length === 0 &&\n runtimeHandlers.size === 0\n ) {\n return false;\n }\n\n if (observabilityState.events && !observabilityState.events.has(event.type)) {\n return false;\n }\n\n return true;\n}\n\nfunction inferFarmEventLevel(type: FarmEventType): FarmEventLevel {\n if (type === \"error\" || type.endsWith(\".error\") || type.endsWith(\".failed\")) {\n return \"error\";\n }\n if (\n type.endsWith(\".bypass\") ||\n type.endsWith(\".invalidated\") ||\n type.endsWith(\".stale\") ||\n type.endsWith(\".notFound\")\n ) {\n return \"warn\";\n }\n if (\n type.endsWith(\".hit\") ||\n type.endsWith(\".miss\") ||\n type.endsWith(\".start\") ||\n type.endsWith(\".shellReady\")\n ) {\n return \"debug\";\n }\n return \"info\";\n}\n\nfunction logFarmEvent(event: FarmEvent): void {\n const message = `[farm:${event.level}] ${event.type}${formatFarmEventDetails(event)}`;\n switch (event.level) {\n case \"error\":\n console.error(message);\n break;\n case \"warn\":\n console.warn(message);\n break;\n default:\n console.log(message);\n break;\n }\n}\n\nfunction formatFarmEventDetails(event: FarmEvent): string {\n const details: string[] = [];\n const record = event as unknown as Record<string, unknown>;\n\n for (const key of [\n \"route\",\n \"pathname\",\n \"method\",\n \"status\",\n \"key\",\n \"tag\",\n \"path\",\n \"reason\",\n \"durationMs\",\n \"integration\",\n \"operation\",\n \"plugin\",\n \"hook\",\n \"target\",\n \"count\",\n ]) {\n const value = record[key];\n if (value !== undefined) {\n details.push(`${key}=${formatDetailValue(value)}`);\n }\n }\n\n return details.length > 0 ? ` ${details.join(\" \")}` : \"\";\n}\n\nfunction formatDetailValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { emitFarmEvent } from \"./observability\";\nimport { notifyFarmCacheInvalidation, notifyFarmCacheTask } from \"./cache-invalidation\";\nimport { getActiveFarmI18nSnapshot } from \"./i18n/bridge\";\n\nexport { applyFarmCacheInvalidations } from \"./cache-invalidation\";\n\nexport type RevalidateTagProfile =\n | \"max\"\n | \"default\"\n | \"seconds\"\n | \"minutes\"\n | \"hours\"\n | \"days\"\n | \"weeks\"\n | \"months\"\n | { expire?: number };\n\nexport interface FarmCacheOptions {\n /**\n * Tag cached data so it can be invalidated with revalidateTag/updateTag.\n */\n tags?: readonly string[];\n /**\n * Path tags let revalidatePath invalidate data tied to a route.\n */\n paths?: readonly string[];\n /**\n * Time in seconds before the entry becomes stale. False means no TTL.\n */\n revalidate?: number | false;\n}\n\nexport interface FarmCacheSetOptions extends FarmCacheOptions {\n createdAt?: number;\n}\n\nexport type RouteDataCacheKey = string | readonly unknown[];\n\nexport type FarmCacheInvalidationTarget =\n | { key: RouteDataCacheKey }\n | { path: string }\n | { tag: string };\n\ndeclare const FARM_DEFINED_CACHE_KEY_DATA: unique symbol;\n\n/**\n * A regular Farm cache key carrying the data shape stored under that key.\n *\n * The brand exists only in TypeScript. At runtime the value remains the\n * original string or structured array, so all existing cache APIs continue to\n * accept untyped keys.\n */\nexport type DefinedCacheKey<TData, TKey extends RouteDataCacheKey = RouteDataCacheKey> = TKey & {\n readonly [FARM_DEFINED_CACHE_KEY_DATA]: TData;\n};\n\nexport type CacheKeyFactory<\n TData,\n TArguments extends readonly unknown[],\n TKey extends RouteDataCacheKey = RouteDataCacheKey,\n> = (...args: TArguments) => DefinedCacheKey<TData, TKey>;\n\nexport type InferCacheKeyData<TKey> =\n TKey extends DefinedCacheKey<infer TData, RouteDataCacheKey> ? TData : unknown;\n\n/**\n * Optionally add a data type to an existing string/array cache-key factory.\n *\n * This helper does not introduce a new runtime key representation. Calling the\n * returned factory produces the exact key returned by `factory`.\n */\nexport function defineCacheKey<TData>() {\n return <const TArguments extends readonly unknown[], const TKey extends RouteDataCacheKey>(\n factory: (...args: TArguments) => TKey,\n ): CacheKeyFactory<TData, TArguments, TKey> => {\n if (typeof factory !== \"function\") {\n throw new TypeError(\"defineCacheKey expects a key factory function.\");\n }\n\n return ((...args: TArguments) => {\n const key = factory(...args);\n if (typeof key !== \"string\" && !Array.isArray(key)) {\n throw new TypeError(\n \"A defined cache key factory must return a string or structured array.\",\n );\n }\n return key as DefinedCacheKey<TData, TKey>;\n }) as CacheKeyFactory<TData, TArguments, TKey>;\n };\n}\n\nexport interface FarmCacheEntry<T = unknown> {\n key: string;\n value: T;\n tags: readonly string[];\n /**\n * Adapter tag versions captured before the cached value was produced.\n * A later version makes the entry stale across every server instance.\n */\n tagVersions?: Readonly<Record<string, number>>;\n createdAt: number;\n createdVersion?: number;\n revalidate?: number | false;\n}\n\ninterface InternalFarmCacheEntry<T = unknown> {\n key: string;\n value: T;\n tags: Set<string>;\n tagVersions?: Readonly<Record<string, number>>;\n createdAt: number;\n createdVersion: number;\n revalidate?: number | false;\n}\n\n/**\n * Asynchronous persistence contract used by distributed Farm caches.\n *\n * Implementations are responsible for serializing cache entries and making\n * tag version updates atomic when the backing service supports it.\n */\nexport interface FarmCacheAdapter {\n readonly name?: string;\n get<T = unknown>(key: string): Promise<FarmCacheEntry<T> | null | undefined>;\n set<T = unknown>(key: string, entry: FarmCacheEntry<T>): Promise<void>;\n delete(key: string): Promise<void>;\n clear?(): Promise<void>;\n getTagVersions?(tags: readonly string[]): Promise<Readonly<Record<string, number>>>;\n invalidateTags?(tags: readonly string[]): Promise<void>;\n /** Atomically acquire a short-lived regeneration lease. */\n acquireLease?(key: string, ttlMs: number): Promise<string | null | undefined>;\n /** Release the lease only when the supplied ownership token still matches. */\n releaseLease?(key: string, token: string): Promise<void>;\n}\n\nexport interface FarmClientCacheUserConfig {\n /**\n * Module path, relative to the project root, whose default export is a\n * client cache adapter (`defineClientCacheAdapter`). The module is bundled\n * into the browser entry; the server never imports it.\n */\n adapter?: string;\n /** Extra version salt, typically a build or deploy id; entries persisted under another salt are dropped. */\n version?: string;\n /** Debounce for persisted write-behind flushes, in milliseconds. */\n flushDelayMs?: number;\n}\n\nexport interface FarmCacheUserConfig {\n /** Shared cache implementation, for example a Redis-backed adapter. */\n adapter?: FarmCacheAdapter;\n /** Prefix isolating applications and deployments sharing one adapter. */\n namespace?: string;\n /** Browser cache persistence; see the client cache adapter documentation. */\n client?: FarmClientCacheUserConfig;\n /**\n * Coordinate cache fills across processes when the adapter implements\n * acquireLease/releaseLease. Set false to disable.\n */\n lease?:\n | false\n | {\n ttlMs?: number;\n waitTimeoutMs?: number;\n pollIntervalMs?: number;\n };\n}\n\nexport interface FarmCacheStorage {\n getItem<T = unknown>(key: string): Promise<T | null>;\n setItem<T = unknown>(key: string, value: T): Promise<unknown>;\n removeItem(key: string): Promise<unknown>;\n clear?(base?: string): Promise<unknown>;\n}\n\nexport interface StorageFarmCacheAdapterOptions {\n /** Prefix used inside the supplied storage client. */\n base?: string;\n}\n\n/**\n * Adapt a Farm/unstorage-compatible key-value client to the cache contract.\n *\n * This is a portable baseline adapter. Provider-specific adapters should use\n * their atomic increment/transaction primitives for tag invalidation.\n */\nexport function storageCacheAdapter(\n storage: FarmCacheStorage,\n options: StorageFarmCacheAdapterOptions = {},\n): FarmCacheAdapter {\n if (!storage || typeof storage.getItem !== \"function\" || typeof storage.setItem !== \"function\") {\n throw new TypeError(\"storageCacheAdapter expects a compatible storage client.\");\n }\n\n const base = normalizeCacheNamespace(options.base || \"farm-cache\");\n const entryKey = (key: string) => `${base}:entry:${key}`;\n const tagKey = (tag: string) => `${base}:tag:${tag}`;\n\n return {\n name: \"storage\",\n get: <T>(key: string) => storage.getItem<FarmCacheEntry<T>>(entryKey(key)),\n set: async <T>(key: string, entry: FarmCacheEntry<T>) => {\n await storage.setItem(entryKey(key), entry);\n },\n delete: async (key: string) => {\n await storage.removeItem(entryKey(key));\n },\n clear: storage.clear\n ? async () => {\n await storage.clear!(base);\n }\n : undefined,\n getTagVersions: async (tags) => {\n const versions = await Promise.all(\n tags.map(async (tag) => {\n const value = await storage.getItem<number>(tagKey(tag));\n return [tag, normalizeAdapterVersion(value)] as const;\n }),\n );\n return Object.fromEntries(versions);\n },\n invalidateTags: async (tags) => {\n await Promise.all(\n tags.map(async (tag) => {\n const key = tagKey(tag);\n const current = normalizeAdapterVersion(await storage.getItem<number>(key));\n await storage.setItem(key, Math.max(Date.now(), current + 1));\n }),\n );\n },\n };\n}\n\nexport interface GetFarmCacheEntryOptions {\n allowStale?: boolean;\n now?: number;\n}\n\ninterface FarmCacheStaleEntry {\n tags: Iterable<string>;\n createdAt: number;\n createdVersion?: number;\n revalidate?: number | false;\n}\n\nexport class FarmDataCache {\n private entries = new Map<string, InternalFarmCacheEntry>();\n private inflight = new Map<string, Promise<unknown>>();\n private invalidatedTagVersions = new Map<string, number>();\n private version = 0;\n private generation = 0;\n private adapter?: FarmCacheAdapter;\n private namespace = \"farm\";\n private local = true;\n private lease = {\n enabled: true,\n ttlMs: 10_000,\n waitTimeoutMs: 10_000,\n pollIntervalMs: 25,\n };\n\n constructor(config: FarmCacheUserConfig = {}) {\n this.configure(config);\n }\n\n configure(config: FarmCacheUserConfig = {}): void {\n this.generation++;\n this.entries.clear();\n this.inflight.clear();\n this.invalidatedTagVersions.clear();\n this.version = 0;\n this.adapter = config.adapter;\n this.namespace = normalizeCacheNamespace(config.namespace || \"farm\");\n this.local = !config.adapter;\n this.lease =\n config.lease === false\n ? { ...this.lease, enabled: false }\n : {\n enabled: true,\n ttlMs: normalizePositiveDuration(config.lease?.ttlMs, 10_000, \"cache.lease.ttlMs\"),\n waitTimeoutMs: normalizePositiveDuration(\n config.lease?.waitTimeoutMs,\n 10_000,\n \"cache.lease.waitTimeoutMs\",\n ),\n pollIntervalMs: normalizePositiveDuration(\n config.lease?.pollIntervalMs,\n 25,\n \"cache.lease.pollIntervalMs\",\n ),\n };\n }\n\n get adapterName(): string {\n return this.adapter?.name || (this.adapter ? \"custom\" : \"memory\");\n }\n\n get hasAdapter(): boolean {\n return this.adapter !== undefined;\n }\n\n get size(): number {\n return this.entries.size;\n }\n\n get<T>(key: string, options: GetFarmCacheEntryOptions = {}): T | undefined {\n return this.getEntry<T>(key, options)?.value;\n }\n\n getEntry<T = unknown>(\n key: string,\n options: GetFarmCacheEntryOptions = {},\n ): FarmCacheEntry<T> | undefined {\n const entry = this.entries.get(key) as InternalFarmCacheEntry<T> | undefined;\n if (!entry) {\n emitFarmEvent({ type: \"cache.miss\", key });\n return undefined;\n }\n\n const stale = this.isStale(entry, options.now);\n if (stale) {\n emitFarmEvent({\n type: \"cache.stale\",\n key,\n tags: Array.from(entry.tags),\n revalidate: entry.revalidate,\n });\n }\n\n if (!options.allowStale && stale) {\n emitFarmEvent({ type: \"cache.miss\", key, reason: \"stale\" });\n return undefined;\n }\n\n emitFarmEvent({\n type: \"cache.hit\",\n key,\n tags: Array.from(entry.tags),\n revalidate: entry.revalidate,\n stale,\n });\n\n return this.toPublicEntry(entry);\n }\n\n async getEntryAsync<T = unknown>(\n key: string,\n options: GetFarmCacheEntryOptions = {},\n ): Promise<FarmCacheEntry<T> | undefined> {\n if (this.local) {\n const localEntry = this.getEntry<T>(key, options);\n if (localEntry) return localEntry;\n }\n\n if (!this.adapter) {\n return this.local ? undefined : this.getEntry<T>(key, options);\n }\n\n const generation = this.generation;\n const adapter = this.adapter;\n const namespace = this.namespace;\n const entry = await adapter.get<T>(`${namespace}:entry:${key}`);\n if (generation !== this.generation) return undefined;\n if (!entry) {\n emitFarmEvent({ type: \"cache.miss\", key });\n return undefined;\n }\n\n assertFarmCacheEntry(entry, key);\n const stale = await this.isAdapterEntryStale(entry, options.now, adapter, namespace);\n if (generation !== this.generation) return undefined;\n if (stale) {\n emitFarmEvent({\n type: \"cache.stale\",\n key,\n tags: [...entry.tags],\n revalidate: entry.revalidate,\n });\n if (!options.allowStale) {\n emitFarmEvent({ type: \"cache.miss\", key, reason: \"stale\" });\n return undefined;\n }\n }\n\n emitFarmEvent({\n type: \"cache.hit\",\n key,\n tags: [...entry.tags],\n revalidate: entry.revalidate,\n stale,\n });\n\n if (this.local && !stale) {\n this.hydrateLocalEntry(entry);\n }\n return { ...entry, key };\n }\n\n set<T>(key: string, value: T, options: FarmCacheSetOptions = {}): FarmCacheEntry<T> {\n const tags = new Set<string>();\n for (const tag of options.tags ?? []) {\n tags.add(normalizeCacheTag(tag));\n }\n for (const routePath of options.paths ?? []) {\n tags.add(createPathCacheTag(routePath));\n }\n\n const entry: InternalFarmCacheEntry<T> = {\n key,\n value,\n tags,\n tagVersions: undefined,\n createdAt: options.createdAt ?? Date.now(),\n createdVersion: ++this.version,\n revalidate: normalizeRevalidate(options.revalidate),\n };\n\n this.entries.set(key, entry);\n emitFarmEvent({\n type: \"cache.set\",\n key,\n tags: Array.from(tags),\n revalidate: entry.revalidate,\n });\n return this.toPublicEntry(entry);\n }\n\n async setAsync<T>(\n key: string,\n value: T,\n options: FarmCacheSetOptions = {},\n tagVersions?: Readonly<Record<string, number>>,\n ): Promise<FarmCacheEntry<T>> {\n return this.writeAsync(key, value, options, tagVersions);\n }\n\n private async writeAsync<T>(\n key: string,\n value: T,\n options: FarmCacheSetOptions,\n tagVersions?: Readonly<Record<string, number>>,\n createdVersion?: number,\n ): Promise<FarmCacheEntry<T>> {\n const tags = normalizeCacheOptionsTags(options);\n const capturedVersions =\n tagVersions ?? (await this.getAdapterTagVersions(Array.from(tags.values())));\n const entry: FarmCacheEntry<T> = {\n key,\n value,\n tags: Array.from(tags),\n tagVersions: capturedVersions,\n createdAt: options.createdAt ?? Date.now(),\n createdVersion: createdVersion ?? ++this.version,\n revalidate: normalizeRevalidate(options.revalidate),\n };\n\n if (this.local) {\n this.hydrateLocalEntry(entry);\n }\n if (this.adapter) {\n await this.adapter.set(this.createAdapterKey(key), entry);\n }\n\n emitFarmEvent({\n type: \"cache.set\",\n key,\n tags: [...entry.tags],\n revalidate: entry.revalidate,\n });\n return entry;\n }\n\n delete(key: string): boolean {\n const deleted = this.entries.delete(key);\n emitFarmEvent({ type: \"cache.delete\", key, deleted });\n return deleted;\n }\n\n async deleteAsync(key: string): Promise<boolean> {\n const deleted = this.entries.delete(key);\n if (this.adapter) {\n await this.adapter.delete(this.createAdapterKey(key));\n }\n emitFarmEvent({ type: \"cache.delete\", key, deleted: this.adapter ? true : deleted });\n return this.adapter ? true : deleted;\n }\n\n clear(): void {\n const count = this.entries.size;\n this.generation++;\n this.entries.clear();\n this.inflight.clear();\n this.invalidatedTagVersions.clear();\n this.version = 0;\n emitFarmEvent({ type: \"cache.clear\", count });\n }\n\n async clearAsync(): Promise<void> {\n this.clear();\n await this.adapter?.clear?.();\n }\n\n isStale(entry: FarmCacheStaleEntry, now = Date.now()): boolean {\n if (\n typeof entry.revalidate === \"number\" &&\n entry.revalidate >= 0 &&\n now - entry.createdAt >= entry.revalidate * 1000\n ) {\n return true;\n }\n\n for (const tag of entry.tags) {\n const invalidatedVersion = this.invalidatedTagVersions.get(normalizeCacheTag(tag));\n if (\n typeof invalidatedVersion === \"number\" &&\n typeof entry.createdVersion === \"number\" &&\n invalidatedVersion > entry.createdVersion\n ) {\n return true;\n }\n }\n\n return false;\n }\n\n async isStaleAsync(entry: FarmCacheEntry, now = Date.now()): Promise<boolean> {\n if (this.adapter) {\n return this.isAdapterEntryStale(entry, now);\n }\n return this.isStale(entry, now);\n }\n\n revalidateTag(\n tag: string,\n options: { source?: \"revalidateTag\" | \"updateTag\"; profile?: RevalidateTagProfile } = {},\n ): number {\n const normalized = normalizeCacheTag(tag);\n const count = this.invalidateTag(normalized);\n emitFarmEvent(\n options.source === \"updateTag\"\n ? { type: \"cache.updateTag\", tag: normalized, count }\n : { type: \"cache.revalidateTag\", tag: normalized, profile: options.profile, count },\n );\n return count;\n }\n\n async revalidateTagAsync(\n tag: string,\n options: { source?: \"revalidateTag\" | \"updateTag\"; profile?: RevalidateTagProfile } = {},\n ): Promise<number> {\n const normalized = normalizeCacheTag(tag);\n const count = this.invalidateTag(normalized);\n await this.adapter?.invalidateTags?.([this.createAdapterTag(normalized)]);\n emitFarmEvent(\n options.source === \"updateTag\"\n ? { type: \"cache.updateTag\", tag: normalized, count }\n : { type: \"cache.revalidateTag\", tag: normalized, profile: options.profile, count },\n );\n return count;\n }\n\n revalidatePath(routePath: string): number {\n const normalizedPath = normalizeRevalidatePath(routePath);\n const pathTag = createPathCacheTag(normalizedPath);\n const pprCount = this.countEntriesForTags([pathTag, \"ppr\"]);\n const count = this.invalidateTag(pathTag);\n emitFarmEvent({ type: \"cache.revalidatePath\", path: normalizedPath, count });\n\n if (pprCount > 0) {\n emitFarmEvent({\n type: \"ppr.shell.invalidated\",\n route: normalizedPath,\n reason: \"revalidatePath\",\n count: pprCount,\n });\n }\n\n return count;\n }\n\n async revalidatePathAsync(routePath: string): Promise<number> {\n const normalizedPath = normalizeRevalidatePath(routePath);\n const pathTag = createPathCacheTag(normalizedPath);\n const pprCount = this.countEntriesForTags([pathTag, \"ppr\"]);\n const count = this.invalidateTag(pathTag);\n await this.adapter?.invalidateTags?.([this.createAdapterTag(pathTag)]);\n emitFarmEvent({ type: \"cache.revalidatePath\", path: normalizedPath, count });\n\n if (pprCount > 0) {\n emitFarmEvent({\n type: \"ppr.shell.invalidated\",\n route: normalizedPath,\n reason: \"revalidatePath\",\n count: pprCount,\n });\n }\n\n return count;\n }\n\n async getOrSet<T>(\n key: string,\n producer: () => Promise<T> | T,\n options: FarmCacheOptions = {},\n ): Promise<T> {\n const cached = await this.getEntryAsync<T>(key);\n if (cached) {\n return cached.value;\n }\n\n const inflight = this.inflight.get(key) as Promise<T> | undefined;\n if (inflight) {\n emitFarmEvent({ type: \"cache.dedupe\", key });\n return inflight;\n }\n\n const tags = Array.from(normalizeCacheOptionsTags(options));\n const generation = this.generation;\n const promise = this.fillCacheEntry(key, producer, options, tags, generation)\n .catch((error) => {\n emitFarmEvent({ type: \"cache.error\", key, operation: \"set\", error });\n throw error;\n })\n .finally(() => {\n if (this.inflight.get(key) === promise) {\n this.inflight.delete(key);\n }\n });\n\n this.inflight.set(key, promise);\n return promise;\n }\n\n private async fillCacheEntry<T>(\n key: string,\n producer: () => Promise<T> | T,\n options: FarmCacheOptions,\n tags: readonly string[],\n generation: number,\n ): Promise<T> {\n const adapter = this.adapter;\n const namespace = this.namespace;\n const lease = { ...this.lease };\n const leaseKey = `${namespace}:lease:${key}`;\n let leaseToken: string | null | undefined;\n\n if (adapter?.acquireLease && adapter.releaseLease && lease.enabled) {\n leaseToken = await adapter.acquireLease(leaseKey, lease.ttlMs);\n if (!leaseToken) {\n const shared = await this.waitForAdapterEntry<T>(\n key,\n adapter,\n namespace,\n lease,\n generation,\n );\n if (shared) {\n emitFarmEvent({ type: \"cache.dedupe\", key });\n return shared.value;\n }\n if (generation === this.generation) {\n leaseToken = await adapter.acquireLease(leaseKey, lease.ttlMs);\n }\n }\n }\n\n try {\n const initialCreatedVersion = this.version;\n const initialTagVersions = await this.getAdapterTagVersions(tags, adapter, namespace);\n const value = await producer();\n if (generation === this.generation) {\n await this.writeAsync(key, value, options, initialTagVersions, initialCreatedVersion);\n }\n return value;\n } finally {\n if (leaseToken && adapter?.releaseLease) {\n await adapter.releaseLease(leaseKey, leaseToken);\n }\n }\n }\n\n private async waitForAdapterEntry<T>(\n key: string,\n adapter: FarmCacheAdapter,\n namespace: string,\n lease: typeof this.lease,\n generation: number,\n ): Promise<FarmCacheEntry<T> | undefined> {\n const deadline = Date.now() + lease.waitTimeoutMs;\n while (Date.now() < deadline) {\n await delay(lease.pollIntervalMs);\n if (generation !== this.generation) return undefined;\n const entry = await adapter.get<T>(`${namespace}:entry:${key}`);\n if (generation !== this.generation) return undefined;\n if (!entry) {\n emitFarmEvent({ type: \"cache.miss\", key });\n continue;\n }\n assertFarmCacheEntry(entry, key);\n const stale = await this.isAdapterEntryStale(entry, Date.now(), adapter, namespace);\n if (generation !== this.generation) return undefined;\n if (stale) {\n emitFarmEvent({\n type: \"cache.stale\",\n key,\n tags: [...entry.tags],\n revalidate: entry.revalidate,\n });\n emitFarmEvent({ type: \"cache.miss\", key, reason: \"stale\" });\n } else {\n emitFarmEvent({\n type: \"cache.hit\",\n key,\n tags: [...entry.tags],\n revalidate: entry.revalidate,\n stale: false,\n });\n return { ...entry, key };\n }\n }\n return undefined;\n }\n\n private countEntriesForTag(tag: string): number {\n let count = 0;\n for (const entry of this.entries.values()) {\n if (entry.tags.has(tag)) {\n count++;\n }\n }\n return count;\n }\n\n private countEntriesForTags(tags: readonly string[]): number {\n let count = 0;\n for (const entry of this.entries.values()) {\n if (tags.every((tag) => entry.tags.has(tag))) {\n count++;\n }\n }\n return count;\n }\n\n private invalidateTag(normalizedTag: string): number {\n this.invalidatedTagVersions.set(normalizedTag, ++this.version);\n return this.countEntriesForTag(normalizedTag);\n }\n\n private toPublicEntry<T>(entry: InternalFarmCacheEntry<T>): FarmCacheEntry<T> {\n return {\n key: entry.key,\n value: entry.value,\n tags: Array.from(entry.tags),\n tagVersions: entry.tagVersions,\n createdAt: entry.createdAt,\n createdVersion: entry.createdVersion,\n revalidate: entry.revalidate,\n };\n }\n\n private hydrateLocalEntry<T>(entry: FarmCacheEntry<T>): void {\n this.entries.set(entry.key, {\n key: entry.key,\n value: entry.value,\n tags: new Set(entry.tags.map(normalizeCacheTag)),\n tagVersions: entry.tagVersions,\n createdAt: entry.createdAt,\n createdVersion: entry.createdVersion ?? ++this.version,\n revalidate: normalizeRevalidate(entry.revalidate),\n });\n }\n\n private createAdapterKey(key: string): string {\n return `${this.namespace}:entry:${key}`;\n }\n\n private createAdapterTag(tag: string): string {\n return `${this.namespace}:tag:${tag}`;\n }\n\n private async getAdapterTagVersions(\n tags: readonly string[],\n adapter = this.adapter,\n namespace = this.namespace,\n ): Promise<Readonly<Record<string, number>>> {\n if (!adapter?.getTagVersions || tags.length === 0) return {};\n\n const normalized = tags.map(normalizeCacheTag);\n const physicalTags = normalized.map((tag) => `${namespace}:tag:${tag}`);\n const versions = await adapter.getTagVersions(physicalTags);\n return Object.fromEntries(\n normalized.map((tag, index) => [\n tag,\n normalizeAdapterVersion(versions[physicalTags[index]!]),\n ]),\n );\n }\n\n private async isAdapterEntryStale(\n entry: FarmCacheEntry,\n now = Date.now(),\n adapter = this.adapter,\n namespace = this.namespace,\n ): Promise<boolean> {\n if (\n typeof entry.revalidate === \"number\" &&\n entry.revalidate >= 0 &&\n now - entry.createdAt >= entry.revalidate * 1000\n ) {\n return true;\n }\n\n const currentVersions = await this.getAdapterTagVersions(entry.tags, adapter, namespace);\n for (const tag of entry.tags) {\n if (\n normalizeAdapterVersion(currentVersions[tag]) >\n normalizeAdapterVersion(entry.tagVersions?.[tag])\n ) {\n return true;\n }\n }\n return false;\n }\n}\n\nconst FARM_DATA_CACHE_SYMBOL = Symbol.for(\"farm.dataCache\");\nconst farmDataCacheGlobal = globalThis as typeof globalThis & {\n [FARM_DATA_CACHE_SYMBOL]?: FarmDataCache;\n};\nconst sharedFarmDataCache = (farmDataCacheGlobal[FARM_DATA_CACHE_SYMBOL] ??= new FarmDataCache());\n\nexport function getFarmDataCache(): FarmDataCache {\n return sharedFarmDataCache;\n}\n\nexport function configureFarmCache(config: FarmCacheUserConfig | undefined): void {\n sharedFarmDataCache.configure(config);\n}\n\n/**\n * Wrap an async function so its results are cached and shared across requests,\n * processes, and restarts.\n *\n * The cache key is built from the wrapped function's identity (its name and a\n * hash of its source), the active locale, `keyParts`, and the call arguments.\n * Deriving identity from the source — rather than the closure instance — is\n * deliberate: it keeps the key stable across processes and restarts so a\n * distributed cache adapter can share entries between server instances.\n *\n * The consequence is that two closures with **identical source text but\n * different captured variables** produce the same identity. Pass those captured\n * values in `keyParts` so they take part in the key; otherwise the closures\n * share a cache entry and return each other's data:\n *\n * ```ts\n * // Collides: both closures have identical source, and `table` is captured,\n * // not an argument, so it never reaches the key.\n * const makeLoader = (table: string) =>\n * unstable_cache(async (id: number) => db.get(table, id));\n *\n * // Correct: the captured value disambiguates the two closures.\n * const makeLoader = (table: string) =>\n * unstable_cache(async (id: number) => db.get(table, id), [table]);\n * ```\n *\n * Values passed as call arguments already participate in the key and do not\n * need to be repeated in `keyParts`.\n *\n * @param fn The async function to memoize.\n * @param keyParts Extra values that identify this call site. Include every\n * variable the function closes over that is not one of its arguments.\n * @param options Tags, paths, and revalidation settings for the cached entry.\n */\nexport function unstable_cache<Args extends unknown[], Result>(\n fn: (...args: Args) => Result | Promise<Result>,\n keyParts: readonly unknown[] = [],\n options: FarmCacheOptions = {},\n): (...args: Args) => Promise<Result> {\n return async (...args: Args): Promise<Result> => {\n const locale = getActiveFarmI18nSnapshot()?.locale;\n const key = createFarmCacheKey([\n \"unstable_cache\",\n getFunctionCacheIdentity(fn),\n locale ? [\"locale\", locale] : null,\n keyParts,\n args,\n ]);\n return getFarmDataCache().getOrSet<Result>(key, () => fn(...args), options);\n };\n}\n\n/**\n * Invalidate every cache entry carrying `tag`.\n *\n * Observability note: the `count` on the emitted `cache.revalidateTag` event is\n * derived from Farm's process-local entry tracking. With a shared `cache.adapter`\n * configured, entries live in the adapter rather than in local memory, so the\n * count can read as `0` even though the invalidation is still propagated to the\n * adapter and applied. Treat it as a best-effort signal, not a distributed count.\n */\nexport function revalidateTag(_tag: string, _profile?: RevalidateTagProfile): void | Promise<void> {\n const cache = getFarmDataCache();\n if (cache.hasAdapter) {\n const task = cache\n .revalidateTagAsync(_tag, {\n source: \"revalidateTag\",\n profile: _profile,\n })\n .then(() => undefined);\n notifyFarmCacheTask(task);\n return task;\n }\n cache.revalidateTag(_tag, {\n source: \"revalidateTag\",\n profile: _profile,\n });\n}\n\nexport function updateTag(tag: string): void | Promise<void> {\n const cache = getFarmDataCache();\n if (cache.hasAdapter) {\n const task = cache.revalidateTagAsync(tag, { source: \"updateTag\" }).then(() => undefined);\n notifyFarmCacheTask(task);\n return task;\n }\n cache.revalidateTag(tag, { source: \"updateTag\" });\n}\n\n/**\n * Invalidate cached data for a route path (and its PPR shell, if any).\n *\n * Observability note: the `count` on the emitted `cache.revalidatePath` event and\n * the `ppr.shell.invalidated` event are derived from process-local entry tracking.\n * With a shared `cache.adapter`, PPR shells live in the adapter rather than in\n * local memory, so the count can read as `0` and `ppr.shell.invalidated` may not\n * be emitted even though the invalidation is still propagated to the adapter and\n * applied.\n */\nexport function revalidatePath(routePath: string): void | Promise<void> {\n const cache = getFarmDataCache();\n if (cache.hasAdapter) {\n const task = cache.revalidatePathAsync(routePath).then(() => undefined);\n notifyFarmCacheTask(task);\n return task;\n }\n cache.revalidatePath(routePath);\n}\n\nexport function invalidate(key: RouteDataCacheKey): void | Promise<void> {\n const clientKey = createRouteDataCacheKey(key);\n const task = updateTag(createRouteDataCacheTag(key));\n notifyFarmCacheInvalidation(clientKey);\n return task;\n}\n\nexport function invalidateRouteData(key: RouteDataCacheKey): void | Promise<void> {\n return invalidate(key);\n}\n\n/**\n * Apply a normalized set of invalidation targets and return browser cache keys\n * that should be carried with an action/endpoint response.\n */\nexport async function applyFarmCacheInvalidationTargets(\n targets: readonly FarmCacheInvalidationTarget[],\n): Promise<readonly string[]> {\n if (!Array.isArray(targets)) {\n throw new TypeError(\"Cache invalidations must resolve to an array of targets.\");\n }\n\n const clientKeys: string[] = [];\n for (const target of targets) {\n assertFarmCacheInvalidationTarget(target);\n if (\"key\" in target) {\n await invalidate(target.key);\n clientKeys.push(createRouteDataCacheKey(target.key));\n } else if (\"path\" in target) {\n await revalidatePath(target.path);\n } else {\n await updateTag(target.tag);\n }\n }\n return Array.from(new Set(clientKeys));\n}\n\nexport function createPathCacheTag(routePath: string): string {\n return `path:${normalizeRevalidatePath(routePath)}`;\n}\n\nexport function createRouteDataCacheTag(key: RouteDataCacheKey): string {\n return `route-data:${createRouteDataCacheKey(key)}`;\n}\n\nexport function createRouteDataCacheKey(key: RouteDataCacheKey): string {\n return createFarmCacheKey(Array.isArray(key) ? key : [key]);\n}\n\nexport function normalizeRevalidatePath(routePath: string): string {\n if (typeof routePath !== \"string\") {\n throw new TypeError(\"revalidatePath expects a path string.\");\n }\n\n let normalized = routePath.trim();\n if (!normalized) {\n throw new Error(\"revalidatePath expects a non-empty path.\");\n }\n\n try {\n if (/^https?:\\/\\//i.test(normalized)) {\n normalized = new URL(normalized).pathname;\n }\n } catch {\n // Keep the original path if URL parsing fails.\n }\n\n normalized = normalized.split(/[?#]/, 1)[0] ?? normalized;\n normalized = normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n normalized = normalized.replace(/\\/{2,}/g, \"/\");\n if (normalized.length > 1) {\n normalized = normalized.replace(/\\/+$/, \"\");\n }\n return normalized || \"/\";\n}\n\nexport function createFarmCacheKey(parts: readonly unknown[]): string {\n return stableSerialize(parts);\n}\n\nfunction normalizeRevalidate(revalidate: number | false | undefined): number | false | undefined {\n if (revalidate === false || revalidate === undefined) {\n return revalidate;\n }\n if (!Number.isFinite(revalidate) || revalidate < 0) {\n return undefined;\n }\n // 0 is meaningful: the entry is stale immediately, i.e. always re-produced.\n return revalidate;\n}\n\nfunction normalizeCacheTag(tag: string): string {\n if (typeof tag !== \"string\") {\n throw new TypeError(\"Cache tags must be strings.\");\n }\n const normalized = tag.trim();\n if (!normalized) {\n throw new Error(\"Cache tags cannot be empty.\");\n }\n return normalized;\n}\n\nfunction normalizeCacheNamespace(namespace: string): string {\n if (typeof namespace !== \"string\") {\n throw new TypeError(\"Cache namespace must be a string.\");\n }\n const normalized = namespace.trim().replace(/:+$/g, \"\");\n if (!normalized) {\n throw new Error(\"Cache namespace cannot be empty.\");\n }\n return normalized;\n}\n\nfunction normalizeAdapterVersion(value: unknown): number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0 ? value : 0;\n}\n\nfunction normalizePositiveDuration(\n value: number | undefined,\n fallback: number,\n name: string,\n): number {\n if (value === undefined) return fallback;\n if (!Number.isFinite(value) || value <= 0) {\n throw new TypeError(`${name} must be a positive number of milliseconds.`);\n }\n return Math.floor(value);\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction normalizeCacheOptionsTags(options: FarmCacheOptions): Set<string> {\n const tags = new Set<string>();\n for (const tag of options.tags ?? []) {\n tags.add(normalizeCacheTag(tag));\n }\n for (const routePath of options.paths ?? []) {\n tags.add(createPathCacheTag(routePath));\n }\n return tags;\n}\n\nfunction assertFarmCacheEntry(\n entry: FarmCacheEntry,\n expectedKey: string,\n): asserts entry is FarmCacheEntry {\n if (\n !entry ||\n typeof entry !== \"object\" ||\n entry.key !== expectedKey ||\n !Array.isArray(entry.tags) ||\n typeof entry.createdAt !== \"number\"\n ) {\n throw new TypeError(\n `Cache adapter returned an invalid entry for ${JSON.stringify(expectedKey)}.`,\n );\n }\n}\n\nfunction assertFarmCacheInvalidationTarget(\n target: unknown,\n): asserts target is FarmCacheInvalidationTarget {\n if (!target || typeof target !== \"object\") {\n throw new TypeError(\"Cache invalidation targets must be { key }, { path }, or { tag }.\");\n }\n\n if (\"key\" in target) {\n const key = (target as { key?: unknown }).key;\n if (typeof key === \"string\" || Array.isArray(key)) return;\n } else if (\"path\" in target && typeof (target as { path?: unknown }).path === \"string\") {\n return;\n } else if (\"tag\" in target && typeof (target as { tag?: unknown }).tag === \"string\") {\n return;\n }\n\n throw new TypeError(\"Cache invalidation targets must contain a string/array key, path, or tag.\");\n}\n\nfunction getFunctionCacheIdentity(fn: Function): string {\n // The name alone collides across modules — two different functions both\n // named getUser would share cache entries. Include a hash of the source so\n // only genuinely identical functions share, and the identity stays stable\n // across processes and restarts.\n const name = fn.name || \"anonymous\";\n return `${name}:${hashFunctionSource(String(fn))}`;\n}\n\nfunction hashFunctionSource(source: string): string {\n // FNV-1a, 32-bit.\n let hash = 0x811c9dc5;\n for (let index = 0; index < source.length; index++) {\n hash ^= source.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(36);\n}\n\nfunction compareCodepoint(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction serializeBinaryBytes(bytes: Uint8Array): string {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction stableSerialize(value: unknown, seen = new WeakSet<object>()): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n\n const valueType = typeof value;\n if (valueType === \"string\") return JSON.stringify(value);\n if (valueType === \"number\" || valueType === \"boolean\" || valueType === \"bigint\") {\n return `${valueType}:${String(value)}`;\n }\n if (valueType === \"symbol\") {\n return `symbol:${String(value)}`;\n }\n if (valueType === \"function\") {\n return `function:${getFunctionCacheIdentity(value as Function)}`;\n }\n\n if (value instanceof Date) {\n // toISOString throws on an Invalid Date. Key building must not throw on a\n // supported type, so all invalid dates share one stable marker and the\n // caller's own validation decides what to do with the input.\n return Number.isNaN(value.getTime()) ? \"date:invalid\" : `date:${value.toISOString()}`;\n }\n if (value instanceof URL) {\n return `url:${value.toString()}`;\n }\n if (value instanceof RegExp) {\n return `regexp:${value.toString()}`;\n }\n if (value instanceof ArrayBuffer) {\n return `arraybuffer:${serializeBinaryBytes(new Uint8Array(value))}`;\n }\n if (typeof SharedArrayBuffer !== \"undefined\" && value instanceof SharedArrayBuffer) {\n return `sharedarraybuffer:${serializeBinaryBytes(new Uint8Array(value))}`;\n }\n if (ArrayBuffer.isView(value)) {\n const viewType = Object.prototype.toString.call(value).slice(8, -1);\n const bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n return `binary:${viewType}:${serializeBinaryBytes(bytes)}`;\n }\n\n if (value && typeof value === \"object\") {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n\n if (Array.isArray(value)) {\n const items: string[] = [];\n for (let index = 0; index < value.length; index++) {\n items.push(\n Object.prototype.hasOwnProperty.call(value, index)\n ? stableSerialize(value[index], seen)\n : \"[Hole]\",\n );\n }\n seen.delete(value);\n return `[${items.join(\",\")}]`;\n }\n\n // Set and Map keep their contents internally, so Object.entries is empty\n // for both. Serialize the contents and sort them by codepoint so equal\n // contents give the same key regardless of insertion order.\n if (value instanceof Set) {\n const items = Array.from(value, (item) => stableSerialize(item, seen)).sort(compareCodepoint);\n seen.delete(value);\n return `set:[${items.join(\",\")}]`;\n }\n if (value instanceof Map) {\n const items = Array.from(\n value,\n ([key, item]) => `[${stableSerialize(key, seen)},${stableSerialize(item, seen)}]`,\n ).sort(compareCodepoint);\n seen.delete(value);\n return `map:[${items.join(\",\")}]`;\n }\n\n // Codepoint comparison, not localeCompare: the host locale must not\n // change how a \"stable\" key serializes, or invalidations computed on one\n // server can miss entries written by another.\n const entries = Object.entries(value as Record<string, unknown>).sort(([a], [b]) =>\n compareCodepoint(a, b),\n );\n const serialized = entries\n .map(([key, item]) => `${JSON.stringify(key)}:${stableSerialize(item, seen)}`)\n .join(\",\");\n\n seen.delete(value);\n return `{${serialized}}`;\n }\n\n return String(value);\n}\n","const FARM_BASE_PATH = Symbol.for(\"farm.basePath\");\n\nfunction getFarmGlobalState(): Record<PropertyKey, unknown> {\n return globalThis as unknown as Record<PropertyKey, unknown>;\n}\n\n/** @internal Configure the app-wide base path for framework link rendering. */\nexport function setFarmBasePath(basePath: string | undefined): void {\n getFarmGlobalState()[FARM_BASE_PATH] = normalizeFarmBasePath(basePath);\n}\n\n/** @internal Read the app-wide base path used by framework links. */\nexport function getFarmBasePath(): string {\n return (getFarmGlobalState()[FARM_BASE_PATH] as string | undefined) ?? \"\";\n}\n\nexport function applyFarmBasePath(href: string, basePath = getFarmBasePath()): string {\n const normalizedBasePath = normalizeFarmBasePath(basePath);\n if (!normalizedBasePath || !href.startsWith(\"/\") || href.startsWith(\"//\")) return href;\n const canonicalHref = canonicalizeAppRelativeHref(href);\n if (\n canonicalHref === normalizedBasePath ||\n canonicalHref.startsWith(`${normalizedBasePath}/`) ||\n canonicalHref.startsWith(`${normalizedBasePath}?`) ||\n canonicalHref.startsWith(`${normalizedBasePath}#`)\n ) {\n return canonicalHref;\n }\n return `${normalizedBasePath}${canonicalHref}`;\n}\n\nfunction canonicalizeAppRelativeHref(href: string): string {\n const origin = \"http://farm.local\";\n const resolved = new URL(href, origin);\n if (resolved.origin !== origin) {\n throw new Error(\"Farm app-relative href cannot change the URL origin.\");\n }\n return `${resolved.pathname}${resolved.search}${resolved.hash}`;\n}\n\nexport function stripFarmBasePath(pathname: string, basePath = getFarmBasePath()): string {\n const normalizedBasePath = normalizeFarmBasePath(basePath);\n if (!normalizedBasePath) return pathname || \"/\";\n if (pathname === normalizedBasePath) return \"/\";\n if (!pathname.startsWith(`${normalizedBasePath}/`)) return pathname || \"/\";\n return pathname.slice(normalizedBasePath.length) || \"/\";\n}\n\nexport function normalizeFarmBasePath(basePath: string | undefined): string {\n if (!basePath || basePath === \"/\") return \"\";\n\n const hasUnstableCharacters = (candidate: string) =>\n candidate.includes(\"\\\\\") ||\n Array.from(candidate).some((character) => {\n const code = character.charCodeAt(0);\n return code <= 31 || (code >= 127 && code <= 159);\n });\n\n if (hasUnstableCharacters(basePath)) {\n throw new Error(\"Farm basePath cannot contain backslashes or control characters.\");\n }\n\n const pathname = basePath.trim();\n if (!pathname || pathname === \"/\") return \"\";\n if (pathname.includes(\"?\") || pathname.includes(\"#\")) {\n throw new Error(\"Farm basePath cannot contain a query string or hash.\");\n }\n if (pathname.startsWith(\"//\") || /^[a-z][a-z\\d+.-]*:\\/\\//i.test(pathname)) {\n throw new Error('Farm basePath must be a pathname such as \"/docs\", not a URL.');\n }\n\n for (const segment of pathname.split(\"/\")) {\n let decoded = segment;\n try {\n decoded = decodeURIComponent(segment);\n } catch {\n // Malformed escapes remain literal in URL pathnames and cannot be dot segments.\n }\n if (hasUnstableCharacters(decoded)) {\n throw new Error(\"Farm basePath cannot contain backslashes or control characters.\");\n }\n if (decoded.includes(\"/\")) {\n throw new Error(\"Farm basePath cannot contain percent-encoded path separators.\");\n }\n if (decoded === \".\" || decoded === \"..\") {\n throw new Error('Farm basePath cannot contain \".\" or \"..\" path segments.');\n }\n }\n\n return `/${pathname}`.replace(/\\/{2,}/g, \"/\").replace(/\\/+$/, \"\");\n}\n\n/** Normalize a configured application base path while preserving `/` for root. */\nexport function normalizeFarmConfigBasePath(basePath: string | undefined): string {\n return normalizeFarmBasePath(basePath) || \"/\";\n}\n","import { applyFarmBasePath, stripFarmBasePath } from \"../base-path\";\nimport type { FarmI18nDirection, FarmI18nRouting, ResolvedFarmI18nConfig } from \"./types\";\n\nexport interface FarmLocalePathConfig {\n locales: readonly string[];\n defaultLocale: string;\n routing: FarmI18nRouting;\n basePath?: string;\n}\n\nexport interface FarmLocalePathMatch {\n locale?: string;\n pathname: string;\n explicit: boolean;\n}\n\nconst RTL_LANGUAGES = new Set([\n \"ar\",\n \"arc\",\n \"ckb\",\n \"dv\",\n \"fa\",\n \"he\",\n \"ku\",\n \"nqo\",\n \"ps\",\n \"sd\",\n \"syr\",\n \"ug\",\n \"ur\",\n \"yi\",\n]);\n\nexport function resolveFarmLocalePath(\n pathname: string,\n config: FarmLocalePathConfig,\n): FarmLocalePathMatch {\n const normalized = normalizePathname(stripFarmBasePath(pathname, config.basePath));\n if (config.routing === \"none\") {\n return { pathname: normalized, explicit: false };\n }\n\n const segments = normalized.split(\"/\").filter(Boolean);\n const firstSegment = segments[0];\n const locale = config.locales.find(\n (candidate) => candidate.toLowerCase() === firstSegment?.toLowerCase(),\n );\n if (!locale) {\n return { pathname: normalized, explicit: false };\n }\n\n const remaining = segments.slice(1);\n return {\n locale,\n pathname: remaining.length > 0 ? `/${remaining.join(\"/\")}` : \"/\",\n explicit: true,\n };\n}\n\nexport function stripFarmLocaleFromPathname(\n pathname: string,\n config: FarmLocalePathConfig,\n): string {\n return resolveFarmLocalePath(pathname, config).pathname;\n}\n\nexport function localizeFarmPathname(\n pathname: string,\n locale: string,\n config: FarmLocalePathConfig,\n): string {\n const internalPathname = resolveFarmLocalePath(pathname, config).pathname;\n let localizedPathname = internalPathname;\n if (config.routing === \"none\") {\n return applyFarmBasePath(localizedPathname, config.basePath);\n }\n if (config.routing === \"prefix-except-default\" && locale === config.defaultLocale) {\n return applyFarmBasePath(localizedPathname, config.basePath);\n }\n localizedPathname = internalPathname === \"/\" ? `/${locale}` : `/${locale}${internalPathname}`;\n return applyFarmBasePath(localizedPathname, config.basePath);\n}\n\nexport function localizeFarmHref(\n href: string,\n locale: string,\n config: FarmLocalePathConfig,\n): string {\n if (!href.startsWith(\"/\") || href.startsWith(\"//\")) return href;\n const url = new URL(href, \"http://farm.local\");\n url.pathname = localizeFarmPathname(url.pathname, locale, config);\n return `${url.pathname}${url.search}${url.hash}`;\n}\n\nexport function getFarmLocaleDirection(\n locale: string,\n direction: ResolvedFarmI18nConfig[\"direction\"] | undefined,\n): FarmI18nDirection {\n const configured = direction?.[locale];\n if (configured) return configured;\n const language = locale.split(\"-\")[0]?.toLowerCase() || locale.toLowerCase();\n return RTL_LANGUAGES.has(language) ? \"rtl\" : \"ltr\";\n}\n\nfunction normalizePathname(pathname: string): string {\n const withLeadingSlash = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n if (withLeadingSlash === \"/\") return \"/\";\n return withLeadingSlash.replace(/\\/{2,}/g, \"/\").replace(/\\/$/, \"\") || \"/\";\n}\n","import { localizeFarmPathname, resolveFarmLocalePath } from \"./routing\";\nimport { stripFarmBasePath } from \"../base-path\";\nimport type { FarmI18nLocaleSource, ResolvedFarmI18nConfig } from \"./types\";\n\nexport interface FarmLocaleResolution {\n locale: string;\n source: FarmI18nLocaleSource;\n pathname: string;\n redirect?: string;\n persist: boolean;\n}\n\nexport function getFarmLocaleVaryHeaders(\n config: ResolvedFarmI18nConfig,\n resolution: FarmLocaleResolution,\n): string[] {\n if (!config.enabled || resolution.source === \"url\") return [];\n\n const headers: string[] = [];\n if (config.detection.includes(\"cookie\")) headers.push(\"Cookie\");\n if (config.detection.includes(\"accept-language\")) headers.push(\"Accept-Language\");\n return headers;\n}\n\nexport function resolveFarmLocaleRequest(\n request: Request,\n config: ResolvedFarmI18nConfig,\n options: { redirect?: boolean } = {},\n): FarmLocaleResolution {\n const url = new URL(request.url);\n if (!config.enabled) {\n return {\n locale: config.defaultLocale,\n source: \"default\",\n pathname: url.pathname,\n persist: false,\n };\n }\n\n const pathMatch = resolveFarmLocalePath(url.pathname, config);\n if (pathMatch.explicit && pathMatch.locale) {\n const canonicalPath = localizeFarmPathname(pathMatch.pathname, pathMatch.locale, config);\n const redirect =\n options.redirect !== false && canonicalPath !== url.pathname\n ? `${canonicalPath}${url.search}${url.hash}`\n : undefined;\n return {\n locale: pathMatch.locale,\n source: \"url\",\n pathname: pathMatch.pathname,\n redirect,\n // Locale-prefixed pages are canonical and can be cached publicly. Locale\n // switchers persist the same choice before navigating in the browser.\n persist: false,\n };\n }\n\n const detected = detectLocale(request, config);\n const shouldRedirect =\n options.redirect !== false &&\n !isInternalOrApiPath(stripFarmBasePath(url.pathname, config.basePath)) &&\n config.routing !== \"none\" &&\n (config.routing === \"prefix-always\" || detected.locale !== config.defaultLocale);\n\n return {\n locale: detected.locale,\n source: detected.source,\n pathname: pathMatch.pathname,\n redirect: shouldRedirect\n ? `${localizeFarmPathname(pathMatch.pathname, detected.locale, config)}${url.search}${url.hash}`\n : undefined,\n persist: detected.source !== \"default\",\n };\n}\n\nexport function createFarmLocaleCookie(\n locale: string,\n config: Pick<ResolvedFarmI18nConfig, \"cookie\">,\n): string {\n const cookie = config.cookie;\n let value = `${encodeURIComponent(cookie.name)}=${encodeURIComponent(locale)}`;\n value += `; Max-Age=${cookie.maxAge}`;\n value += `; Path=${cookie.path}`;\n value += `; SameSite=${capitalize(cookie.sameSite)}`;\n if (cookie.secure) value += \"; Secure\";\n return value;\n}\n\nexport function matchFarmLocale(\n requested: string | null | undefined,\n locales: readonly string[],\n): string | undefined {\n if (!requested) return undefined;\n let canonical: string;\n try {\n canonical = Intl.getCanonicalLocales(requested)[0]!;\n } catch {\n return undefined;\n }\n\n const exact = locales.find((locale) => locale.toLowerCase() === canonical.toLowerCase());\n if (exact) return exact;\n\n const language = canonical.split(\"-\")[0]?.toLowerCase();\n return locales.find((locale) => locale.split(\"-\")[0]?.toLowerCase() === language);\n}\n\nfunction detectLocale(\n request: Request,\n config: ResolvedFarmI18nConfig,\n): { locale: string; source: FarmI18nLocaleSource } {\n for (const signal of config.detection) {\n if (signal === \"url\") continue;\n\n if (signal === \"cookie\") {\n const locale = matchFarmLocale(\n readCookie(request.headers.get(\"cookie\"), config.cookie.name),\n config.locales,\n );\n if (locale) return { locale, source: \"cookie\" };\n }\n\n if (signal === \"accept-language\") {\n const locale = resolveAcceptLanguage(request.headers.get(\"accept-language\"), config.locales);\n if (locale) return { locale, source: \"accept-language\" };\n }\n }\n\n return { locale: config.defaultLocale, source: \"default\" };\n}\n\nfunction resolveAcceptLanguage(\n header: string | null,\n locales: readonly string[],\n): string | undefined {\n if (!header) return undefined;\n\n const byRange = new Map<string, { locale: string; quality: number; index: number }>();\n for (const [index, entry] of header.split(\",\").entries()) {\n const [rawLocale = \"\", ...parameters] = entry.trim().split(\";\");\n const locale = rawLocale.trim();\n if (!locale) continue;\n\n let quality = 1;\n for (const parameter of parameters) {\n const [rawName, rawValue] = parameter.trim().split(\"=\", 2);\n if (rawName?.trim().toLowerCase() !== \"q\") continue;\n const value = rawValue?.trim() ?? \"\";\n quality = /^(?:0(?:\\.\\d{0,3})?|1(?:\\.0{0,3})?)$/.test(value) ? Number(value) : 0;\n }\n\n const key = locale.toLowerCase();\n const previous = byRange.get(key);\n if (!previous || quality > previous.quality) {\n byRange.set(key, { locale, quality, index: previous?.index ?? index });\n }\n }\n\n const candidates = [...byRange.values()]\n .filter((candidate) => candidate.quality > 0)\n .sort((a, b) => b.quality - a.quality || a.index - b.index);\n const explicitRanges = [...byRange.values()].filter(({ locale }) => locale !== \"*\");\n\n for (const candidate of candidates) {\n if (candidate.locale === \"*\") {\n const wildcardMatch = locales.find(\n (locale) =>\n !explicitRanges.some((range) => matchFarmLocale(range.locale, [locale]) !== undefined),\n );\n if (wildcardMatch) return wildcardMatch;\n continue;\n }\n\n const locale = matchFarmLocale(candidate.locale, locales);\n if (locale) return locale;\n }\n return undefined;\n}\n\nfunction readCookie(header: string | null, name: string): string | undefined {\n if (!header) return undefined;\n for (const part of header.split(\";\")) {\n const separator = part.indexOf(\"=\");\n if (separator < 0) continue;\n let key: string;\n try {\n key = decodeURIComponent(part.slice(0, separator).trim());\n } catch {\n continue;\n }\n if (key !== name) continue;\n try {\n return decodeURIComponent(part.slice(separator + 1).trim());\n } catch {\n return part.slice(separator + 1).trim();\n }\n }\n return undefined;\n}\n\nfunction isInternalOrApiPath(pathname: string): boolean {\n return (\n pathname === \"/api\" ||\n pathname.startsWith(\"/api/\") ||\n pathname.startsWith(\"/__farm/\") ||\n pathname.startsWith(\"/_farm/\")\n );\n}\n\nfunction capitalize(value: string): string {\n return value.charAt(0).toUpperCase() + value.slice(1);\n}\n","/**\n * Agent-readiness configuration: opt-in primitives that make a Farm site easier\n * for AI agents and crawlers to discover, resolve, and use. Off by default so\n * sites that do not want agent exposure (internal tools, private dashboards) are\n * unaffected.\n */\n\n/** schema.org JSON-LD emitted in the document head to identify the site. */\nexport interface FarmAgentJsonLd {\n /**\n * schema.org `@type`. Common values: `\"Organization\"` for a company or\n * project, `\"SoftwareApplication\"` for a product, `\"WebSite\"`, `\"Person\"`.\n *\n * @default \"Organization\"\n */\n type?: string;\n /** Entity name. Defaults to the site's Open Graph site name or page title. */\n name?: string;\n /** Canonical URL for the entity. Defaults to the configured `metadataBase`. */\n url?: string;\n /** Short description. Defaults to the page/site metadata description. */\n description?: string;\n /** Logo URL. */\n logo?: string;\n /** URLs that also represent this entity (social profiles, repos) — schema.org `sameAs`. */\n sameAs?: string[];\n /** Additional schema.org properties merged into the emitted object. */\n properties?: Record<string, unknown>;\n}\n\nexport interface FarmAgentUserConfig {\n /**\n * Emit schema.org JSON-LD in the document head so agents and crawlers can\n * resolve the site's identity. `true` emits an `Organization` built from the\n * site's metadata; an object customizes the type and fields.\n *\n * @default false\n */\n jsonLd?: boolean | FarmAgentJsonLd;\n}\n\nexport interface ResolvedFarmAgentConfig {\n jsonLd: FarmAgentJsonLd | false;\n}\n\nexport function resolveFarmAgentConfig(\n input: FarmAgentUserConfig | undefined,\n): ResolvedFarmAgentConfig {\n const jsonLd = input?.jsonLd;\n if (!jsonLd) return { jsonLd: false };\n return { jsonLd: jsonLd === true ? {} : jsonLd };\n}\n\nexport interface FarmAgentJsonLdContext {\n metadataBase?: string;\n siteName?: string;\n title?: string;\n description?: string;\n}\n\nfunction pruneUndefined(object: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(object)) {\n if (value !== undefined && value !== null && value !== \"\") result[key] = value;\n }\n return result;\n}\n\n/**\n * Serialize a JSON-LD object for inline `<script>` embedding, escaping `<` so a\n * value containing `</script>` cannot break out of the tag.\n */\nfunction serializeJsonLd(value: unknown): string {\n return JSON.stringify(value).replace(/</g, \"\\\\u003c\");\n}\n\n/**\n * Build a JSON-LD `<script>` tag for the site identity, or an empty string when\n * there is not enough information to emit meaningful structured data.\n */\nexport function renderFarmAgentJsonLd(\n config: FarmAgentJsonLd,\n context: FarmAgentJsonLdContext,\n): string {\n const base = pruneUndefined({\n name: config.name ?? context.siteName ?? context.title,\n url: config.url ?? context.metadataBase,\n description: config.description ?? context.description,\n logo: config.logo,\n sameAs: config.sameAs && config.sameAs.length > 0 ? config.sameAs : undefined,\n });\n\n const object = {\n \"@context\": \"https://schema.org\",\n \"@type\": config.type || \"Organization\",\n ...base,\n ...(config.properties || {}),\n };\n\n // Nothing beyond @context/@type and no custom properties: not worth emitting.\n if (Object.keys(object).length <= 2 && !config.properties) {\n return \"\";\n }\n\n return `<script type=\"application/ld+json\">${serializeJsonLd(object)}</script>`;\n}\n","import type { Metadata } from \"./types\";\nimport { renderFarmAgentJsonLd, type FarmAgentJsonLd } from \"./agent-config\";\n\nexport type MetadataImageKind = \"opengraph\" | \"twitter\";\n\nexport interface FarmMetadataImageReference {\n kind: MetadataImageKind;\n href: string;\n alt?: string;\n width?: number;\n height?: number;\n contentType?: string;\n}\n\nexport interface RenderedMetadataHead {\n title: string;\n tags: string;\n hasFavicon: boolean;\n /** False when the title is the framework fallback rather than configured. */\n hasExplicitTitle: boolean;\n}\n\ntype MetadataRecord = Metadata & Record<string, any>;\n\nexport function mergeMetadata(\n base: MetadataRecord | undefined,\n next: MetadataRecord | undefined,\n): MetadataRecord {\n if (!base) return next ? { ...next } : {};\n if (!next) return { ...base };\n\n return {\n ...base,\n ...next,\n title: mergeMetadataTitle(base.title, next.title),\n openGraph: mergeNestedMetadata(base.openGraph, next.openGraph),\n twitter: mergeNestedMetadata(base.twitter, next.twitter),\n alternates: mergeNestedMetadata((base as any).alternates, (next as any).alternates),\n icons: mergeNestedMetadata((base as any).icons, (next as any).icons),\n };\n}\n\nfunction mergeMetadataTitle(base: Metadata[\"title\"], next: Metadata[\"title\"]): Metadata[\"title\"] {\n if (next === undefined) return base;\n\n const parentTemplate = isRecord(base) ? normalizeContent(base.template) : undefined;\n if (typeof next === \"string\") {\n return parentTemplate ? applyTitleTemplate(parentTemplate, next) : next;\n }\n\n if (!isRecord(next)) return next;\n\n const defaultTitle = normalizeContent(next.default) ?? resolveMetadataTitle(base);\n return {\n ...next,\n default:\n defaultTitle && parentTemplate\n ? applyTitleTemplate(parentTemplate, defaultTitle)\n : defaultTitle,\n };\n}\n\nfunction applyTitleTemplate(template: string, title: string): string {\n return template.split(\"%s\").join(title);\n}\n\nexport function addMetadataImageReference(\n metadata: MetadataRecord,\n reference: FarmMetadataImageReference,\n): MetadataRecord {\n if (reference.kind === \"opengraph\") {\n const openGraph = { ...metadata.openGraph };\n if (!hasMetadataImages(openGraph.images) && !hasMetadataImages((openGraph as any).image)) {\n openGraph.images = [\n {\n url: reference.href,\n width: reference.width,\n height: reference.height,\n alt: reference.alt,\n type: reference.contentType,\n },\n ];\n }\n\n return {\n ...metadata,\n openGraph,\n };\n }\n\n const twitter = { ...metadata.twitter };\n if (!hasMetadataImages(twitter.images)) {\n twitter.images = [reference.href];\n twitter.card = twitter.card || \"summary_large_image\";\n }\n\n return {\n ...metadata,\n twitter,\n };\n}\n\nexport interface RenderMetadataHeadOptions {\n /**\n * Current request pathname. Used to emit a default `<link rel=\"canonical\">`\n * when the route does not set one, so agents and crawlers can resolve the\n * page's identity. Combined with `metadataBase` into an absolute URL when a\n * base is configured; otherwise emitted as a self-referential path.\n */\n pathname?: string;\n /**\n * Agent JSON-LD config. When truthy, a schema.org JSON-LD script is emitted in\n * the head, built from this config and the page/site metadata. `true` uses the\n * defaults; `false`/omitted (the default) emits nothing.\n */\n jsonLd?: FarmAgentJsonLd | boolean;\n}\n\nexport function renderMetadataHead(\n metadata: MetadataRecord | undefined,\n options: RenderMetadataHeadOptions = {},\n): RenderedMetadataHead {\n const resolvedMetadata = metadata || {};\n const metadataBase = resolveMetadataBase(resolvedMetadata);\n const explicitTitle = resolveMetadataTitle(resolvedMetadata.title);\n const title = explicitTitle || \"Farm.js App\";\n const tags: string[] = [];\n\n appendMetaName(tags, \"description\", resolvedMetadata.description);\n appendMetaName(tags, \"keywords\", normalizeKeywords(resolvedMetadata.keywords));\n appendMetaName(tags, \"author\", (resolvedMetadata as any).author);\n\n if (Array.isArray(resolvedMetadata.authors)) {\n for (const author of resolvedMetadata.authors) {\n appendMetaName(tags, \"author\", author?.name);\n if (author?.url) {\n appendLink(tags, \"author\", resolveMetadataUrl(author.url, metadataBase));\n }\n }\n }\n\n appendMetaName(tags, \"creator\", resolvedMetadata.creator);\n appendMetaName(tags, \"publisher\", resolvedMetadata.publisher);\n appendMetaName(tags, \"robots\", normalizeRobots(resolvedMetadata.robots));\n\n const alternates = (resolvedMetadata as any).alternates;\n const explicitCanonical = isRecord(alternates) ? alternates.canonical : undefined;\n // Default the canonical link to the current path when the route does not set\n // one. This is a self-referential canonical (absolute when `metadataBase` is\n // configured), which is safe for every page and gives agents/crawlers a\n // stable identity for the URL.\n const canonicalHref =\n explicitCanonical != null\n ? resolveMetadataUrl(explicitCanonical, metadataBase)\n : options.pathname\n ? resolveMetadataUrl(options.pathname, metadataBase)\n : undefined;\n if (canonicalHref) {\n appendLink(tags, \"canonical\", canonicalHref);\n }\n\n if (isRecord(alternates) && isRecord(alternates.languages)) {\n for (const [language, href] of Object.entries(alternates.languages)) {\n appendLink(tags, \"alternate\", resolveMetadataUrl(href, metadataBase), {\n hreflang: language,\n });\n }\n }\n\n const hasFavicon = appendIcons(tags, (resolvedMetadata as any).icons, metadataBase);\n\n if ((resolvedMetadata as any).manifest) {\n appendLink(\n tags,\n \"manifest\",\n resolveMetadataUrl((resolvedMetadata as any).manifest, metadataBase),\n );\n }\n\n appendOpenGraph(tags, resolvedMetadata.openGraph, metadataBase);\n appendTwitter(tags, resolvedMetadata.twitter, metadataBase);\n\n if (options.jsonLd) {\n const jsonLdConfig = options.jsonLd === true ? {} : options.jsonLd;\n const jsonLdScript = renderFarmAgentJsonLd(jsonLdConfig, {\n metadataBase,\n siteName: isRecord(resolvedMetadata.openGraph)\n ? normalizeContent(resolvedMetadata.openGraph.siteName)\n : undefined,\n title: explicitTitle,\n description: normalizeContent(resolvedMetadata.description),\n });\n if (jsonLdScript) tags.push(jsonLdScript);\n }\n\n return {\n title: escapeText(title),\n tags: tags.length > 0 ? `\\n ${tags.join(\"\\n \")}` : \"\",\n hasFavicon,\n hasExplicitTitle: Boolean(explicitTitle),\n };\n}\n\nfunction mergeNestedMetadata(base: unknown, next: unknown): any {\n if (isRecord(base) && isRecord(next)) {\n return {\n ...base,\n ...next,\n };\n }\n\n return next ?? base;\n}\n\nfunction appendOpenGraph(tags: string[], openGraph: Metadata[\"openGraph\"], metadataBase?: string) {\n if (!isRecord(openGraph)) return;\n\n appendMetaProperty(tags, \"og:title\", openGraph.title);\n appendMetaProperty(tags, \"og:description\", openGraph.description);\n appendMetaProperty(tags, \"og:url\", resolveMetadataUrl(openGraph.url, metadataBase));\n appendMetaProperty(tags, \"og:site_name\", openGraph.siteName);\n // Default og:type so a route that sets Open Graph data without a type still\n // emits a valid entity type for agents and social crawlers.\n appendMetaProperty(tags, \"og:type\", openGraph.type ?? \"website\");\n appendMetaProperty(tags, \"og:locale\", (openGraph as any).locale);\n\n const images = normalizeMetadataImages(\n openGraph.images ?? (openGraph as any).image,\n metadataBase,\n );\n for (const image of images) {\n appendMetaProperty(tags, \"og:image\", image.url);\n appendMetaProperty(tags, \"og:image:width\", image.width);\n appendMetaProperty(tags, \"og:image:height\", image.height);\n appendMetaProperty(tags, \"og:image:alt\", image.alt);\n appendMetaProperty(tags, \"og:image:type\", image.type);\n }\n}\n\nfunction appendTwitter(tags: string[], twitter: Metadata[\"twitter\"], metadataBase?: string) {\n if (!isRecord(twitter)) return;\n\n appendMetaName(tags, \"twitter:card\", twitter.card);\n appendMetaName(tags, \"twitter:site\", twitter.site);\n appendMetaName(tags, \"twitter:creator\", twitter.creator);\n appendMetaName(tags, \"twitter:title\", twitter.title);\n appendMetaName(tags, \"twitter:description\", twitter.description);\n\n for (const image of normalizeMetadataImages(twitter.images, metadataBase)) {\n appendMetaName(tags, \"twitter:image\", image.url);\n appendMetaName(tags, \"twitter:image:alt\", image.alt);\n }\n}\n\nfunction appendIcons(tags: string[], icons: unknown, metadataBase?: string): boolean {\n if (!icons) return false;\n\n if (typeof icons === \"string\") {\n const initialTagCount = tags.length;\n appendLink(tags, \"icon\", resolveMetadataUrl(icons, metadataBase));\n return tags.length > initialTagCount;\n }\n\n if (!isRecord(icons)) return false;\n\n const initialTagCount = tags.length;\n appendIconList(tags, \"icon\", icons.icon, metadataBase);\n appendIconList(tags, \"shortcut icon\", icons.shortcut, metadataBase);\n const hasFavicon = tags.length > initialTagCount;\n appendIconList(tags, \"apple-touch-icon\", icons.apple, metadataBase);\n return hasFavicon;\n}\n\nfunction appendIconList(tags: string[], rel: string, value: unknown, metadataBase?: string) {\n for (const icon of normalizeArray(value)) {\n if (typeof icon === \"string\") {\n appendLink(tags, rel, resolveMetadataUrl(icon, metadataBase));\n continue;\n }\n\n if (!isRecord(icon)) continue;\n appendLink(tags, rel, resolveMetadataUrl(icon.url, metadataBase), {\n sizes: icon.sizes,\n type: icon.type,\n });\n }\n}\n\nfunction appendMetaName(tags: string[], name: string, content: unknown) {\n const normalized = normalizeContent(content);\n if (!normalized) return;\n tags.push(`<meta name=\"${escapeAttribute(name)}\" content=\"${escapeAttribute(normalized)}\">`);\n}\n\nfunction appendMetaProperty(tags: string[], property: string, content: unknown) {\n const normalized = normalizeContent(content);\n if (!normalized) return;\n tags.push(\n `<meta property=\"${escapeAttribute(property)}\" content=\"${escapeAttribute(normalized)}\">`,\n );\n}\n\nfunction appendLink(\n tags: string[],\n rel: string,\n href: unknown,\n attrs: Record<string, unknown> = {},\n) {\n const normalizedHref = normalizeContent(href);\n if (!normalizedHref) return;\n\n const attrText = Object.entries(attrs)\n .map(([key, value]) => {\n const normalized = normalizeContent(value);\n return normalized ? ` ${key}=\"${escapeAttribute(normalized)}\"` : \"\";\n })\n .join(\"\");\n\n tags.push(\n `<link rel=\"${escapeAttribute(rel)}\" href=\"${escapeAttribute(normalizedHref)}\"${attrText}>`,\n );\n}\n\nfunction normalizeMetadataImages(\n value: unknown,\n metadataBase?: string,\n): Array<{\n url: string;\n width?: number;\n height?: number;\n alt?: string;\n type?: string;\n}> {\n return normalizeArray(value)\n .map((item) => {\n if (typeof item === \"string\") {\n return { url: resolveMetadataUrl(item, metadataBase) || item };\n }\n\n if (!isRecord(item)) return null;\n const rawUrl = item.url || item.src;\n const url = resolveMetadataUrl(rawUrl, metadataBase);\n if (!url) return null;\n\n return {\n url,\n width: normalizeNumber(item.width),\n height: normalizeNumber(item.height),\n alt: typeof item.alt === \"string\" ? item.alt : undefined,\n type: typeof item.type === \"string\" ? item.type : undefined,\n };\n })\n .filter((item): item is NonNullable<typeof item> => item !== null);\n}\n\nfunction normalizeArray(value: unknown): unknown[] {\n if (value == null) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction hasMetadataImages(value: unknown): boolean {\n return normalizeMetadataImages(value).length > 0;\n}\n\nfunction resolveMetadataTitle(title: Metadata[\"title\"]): string | undefined {\n if (typeof title === \"string\") return title;\n if (isRecord(title)) {\n return normalizeContent(title.default);\n }\n return undefined;\n}\n\nfunction normalizeKeywords(keywords: Metadata[\"keywords\"]): string | undefined {\n if (Array.isArray(keywords)) return keywords.filter(Boolean).join(\", \");\n return keywords;\n}\n\nfunction normalizeRobots(robots: Metadata[\"robots\"]): string | undefined {\n if (typeof robots === \"string\") return robots;\n if (!isRecord(robots)) return undefined;\n\n const values: string[] = [];\n if (typeof robots.index === \"boolean\") values.push(robots.index ? \"index\" : \"noindex\");\n if (typeof robots.follow === \"boolean\") values.push(robots.follow ? \"follow\" : \"nofollow\");\n return values.join(\", \") || undefined;\n}\n\nfunction resolveMetadataBase(metadata: MetadataRecord): string | undefined {\n const base = metadata.metadataBase;\n if (!base) return undefined;\n return String(base);\n}\n\nfunction resolveMetadataUrl(value: unknown, metadataBase?: string): string | undefined {\n const normalized = normalizeContent(value);\n if (!normalized) return undefined;\n if (!metadataBase) return normalized;\n\n try {\n return new URL(normalized, metadataBase).toString();\n } catch {\n return normalized;\n }\n}\n\nfunction normalizeNumber(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\") {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return undefined;\n}\n\nfunction normalizeContent(value: unknown): string | undefined {\n if (value == null) return undefined;\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n if (value instanceof URL) return value.toString();\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction escapeText(value: string): string {\n return value.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeText(value).replace(/\"/g, \""\");\n}\n","/** @internal */\nexport function omitFarmResponseBody(response: Response): Response {\n if (response.body) {\n void response.body.cancel().catch(() => undefined);\n }\n\n return new Response(null, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n}\n","import { omitFarmResponseBody } from \"./response-body\";\n\nexport type ApplicationMetadataRouteKind = \"sitemap\" | \"robots\" | \"manifest\";\n\nexport namespace MetadataRoute {\n export type SitemapChangeFrequency =\n | \"always\"\n | \"hourly\"\n | \"daily\"\n | \"weekly\"\n | \"monthly\"\n | \"yearly\"\n | \"never\";\n\n export interface SitemapEntry {\n url: string;\n lastModified?: string | Date;\n changeFrequency?: SitemapChangeFrequency;\n priority?: number;\n alternates?: {\n languages?: Record<string, string>;\n };\n }\n\n export type Sitemap = SitemapEntry[];\n\n export interface RobotsRule {\n userAgent: string | string[];\n allow?: string | string[];\n disallow?: string | string[];\n crawlDelay?: number;\n }\n\n export interface Robots {\n rules: RobotsRule | RobotsRule[];\n sitemap?: string | string[];\n host?: string;\n }\n\n export interface ManifestIcon {\n src: string;\n sizes?: string;\n type?: string;\n purpose?: string;\n }\n\n export interface Manifest {\n name?: string;\n short_name?: string;\n description?: string;\n id?: string;\n start_url?: string;\n scope?: string;\n display?: \"fullscreen\" | \"standalone\" | \"minimal-ui\" | \"browser\" | string;\n orientation?: string;\n background_color?: string;\n theme_color?: string;\n lang?: string;\n dir?: \"ltr\" | \"rtl\" | \"auto\";\n categories?: string[];\n icons?: ManifestIcon[];\n [key: string]: unknown;\n }\n}\n\nexport interface MetadataRouteContext {\n request: Request;\n params: Record<string, string>;\n searchParams: URLSearchParams;\n /** The concrete route-segment path that owns the metadata file. */\n path: string;\n}\n\nexport interface FarmMetadataRouteModule {\n revalidate?: number | false;\n}\n\nexport interface FarmMetadataRouteResponseOptions {\n method?: string;\n}\n\nfunction isResponse(value: unknown): value is Response {\n return (\n typeof Response !== \"undefined\" &&\n (value instanceof Response ||\n Boolean(\n value &&\n typeof value === \"object\" &&\n typeof (value as Response).arrayBuffer === \"function\" &&\n (value as Response).headers,\n ))\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nfunction resolveCacheControl(revalidate: number | false | undefined): string {\n if (revalidate === false) {\n return \"public, max-age=31536000, immutable\";\n }\n if (typeof revalidate === \"number\" && Number.isFinite(revalidate) && revalidate > 0) {\n return `public, s-maxage=${Math.floor(revalidate)}, stale-while-revalidate=300`;\n }\n return \"public, max-age=0, must-revalidate\";\n}\n\nfunction escapeXml(value: unknown): string {\n return String(value)\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction serializeSitemap(value: unknown): string {\n if (!Array.isArray(value)) {\n throw new TypeError(\"sitemap.ts must return an array or a Response\");\n }\n\n const entries = value.map((candidate, index) => {\n if (!isRecord(candidate) || typeof candidate.url !== \"string\" || !candidate.url) {\n throw new TypeError(`sitemap.ts entry ${index} must include a non-empty url`);\n }\n return candidate as unknown as MetadataRoute.SitemapEntry;\n });\n const hasLanguageAlternates = entries.some(\n (entry) => entry.alternates?.languages && Object.keys(entry.alternates.languages).length > 0,\n );\n const namespace = hasLanguageAlternates ? ' xmlns:xhtml=\"http://www.w3.org/1999/xhtml\"' : \"\";\n const lines = [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n `<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"${namespace}>`,\n ];\n\n for (const entry of entries) {\n lines.push(\" <url>\", ` <loc>${escapeXml(entry.url)}</loc>`);\n if (entry.lastModified !== undefined) {\n const lastModified =\n entry.lastModified instanceof Date ? entry.lastModified.toISOString() : entry.lastModified;\n lines.push(` <lastmod>${escapeXml(lastModified)}</lastmod>`);\n }\n if (entry.changeFrequency) {\n lines.push(` <changefreq>${escapeXml(entry.changeFrequency)}</changefreq>`);\n }\n if (entry.priority !== undefined) {\n lines.push(` <priority>${escapeXml(entry.priority)}</priority>`);\n }\n for (const [language, href] of Object.entries(entry.alternates?.languages || {})) {\n lines.push(\n ` <xhtml:link rel=\"alternate\" hreflang=\"${escapeXml(language)}\" href=\"${escapeXml(href)}\" />`,\n );\n }\n lines.push(\" </url>\");\n }\n\n lines.push(\"</urlset>\");\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction toArray<T>(value: T | T[] | undefined): T[] {\n return value === undefined ? [] : Array.isArray(value) ? value : [value];\n}\n\nfunction serializeRobots(value: unknown): string {\n if (!isRecord(value)) {\n throw new TypeError(\"robots.ts must return a robots object or a Response\");\n }\n\n const robots = value as unknown as MetadataRoute.Robots;\n const rules = toArray(robots.rules);\n if (rules.length === 0) {\n throw new TypeError(\"robots.ts must return at least one rule\");\n }\n\n const sections = rules.map((rule, index) => {\n if (!isRecord(rule)) {\n throw new TypeError(`robots.ts rule ${index} must be an object`);\n }\n const userAgents = toArray(rule.userAgent).filter(\n (userAgent): userAgent is string => typeof userAgent === \"string\" && Boolean(userAgent),\n );\n if (userAgents.length === 0) {\n throw new TypeError(`robots.ts rule ${index} must include a userAgent`);\n }\n\n const lines = userAgents.map((userAgent) => `User-agent: ${userAgent}`);\n for (const allow of toArray(rule.allow)) lines.push(`Allow: ${allow}`);\n for (const disallow of toArray(rule.disallow)) lines.push(`Disallow: ${disallow}`);\n if (rule.crawlDelay !== undefined) lines.push(`Crawl-delay: ${rule.crawlDelay}`);\n return lines.join(\"\\n\");\n });\n\n const globalLines = [\n ...toArray(robots.sitemap).map((sitemap) => `Sitemap: ${sitemap}`),\n ...(robots.host ? [`Host: ${robots.host}`] : []),\n ];\n return `${[...sections, ...(globalLines.length ? [globalLines.join(\"\\n\")] : [])].join(\"\\n\\n\")}\\n`;\n}\n\nfunction serializeManifest(value: unknown): string {\n if (!isRecord(value)) {\n throw new TypeError(\"manifest.ts must return a manifest object or a Response\");\n }\n return `${JSON.stringify(value, null, 2)}\\n`;\n}\n\n/** @internal */\nexport function createFarmMetadataRouteResponse(\n kind: ApplicationMetadataRouteKind,\n value: unknown,\n routeModule: FarmMetadataRouteModule = {},\n options: FarmMetadataRouteResponseOptions = {},\n): Response {\n const method = (options.method || \"GET\").toUpperCase();\n if (method !== \"GET\" && method !== \"HEAD\") {\n return new Response(null, { status: 405, headers: { Allow: \"GET, HEAD\" } });\n }\n\n if (isResponse(value)) {\n return method === \"HEAD\" ? omitFarmResponseBody(value) : value;\n }\n\n const body =\n kind === \"sitemap\"\n ? serializeSitemap(value)\n : kind === \"robots\"\n ? serializeRobots(value)\n : serializeManifest(value);\n const contentType =\n kind === \"sitemap\"\n ? \"application/xml; charset=utf-8\"\n : kind === \"robots\"\n ? \"text/plain; charset=utf-8\"\n : \"application/manifest+json; charset=utf-8\";\n\n return new Response(method === \"HEAD\" ? null : body, {\n headers: {\n \"Content-Type\": contentType,\n \"Cache-Control\": resolveCacheControl(routeModule.revalidate),\n \"X-Content-Type-Options\": \"nosniff\",\n },\n });\n}\n","/**\n * Decode a percent-encoded path segment, falling back to the raw value.\n *\n * Request paths are not guaranteed to be validly percent-encoded, so\n * `decodeURIComponent` can throw on input that is still a legal URL: a\n * latin-1 escape such as `caf%E9` from an old link, or a truncated `%ZZ`\n * from a crawler. A malformed segment simply will not match a known route,\n * which is a 404, so it must not throw out of route matching.\n */\nexport function decodeRouteSegment(segment: string): string {\n try {\n return decodeURIComponent(segment);\n } catch {\n return segment;\n }\n}\n","import { createWebRequestFromFarmRequest } from \"../server/request\";\nimport type {\n MiddlewareConfig,\n MiddlewareContext,\n MiddlewareFunction,\n MiddlewareModule,\n MiddlewareStore,\n RequestMiddlewareContext,\n} from \"./types\";\n\nexport interface NormalizedMiddlewareModule {\n handlers: MiddlewareFunction[];\n config?: MiddlewareConfig;\n}\n\nfunction isWebRequest(request: unknown): request is Request {\n return typeof Request !== \"undefined\" && request instanceof Request;\n}\n\nfunction toWebRequest(ctx: MiddlewareContext): Request {\n if (isWebRequest(ctx.request)) {\n return ctx.request;\n }\n return createWebRequestFromFarmRequest(ctx.request, { origin: ctx.url.origin });\n}\n\nfunction createRequestMiddlewareContext(\n ctx: MiddlewareContext,\n): RequestMiddlewareContext<Record<string, any>, Record<string, any>> {\n const context = {\n get url() {\n return ctx.url;\n },\n get pathname() {\n return ctx.pathname;\n },\n get searchParams() {\n return ctx.searchParams;\n },\n get method() {\n return ctx.method;\n },\n get params() {\n return ctx.params;\n },\n get route() {\n return ctx.route;\n },\n get locals() {\n return ctx.locals as MiddlewareStore<Record<string, any>>;\n },\n get data() {\n return ctx.data as MiddlewareStore<Record<string, any>>;\n },\n get headers() {\n return ctx.headers;\n },\n get cookies() {\n return ctx.cookies;\n },\n get(key: string) {\n return ctx.locals.get(key);\n },\n has(key: string) {\n return ctx.locals.has(key);\n },\n set(key: string, value: any) {\n ctx.locals.set(key, value);\n },\n delete(key: string) {\n return ctx.locals.delete(key);\n },\n redirect(url: string, status?: number) {\n ctx.redirect(url, status);\n },\n rewrite(url: string) {\n ctx.rewrite(url);\n },\n json(data: any, status?: number) {\n ctx.json(data, status);\n },\n text(content: string, status?: number) {\n ctx.text(content, status);\n },\n html(content: string, status?: number) {\n ctx.html(content, status);\n },\n } satisfies RequestMiddlewareContext;\n\n return context;\n}\n\n/**\n * Normalize the two supported middleware file styles to Farm's internal chain.\n */\nexport function normalizeMiddlewareModule(\n middlewareModule: MiddlewareModule | Record<string, any>,\n routePath: string,\n): NormalizedMiddlewareModule | null {\n const module = middlewareModule as MiddlewareModule;\n const defaultExport = module.default;\n const namedExport = module.middleware;\n const hasNamedExport = typeof namedExport === \"function\";\n\n if (namedExport !== undefined && !hasNamedExport) {\n throw new TypeError(\"The named middleware export must be a function\");\n }\n\n if (defaultExport && hasNamedExport) {\n throw new Error(\n \"A middleware file cannot export both a default handler and a named middleware handler\",\n );\n }\n\n if (hasNamedExport) {\n return {\n handlers: [\n async (ctx) => {\n return namedExport(toWebRequest(ctx), createRequestMiddlewareContext(ctx));\n },\n ],\n config: module.config,\n };\n }\n\n if (defaultExport && typeof defaultExport === \"object\" && \"build\" in defaultExport) {\n if (typeof (defaultExport as any).setBasePath === \"function\") {\n (defaultExport as any).setBasePath(routePath);\n }\n const built = (defaultExport as any).build();\n const handlers = Array.isArray(built?.handlers)\n ? built.handlers.filter((handler: unknown) => typeof handler === \"function\")\n : [];\n return handlers.length > 0\n ? {\n handlers,\n config: module.config || built?.config,\n }\n : null;\n }\n\n if (typeof defaultExport === \"function\") {\n return {\n handlers: [defaultExport as MiddlewareFunction],\n config: module.config,\n };\n }\n\n return null;\n}\n","function decodeCookieValue(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n // Cookies are not required to be percent-encoded; keep the raw value\n // instead of failing the whole request on malformed encoding.\n return value;\n }\n}\n\nexport function parseMiddlewareCookieHeader(cookieHeader?: string | null): Record<string, string> {\n const cookies = Object.create(null) as Record<string, string>;\n if (!cookieHeader) return cookies;\n\n for (const cookie of cookieHeader.split(\";\")) {\n const separator = cookie.indexOf(\"=\");\n if (separator < 0) continue;\n\n const name = cookie.slice(0, separator).trim();\n if (!name) continue;\n\n const value = cookie.slice(separator + 1).trim();\n cookies[name] = decodeCookieValue(value);\n }\n\n return cookies;\n}\n","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","/**\n * Server-side middleware utilities for accessing middleware data in pages\n */\n\nimport { AsyncLocalStorage } from \"async_hooks\";\nimport type { ReadonlyMiddlewareStore } from \"./types\";\n\ntype MiddlewareStoreInput = Record<string, any> | Map<string, any>;\nconst MIDDLEWARE_DATA_STORE_KEY = Symbol.for(\"farm.middlewareDataStore\");\nconst MIDDLEWARE_CONTEXT_STORE_KEY = Symbol.for(\"farm.middlewareContextStore\");\n\nfunction getGlobalMiddlewareStore(key: symbol): AsyncLocalStorage<Map<string, any>> {\n const state = globalThis as typeof globalThis & Record<symbol, unknown>;\n const existing = state[key];\n if (existing instanceof AsyncLocalStorage) {\n return existing as AsyncLocalStorage<Map<string, any>>;\n }\n\n const store = new AsyncLocalStorage<Map<string, any>>();\n state[key] = store;\n return store;\n}\n\nconst middlewareStore = getGlobalMiddlewareStore(MIDDLEWARE_DATA_STORE_KEY);\nconst middlewareContextStore = getGlobalMiddlewareStore(MIDDLEWARE_CONTEXT_STORE_KEY);\n\nfunction toMiddlewareMap(data: MiddlewareStoreInput): Map<string, any> {\n if (data instanceof Map) {\n return new Map(data);\n }\n return new Map(Object.entries(data));\n}\n\n/**\n * Internal: Set middleware data for the current request\n * This is called by the server renderer before rendering starts.\n * Prefer _runWithMiddlewareData for request-scoped async flows.\n */\nexport function _setCurrentMiddlewareData(data: MiddlewareStoreInput): void {\n middlewareStore.enterWith(toMiddlewareMap(data));\n}\n\n/**\n * Internal: Clear middleware data after request completes\n */\nexport function _clearCurrentMiddlewareData(): void {\n middlewareStore.enterWith(new Map());\n}\n\n/** Internal: Clear server-only middleware context after rendering. */\nexport function _clearCurrentMiddlewareContext(): void {\n middlewareContextStore.enterWith(new Map());\n}\n\n/**\n * Internal: Run code with middleware data available\n * This is called by the server renderer\n */\nexport async function _runWithMiddlewareData<T>(\n data: MiddlewareStoreInput,\n fn: () => T | Promise<T>,\n): Promise<T> {\n return middlewareStore.run(toMiddlewareMap(data), fn);\n}\n\n/** Internal: Run code with server-only middleware context available. */\nexport async function _runWithMiddlewareContext<T>(\n context: MiddlewareStoreInput,\n fn: () => T | Promise<T>,\n): Promise<T> {\n return middlewareContextStore.run(toMiddlewareMap(context), fn);\n}\n\n/**\n * Get middleware data in a server component\n * No props needed - uses global storage!\n *\n * @example\n * ```tsx\n * import { getMiddlewareData } from 'farm/middleware';\n *\n * export default function Page() {\n * const data = getMiddlewareData(); // ← No props needed!\n * const user = data.get('user');\n * const demoInfo = data.get('demoInfo');\n *\n * return <div>Welcome {user?.name}</div>;\n * }\n * ```\n */\nexport function getMiddlewareData<T extends Record<string, any> = Record<string, any>>(): Map<\n keyof T,\n T[keyof T]\n> {\n return (middlewareStore.getStore() || new Map()) as Map<keyof T, T[keyof T]>;\n}\n\n/**\n * Get a specific value from middleware data (synchronous)\n * Uses AsyncLocalStorage for request scoping - no props needed.\n *\n * @example\n * ```tsx\n * import { getMiddlewareValue } from 'farm/middleware';\n *\n * export default function Page() {\n * const user = getMiddlewareValue<User>('user'); // ← No props needed!\n * const stats = getMiddlewareValue('dashboardStats');\n *\n * return <div>Welcome {user?.name}</div>;\n * }\n * ```\n */\nexport function getMiddlewareValue<T = any>(key: string): T | undefined {\n const data = getMiddlewareData();\n return data.get(key);\n}\n\n/**\n * Read server-only values set by route middleware for the current request.\n * The returned store is available to the matched page, layouts, and nested\n * Server Components, but is never added to hydration props.\n */\nexport function getMiddlewareContext<\n T extends Record<string, any> = Record<string, any>,\n>(): ReadonlyMiddlewareStore<T> {\n return (middlewareContextStore.getStore() || new Map()) as unknown as ReadonlyMiddlewareStore<T>;\n}\n\n/**\n * Type-safe middleware data accessor with type parameter\n *\n * @example\n * ```tsx\n * import { createMiddlewareAccessor } from 'farm/middleware/server';\n *\n * interface MiddlewareData {\n * user: { id: number; name: string };\n * dashboardStats: { views: number; clicks: number };\n * }\n *\n * const getData = createMiddlewareAccessor<MiddlewareData>();\n *\n * export default function Page() {\n * const data = getData();\n * const user = data.user; // Fully typed!\n * const stats = data.dashboardStats; // Fully typed!\n *\n * return <div>Welcome {user?.name}</div>;\n * }\n * ```\n */\nexport function createMiddlewareAccessor<T extends Record<string, any>>() {\n return (): Partial<T> => {\n const data = getMiddlewareData();\n const result: any = {};\n\n for (const [key, value] of data) {\n result[key] = value;\n }\n\n return result as Partial<T>;\n };\n}\n","export type FarmRedirectStatus = 301 | 302 | 303 | 307 | 308;\n\nexport interface FarmRedirectSignal {\n url: string;\n status: FarmRedirectStatus;\n}\n\nconst REDIRECT_ERROR_CODE = \"FARM_REDIRECT\";\nconst NOT_FOUND_ERROR_CODE = \"FARM_NOT_FOUND\";\nconst REDIRECT_ERROR_SYMBOL = Symbol.for(\"farm.navigation.redirect\");\nconst NOT_FOUND_ERROR_SYMBOL = Symbol.for(\"farm.navigation.notFound\");\n\ntype FarmNavigationError = Error & {\n digest: string;\n [REDIRECT_ERROR_SYMBOL]?: FarmRedirectSignal;\n [NOT_FOUND_ERROR_SYMBOL]?: true;\n};\n\nexport function redirect(url: string, status: FarmRedirectStatus = 307): never {\n throw createRedirectError(url, status);\n}\n\nexport function permanentRedirect(url: string): never {\n redirect(url, 308);\n}\n\nexport function notFound(): never {\n const error = new Error(NOT_FOUND_ERROR_CODE) as FarmNavigationError;\n error.digest = NOT_FOUND_ERROR_CODE;\n error[NOT_FOUND_ERROR_SYMBOL] = true;\n throw error;\n}\n\nexport function isFarmRedirectError(error: unknown): boolean {\n return Boolean(getFarmRedirectError(error));\n}\n\nexport function getFarmRedirectError(error: unknown): FarmRedirectSignal | null {\n if (!error || typeof error !== \"object\") return null;\n const candidate = error as Partial<FarmNavigationError>;\n if (candidate[REDIRECT_ERROR_SYMBOL]) {\n return candidate[REDIRECT_ERROR_SYMBOL] as FarmRedirectSignal;\n }\n\n if (\n typeof candidate.digest === \"string\" &&\n candidate.digest.startsWith(`${REDIRECT_ERROR_CODE};`)\n ) {\n const [, status, ...urlParts] = candidate.digest.split(\";\");\n const parsedStatus = Number(status);\n if (isFarmRedirectStatus(parsedStatus)) {\n return {\n status: parsedStatus,\n url: urlParts.join(\";\"),\n };\n }\n }\n\n return null;\n}\n\nexport function isFarmNotFoundError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const candidate = error as Partial<FarmNavigationError>;\n return Boolean(candidate[NOT_FOUND_ERROR_SYMBOL] || candidate.digest === NOT_FOUND_ERROR_CODE);\n}\n\nfunction createRedirectError(url: string, status: FarmRedirectStatus): FarmNavigationError {\n const error = new Error(`${REDIRECT_ERROR_CODE};${status};${url}`) as FarmNavigationError;\n error.digest = `${REDIRECT_ERROR_CODE};${status};${url}`;\n error[REDIRECT_ERROR_SYMBOL] = { url, status };\n return error;\n}\n\nexport function isFarmRedirectStatus(status: unknown): status is FarmRedirectStatus {\n return status === 301 || status === 302 || status === 303 || status === 307 || status === 308;\n}\n","export type FarmInstrumentationRuntime = \"nodejs\" | \"edge\" | \"bun\";\nexport type FarmInstrumentationMode = \"development\" | \"production\" | \"test\";\n\nexport interface FarmInstrumentationContext {\n root: string;\n mode: FarmInstrumentationMode;\n runtime: FarmInstrumentationRuntime;\n}\n\nexport type FarmInstrumentationCleanup =\n | void\n | (() => void | Promise<void>)\n | { shutdown: () => void | Promise<void> };\n\nexport interface FarmInstrumentationModule {\n register?: (\n context: FarmInstrumentationContext,\n ) => FarmInstrumentationCleanup | Promise<FarmInstrumentationCleanup>;\n shutdown?: () => void | Promise<void>;\n}\n\nexport interface FarmInstrumentationLifecycle {\n start(): Promise<void>;\n shutdown(): Promise<void>;\n}\n\nexport function createFarmInstrumentationLifecycle(\n module: FarmInstrumentationModule | null | undefined,\n context: FarmInstrumentationContext,\n): FarmInstrumentationLifecycle {\n let startPromise: Promise<void> | undefined;\n let shutdownPromise: Promise<void> | undefined;\n let cleanup: Exclude<FarmInstrumentationCleanup, void> | undefined;\n\n return {\n start() {\n if (!startPromise) {\n startPromise = Promise.resolve(module?.register?.(context)).then((result) => {\n cleanup = result || undefined;\n });\n }\n return startPromise;\n },\n shutdown() {\n if (!shutdownPromise) {\n shutdownPromise = (async () => {\n try {\n await startPromise;\n } catch {\n // A partially initialized module may still need its exported cleanup.\n }\n try {\n if (typeof cleanup === \"function\") {\n await cleanup();\n } else if (cleanup?.shutdown) {\n await cleanup.shutdown();\n }\n } finally {\n if (module?.shutdown) {\n await module.shutdown();\n }\n }\n })();\n }\n return shutdownPromise;\n },\n };\n}\n\nexport function resolveFarmInstrumentationRuntime(preset?: string): FarmInstrumentationRuntime {\n const normalized = preset?.toLowerCase() ?? \"\";\n if (\n normalized.includes(\"cloudflare\") ||\n normalized.includes(\"worker\") ||\n normalized.includes(\"edge\")\n ) {\n return \"edge\";\n }\n if (normalized.includes(\"bun\")) return \"bun\";\n return \"nodejs\";\n}\n","import type { FarmConfig, FarmContextFactoryInput } from \"./types\";\n\nexport const FARM_ROUTE_CONTEXT_SYMBOL = Symbol.for(\"farm.routeContext\");\n\nexport type FarmRouteContextCarrier<TContext = unknown> = {\n [FARM_ROUTE_CONTEXT_SYMBOL]?: TContext;\n};\n\nexport async function resolveFarmRouteContext(\n config: Pick<FarmConfig, \"context\">,\n input: FarmContextFactoryInput,\n): Promise<unknown> {\n if (typeof config.context !== \"function\") {\n return undefined;\n }\n\n return config.context(input);\n}\n\nexport function withFarmRouteContext<TProps extends object, TContext>(\n props: TProps,\n context: TContext | undefined,\n): TProps & FarmRouteContextCarrier<TContext> {\n if (context === undefined) {\n return props as TProps & FarmRouteContextCarrier<TContext>;\n }\n\n Object.defineProperty(props, FARM_ROUTE_CONTEXT_SYMBOL, {\n value: context,\n enumerable: false,\n configurable: true,\n });\n\n return props as TProps & FarmRouteContextCarrier<TContext>;\n}\n\nexport function getFarmRouteContext<TContext = unknown>(props: unknown): TContext | undefined {\n if (!props || typeof props !== \"object\") {\n return undefined;\n }\n\n return (props as FarmRouteContextCarrier<TContext>)[FARM_ROUTE_CONTEXT_SYMBOL];\n}\n","import type { FarmThemeSnapshot } from \"./types\";\n\nconst FALLBACK_SERVER_SNAPSHOT: FarmThemeSnapshot = Object.freeze({\n theme: \"system\",\n resolvedTheme: undefined,\n mounted: false,\n});\n\nconst FARM_THEME_SERVER_SNAPSHOT_RESOLVER = Symbol.for(\"farm.js.theme.server-snapshot-resolver\");\n\ntype FarmThemeBridgeGlobal = typeof globalThis & {\n [FARM_THEME_SERVER_SNAPSHOT_RESOLVER]?: () => FarmThemeSnapshot;\n};\n\nexport function _setFarmThemeServerSnapshotResolver(resolver: () => FarmThemeSnapshot): void {\n (globalThis as FarmThemeBridgeGlobal)[FARM_THEME_SERVER_SNAPSHOT_RESOLVER] = resolver;\n}\n\nexport function getFarmThemeServerSnapshot(): FarmThemeSnapshot {\n return (\n (globalThis as FarmThemeBridgeGlobal)[FARM_THEME_SERVER_SNAPSHOT_RESOLVER]?.() ??\n FALLBACK_SERVER_SNAPSHOT\n );\n}\n","import type { FarmThemeConfig, ResolvedFarmThemeConfig } from \"./types\";\n\nexport const DEFAULT_FARM_THEME_STORAGE_KEY = \"farm-theme\";\n\nconst STORAGE_KEY_PATTERN = /^[A-Za-z0-9._-]+$/;\n\nexport function resolveFarmThemeConfig(\n config: FarmThemeConfig | ResolvedFarmThemeConfig | false | undefined,\n basePath = \"/\",\n): ResolvedFarmThemeConfig {\n if (config && \"enabled\" in config) {\n return config;\n }\n\n if (!config) {\n return {\n enabled: false,\n default: \"system\",\n storageKey: DEFAULT_FARM_THEME_STORAGE_KEY,\n cookiePath: normalizeCookiePath(basePath),\n };\n }\n\n const storageKey = config.storageKey?.trim() || DEFAULT_FARM_THEME_STORAGE_KEY;\n if (!STORAGE_KEY_PATTERN.test(storageKey)) {\n throw new Error(\n \"theme.storageKey may only contain letters, numbers, dots, underscores, and hyphens.\",\n );\n }\n\n const defaultTheme = config.default ?? \"system\";\n if (defaultTheme !== \"light\" && defaultTheme !== \"dark\" && defaultTheme !== \"system\") {\n throw new Error('theme.default must be \"light\", \"dark\", or \"system\".');\n }\n\n return {\n enabled: true,\n default: defaultTheme,\n storageKey,\n cookiePath: normalizeCookiePath(basePath),\n };\n}\n\nfunction normalizeCookiePath(basePath: string): string {\n const normalized = `/${basePath}`.replace(/\\/{2,}/g, \"/\");\n if (normalized === \"/\") return normalized;\n return normalized.replace(/\\/$/, \"\");\n}\n","import { getCurrentRequestOrNull } from \"../server/request\";\nimport { _setFarmThemeServerSnapshotResolver } from \"./bridge\";\nimport { resolveFarmThemeConfig } from \"./config\";\nimport type {\n FarmThemeConfig,\n FarmThemePreference,\n FarmThemeSnapshot,\n ResolvedFarmThemeConfig,\n} from \"./types\";\n\nlet defaultThemeConfig = resolveFarmThemeConfig(undefined);\n\nexport function _setDefaultFarmThemeConfig(\n config: FarmThemeConfig | ResolvedFarmThemeConfig | false | undefined,\n basePath = \"/\",\n): void {\n defaultThemeConfig = resolveFarmThemeConfig(config, basePath);\n}\n\n// The theme preference is cosmetic, so a missing request context must never\n// crash a render: without a request to read the cookie from, the configured\n// default applies. Runtimes with partial AsyncLocalStorage support (for\n// example StackBlitz WebContainers) can lose the store mid-render, and a\n// thrown error here would also take down the error page itself.\nexport function getTheme(request: Request | null = getCurrentRequestOrNull()): FarmThemePreference {\n if (!request) return defaultThemeConfig.default;\n return readFarmThemePreference(request, defaultThemeConfig);\n}\n\nexport function getThemeSnapshot(\n request: Request | null = getCurrentRequestOrNull(),\n): FarmThemeSnapshot {\n const theme = request\n ? readFarmThemePreference(request, defaultThemeConfig)\n : defaultThemeConfig.default;\n return {\n theme,\n resolvedTheme: theme === \"system\" ? undefined : theme,\n mounted: false,\n };\n}\n\nexport function readFarmThemePreference(\n request: Request,\n config: ResolvedFarmThemeConfig,\n): FarmThemePreference {\n if (!config.enabled) return config.default;\n const stored = readCookie(request.headers.get(\"cookie\"), config.storageKey);\n return isFarmThemePreference(stored) ? stored : config.default;\n}\n\nfunction readCookie(cookieHeader: string | null, name: string): string | undefined {\n if (!cookieHeader) return undefined;\n for (const entry of cookieHeader.split(\";\")) {\n const separator = entry.indexOf(\"=\");\n if (separator < 0) continue;\n const key = decodeCookieValue(entry.slice(0, separator).trim());\n if (key !== name) continue;\n return decodeCookieValue(entry.slice(separator + 1).trim());\n }\n return undefined;\n}\n\nfunction decodeCookieValue(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nfunction isFarmThemePreference(value: unknown): value is FarmThemePreference {\n return value === \"light\" || value === \"dark\" || value === \"system\";\n}\n\n_setFarmThemeServerSnapshotResolver(() => {\n try {\n return getThemeSnapshot();\n } catch {\n const theme = defaultThemeConfig.default;\n return {\n theme,\n resolvedTheme: theme === \"system\" ? undefined : theme,\n mounted: false,\n };\n }\n});\n","import { resolveFarmThemeConfig } from \"./config\";\nimport type {\n FarmThemeConfig,\n FarmThemePreference,\n FarmThemeRuntime,\n ResolvedFarmThemeConfig,\n} from \"./types\";\n\nconst THEME_SCRIPT_ID = \"farm-theme-script\";\nconst THEME_STYLE_ID = \"farm-theme-style\";\n\ndeclare global {\n interface Window {\n __FARM_THEME__?: FarmThemeRuntime;\n }\n}\n\nexport interface FarmThemeDocumentParts {\n attributes: string;\n head: string;\n}\n\nexport function createFarmThemeDocumentParts(\n input: FarmThemeConfig | ResolvedFarmThemeConfig | false | undefined,\n basePath = \"/\",\n serverTheme?: FarmThemePreference,\n): FarmThemeDocumentParts {\n const config = resolveFarmThemeConfig(input, basePath);\n if (!config.enabled) return { attributes: \"\", head: \"\" };\n\n const hydrationTheme = serverTheme ?? config.default;\n const initialTheme = hydrationTheme === \"system\" ? \"light\" : hydrationTheme;\n const script = createFarmThemeBootstrapScript(config, hydrationTheme);\n\n return {\n attributes: ` data-theme=\"${initialTheme}\"`,\n head: `<style id=\"${THEME_STYLE_ID}\">:root[data-theme=\"light\"]{color-scheme:light}:root[data-theme=\"dark\"]{color-scheme:dark}</style><script id=\"${THEME_SCRIPT_ID}\">${script}</script>`,\n };\n}\n\nexport function createFarmThemeBootstrapScript(\n config: ResolvedFarmThemeConfig,\n serverTheme: FarmThemePreference = config.default,\n): string {\n return `(function(config,serverTheme){\nvar isTheme=function(value){return value===\"light\"||value===\"dark\"||value===\"system\";};\nvar decode=function(value){try{return decodeURIComponent(value);}catch(_error){return value;}};\nvar readCookie=function(){var entries=document.cookie.split(\";\");for(var index=0;index<entries.length;index++){var entry=entries[index];var separator=entry.indexOf(\"=\");if(separator<0)continue;if(decode(entry.slice(0,separator).trim())===config.storageKey)return decode(entry.slice(separator+1).trim());}};\nvar media=window.matchMedia(\"(prefers-color-scheme: dark)\");\nvar resolveTheme=function(theme){return theme===\"system\"?(media.matches?\"dark\":\"light\"):theme;};\nvar storedTheme=readCookie();\nvar preference=isTheme(storedTheme)?storedTheme:config.default;\nvar serverSnapshot={theme:serverTheme,resolvedTheme:serverTheme===\"system\"?undefined:serverTheme,mounted:false};\nvar apply=function(){var resolvedTheme=resolveTheme(preference);document.documentElement.dataset.theme=resolvedTheme;var snapshot={theme:preference,resolvedTheme:resolvedTheme,mounted:true};if(window.__FARM_THEME__)window.__FARM_THEME__.snapshot=snapshot;return snapshot;};\nvar emit=function(){var snapshot=apply();window.dispatchEvent(new CustomEvent(\"farm:themechange\",{detail:snapshot}));};\nvar persist=function(theme){var secure=window.location.protocol===\"https:\"?\"; Secure\":\"\";document.cookie=encodeURIComponent(config.storageKey)+\"=\"+encodeURIComponent(theme)+\"; Path=\"+config.cookiePath+\"; Max-Age=31536000; SameSite=Lax\"+secure;try{localStorage.setItem(config.storageKey,theme);}catch(_error){}};\nvar setTheme=function(theme){if(!isTheme(theme))throw new TypeError(\"Unknown FARMJS theme: \"+String(theme));preference=theme;persist(theme);emit();};\nvar initialSnapshot={theme:preference,resolvedTheme:resolveTheme(preference),mounted:true};\nwindow.__FARM_THEME__={config:config,serverSnapshot:serverSnapshot,snapshot:initialSnapshot,setTheme:setTheme};\ndocument.documentElement.dataset.theme=initialSnapshot.resolvedTheme;\nvar handleSystemChange=function(){if(preference===\"system\")emit();};\nif(typeof media.addEventListener===\"function\")media.addEventListener(\"change\",handleSystemChange);else if(typeof media.addListener===\"function\")media.addListener(handleSystemChange);\nwindow.addEventListener(\"storage\",function(event){if(event.key!==config.storageKey||!isTheme(event.newValue))return;preference=event.newValue;persist(preference);emit();});\n})(${serializeInlineValue(config)},${serializeInlineValue(serverTheme)});`;\n}\n\nexport function applyFarmThemeDocument(\n html: string,\n input: FarmThemeConfig | ResolvedFarmThemeConfig | false | undefined,\n basePath = \"/\",\n serverTheme?: FarmThemePreference,\n): string {\n const parts = createFarmThemeDocumentParts(input, basePath, serverTheme);\n if (!parts.head) return html;\n\n let output = html.replace(/<html([^>]*)>/i, (_match, attributes: string) => {\n const nextAttributes = attributes.replace(/\\sdata-theme=(?:\"[^\"]*\"|'[^']*'|[^\\s>]+)/i, \"\");\n return `<html${nextAttributes}${parts.attributes}>`;\n });\n\n if (!output.includes(`id=\"${THEME_SCRIPT_ID}\"`)) {\n output = output.replace(/<head([^>]*)>/i, `<head$1>${parts.head}`);\n }\n\n return output;\n}\n\nfunction serializeInlineValue(value: unknown): string {\n return JSON.stringify(value)\n .replace(/</g, \"\\\\u003c\")\n .replace(/\\u2028/g, \"\\\\u2028\")\n .replace(/\\u2029/g, \"\\\\u2029\");\n}\n","/**\n * Shared styles for Farm's default HTTP error page.\n *\n * Kept framework-agnostic so the same fallback can be used by the development\n * renderer and generated production runtimes.\n */\nexport const DEFAULT_ERROR_STYLES = `\nbody {\n margin: 0;\n}\n\n.farm-default-error {\n --farm-error-bg: #fafafa;\n --farm-error-fg: #171717;\n --farm-error-muted: #737373;\n --farm-error-line: rgba(0, 0, 0, 0.1);\n --farm-error-line-strong: rgba(0, 0, 0, 0.22);\n --farm-error-panel: rgba(0, 0, 0, 0.018);\n --farm-error-button-fg: #ffffff;\n --farm-error-source-line: rgba(185, 28, 28, 0.08);\n --farm-error-source-marker: #b91c1c;\n min-height: 100vh;\n min-height: 100svh;\n display: grid;\n place-items: center;\n padding: clamp(28px, 6vw, 72px) 24px;\n color: var(--farm-error-fg);\n background: var(--farm-error-bg);\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n color-scheme: light;\n}\n\n.farm-default-error,\n.farm-default-error * {\n box-sizing: border-box;\n}\n\n.farm-default-error__content {\n width: min(100%, 840px);\n display: flex;\n flex-direction: column;\n align-items: stretch;\n}\n\n.farm-default-error__code {\n margin: 0;\n color: var(--farm-error-fg);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: clamp(76px, 13vw, 112px);\n font-weight: 800;\n line-height: 0.78;\n letter-spacing: -0.08em;\n text-align: center;\n transform: translateX(-3px);\n}\n\n@supports (-webkit-text-stroke: 1px currentColor) {\n .farm-default-error__code {\n color: var(--farm-error-bg);\n -webkit-text-stroke: 1.5px var(--farm-error-fg);\n text-shadow: 2px 2px 0 var(--farm-error-fg);\n }\n}\n\n.farm-default-error__eyebrow {\n width: min(100%, 590px);\n display: flex;\n align-items: center;\n align-self: center;\n gap: 16px;\n margin: 34px 0 28px;\n color: var(--farm-error-fg);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 11px;\n font-weight: 600;\n line-height: 1;\n letter-spacing: 0.16em;\n text-transform: uppercase;\n white-space: nowrap;\n}\n\n.farm-default-error__eyebrow::before,\n.farm-default-error__eyebrow::after {\n content: \"\";\n height: 1px;\n flex: 1 1 auto;\n background: var(--farm-error-line-strong);\n}\n\n.farm-default-error__summary {\n margin-bottom: 28px;\n text-align: center;\n}\n\n.farm-default-error__title {\n margin: 0;\n font-size: clamp(20px, 3vw, 26px);\n font-weight: 540;\n line-height: 1.25;\n letter-spacing: -0.02em;\n}\n\n.farm-default-error__message {\n max-width: 680px;\n margin: 8px auto 0;\n color: var(--farm-error-muted);\n font-size: 15px;\n line-height: 1.55;\n overflow-wrap: anywhere;\n}\n\n.farm-default-error__panel {\n border: 1px solid var(--farm-error-line-strong);\n background: var(--farm-error-panel);\n}\n\n.farm-default-error__row {\n min-height: 58px;\n display: grid;\n grid-template-columns: minmax(124px, 180px) minmax(0, 1fr);\n align-items: center;\n border-bottom: 1px solid var(--farm-error-line);\n}\n\n.farm-default-error__row:last-child {\n border-bottom: 0;\n}\n\n.farm-default-error__label,\n.farm-default-error__value,\n.farm-default-error__details-title,\n.farm-default-error__source-path,\n.farm-default-error__meta {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n}\n\n.farm-default-error__label {\n padding: 0 22px;\n color: var(--farm-error-muted);\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n}\n\n.farm-default-error__value {\n min-width: 0;\n padding: 15px 22px;\n color: var(--farm-error-fg);\n font-size: 14px;\n line-height: 1.45;\n overflow-wrap: anywhere;\n}\n\n.farm-default-error__details {\n padding: 20px 22px 18px;\n}\n\n.farm-default-error__details-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n margin-bottom: 10px;\n}\n\n.farm-default-error__details-title {\n margin: 0;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n}\n\n.farm-default-error__copy {\n min-height: 34px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0 12px;\n border: 1px solid var(--farm-error-line);\n border-radius: 0;\n color: var(--farm-error-fg);\n background: transparent;\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n font-size: 12px;\n font-weight: 600;\n line-height: 1;\n letter-spacing: 0.01em;\n cursor: pointer;\n transition: border-color 150ms ease-out, background 150ms ease-out;\n}\n\n.farm-default-error__source {\n border: 1px solid var(--farm-error-line);\n background: var(--farm-error-bg);\n overflow: hidden;\n}\n\n.farm-default-error__source-path {\n margin: 0;\n padding: 11px 14px;\n border-bottom: 1px solid var(--farm-error-line);\n color: var(--farm-error-fg);\n font-size: 12px;\n line-height: 1.4;\n overflow-wrap: anywhere;\n}\n\n.farm-default-error__source-code {\n margin: 0;\n padding: 8px 0;\n overflow-x: auto;\n color: var(--farm-error-fg);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 12px;\n line-height: 1.75;\n tab-size: 2;\n}\n\n.farm-default-error__source-line {\n min-width: max-content;\n display: grid;\n grid-template-columns: 68px minmax(0, 1fr);\n padding: 0 14px 0 0;\n border-left: 1px solid transparent;\n}\n\n.farm-default-error__source-line--active {\n border-left-color: var(--farm-error-source-marker);\n background: var(--farm-error-source-line);\n}\n\n.farm-default-error__source-gutter {\n padding-right: 14px;\n color: var(--farm-error-muted);\n text-align: right;\n user-select: none;\n}\n\n.farm-default-error__source-line--active .farm-default-error__source-gutter {\n color: var(--farm-error-source-marker);\n}\n\n.farm-default-error__source-text {\n white-space: pre;\n}\n\n.farm-default-error__details-empty {\n margin: 0;\n padding: 15px;\n border: 1px solid var(--farm-error-line);\n color: var(--farm-error-muted);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 12px;\n line-height: 1.5;\n}\n\n.farm-default-error__meta {\n margin: 14px 0 0;\n color: var(--farm-error-muted);\n font-size: 10px;\n line-height: 1.5;\n letter-spacing: 0.04em;\n text-align: center;\n}\n\n.farm-default-error__actions {\n display: flex;\n justify-content: center;\n gap: 12px;\n margin-top: 28px;\n}\n\n.farm-default-error__action {\n min-width: 152px;\n min-height: 44px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0 20px;\n border: 1px solid var(--farm-error-line-strong);\n border-radius: 0;\n color: var(--farm-error-fg);\n background: transparent;\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n font-size: 13px;\n font-weight: 600;\n line-height: 1;\n letter-spacing: 0.01em;\n text-decoration: none;\n cursor: pointer;\n transition: opacity 150ms ease-out, transform 100ms ease-out;\n}\n\n.farm-default-error__action--primary {\n border-color: var(--farm-error-fg);\n color: var(--farm-error-button-fg);\n background: var(--farm-error-fg);\n}\n\n.farm-default-error__sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .farm-default-error__copy:hover {\n border-color: var(--farm-error-line-strong);\n background: var(--farm-error-panel);\n }\n\n .farm-default-error__action:hover {\n opacity: 0.76;\n }\n}\n\n.farm-default-error__copy:active,\n.farm-default-error__action:active {\n transform: translateY(1px);\n}\n\n.farm-default-error__copy:focus-visible,\n.farm-default-error__action:focus-visible {\n outline: 1px solid var(--farm-error-fg);\n outline-offset: 2px;\n}\n\n@media (max-width: 620px) {\n .farm-default-error {\n place-items: start center;\n padding: 48px 16px 32px;\n }\n\n .farm-default-error__eyebrow {\n margin-top: 28px;\n }\n\n .farm-default-error__row {\n grid-template-columns: 1fr;\n gap: 5px;\n padding: 14px 16px;\n }\n\n .farm-default-error__label,\n .farm-default-error__value {\n padding: 0;\n }\n\n .farm-default-error__details {\n padding: 16px;\n }\n\n .farm-default-error__details-header {\n align-items: flex-start;\n flex-direction: column;\n }\n\n .farm-default-error__copy {\n width: 100%;\n }\n\n .farm-default-error__source-line {\n grid-template-columns: 56px minmax(0, 1fr);\n }\n\n .farm-default-error__actions {\n flex-direction: column;\n }\n\n .farm-default-error__action {\n width: 100%;\n }\n}\n\n@media (prefers-color-scheme: dark) {\n .farm-default-error {\n --farm-error-bg: #0a0a0a;\n --farm-error-fg: #ededed;\n --farm-error-muted: #a1a1a1;\n --farm-error-line: rgba(255, 255, 255, 0.1);\n --farm-error-line-strong: rgba(255, 255, 255, 0.22);\n --farm-error-panel: rgba(255, 255, 255, 0.018);\n --farm-error-button-fg: #0a0a0a;\n --farm-error-source-line: rgba(248, 113, 113, 0.12);\n --farm-error-source-marker: #f87171;\n color-scheme: dark;\n }\n}\n\n.dark .farm-default-error,\n[data-theme=\"dark\"] .farm-default-error,\n[data-color-scheme=\"dark\"] .farm-default-error {\n --farm-error-bg: #0a0a0a;\n --farm-error-fg: #ededed;\n --farm-error-muted: #a1a1a1;\n --farm-error-line: rgba(255, 255, 255, 0.1);\n --farm-error-line-strong: rgba(255, 255, 255, 0.22);\n --farm-error-panel: rgba(255, 255, 255, 0.018);\n --farm-error-button-fg: #0a0a0a;\n --farm-error-source-line: rgba(248, 113, 113, 0.12);\n --farm-error-source-marker: #f87171;\n color-scheme: dark;\n}\n\n.light .farm-default-error,\n[data-theme=\"light\"] .farm-default-error,\n[data-color-scheme=\"light\"] .farm-default-error {\n --farm-error-bg: #fafafa;\n --farm-error-fg: #171717;\n --farm-error-muted: #737373;\n --farm-error-line: rgba(0, 0, 0, 0.1);\n --farm-error-line-strong: rgba(0, 0, 0, 0.22);\n --farm-error-panel: rgba(0, 0, 0, 0.018);\n --farm-error-button-fg: #ffffff;\n --farm-error-source-line: rgba(185, 28, 28, 0.08);\n --farm-error-source-marker: #b91c1c;\n color-scheme: light;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .farm-default-error__copy,\n .farm-default-error__action {\n transition: none;\n }\n\n .farm-default-error__copy:active,\n .farm-default-error__action:active {\n transform: none;\n }\n}\n`;\n","import { DEFAULT_ERROR_STYLES } from \"./error-styles\";\n\nexport { DEFAULT_ERROR_STYLES } from \"./error-styles\";\n\nconst ERROR_STATUS_TEXT: Record<number, string> = {\n 400: \"Bad Request\",\n 401: \"Unauthorized\",\n 402: \"Payment Required\",\n 403: \"Forbidden\",\n 404: \"Not Found\",\n 405: \"Method Not Allowed\",\n 406: \"Not Acceptable\",\n 408: \"Request Timeout\",\n 409: \"Conflict\",\n 410: \"Gone\",\n 411: \"Length Required\",\n 412: \"Precondition Failed\",\n 413: \"Content Too Large\",\n 414: \"URI Too Long\",\n 415: \"Unsupported Media Type\",\n 416: \"Range Not Satisfiable\",\n 418: \"I'm a Teapot\",\n 422: \"Unprocessable Content\",\n 423: \"Locked\",\n 424: \"Failed Dependency\",\n 425: \"Too Early\",\n 426: \"Upgrade Required\",\n 428: \"Precondition Required\",\n 429: \"Too Many Requests\",\n 431: \"Request Header Fields Too Large\",\n 451: \"Unavailable For Legal Reasons\",\n 500: \"Internal Server Error\",\n 501: \"Not Implemented\",\n 502: \"Bad Gateway\",\n 503: \"Service Unavailable\",\n 504: \"Gateway Timeout\",\n 505: \"HTTP Version Not Supported\",\n 506: \"Variant Also Negotiates\",\n 507: \"Insufficient Storage\",\n 508: \"Loop Detected\",\n 510: \"Not Extended\",\n 511: \"Network Authentication Required\",\n};\n\nconst ERROR_TITLES: Record<number, string> = {\n 400: \"The request could not be understood\",\n 401: \"Authentication is required\",\n 403: \"You do not have access to this page\",\n 404: \"The requested page could not be found\",\n 405: \"This request method is not supported\",\n 408: \"The request took too long\",\n 409: \"The request conflicts with the current state\",\n 410: \"This resource is no longer available\",\n 413: \"The request is too large\",\n 422: \"The request could not be processed\",\n 429: \"Too many requests were sent\",\n 500: \"Application failed during server rendering\",\n 501: \"This operation is not implemented\",\n 502: \"An upstream service returned an invalid response\",\n 503: \"The service is temporarily unavailable\",\n 504: \"An upstream service took too long to respond\",\n};\n\nconst ERROR_PUBLIC_MESSAGES: Record<number, string> = {\n 400: \"Check the request and try again.\",\n 401: \"Sign in and try this request again.\",\n 403: \"Use an account with the required permissions or return home.\",\n 404: \"Check the address or return to the home page.\",\n 405: \"Use a supported request method and try again.\",\n 408: \"Try the request again in a moment.\",\n 409: \"Refresh the page, review the latest state, and try again.\",\n 410: \"Return home to continue browsing.\",\n 413: \"Reduce the request size and try again.\",\n 422: \"Review the request data and try again.\",\n 429: \"Wait a moment before trying again.\",\n 500: \"An unexpected error prevented this page from rendering.\",\n 501: \"This operation is not available yet.\",\n 502: \"Try again after the upstream service recovers.\",\n 503: \"Try again in a moment.\",\n 504: \"Try again after the upstream service recovers.\",\n};\n\nexport interface DefaultErrorSourceLine {\n number: number;\n content: string;\n highlight?: boolean;\n}\n\nexport interface DefaultErrorSourceFrame {\n file: string;\n line: number;\n column: number;\n lines: DefaultErrorSourceLine[];\n}\n\nexport interface DefaultErrorPageOptions {\n statusCode?: number;\n statusText?: string;\n requestPath?: string;\n method?: string;\n message?: string;\n errorName?: string;\n stack?: string;\n sourceFrame?: DefaultErrorSourceFrame;\n development?: boolean;\n farmVersion?: string;\n nodeVersion?: string;\n mode?: string;\n}\n\nfunction escapeHtml(value: unknown): string {\n return String(value ?? \"\")\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction serializeJsonForHtml(value: unknown): string {\n return JSON.stringify(value)\n .replace(/</g, \"\\\\u003c\")\n .replace(/\\u2028/g, \"\\\\u2028\")\n .replace(/\\u2029/g, \"\\\\u2029\");\n}\n\nfunction normalizeErrorStatus(status: unknown): number | undefined {\n const value = typeof status === \"string\" && status.trim() ? Number(status) : status;\n return typeof value === \"number\" && Number.isInteger(value) && value >= 400 && value <= 599\n ? value\n : undefined;\n}\n\nexport function resolveDefaultErrorStatus(error: unknown): number {\n if (error && typeof error === \"object\") {\n const candidate = error as { status?: unknown; statusCode?: unknown };\n return (\n normalizeErrorStatus(candidate.status) ?? normalizeErrorStatus(candidate.statusCode) ?? 500\n );\n }\n return 500;\n}\n\nexport function getDefaultErrorStatusText(statusCode: number): string {\n return ERROR_STATUS_TEXT[statusCode] || (statusCode >= 500 ? \"Server Error\" : \"Request Error\");\n}\n\nexport function getDefaultErrorTitle(statusCode: number): string {\n return (\n ERROR_TITLES[statusCode] ||\n (statusCode >= 500\n ? \"The server could not complete the request\"\n : \"The request could not be completed\")\n );\n}\n\nfunction getDefaultErrorPublicMessage(statusCode: number): string {\n return ERROR_PUBLIC_MESSAGES[statusCode] || \"Try again or return to the home page.\";\n}\n\nfunction createSourceFrameMarkup(sourceFrame?: DefaultErrorSourceFrame): string {\n if (!sourceFrame) {\n return `<p class=\"farm-default-error__details-empty\">Source location is unavailable. Copy the debug report to inspect the filtered stack trace.</p>`;\n }\n\n const lines = sourceFrame.lines\n .map(\n (line) =>\n `<span class=\"farm-default-error__source-line${line.highlight ? \" farm-default-error__source-line--active\" : \"\"}\"><span class=\"farm-default-error__source-gutter\">${line.highlight ? \">\" : \" \"} ${line.number}</span><span class=\"farm-default-error__source-text\">${escapeHtml(line.content || \" \")}</span></span>`,\n )\n .join(\"\\n\");\n\n return `<div class=\"farm-default-error__source\"><p class=\"farm-default-error__source-path\">${escapeHtml(sourceFrame.file)}:${sourceFrame.line}:${sourceFrame.column}</p><pre class=\"farm-default-error__source-code\" tabindex=\"0\"><code>${lines}</code></pre></div>`;\n}\n\nfunction createDebugReport(\n options: Required<Pick<DefaultErrorPageOptions, \"statusCode\">> & DefaultErrorPageOptions,\n): string {\n const statusText = options.statusText || getDefaultErrorStatusText(options.statusCode);\n const sourceFrame = options.sourceFrame;\n const source = sourceFrame\n ? [\n `\\`${sourceFrame.file}:${sourceFrame.line}:${sourceFrame.column}\\``,\n \"\",\n \"```text\",\n ...sourceFrame.lines.map(\n (line) =>\n `${line.highlight ? \">\" : \" \"} ${String(line.number).padStart(4, \" \")} | ${line.content}`,\n ),\n \"```\",\n ].join(\"\\n\")\n : \"Source frame unavailable.\";\n\n return [\n \"# Farm.js debug report\",\n \"\",\n \"## Error\",\n `- Status: ${options.statusCode} ${statusText}`,\n `- Name: ${options.errorName || \"Error\"}`,\n `- Message: ${options.message || getDefaultErrorPublicMessage(options.statusCode)}`,\n `- Request: ${(options.method || \"GET\").toUpperCase()} ${options.requestPath || \"/\"}`,\n \"\",\n \"## Runtime\",\n `- Farm.js: ${options.farmVersion || \"unknown\"}`,\n `- Node.js: ${options.nodeVersion || \"unknown\"}`,\n `- Mode: ${options.mode || \"development\"}`,\n \"\",\n \"## Source\",\n source,\n \"\",\n \"## Filtered stack\",\n \"```text\",\n options.stack || \"Stack trace unavailable.\",\n \"```\",\n ].join(\"\\n\");\n}\n\nconst ERROR_PAGE_SCRIPT = `<script>(function(){var root=document.querySelector(\"[data-farm-default-error]\");if(!root)return;var retry=root.querySelector(\"[data-farm-error-retry]\");if(retry)retry.addEventListener(\"click\",function(){window.location.reload()})})();</script>`;\nconst ERROR_COPY_SCRIPT = `<script>(function(){var root=document.querySelector(\"[data-farm-default-error]\");var copy=root&&root.querySelector(\"[data-farm-error-copy]\");var report=document.getElementById(\"farm-default-error-report\");if(!copy||!report)return;copy.addEventListener(\"click\",async function(){var value=\"\";try{value=JSON.parse(report.textContent||'\"\"')}catch(_error){value=report.textContent||\"\"}try{if(navigator.clipboard&&window.isSecureContext){await navigator.clipboard.writeText(value)}else{var area=document.createElement(\"textarea\");area.value=value;area.setAttribute(\"readonly\",\"\");area.style.position=\"fixed\";area.style.opacity=\"0\";document.body.appendChild(area);area.select();document.execCommand(\"copy\");area.remove()}var label=copy.querySelector(\"[data-farm-error-copy-label]\");var status=copy.querySelector(\"[data-farm-error-copy-status]\");if(label)label.textContent=\"COPIED\";if(status)status.textContent=\"Debug report copied\";window.setTimeout(function(){if(label)label.textContent=\"COPY DEBUG REPORT\";if(status)status.textContent=\"\"},1800)}catch(_error){var status=copy.querySelector(\"[data-farm-error-copy-status]\");if(status)status.textContent=\"Unable to copy the debug report\"}})})();</script>`;\n\nexport function createDefaultErrorMarkup(options: DefaultErrorPageOptions = {}): string {\n const statusCode = normalizeErrorStatus(options.statusCode) ?? 500;\n const statusText = options.statusText || getDefaultErrorStatusText(statusCode);\n const development = options.development === true;\n const title = getDefaultErrorTitle(statusCode);\n const message =\n development && options.message ? options.message : getDefaultErrorPublicMessage(statusCode);\n const requestPath = options.requestPath || \"/\";\n const method = (options.method || \"GET\").toUpperCase();\n const eyebrow = statusCode >= 500 ? \"Runtime error\" : \"Request error\";\n const details = development\n ? `<section class=\"farm-default-error__details\" aria-labelledby=\"farm-default-error-details-title\"><div class=\"farm-default-error__details-header\"><h2 id=\"farm-default-error-details-title\" class=\"farm-default-error__details-title\">Details</h2><button class=\"farm-default-error__copy\" type=\"button\" data-farm-error-copy><span data-farm-error-copy-label>COPY DEBUG REPORT</span><span class=\"farm-default-error__sr-only\" aria-live=\"polite\" data-farm-error-copy-status></span></button></div>${createSourceFrameMarkup(options.sourceFrame)}<p class=\"farm-default-error__meta\">Farm.js v${escapeHtml(options.farmVersion || \"unknown\")} · ${escapeHtml(options.mode || \"development\")} · Node.js ${escapeHtml(options.nodeVersion || \"unknown\")}</p></section>`\n : \"\";\n const report = development\n ? `<script id=\"farm-default-error-report\" type=\"application/json\">${serializeJsonForHtml(createDebugReport({ ...options, statusCode, statusText, requestPath, method }))}</script>${ERROR_COPY_SCRIPT}`\n : \"\";\n\n return `<style>${DEFAULT_ERROR_STYLES}</style><main class=\"farm-default-error\" data-farm-default-error role=\"alert\" aria-labelledby=\"farm-default-error-title\" aria-describedby=\"farm-default-error-description\"><div class=\"farm-default-error__content\"><p class=\"farm-default-error__code\" aria-hidden=\"true\">${statusCode}</p><p class=\"farm-default-error__eyebrow\">${escapeHtml(eyebrow)}</p><header class=\"farm-default-error__summary\"><h1 id=\"farm-default-error-title\" class=\"farm-default-error__title\">${escapeHtml(title)}</h1><p id=\"farm-default-error-description\" class=\"farm-default-error__message\">${escapeHtml(message)}</p></header><section class=\"farm-default-error__panel\" aria-label=\"Error information\"><div class=\"farm-default-error__row\"><span class=\"farm-default-error__label\">Request</span><span class=\"farm-default-error__value\">${escapeHtml(method)} ${escapeHtml(requestPath)}</span></div><div class=\"farm-default-error__row\"><span class=\"farm-default-error__label\">Status</span><span class=\"farm-default-error__value\">${statusCode} ${escapeHtml(statusText)}</span></div>${details}</section><div class=\"farm-default-error__actions\"><button class=\"farm-default-error__action farm-default-error__action--primary\" type=\"button\" data-farm-error-retry>TRY AGAIN</button><a class=\"farm-default-error__action\" href=\"/\">RETURN HOME</a></div></div>${report}${ERROR_PAGE_SCRIPT}</main>`;\n}\n","export type FarmPreloadMode = \"warn\" | \"enforce\";\n\nexport interface FarmPreloadUserConfig {\n /** Report excess hints or remove the lower-priority hints. @default \"enforce\" */\n mode?: FarmPreloadMode;\n /** Maximum image preload hints per document. @default 1 */\n maxImages?: number;\n /** Maximum font preload hints per document. @default 2 */\n maxFonts?: number;\n}\n\nexport interface ResolvedFarmPreloadConfig {\n mode: FarmPreloadMode;\n maxImages: number;\n maxFonts: number;\n}\n\nexport interface FarmPerformanceConfig {\n preload?: FarmPreloadUserConfig;\n}\n\nexport interface ResolvedFarmPerformanceConfig {\n preload: ResolvedFarmPreloadConfig;\n}\n\nexport type FarmPreloadKind = \"image\" | \"font\";\n\nexport interface FarmPreloadBudgetWarning {\n kind: FarmPreloadKind;\n count: number;\n budget: number;\n removed: number;\n}\n\nexport interface FarmManagedPreloads {\n value: string;\n warnings: FarmPreloadBudgetWarning[];\n}\n\nexport interface FarmManagedDocumentPreloads {\n html: string;\n linkHeader: string;\n warnings: FarmPreloadBudgetWarning[];\n}\n\nconst DEFAULT_PRELOAD_CONFIG: ResolvedFarmPreloadConfig = {\n mode: \"enforce\",\n maxImages: 1,\n maxFonts: 2,\n};\n\nconst reportedWarnings = new Map<string, number>();\nconst PRELOAD_WARNING_TTL_MS = 60_000;\nconst MAX_REPORTED_PRELOAD_WARNINGS = 256;\n\nexport function resolveFarmPerformanceConfig(\n config: FarmPerformanceConfig | undefined,\n): ResolvedFarmPerformanceConfig {\n return {\n preload: {\n mode: config?.preload?.mode === \"warn\" ? \"warn\" : \"enforce\",\n maxImages: normalizeBudget(config?.preload?.maxImages, DEFAULT_PRELOAD_CONFIG.maxImages),\n maxFonts: normalizeBudget(config?.preload?.maxFonts, DEFAULT_PRELOAD_CONFIG.maxFonts),\n },\n };\n}\n\n/**\n * Apply image and font budgets to HTML preload elements. High-priority image\n * hints are retained before ordinary hints, making an explicitly preloaded LCP\n * image the winner when a document contains too many React-generated hints.\n */\nexport function manageFarmHtmlPreloads(\n html: string,\n config: ResolvedFarmPreloadConfig,\n): FarmManagedPreloads {\n const elements = findHtmlLinkElements(html);\n const candidates = elements.flatMap((element, index) => {\n const kind = getHtmlPreloadKind(element.value);\n return kind\n ? [\n {\n index,\n kind,\n highPriority:\n readHtmlAttribute(element.value, \"fetchpriority\")?.toLowerCase() === \"high\",\n },\n ]\n : [];\n });\n\n const budget = selectPreloadsWithinBudget(candidates, config);\n if (config.mode === \"warn\" || budget.removed.size === 0) {\n return { value: html, warnings: budget.warnings };\n }\n\n return {\n value: removeHtmlLinkElements(html, elements, budget.removed),\n warnings: budget.warnings,\n };\n}\n\n/** Apply the same budgets to HTTP Link preload hints, including Farm fonts. */\nexport function manageFarmLinkHeaderPreloads(\n value: string,\n config: ResolvedFarmPreloadConfig,\n): FarmManagedPreloads {\n if (!value) return { value, warnings: [] };\n\n const links = splitLinkHeader(value);\n const candidates = links.flatMap((link, index) => {\n const kind = getLinkHeaderPreloadKind(link);\n return kind\n ? [\n {\n index,\n kind,\n highPriority: getLinkHeaderParameter(link, \"fetchpriority\")?.toLowerCase() === \"high\",\n },\n ]\n : [];\n });\n const budget = selectPreloadsWithinBudget(candidates, config);\n\n return {\n value:\n config.mode === \"enforce\"\n ? links.filter((_, index) => !budget.removed.has(index)).join(\", \")\n : value,\n warnings: budget.warnings,\n };\n}\n\n/** Apply a single document budget across HTML and HTTP Link header hints. */\nexport function manageFarmDocumentPreloads(\n html: string,\n linkHeader: string,\n config: ResolvedFarmPreloadConfig,\n): FarmManagedDocumentPreloads {\n const elements = findHtmlLinkElements(html);\n const links = linkHeader ? splitLinkHeader(linkHeader) : [];\n const headerOffset = elements.length;\n const candidates: PreloadCandidate[] = [];\n\n for (const [index, element] of elements.entries()) {\n const kind = getHtmlPreloadKind(element.value);\n if (!kind) continue;\n candidates.push({\n index,\n kind,\n highPriority: readHtmlAttribute(element.value, \"fetchpriority\")?.toLowerCase() === \"high\",\n });\n }\n for (const [index, link] of links.entries()) {\n const kind = getLinkHeaderPreloadKind(link);\n if (!kind) continue;\n candidates.push({\n index: headerOffset + index,\n kind,\n highPriority: getLinkHeaderParameter(link, \"fetchpriority\")?.toLowerCase() === \"high\",\n });\n }\n\n const budget = selectPreloadsWithinBudget(candidates, config);\n if (config.mode === \"warn\" || budget.removed.size === 0) {\n return { html, linkHeader, warnings: budget.warnings };\n }\n\n return {\n html: removeHtmlLinkElements(html, elements, budget.removed),\n linkHeader: links.filter((_, index) => !budget.removed.has(headerOffset + index)).join(\", \"),\n warnings: budget.warnings,\n };\n}\n\n/** Rate-limit identical route-and-budget warnings within a server process. */\nexport function reportFarmPreloadWarnings(\n warnings: FarmPreloadBudgetWarning[],\n context = \"the rendered document\",\n): void {\n const now = Date.now();\n for (const [key, reportedAt] of reportedWarnings) {\n if (now - reportedAt >= PRELOAD_WARNING_TTL_MS) reportedWarnings.delete(key);\n }\n\n for (const warning of warnings) {\n const key = `${context}:${warning.kind}:${warning.count}:${warning.budget}:${warning.removed}`;\n const reportedAt = reportedWarnings.get(key);\n if (reportedAt !== undefined && now - reportedAt < PRELOAD_WARNING_TTL_MS) continue;\n reportedWarnings.set(key, now);\n while (reportedWarnings.size > MAX_REPORTED_PRELOAD_WARNINGS) {\n const oldest = reportedWarnings.keys().next().value;\n if (oldest === undefined) break;\n reportedWarnings.delete(oldest);\n }\n\n const action = warning.removed > 0 ? ` Removed ${warning.removed} lower-priority hint(s).` : \"\";\n const recommendation =\n warning.kind === \"image\"\n ? ' Mark only the LCP image with `preload` or `fetchPriority=\"high\"`.'\n : \" Set `preload: false` on fonts that are not required above the fold.\";\n console.warn(\n `[Farm.js] ${context} emitted ${warning.count} ${warning.kind} preload hints ` +\n `(budget: ${warning.budget}).${action}${recommendation}`,\n );\n }\n}\n\nexport function clearReportedFarmPreloadWarnings(): void {\n reportedWarnings.clear();\n}\n\ninterface PreloadCandidate {\n index: number;\n kind: FarmPreloadKind;\n highPriority: boolean;\n}\n\nfunction selectPreloadsWithinBudget(\n candidates: PreloadCandidate[],\n config: ResolvedFarmPreloadConfig,\n): { removed: Set<number>; warnings: FarmPreloadBudgetWarning[] } {\n const removed = new Set<number>();\n const warnings: FarmPreloadBudgetWarning[] = [];\n\n for (const kind of [\"image\", \"font\"] as const) {\n const matching = candidates.filter((candidate) => candidate.kind === kind);\n const limit = kind === \"image\" ? config.maxImages : config.maxFonts;\n if (matching.length <= limit) continue;\n\n const retained = new Set(\n [...matching]\n .sort(\n (left, right) =>\n Number(right.highPriority) - Number(left.highPriority) || left.index - right.index,\n )\n .slice(0, limit)\n .map((candidate) => candidate.index),\n );\n\n if (config.mode === \"enforce\") {\n for (const candidate of matching) {\n if (!retained.has(candidate.index)) removed.add(candidate.index);\n }\n }\n\n warnings.push({\n kind,\n count: matching.length,\n budget: limit,\n removed: config.mode === \"enforce\" ? matching.length - retained.size : 0,\n });\n }\n\n return { removed, warnings };\n}\n\nfunction getHtmlPreloadKind(link: string): FarmPreloadKind | undefined {\n const rel = readHtmlAttribute(link, \"rel\")?.toLowerCase().split(/\\s+/) || [];\n if (!rel.includes(\"preload\")) return undefined;\n return normalizePreloadKind(readHtmlAttribute(link, \"as\"));\n}\n\nfunction getLinkHeaderPreloadKind(link: string): FarmPreloadKind | undefined {\n const relations = getLinkHeaderParameter(link, \"rel\")?.toLowerCase().split(/\\s+/) ?? [];\n if (!relations.includes(\"preload\")) return undefined;\n return normalizePreloadKind(getLinkHeaderParameter(link, \"as\"));\n}\n\nfunction getLinkHeaderParameter(link: string, name: string): string | undefined {\n const uriEnd = link.indexOf(\">\");\n if (uriEnd === -1) return undefined;\n\n for (const parameter of splitLinkParameters(link.slice(uriEnd + 1))) {\n const separator = parameter.indexOf(\"=\");\n const parameterName = (separator === -1 ? parameter : parameter.slice(0, separator))\n .trim()\n .toLowerCase();\n if (parameterName !== name.toLowerCase() || separator === -1) continue;\n const rawValue = parameter.slice(separator + 1).trim();\n if (rawValue.startsWith('\"') && rawValue.endsWith('\"')) {\n return rawValue.slice(1, -1).replace(/\\\\([\\\\\"])/g, \"$1\");\n }\n return rawValue;\n }\n return undefined;\n}\n\nfunction splitLinkParameters(value: string): string[] {\n const parameters: string[] = [];\n let start = 0;\n let quoted = false;\n for (let index = 0; index < value.length; index += 1) {\n const character = value[index];\n if (character === '\"' && !isEscaped(value, index)) quoted = !quoted;\n else if (character === \";\" && !quoted) {\n const parameter = value.slice(start, index).trim();\n if (parameter) parameters.push(parameter);\n start = index + 1;\n }\n }\n const parameter = value.slice(start).trim();\n if (parameter) parameters.push(parameter);\n return parameters;\n}\n\nfunction normalizePreloadKind(value: string | undefined): FarmPreloadKind | undefined {\n const normalized = value?.toLowerCase();\n return normalized === \"image\" || normalized === \"font\" ? normalized : undefined;\n}\n\nfunction readHtmlAttribute(element: string, name: string): string | undefined {\n const match = element.match(\n new RegExp(`\\\\s${name}\\\\s*=\\\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\\\s>]+))`, \"i\"),\n );\n return match?.[1] ?? match?.[2] ?? match?.[3];\n}\n\ninterface HtmlLinkElement {\n start: number;\n end: number;\n value: string;\n}\n\nfunction findHtmlLinkElements(html: string): HtmlLinkElement[] {\n const elements: HtmlLinkElement[] = [];\n const lowerHtml = html.toLowerCase();\n let cursor = 0;\n\n while (cursor < html.length) {\n const start = html.indexOf(\"<\", cursor);\n if (start === -1) break;\n\n if (lowerHtml.startsWith(\"<!--\", start)) {\n const commentEnd = lowerHtml.indexOf(\"-->\", start + 4);\n cursor = commentEnd === -1 ? html.length : commentEnd + 3;\n continue;\n }\n\n const rawText = lowerHtml\n .slice(start)\n .match(/^<(script|style|template|textarea|title|noscript|svg)(?=[\\s/>])/);\n if (rawText?.[1]) {\n const openingEnd = findHtmlTagEnd(html, start);\n if (openingEnd === -1) break;\n const closingStart = findHtmlClosingTag(lowerHtml, rawText[1], openingEnd);\n if (closingStart === -1) {\n cursor = html.length;\n continue;\n }\n const closingEnd = findHtmlTagEnd(html, closingStart);\n cursor = closingEnd === -1 ? html.length : closingEnd;\n continue;\n }\n\n if (/^<link(?=[\\s/>])/i.test(html.slice(start))) {\n const end = findHtmlTagEnd(html, start);\n if (end === -1) break;\n elements.push({ start, end, value: html.slice(start, end) });\n cursor = end;\n continue;\n }\n\n if (/^<\\/?[A-Za-z][\\w:-]*(?=[\\s/>])/.test(html.slice(start))) {\n const end = findHtmlTagEnd(html, start);\n cursor = end === -1 ? html.length : end;\n continue;\n }\n\n cursor = start + 1;\n }\n\n return elements;\n}\n\nfunction findHtmlClosingTag(html: string, tagName: string, start: number): number {\n const prefix = `</${tagName}`;\n let candidate = html.indexOf(prefix, start);\n while (candidate !== -1) {\n const boundary = html[candidate + prefix.length];\n if (boundary === \">\" || boundary === \"/\" || /\\s/.test(boundary ?? \"\")) return candidate;\n candidate = html.indexOf(prefix, candidate + prefix.length);\n }\n return -1;\n}\n\nfunction findHtmlTagEnd(html: string, start: number): number {\n let quote: '\"' | \"'\" | undefined;\n for (let index = start + 1; index < html.length; index += 1) {\n const character = html[index];\n if (quote) {\n if (character === quote) quote = undefined;\n } else if (character === '\"' || character === \"'\") {\n quote = character;\n } else if (character === \">\") {\n return index + 1;\n }\n }\n return -1;\n}\n\nfunction removeHtmlLinkElements(\n html: string,\n elements: HtmlLinkElement[],\n removed: ReadonlySet<number>,\n): string {\n let cursor = 0;\n let output = \"\";\n for (const [index, element] of elements.entries()) {\n if (!removed.has(index)) continue;\n output += html.slice(cursor, element.start);\n cursor = element.end;\n }\n return output + html.slice(cursor);\n}\n\nfunction splitLinkHeader(value: string): string[] {\n const links: string[] = [];\n let start = 0;\n let insideAngleBrackets = false;\n let quoted = false;\n\n for (let index = 0; index < value.length; index += 1) {\n const character = value[index];\n if (quoted) {\n if (character === '\"' && !isEscaped(value, index)) quoted = false;\n continue;\n }\n if (character === '\"') {\n quoted = true;\n } else if (character === \"<\") {\n insideAngleBrackets = true;\n } else if (character === \">\") {\n insideAngleBrackets = false;\n } else if (character === \",\" && !insideAngleBrackets) {\n links.push(value.slice(start, index).trim());\n start = index + 1;\n }\n }\n\n links.push(value.slice(start).trim());\n return links.filter(Boolean);\n}\n\nfunction isEscaped(value: string, index: number): boolean {\n let backslashes = 0;\n for (let cursor = index - 1; cursor >= 0 && value[cursor] === \"\\\\\"; cursor -= 1) {\n backslashes += 1;\n }\n return backslashes % 2 === 1;\n}\n\nfunction normalizeBudget(value: number | undefined, fallback: number): number {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? Math.floor(value)\n : fallback;\n}\n","/**\n * Convert URLSearchParams into the object handed to routes as `search` /\n * `searchParams`: single keys stay strings and repeated keys collect into\n * arrays, in order. The dev renderer, the production SSR entry, the SPA\n * page-data endpoint, and the generated client hydration runtime all share\n * this helper so every environment agrees on one representation.\n */\nexport function searchParamsToObject(\n searchParams: URLSearchParams,\n): Record<string, string | string[] | undefined> {\n const output: Record<string, string | string[] | undefined> = {};\n\n searchParams.forEach((value, key) => {\n // Keys come from the request URL. Writing \"__proto__\" onto a plain object\n // replaces its prototype instead of adding an entry, so a crafted query\n // string could reshape the object handed to pages and workflow handlers.\n // The API route helper (entriesToObject in api/runtime.ts) already skips\n // these names; keep both representations consistent.\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") return;\n const existing = Object.prototype.hasOwnProperty.call(output, key) ? output[key] : undefined;\n if (existing !== undefined) {\n if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n output[key] = [existing, value];\n }\n } else {\n output[key] = value;\n }\n });\n\n return output;\n}\n","import type { RouteSegment, ParsedRoute } from \"./types\";\nimport path from \"path\";\nimport {\n assertBrowserStableRoutePath,\n assertTerminalCatchAll,\n assertUniqueRouteParameters,\n} from \"./routing/specificity\";\nimport { searchParamsToObject } from \"./search-params\";\nimport { decodeRouteSegment } from \"./utils/decode\";\n\nexport function parseRoutePath(filePath: string): ParsedRoute {\n const segments: RouteSegment[] = [];\n const normalizedPath = filePath.replace(/\\\\/g, \"/\");\n const pathParts = normalizedPath.split(\"/\").filter(Boolean);\n\n const fileName = pathParts.pop() || \"\";\n const fileType = getRouteType(fileName);\n const routePath = `/${pathParts.join(\"/\")}`;\n assertBrowserStableRoutePath(routePath);\n assertTerminalCatchAll(routePath);\n assertUniqueRouteParameters(routePath);\n\n for (const part of pathParts) {\n // Route groups like `(marketing)` organize files without adding URL\n // segments. Mirrors isRouteGroup in router.ts for programmatic routes.\n if (part.startsWith(\"(\") && part.endsWith(\")\")) continue;\n if (part.startsWith(\"[\") && part.endsWith(\"]\")) {\n let segment = part.slice(1, -1);\n const isDynamic = true;\n let isOptional = false;\n let isCatchAll = false;\n\n if (segment.startsWith(\"[\") && segment.endsWith(\"]\")) {\n isOptional = true;\n segment = segment.slice(1, -1);\n if (segment.startsWith(\"...\")) {\n segment = segment.slice(3);\n isCatchAll = true;\n }\n } else if (segment.startsWith(\"...\")) {\n segment = segment.slice(3);\n isCatchAll = true;\n }\n\n segments.push({ segment, isDynamic, isOptional, isCatchAll });\n } else {\n segments.push({\n segment: part,\n isDynamic: false,\n isOptional: false,\n isCatchAll: false,\n });\n }\n }\n\n return {\n segments,\n filePath: normalizedPath,\n type: fileType,\n };\n}\n\nfunction getRouteType(fileName: string): ParsedRoute[\"type\"] {\n const baseName = fileName.replace(/\\.(tsx?|jsx?|vue|svelte|mdx?|markdown)$/, \"\");\n\n switch (baseName) {\n case \"page\":\n return \"page\";\n case \"layout\":\n return \"layout\";\n case \"loading\":\n return \"loading\";\n case \"error\":\n return \"error\";\n case \"not-found\":\n return \"not-found\";\n default:\n return \"page\";\n }\n}\n\nexport function segmentsToPattern(segments: RouteSegment[]): string {\n if (segments.length === 0) return \"/\";\n\n return (\n \"/\" +\n segments\n .map((segment) => {\n if (!segment.isDynamic) return segment.segment;\n\n if (segment.isCatchAll) {\n return segment.isOptional ? `*${segment.segment}?` : `*${segment.segment}`;\n }\n\n return `:${segment.segment}`;\n })\n .join(\"/\")\n );\n}\n\nexport function matchRoute(\n url: string,\n segments: RouteSegment[],\n): { params: Record<string, string>; matches: boolean } {\n const urlParts = url.split(\"/\").filter(Boolean).map(decodeRouteSegment);\n const params: Record<string, string> = {};\n if (segments.length === 0) {\n return { params, matches: urlParts.length === 0 };\n }\n\n let urlIndex = 0;\n let segmentIndex = 0;\n\n while (segmentIndex < segments.length && urlIndex <= urlParts.length) {\n const segment = segments[segmentIndex];\n\n if (!segment.isDynamic) {\n if (urlParts[urlIndex] !== segment.segment) {\n return { params: {}, matches: false };\n }\n urlIndex++;\n segmentIndex++;\n } else if (segment.isCatchAll) {\n const remainingParts = urlParts.slice(urlIndex);\n\n if (remainingParts.length === 0 && !segment.isOptional) {\n return { params: {}, matches: false };\n }\n\n params[segment.segment] = remainingParts.join(\"/\");\n urlIndex = urlParts.length;\n segmentIndex++;\n } else {\n if (urlIndex >= urlParts.length) {\n return { params: {}, matches: false };\n }\n\n params[segment.segment] = urlParts[urlIndex];\n urlIndex++;\n segmentIndex++;\n }\n }\n\n const matches = segmentIndex === segments.length && urlIndex === urlParts.length;\n\n return { params, matches };\n}\n\n/** Match a route segment chain as an owner of the pathname or one of its descendants. */\nexport function matchRoutePrefix(url: string, segments: RouteSegment[]): boolean {\n const urlParts = url.split(\"/\").filter(Boolean).map(decodeRouteSegment);\n let urlIndex = 0;\n\n for (const segment of segments) {\n if (segment.isCatchAll) {\n return segment.isOptional || urlIndex < urlParts.length;\n }\n\n const urlPart = urlParts[urlIndex];\n if (urlPart === undefined) return false;\n if (!segment.isDynamic && segment.segment !== urlPart) return false;\n urlIndex++;\n }\n\n return true;\n}\n\nexport function resolveAppPath(root: string, ...paths: string[]): string {\n return path.resolve(root, ...paths);\n}\n\n/**\n * Convert an absolute module path inside the project root to a root-relative\n * URL path with forward slashes (e.g. `/src/app/page.tsx`), for values the\n * client passes to dynamic `import()`. On Windows the naive root-prefix slice\n * yields `\\src\\app\\page.tsx`, which is not a valid module specifier. Returns\n * undefined for paths outside the root so callers keep their own fallbacks.\n */\nexport function toRootRelativeUrlPath(\n absolutePath: string,\n projectRoot: string,\n): string | undefined {\n if (absolutePath === projectRoot) return \"\";\n if (absolutePath.startsWith(`${projectRoot}/`) || absolutePath.startsWith(`${projectRoot}\\\\`)) {\n return absolutePath.slice(projectRoot.length).replace(/\\\\/g, \"/\");\n }\n return undefined;\n}\n\n/**\n * Normalize a filesystem path to forward slashes. Node's fs accepts these on\n * every platform, and module ids handed to bundlers (e.g. Nitro handler and\n * task entries) must not contain backslashes.\n */\nexport function toPosixPath(filePath: string): string {\n return filePath.replace(/\\\\/g, \"/\");\n}\n\nexport function toViteModuleId(filePath: string, root: string): string {\n if (!path.isAbsolute(filePath)) return filePath;\n\n const relativePath = path.relative(root, filePath);\n if (relativePath && !relativePath.startsWith(\"..\") && !path.isAbsolute(relativePath)) {\n return `/${relativePath.split(path.sep).join(\"/\")}`;\n }\n\n const normalizedPath = filePath.replace(/\\\\/g, \"/\");\n return normalizedPath.startsWith(\"/\") ? `/@fs${normalizedPath}` : `/@fs/${normalizedPath}`;\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n const fs = await import(\"fs/promises\");\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function globFiles(pattern: string, cwd: string): Promise<string[]> {\n const glob = await import(\"fast-glob\");\n return glob.default(pattern, { cwd, absolute: false });\n}\n\nexport function parseSearchParams(\n searchParams: URLSearchParams,\n): Record<string, string | string[]> {\n return searchParamsToObject(searchParams) as Record<string, string | string[]>;\n}\n\nexport const logger = {\n info: (message: string) => console.log(`[info] ${message}`),\n success: (message: string) => console.log(`[success] ${message}`),\n warn: (message: string) => console.warn(`⚠️ ${message}`),\n error: (message: string) => console.error(`❌ ${message}`),\n ready: (message: string) => console.log(`${message}`),\n event: (message: string) => console.log(` ${message}`),\n};\n","export async function createFarmLegacyRequest<TEvent extends { method?: string }>(\n event: TEvent,\n input: string | URL,\n headers: HeadersInit,\n readRawBody: (event: TEvent, encoding: false) => Promise<BodyInit | null | undefined>,\n): Promise<Request> {\n const method = event.method || \"GET\";\n const body =\n method === \"GET\" || method === \"HEAD\"\n ? undefined\n : ((await readRawBody(event, false)) ?? undefined);\n\n return new Request(input, { method, headers, body });\n}\n","const FARM_LEGACY_ERROR_HTML =\n \"<!DOCTYPE html><html><head><title>Error</title></head><body><h1>Error</h1><p>Internal Server Error</p></body></html>\";\n\nexport function serializeFarmInlineValue(value: unknown): string {\n return (JSON.stringify(value) ?? \"null\")\n .replace(/</g, \"\\\\u003c\")\n .replace(/\\u2028/g, \"\\\\u2028\")\n .replace(/\\u2029/g, \"\\\\u2029\");\n}\n\nfunction escapeFarmHtmlAttribute(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nexport function renderFarmLegacyHtml(options: {\n deploymentId: unknown;\n pageProps: unknown;\n pathname: unknown;\n html: string;\n clientScript: string;\n}): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <link rel=\"icon\" href=\"data:,\">\n <title>Farm.js App</title>\n <script>\n window.__FARM_DEPLOYMENT_ID__ = ${serializeFarmInlineValue(options.deploymentId)};\n window.__FARM_PROPS__ = ${serializeFarmInlineValue(options.pageProps)};\n window.__FARM_PATH__ = ${serializeFarmInlineValue(options.pathname)};\n </script>\n</head>\n<body>\n <div id=\"root\">${options.html}</div>\n <script type=\"module\" src=\"${escapeFarmHtmlAttribute(options.clientScript)}\"></script>\n</body>\n</html>`;\n}\n\nexport function renderFarmLegacyErrorHtml(): string {\n return FARM_LEGACY_ERROR_HTML;\n}\n","const FARM_TRAILING_SLASH_PREFERENCE = Symbol.for(\"farm.trailingSlashPreference\");\n\nfunction getFarmGlobalState(): Record<PropertyKey, unknown> {\n return globalThis as unknown as Record<PropertyKey, unknown>;\n}\n\n/** @internal Configure the app-wide URL preference for framework link rendering. */\nexport function setFarmTrailingSlashPreference(enabled: boolean | undefined): void {\n getFarmGlobalState()[FARM_TRAILING_SLASH_PREFERENCE] = enabled === true;\n}\n\n/** @internal Read the app-wide URL preference used by framework links. */\nexport function getFarmTrailingSlashPreference(): boolean {\n return getFarmGlobalState()[FARM_TRAILING_SLASH_PREFERENCE] === true;\n}\n\nexport function normalizeFarmTrailingSlashPathname(pathname: string, enabled: boolean): string {\n if (pathname === \"/\") return pathname;\n if (enabled) return pathname.endsWith(\"/\") ? pathname : `${pathname}/`;\n return pathname.replace(/\\/+$/, \"\") || \"/\";\n}\n\nexport function resolveFarmTrailingSlashRedirect(url: URL, enabled: boolean): string | null {\n const pathname = normalizeFarmTrailingSlashPathname(url.pathname, enabled);\n return pathname === url.pathname ? null : `${pathname}${url.search}`;\n}\n","/** Preserve an incoming query when a redirect destination does not declare one. */\nexport function appendFarmRedirectQuery(destination: string, search: string): string {\n if (!search || search === \"?\") return destination;\n\n const hashIndex = destination.indexOf(\"#\");\n const pathAndQuery = hashIndex === -1 ? destination : destination.slice(0, hashIndex);\n if (pathAndQuery.includes(\"?\")) return destination;\n\n if (hashIndex === -1) return `${destination}${search}`;\n return `${pathAndQuery}${search}${destination.slice(hashIndex)}`;\n}\n"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":["storage","context","context","context","import_node_async_hooks","storage","import_node_async_hooks","context","initialTagCount","isRecord","context","module","match","result","context","module","context","context","decodeCookieValue","context","parameter","getFarmGlobalState"]}
|