@farm.js/core 0.1.0-beta.3 → 0.1.0-beta.5
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/agent-runtime.d.mts +2 -1
- package/dist/agent-runtime.d.ts +2 -1
- package/dist/api/route-manager.cjs +313 -10
- package/dist/api/route-manager.cjs.map +1 -1
- package/dist/api/route-manager.d.mts +3 -2
- package/dist/api/route-manager.d.ts +3 -2
- package/dist/api/route-manager.mjs +6 -5
- package/dist/api/runtime.cjs +313 -10
- package/dist/api/runtime.cjs.map +1 -1
- package/dist/api/runtime.d.mts +2 -1
- package/dist/api/runtime.d.ts +2 -1
- package/dist/api/runtime.mjs +4 -3
- package/dist/api.cjs +642 -57
- package/dist/api.cjs.map +1 -1
- package/dist/api.d.mts +3 -2
- package/dist/api.d.ts +3 -2
- package/dist/api.mjs +29 -9
- package/dist/{app-DOKxo-LH.d.ts → app-BjN-da13.d.ts} +38 -3
- package/dist/{app-BB3Iu3xh.d.mts → app-CakAr8Be.d.mts} +38 -3
- package/dist/app-markdown.d.mts +2 -1
- package/dist/app-markdown.d.ts +2 -1
- package/dist/cache.cjs +395 -12
- package/dist/cache.cjs.map +1 -1
- package/dist/cache.d.mts +100 -6
- package/dist/cache.d.ts +100 -6
- package/dist/cache.mjs +8 -2
- package/dist/{chunk-XUBZ7JI4.mjs → chunk-2CUKEMVR.mjs} +187 -16
- package/dist/chunk-2CUKEMVR.mjs.map +1 -0
- package/dist/{chunk-OHC6VCDI.mjs → chunk-2NHCNRF6.mjs} +521 -42
- package/dist/chunk-2NHCNRF6.mjs.map +1 -0
- package/dist/{chunk-6WXJ54TC.mjs → chunk-65A7QIKI.mjs} +5 -5
- package/dist/{chunk-6WXJ54TC.mjs.map → chunk-65A7QIKI.mjs.map} +1 -1
- package/dist/{chunk-5QH4IKY3.mjs → chunk-7N62DNSO.mjs} +2 -2
- package/dist/{chunk-XJSHJN4M.mjs → chunk-A2LUXHD2.mjs} +593 -49
- package/dist/chunk-A2LUXHD2.mjs.map +1 -0
- package/dist/chunk-ALCLXXTY.mjs +187 -0
- package/dist/chunk-ALCLXXTY.mjs.map +1 -0
- package/dist/{chunk-CSU4KJJF.mjs → chunk-C2ROET2V.mjs} +2 -2
- package/dist/{chunk-JNYVN7YP.mjs → chunk-EEABSBKK.mjs} +2 -2
- package/dist/{chunk-JNYVN7YP.mjs.map → chunk-EEABSBKK.mjs.map} +1 -1
- package/dist/{chunk-BIOIOWXZ.mjs → chunk-HNIQFZKB.mjs} +2 -2
- package/dist/{chunk-MH6FKW2I.mjs → chunk-J5YWQVI5.mjs} +4 -4
- package/dist/chunk-J5YWQVI5.mjs.map +1 -0
- package/dist/{chunk-G5I34UA6.mjs → chunk-JDEOUK5V.mjs} +4 -4
- package/dist/{chunk-T543TMFY.mjs → chunk-NM3CRAAL.mjs} +3 -2
- package/dist/chunk-NM3CRAAL.mjs.map +1 -0
- package/dist/{chunk-LWMGIEJA.mjs → chunk-PFE6GMNE.mjs} +47 -37
- package/dist/chunk-PFE6GMNE.mjs.map +1 -0
- package/dist/{chunk-6VS6CKAV.mjs → chunk-QM746KUO.mjs} +8 -1
- package/dist/chunk-QM746KUO.mjs.map +1 -0
- package/dist/{chunk-5FW6PQ3J.mjs → chunk-QTZZ2ISQ.mjs} +41 -16
- package/dist/chunk-QTZZ2ISQ.mjs.map +1 -0
- package/dist/{chunk-SHRJG6OG.mjs → chunk-RBRLLZL5.mjs} +18 -3
- package/dist/chunk-RBRLLZL5.mjs.map +1 -0
- package/dist/{chunk-NRRFGX45.mjs → chunk-TQAEEJB4.mjs} +3 -3
- package/dist/{chunk-45LKHSHJ.mjs → chunk-UB5UOSHB.mjs} +24 -12
- package/dist/chunk-UB5UOSHB.mjs.map +1 -0
- package/dist/chunk-V3XURYJO.mjs +756 -0
- package/dist/chunk-V3XURYJO.mjs.map +1 -0
- package/dist/{chunk-HZYXGV4K.mjs → chunk-VY2UYN5R.mjs} +24 -4
- package/dist/chunk-VY2UYN5R.mjs.map +1 -0
- package/dist/{chunk-C33RALN7.mjs → chunk-W2CRQFF6.mjs} +79 -15
- package/dist/chunk-W2CRQFF6.mjs.map +1 -0
- package/dist/{chunk-LG3YINQN.mjs → chunk-Z5CQMP54.mjs} +3 -3
- package/dist/{client-DiViK9yK.d.mts → client-BT1mFQas.d.mts} +23 -4
- package/dist/{client-DpEBJbts.d.ts → client-Nn0q4eO4.d.ts} +23 -4
- package/dist/{client-plugins-CTnsZz_A.d.ts → client-plugins-Cw4qUGsw.d.ts} +6 -0
- package/dist/{client-plugins-Cnr0D3kk.d.mts → client-plugins-DQQ1adXM.d.mts} +6 -0
- package/dist/client-plugins.d.mts +2 -1
- package/dist/client-plugins.d.ts +2 -1
- package/dist/client.cjs +665 -82
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.mts +71 -5
- package/dist/client.d.ts +71 -5
- package/dist/client.mjs +10 -7
- package/dist/config.d.mts +2 -1
- package/dist/config.d.ts +2 -1
- package/dist/{devtools-HE4FTUDN.mjs → devtools-LVC3VB5P.mjs} +4 -4
- package/dist/docs.cjs +11 -1
- package/dist/docs.cjs.map +1 -1
- package/dist/docs.mjs +4 -4
- package/dist/index.cjs +2113 -198
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +16 -16
- package/dist/index.d.ts +16 -16
- package/dist/index.mjs +49 -21
- package/dist/index.mjs.map +1 -1
- package/dist/integrations.d.mts +2 -1
- package/dist/integrations.d.ts +2 -1
- package/dist/internal/build-runtime.cjs +1455 -90
- package/dist/internal/build-runtime.cjs.map +1 -1
- package/dist/internal/build-runtime.d.mts +4 -3
- package/dist/internal/build-runtime.d.ts +4 -3
- package/dist/internal/build-runtime.mjs +15 -14
- package/dist/internal/config-runtime.cjs +12 -1
- package/dist/internal/config-runtime.cjs.map +1 -1
- package/dist/internal/config-runtime.d.mts +3 -2
- package/dist/internal/config-runtime.d.ts +3 -2
- package/dist/internal/config-runtime.mjs +3 -3
- package/dist/internal/production-runtime.cjs +282 -6
- package/dist/internal/production-runtime.cjs.map +1 -1
- package/dist/internal/production-runtime.d.mts +4 -4
- package/dist/internal/production-runtime.d.ts +4 -4
- package/dist/internal/production-runtime.mjs +4 -2
- package/dist/{metadata-eoVmHoyv.d.ts → metadata-BAPg_Nmo.d.ts} +1 -1
- package/dist/{metadata-Dp8AdvsB.d.mts → metadata-_6i9oFG3.d.mts} +1 -1
- package/dist/middleware.d.mts +4 -3
- package/dist/middleware.d.ts +4 -3
- package/dist/navigation.cjs +40 -15
- package/dist/navigation.cjs.map +1 -1
- package/dist/navigation.mjs +2 -2
- package/dist/plugin.cjs +913 -53
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.mts +2 -1
- package/dist/plugin.d.ts +2 -1
- package/dist/plugin.mjs +11 -10
- package/dist/{production-runtime-BqTnUTai.d.ts → production-runtime-BoJDc5mc.d.ts} +1 -1
- package/dist/{production-runtime-DtDdG9fc.d.mts → production-runtime-DPfgMV9Y.d.mts} +1 -1
- package/dist/routes.cjs +276 -6
- package/dist/routes.cjs.map +1 -1
- package/dist/routes.d.mts +1 -1
- package/dist/routes.d.ts +1 -1
- package/dist/routes.mjs +3 -3
- package/dist/{runtime-C1B7pSGT.d.mts → runtime-9nQjVM7X.d.mts} +8 -9
- package/dist/{runtime-CdPHt0bv.d.ts → runtime-DgeS2skB.d.ts} +8 -9
- package/dist/server-action-security.cjs +28 -10
- package/dist/server-action-security.cjs.map +1 -1
- package/dist/server-action-security.d.mts +2 -1
- package/dist/server-action-security.d.ts +2 -1
- package/dist/server-action-security.mjs +2 -2
- package/dist/server-fn-client.d.mts +1 -0
- package/dist/server-fn-client.d.ts +1 -0
- package/dist/server-fn.cjs +785 -3
- package/dist/server-fn.cjs.map +1 -1
- package/dist/server-fn.d.mts +10 -1
- package/dist/server-fn.d.ts +10 -1
- package/dist/server-fn.mjs +6 -3
- package/dist/server-plugins.d.mts +3 -2
- package/dist/server-plugins.d.ts +3 -2
- package/dist/server-query-client.cjs +279 -8
- package/dist/server-query-client.cjs.map +1 -1
- package/dist/server-query-client.mjs +4 -4
- package/dist/server-query.cjs +381 -10
- package/dist/server-query.cjs.map +1 -1
- package/dist/server-query.mjs +5 -5
- package/dist/server.cjs +1086 -76
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.mts +8 -7
- package/dist/server.d.ts +8 -7
- package/dist/server.mjs +31 -16
- package/dist/server.mjs.map +1 -1
- package/dist/testing.cjs +341 -20
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.mts +3 -2
- package/dist/testing.d.ts +3 -2
- package/dist/testing.mjs +7 -6
- package/dist/testing.mjs.map +1 -1
- package/dist/transport-BmbGTXA5.d.mts +49 -0
- package/dist/transport-BmbGTXA5.d.ts +49 -0
- package/dist/{utils-8USa5BiY.d.mts → utils-CHXlMDkg.d.mts} +1 -1
- package/dist/{utils-DKJb6K6G.d.ts → utils-Drsyz1Vj.d.ts} +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -1
- package/dist/version.mjs +1 -1
- package/dist/vite.cjs +914 -54
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.d.mts +2 -1
- package/dist/vite.d.ts +2 -1
- package/dist/vite.mjs +11 -10
- package/package.json +1 -1
- package/types/api.d.ts +44 -0
- package/types/client.d.ts +85 -4
- package/dist/chunk-45LKHSHJ.mjs.map +0 -1
- package/dist/chunk-5FW6PQ3J.mjs.map +0 -1
- package/dist/chunk-6VS6CKAV.mjs.map +0 -1
- package/dist/chunk-C33RALN7.mjs.map +0 -1
- package/dist/chunk-GZWT6VI5.mjs +0 -382
- package/dist/chunk-GZWT6VI5.mjs.map +0 -1
- package/dist/chunk-HZYXGV4K.mjs.map +0 -1
- package/dist/chunk-LWMGIEJA.mjs.map +0 -1
- package/dist/chunk-MH6FKW2I.mjs.map +0 -1
- package/dist/chunk-OHC6VCDI.mjs.map +0 -1
- package/dist/chunk-SHRJG6OG.mjs.map +0 -1
- package/dist/chunk-T543TMFY.mjs.map +0 -1
- package/dist/chunk-XJSHJN4M.mjs.map +0 -1
- package/dist/chunk-XUBZ7JI4.mjs.map +0 -1
- /package/dist/{chunk-5QH4IKY3.mjs.map → chunk-7N62DNSO.mjs.map} +0 -0
- /package/dist/{chunk-CSU4KJJF.mjs.map → chunk-C2ROET2V.mjs.map} +0 -0
- /package/dist/{chunk-BIOIOWXZ.mjs.map → chunk-HNIQFZKB.mjs.map} +0 -0
- /package/dist/{chunk-G5I34UA6.mjs.map → chunk-JDEOUK5V.mjs.map} +0 -0
- /package/dist/{chunk-NRRFGX45.mjs.map → chunk-TQAEEJB4.mjs.map} +0 -0
- /package/dist/{chunk-LG3YINQN.mjs.map → chunk-Z5CQMP54.mjs.map} +0 -0
- /package/dist/{devtools-HE4FTUDN.mjs.map → devtools-LVC3VB5P.mjs.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/nitro/production-runtime.ts","../../src/after.ts","../../src/server/request.ts","../../src/server/request-bridge.ts","../../src/observability.ts","../../src/cache.ts","../../src/i18n/routing.ts","../../src/i18n/resolver.ts","../../src/metadata.ts","../../src/middleware/module.ts","../../src/middleware/production-runtime.ts","../../src/middleware/server.ts","../../src/navigation-errors.ts","../../src/route-context.ts"],"sourcesContent":["export { _runWithAfterRequest } from \"../after\";\nexport { _runWithCurrentRequest, getCurrentRequest } from \"../server/request\";\nexport { createFarmCacheKey, getFarmDataCache, normalizeRevalidatePath } 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 {\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 { configureFarmObservability, emitFarmEvent } from \"../observability\";\nexport { resolveFarmRouteContext, withFarmRouteContext } from \"../route-context\";\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 async cancel(reason) {\n try {\n await 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 if (!hasResponseHook) 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","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { FarmRequest } from \"../types\";\nimport { _setCurrentRequestResolver } from \"./request-bridge\";\n\nconst REQUEST_STORAGE_KEY = Symbol.for(\"@farm.js/core/request-storage\");\n\nfunction getRequestStore(): AsyncLocalStorage<Request> {\n const runtime = globalThis as typeof globalThis & Record<PropertyKey, unknown>;\n const existing = runtime[REQUEST_STORAGE_KEY];\n if (existing instanceof AsyncLocalStorage) {\n return existing as AsyncLocalStorage<Request>;\n }\n\n const storage = new AsyncLocalStorage<Request>();\n runtime[REQUEST_STORAGE_KEY] = storage;\n return storage;\n}\n\nconst requestStore = getRequestStore();\n\n_setCurrentRequestResolver(() => requestStore.getStore());\n\nexport function createWebRequestFromFarmRequest(req: FarmRequest): Request {\n const forwardedHost = req.headers[\"x-forwarded-host\"];\n const host = Array.isArray(forwardedHost)\n ? forwardedHost[0]\n : forwardedHost || req.headers.host || \"localhost\";\n const forwardedProto = req.headers[\"x-forwarded-proto\"];\n const proto = Array.isArray(forwardedProto) ? forwardedProto[0] : forwardedProto || \"http\";\n const fullUrl = new URL(req.url || \"/\", `${proto}://${host}`).toString();\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value == null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n headers.append(key, item);\n }\n continue;\n }\n\n headers.set(key, value);\n }\n\n return new Request(fullUrl, {\n method: req.method,\n headers,\n });\n}\n\nexport async function _runWithCurrentRequest<T>(\n request: Request,\n fn: () => Promise<T> | T,\n): Promise<T> {\n return requestStore.run(request, fn);\n}\n\nexport function getCurrentRequest(): Request {\n const request = requestStore.getStore();\n if (!request) {\n throw new Error(\n \"No current request is available. getCurrentRequest() can only be used during server rendering.\",\n );\n }\n\n return request;\n}\n","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","export type FarmEventLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface FarmEventBase {\n type: string;\n timestamp: number;\n level: FarmEventLevel;\n requestId?: string;\n route?: string;\n pathname?: string;\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 & { type: \"api.error\"; route: string; method: string; error: unknown });\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 | 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 };\n\nexport interface FarmResolvedObservabilityConfig {\n logs: boolean;\n handlers: FarmEventHandler[];\n events?: Set<FarmEventType>;\n}\n\nconst runtimeHandlers = new Set<FarmEventHandler>();\nlet observabilityState: FarmResolvedObservabilityConfig = {\n logs: false,\n handlers: [],\n};\n\nexport function configureFarmObservability(config: FarmObservabilityUserConfig | undefined): void {\n observabilityState = normalizeFarmObservabilityConfig(config);\n}\n\nexport function normalizeFarmObservabilityConfig(\n config: FarmObservabilityUserConfig | undefined,\n): FarmResolvedObservabilityConfig {\n if (config === undefined || config === false) {\n return { logs: false, handlers: [] };\n }\n\n if (config === true) {\n return { logs: true, handlers: [] };\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 };\n}\n\nexport function onFarmEvent(handler: FarmEventHandler): () => void {\n runtimeHandlers.add(handler);\n return () => {\n runtimeHandlers.delete(handler);\n };\n}\n\nexport function resetFarmObservability(): void {\n runtimeHandlers.clear();\n observabilityState = {\n logs: false,\n handlers: [],\n };\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 if (!shouldEmitFarmEvent(event)) {\n return event;\n }\n\n if (observabilityState.logs) {\n logFarmEvent(event);\n }\n\n for (const handler of [...observabilityState.handlers, ...runtimeHandlers]) {\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 return event;\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 } 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\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 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 createdAt: number;\n createdVersion: number;\n revalidate?: number | false;\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\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 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 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 delete(key: string): boolean {\n const deleted = this.entries.delete(key);\n emitFarmEvent({ type: \"cache.delete\", key, deleted });\n return deleted;\n }\n\n clear(): void {\n const count = this.entries.size;\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 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 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 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 getOrSet<T>(\n key: string,\n producer: () => Promise<T> | T,\n options: FarmCacheOptions = {},\n ): Promise<T> {\n const cached = this.getEntry<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 promise = Promise.resolve()\n .then(producer)\n .then((value) => {\n this.set(key, value, options);\n return value;\n })\n .catch((error) => {\n emitFarmEvent({ type: \"cache.error\", key, operation: \"set\", error });\n throw error;\n })\n .finally(() => {\n this.inflight.delete(key);\n });\n\n this.inflight.set(key, promise);\n return promise;\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 createdAt: entry.createdAt,\n createdVersion: entry.createdVersion,\n revalidate: entry.revalidate,\n };\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());\nconst functionIds = new WeakMap<Function, number>();\nlet nextFunctionId = 0;\n\nexport function getFarmDataCache(): FarmDataCache {\n return sharedFarmDataCache;\n}\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\nexport function revalidateTag(_tag: string, _profile?: RevalidateTagProfile): void {\n getFarmDataCache().revalidateTag(_tag, {\n source: \"revalidateTag\",\n profile: _profile,\n });\n}\n\nexport function updateTag(tag: string): void {\n getFarmDataCache().revalidateTag(tag, { source: \"updateTag\" });\n}\n\nexport function revalidatePath(routePath: string): void {\n getFarmDataCache().revalidatePath(routePath);\n}\n\nexport function invalidate(key: RouteDataCacheKey): void {\n const clientKey = createRouteDataCacheKey(key);\n getFarmDataCache().revalidateTag(createRouteDataCacheTag(key), { source: \"updateTag\" });\n notifyFarmCacheInvalidation(clientKey);\n}\n\nexport function invalidateRouteData(key: RouteDataCacheKey): void {\n invalidate(key);\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?:\\/\\//.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(\"?\")[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 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 getFunctionCacheIdentity(fn: Function): string {\n if (fn.name) {\n return `name:${fn.name}`;\n }\n\n let id = functionIds.get(fn);\n if (!id) {\n id = ++nextFunctionId;\n functionIds.set(fn, id);\n }\n return `anonymous:${id}`;\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 return `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\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableSerialize(item, seen)).join(\",\")}]`;\n }\n\n if (value && typeof value === \"object\") {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n\n const entries = Object.entries(value as Record<string, unknown>).sort(([a], [b]) =>\n a.localeCompare(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","import type { FarmI18nDirection, FarmI18nRouting, ResolvedFarmI18nConfig } from \"./types\";\n\nexport interface FarmLocalePathConfig {\n locales: readonly string[];\n defaultLocale: string;\n routing: FarmI18nRouting;\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(pathname);\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 if (config.routing === \"none\") return internalPathname;\n if (config.routing === \"prefix-except-default\" && locale === config.defaultLocale) {\n return internalPathname;\n }\n return internalPathname === \"/\" ? `/${locale}` : `/${locale}${internalPathname}`;\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 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(url.pathname) &&\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 const candidates = header\n .split(\",\")\n .map((entry, index) => {\n const [locale = \"\", ...parameters] = entry.trim().split(\";\");\n const qualityValue = parameters\n .map((parameter) => parameter.trim())\n .find((parameter) => parameter.startsWith(\"q=\"));\n const quality = qualityValue ? Number(qualityValue.slice(2)) : 1;\n return { locale, quality: Number.isFinite(quality) ? quality : 0, index };\n })\n .filter((candidate) => candidate.locale && candidate.locale !== \"*\" && candidate.quality > 0)\n .sort((a, b) => b.quality - a.quality || a.index - b.index);\n\n for (const candidate of candidates) {\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","import type { Metadata } from \"./types\";\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}\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 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\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 function renderMetadataHead(metadata: MetadataRecord | undefined): RenderedMetadataHead {\n const resolvedMetadata = metadata || {};\n const metadataBase = resolveMetadataBase(resolvedMetadata);\n const title = resolveMetadataTitle(resolvedMetadata.title) || \"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 if (isRecord(alternates)) {\n appendLink(tags, \"canonical\", resolveMetadataUrl(alternates.canonical, metadataBase));\n\n if (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\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 return {\n title: escapeText(title),\n tags: tags.length > 0 ? `\\n ${tags.join(\"\\n \")}` : \"\",\n hasFavicon,\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 appendMetaProperty(tags, \"og:type\", openGraph.type);\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","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);\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","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 { normalizeMiddlewareModule } from \"./module\";\nimport { stripFarmLocaleFromPathname } from \"../i18n/routing\";\nimport type { ResolvedFarmI18nConfig } from \"../i18n/types\";\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}\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 getRequest(): Request;\n getResponse(): Response | null;\n}\n\nfunction parseCookies(cookieHeader?: string | null): Record<string, string> {\n if (!cookieHeader) return {};\n\n return cookieHeader.split(\";\").reduce(\n (cookies, cookie) => {\n const [name, ...rest] = cookie.split(\"=\");\n const value = rest.join(\"=\").trim();\n if (name && value) {\n cookies[name.trim()] = decodeURIComponent(value);\n }\n return cookies;\n },\n {} as Record<string, string>,\n );\n}\n\nfunction serializeCookie(name: string, value: string, options: CookieOptions = {}): string {\n let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\n\n if (options.maxAge) 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 private setCookies: string[] = [];\n\n constructor(\n request: Request,\n private headers: Map<string, string>,\n ) {\n this.cookies = parseCookies(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.setCookies.push(cookieString);\n this.headers.set(\"Set-Cookie\", this.setCookies.join(\", \"));\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.setCookies.push(cookieString);\n this.headers.set(\"Set-Cookie\", this.setCookies.join(\", \"));\n }\n\n getAll(): Record<string, string> {\n return { ...this.cookies };\n }\n}\n\nfunction mapToHeaders(map: Map<string, string>): Headers {\n const headers = new Headers();\n for (const [key, value] of map) {\n if (key.toLowerCase() === \"set-cookie\") {\n headers.append(key, value);\n } else {\n headers.set(key, value);\n }\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: Map<string, string>): Record<string, any> {\n return {\n headersSent: false,\n writableEnded: false,\n setHeader(name: string, value: string | string[]) {\n headers.set(name, Array.isArray(value) ? value.join(\", \") : String(value));\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): Request {\n const requestWithShape = request as Request & {\n socket?: { remoteAddress?: string };\n };\n\n if (!requestWithShape.socket) {\n const forwardedFor = request.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim();\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: Map<string, string>,\n): Response {\n const responseHeaders = new Headers(init.headers);\n for (const [key, value] of headers) {\n if (key.toLowerCase() === \"set-cookie\") {\n responseHeaders.append(key, value);\n } else {\n responseHeaders.set(key, value);\n }\n }\n return new Response(body, { ...init, headers: responseHeaders });\n}\n\nfunction createWebMiddlewareContext(\n request: Request,\n parent?: MiddlewareContext[\"parent\"],\n): WebMiddlewareContextState {\n let currentRequest = withNodeRequestShape(request);\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 Map<string, string>();\n\n if (parent?.headers) {\n for (const [key, value] of Object.entries(parent.headers)) {\n headers.set(key, value);\n }\n }\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));\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 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] = decodeURIComponent(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\") {\n return { matched: matcher(ctx) };\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(request);\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(ctx.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(currentRequest, parentData);\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(ctx.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(ctx.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(ctx.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(ctx.headers),\n };\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(ctx.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 for (const [key, value] of middlewareHeaders) {\n if (key.toLowerCase() === \"set-cookie\") {\n headers.append(key, value);\n } else {\n headers.set(key, value);\n }\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 (isRedirectStatus(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\nfunction isRedirectStatus(status: number): status is FarmRedirectStatus {\n return status === 301 || status === 302 || status === 303 || status === 307 || status === 308;\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"],"mappings":"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","names":["import_node_async_hooks","initialTagCount","module","match","result"]}
|
|
1
|
+
{"version":3,"sources":["../../src/nitro/production-runtime.ts","../../src/after.ts","../../src/server/request.ts","../../src/server/request-bridge.ts","../../src/observability.ts","../../src/cache.ts","../../src/i18n/routing.ts","../../src/i18n/resolver.ts","../../src/metadata.ts","../../src/middleware/module.ts","../../src/middleware/production-runtime.ts","../../src/middleware/server.ts","../../src/navigation-errors.ts","../../src/route-context.ts"],"sourcesContent":["export { _runWithAfterRequest } from \"../after\";\nexport { _runWithCurrentRequest, getCurrentRequest } from \"../server/request\";\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 {\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 { configureFarmObservability, emitFarmEvent } from \"../observability\";\nexport { resolveFarmRouteContext, withFarmRouteContext } from \"../route-context\";\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 async cancel(reason) {\n try {\n await 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 if (!hasResponseHook) 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","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { FarmRequest } from \"../types\";\nimport { _setCurrentRequestResolver } from \"./request-bridge\";\n\nconst REQUEST_STORAGE_KEY = Symbol.for(\"@farm.js/core/request-storage\");\n\nfunction getRequestStore(): AsyncLocalStorage<Request> {\n const runtime = globalThis as typeof globalThis & Record<PropertyKey, unknown>;\n const existing = runtime[REQUEST_STORAGE_KEY];\n if (existing instanceof AsyncLocalStorage) {\n return existing as AsyncLocalStorage<Request>;\n }\n\n const storage = new AsyncLocalStorage<Request>();\n runtime[REQUEST_STORAGE_KEY] = storage;\n return storage;\n}\n\nconst requestStore = getRequestStore();\n\n_setCurrentRequestResolver(() => requestStore.getStore());\n\nexport function createWebRequestFromFarmRequest(req: FarmRequest): Request {\n const forwardedHost = req.headers[\"x-forwarded-host\"];\n const host = Array.isArray(forwardedHost)\n ? forwardedHost[0]\n : forwardedHost || req.headers.host || \"localhost\";\n const forwardedProto = req.headers[\"x-forwarded-proto\"];\n const proto = Array.isArray(forwardedProto) ? forwardedProto[0] : forwardedProto || \"http\";\n const fullUrl = new URL(req.url || \"/\", `${proto}://${host}`).toString();\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value == null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n headers.append(key, item);\n }\n continue;\n }\n\n headers.set(key, value);\n }\n\n return new Request(fullUrl, {\n method: req.method,\n headers,\n });\n}\n\nexport async function _runWithCurrentRequest<T>(\n request: Request,\n fn: () => Promise<T> | T,\n): Promise<T> {\n return requestStore.run(request, fn);\n}\n\nexport function getCurrentRequest(): Request {\n const request = requestStore.getStore();\n if (!request) {\n throw new Error(\n \"No current request is available. getCurrentRequest() can only be used during server rendering.\",\n );\n }\n\n return request;\n}\n","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","export type FarmEventLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface FarmEventBase {\n type: string;\n timestamp: number;\n level: FarmEventLevel;\n requestId?: string;\n route?: string;\n pathname?: string;\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 & { type: \"api.error\"; route: string; method: string; error: unknown });\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 | 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 };\n\nexport interface FarmResolvedObservabilityConfig {\n logs: boolean;\n handlers: FarmEventHandler[];\n events?: Set<FarmEventType>;\n}\n\nconst runtimeHandlers = new Set<FarmEventHandler>();\nlet observabilityState: FarmResolvedObservabilityConfig = {\n logs: false,\n handlers: [],\n};\n\nexport function configureFarmObservability(config: FarmObservabilityUserConfig | undefined): void {\n observabilityState = normalizeFarmObservabilityConfig(config);\n}\n\nexport function normalizeFarmObservabilityConfig(\n config: FarmObservabilityUserConfig | undefined,\n): FarmResolvedObservabilityConfig {\n if (config === undefined || config === false) {\n return { logs: false, handlers: [] };\n }\n\n if (config === true) {\n return { logs: true, handlers: [] };\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 };\n}\n\nexport function onFarmEvent(handler: FarmEventHandler): () => void {\n runtimeHandlers.add(handler);\n return () => {\n runtimeHandlers.delete(handler);\n };\n}\n\nexport function resetFarmObservability(): void {\n runtimeHandlers.clear();\n observabilityState = {\n logs: false,\n handlers: [],\n };\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 if (!shouldEmitFarmEvent(event)) {\n return event;\n }\n\n if (observabilityState.logs) {\n logFarmEvent(event);\n }\n\n for (const handler of [...observabilityState.handlers, ...runtimeHandlers]) {\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 return event;\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 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 /**\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 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.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 if (!this.local) {\n this.entries.clear();\n this.inflight.clear();\n this.invalidatedTagVersions.clear();\n this.version = 0;\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 entry = await this.adapter.get<T>(this.createAdapterKey(key));\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);\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 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: ++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.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 promise = this.fillCacheEntry(key, producer, options, tags)\n .catch((error) => {\n emitFarmEvent({ type: \"cache.error\", key, operation: \"set\", error });\n throw error;\n })\n .finally(() => {\n this.inflight.delete(key);\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 ): Promise<T> {\n const leaseKey = `${this.namespace}:lease:${key}`;\n let leaseToken: string | null | undefined;\n\n if (this.adapter?.acquireLease && this.adapter.releaseLease && this.lease.enabled) {\n leaseToken = await this.adapter.acquireLease(leaseKey, this.lease.ttlMs);\n if (!leaseToken) {\n const shared = await this.waitForAdapterEntry<T>(key);\n if (shared) {\n emitFarmEvent({ type: \"cache.dedupe\", key });\n return shared.value;\n }\n leaseToken = await this.adapter.acquireLease(leaseKey, this.lease.ttlMs);\n }\n }\n\n try {\n const initialTagVersions = await this.getAdapterTagVersions(tags);\n const value = await producer();\n await this.setAsync(key, value, options, initialTagVersions);\n return value;\n } finally {\n if (leaseToken && this.adapter?.releaseLease) {\n await this.adapter.releaseLease(leaseKey, leaseToken);\n }\n }\n }\n\n private async waitForAdapterEntry<T>(key: string): Promise<FarmCacheEntry<T> | undefined> {\n const deadline = Date.now() + this.lease.waitTimeoutMs;\n while (Date.now() < deadline) {\n await delay(this.lease.pollIntervalMs);\n const entry = await this.getEntryAsync<T>(key);\n if (entry) return entry;\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 ): Promise<Readonly<Record<string, number>>> {\n if (!this.adapter?.getTagVersions || tags.length === 0) return {};\n\n const normalized = tags.map(normalizeCacheTag);\n const physicalTags = normalized.map((tag) => this.createAdapterTag(tag));\n const versions = await this.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(entry: FarmCacheEntry, now = Date.now()): 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);\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());\nconst functionIds = new WeakMap<Function, number>();\nlet nextFunctionId = 0;\n\nexport function getFarmDataCache(): FarmDataCache {\n return sharedFarmDataCache;\n}\n\nexport function configureFarmCache(config: FarmCacheUserConfig | undefined): void {\n sharedFarmDataCache.configure(config);\n}\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\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\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?:\\/\\//.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(\"?\")[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 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 if (fn.name) {\n return `name:${fn.name}`;\n }\n\n let id = functionIds.get(fn);\n if (!id) {\n id = ++nextFunctionId;\n functionIds.set(fn, id);\n }\n return `anonymous:${id}`;\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 return `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\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableSerialize(item, seen)).join(\",\")}]`;\n }\n\n if (value && typeof value === \"object\") {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n\n const entries = Object.entries(value as Record<string, unknown>).sort(([a], [b]) =>\n a.localeCompare(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","import type { FarmI18nDirection, FarmI18nRouting, ResolvedFarmI18nConfig } from \"./types\";\n\nexport interface FarmLocalePathConfig {\n locales: readonly string[];\n defaultLocale: string;\n routing: FarmI18nRouting;\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(pathname);\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 if (config.routing === \"none\") return internalPathname;\n if (config.routing === \"prefix-except-default\" && locale === config.defaultLocale) {\n return internalPathname;\n }\n return internalPathname === \"/\" ? `/${locale}` : `/${locale}${internalPathname}`;\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 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(url.pathname) &&\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 const candidates = header\n .split(\",\")\n .map((entry, index) => {\n const [locale = \"\", ...parameters] = entry.trim().split(\";\");\n const qualityValue = parameters\n .map((parameter) => parameter.trim())\n .find((parameter) => parameter.startsWith(\"q=\"));\n const quality = qualityValue ? Number(qualityValue.slice(2)) : 1;\n return { locale, quality: Number.isFinite(quality) ? quality : 0, index };\n })\n .filter((candidate) => candidate.locale && candidate.locale !== \"*\" && candidate.quality > 0)\n .sort((a, b) => b.quality - a.quality || a.index - b.index);\n\n for (const candidate of candidates) {\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","import type { Metadata } from \"./types\";\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}\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 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\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 function renderMetadataHead(metadata: MetadataRecord | undefined): RenderedMetadataHead {\n const resolvedMetadata = metadata || {};\n const metadataBase = resolveMetadataBase(resolvedMetadata);\n const title = resolveMetadataTitle(resolvedMetadata.title) || \"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 if (isRecord(alternates)) {\n appendLink(tags, \"canonical\", resolveMetadataUrl(alternates.canonical, metadataBase));\n\n if (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\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 return {\n title: escapeText(title),\n tags: tags.length > 0 ? `\\n ${tags.join(\"\\n \")}` : \"\",\n hasFavicon,\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 appendMetaProperty(tags, \"og:type\", openGraph.type);\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","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);\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","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 { normalizeMiddlewareModule } from \"./module\";\nimport { stripFarmLocaleFromPathname } from \"../i18n/routing\";\nimport type { ResolvedFarmI18nConfig } from \"../i18n/types\";\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}\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 getRequest(): Request;\n getResponse(): Response | null;\n}\n\nfunction parseCookies(cookieHeader?: string | null): Record<string, string> {\n if (!cookieHeader) return {};\n\n return cookieHeader.split(\";\").reduce(\n (cookies, cookie) => {\n const [name, ...rest] = cookie.split(\"=\");\n const value = rest.join(\"=\").trim();\n if (name && value) {\n cookies[name.trim()] = decodeURIComponent(value);\n }\n return cookies;\n },\n {} as Record<string, string>,\n );\n}\n\nfunction serializeCookie(name: string, value: string, options: CookieOptions = {}): string {\n let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\n\n if (options.maxAge) 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 private setCookies: string[] = [];\n\n constructor(\n request: Request,\n private headers: Map<string, string>,\n ) {\n this.cookies = parseCookies(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.setCookies.push(cookieString);\n this.headers.set(\"Set-Cookie\", this.setCookies.join(\", \"));\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.setCookies.push(cookieString);\n this.headers.set(\"Set-Cookie\", this.setCookies.join(\", \"));\n }\n\n getAll(): Record<string, string> {\n return { ...this.cookies };\n }\n}\n\nfunction mapToHeaders(map: Map<string, string>): Headers {\n const headers = new Headers();\n for (const [key, value] of map) {\n if (key.toLowerCase() === \"set-cookie\") {\n headers.append(key, value);\n } else {\n headers.set(key, value);\n }\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: Map<string, string>): Record<string, any> {\n return {\n headersSent: false,\n writableEnded: false,\n setHeader(name: string, value: string | string[]) {\n headers.set(name, Array.isArray(value) ? value.join(\", \") : String(value));\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): Request {\n const requestWithShape = request as Request & {\n socket?: { remoteAddress?: string };\n };\n\n if (!requestWithShape.socket) {\n const forwardedFor = request.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim();\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: Map<string, string>,\n): Response {\n const responseHeaders = new Headers(init.headers);\n for (const [key, value] of headers) {\n if (key.toLowerCase() === \"set-cookie\") {\n responseHeaders.append(key, value);\n } else {\n responseHeaders.set(key, value);\n }\n }\n return new Response(body, { ...init, headers: responseHeaders });\n}\n\nfunction createWebMiddlewareContext(\n request: Request,\n parent?: MiddlewareContext[\"parent\"],\n): WebMiddlewareContextState {\n let currentRequest = withNodeRequestShape(request);\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 Map<string, string>();\n\n if (parent?.headers) {\n for (const [key, value] of Object.entries(parent.headers)) {\n headers.set(key, value);\n }\n }\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));\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 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] = decodeURIComponent(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\") {\n return { matched: matcher(ctx) };\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(request);\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(ctx.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(currentRequest, parentData);\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(ctx.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(ctx.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(ctx.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(ctx.headers),\n };\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(ctx.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 for (const [key, value] of middlewareHeaders) {\n if (key.toLowerCase() === \"set-cookie\") {\n headers.append(key, value);\n } else {\n headers.set(key, value);\n }\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 (isRedirectStatus(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\nfunction isRedirectStatus(status: number): status is FarmRedirectStatus {\n return status === 301 || status === 302 || status === 303 || status === 307 || status === 308;\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"],"mappings":"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","names":["import_node_async_hooks","initialTagCount","module","match","result"]}
|