{"version":3,"sources":["../src/middleware/index.ts","../src/middleware/chain.ts","../src/server/request.ts","../src/server/request-bridge.ts","../src/middleware/cookie-header.ts","../src/middleware/context.ts","../src/middleware/manager.ts","../src/utils/decode.ts","../src/middleware/module.ts","../src/utils.ts","../src/server/response.ts","../src/tracing.ts","../src/observability.ts","../src/base-path.ts","../src/i18n/routing.ts","../src/cli-colors.ts","../src/middleware/path.ts","../src/middleware/server.ts","../src/middleware/helpers.ts","../src/middleware/production-runtime.ts","../src/middleware/vite-plugin.ts"],"sourcesContent":["/**\n * Farm.js Middleware System\n *\n * Export public API\n */\n\nexport {\n  middleware,\n  getRateLimitStatus,\n  memoryRateLimitStorage,\n  UnsupportedRateLimitStorageError,\n} from \"./chain\";\nexport { createContext } from \"./context\";\nexport { MiddlewareManager } from \"./manager\";\nexport {\n  getMiddlewareContext,\n  getMiddlewareData,\n  getMiddlewareValue,\n  _runWithMiddlewareContext,\n  _runWithMiddlewareData,\n} from \"./server\";\nexport { unwrapMiddleware, getFromMiddleware, hasMiddlewareData } from \"./helpers\";\nexport {\n  createProductionMiddlewareRunner,\n  applyProductionMiddlewareHeaders,\n  matchesMiddlewareConfig,\n} from \"./production-runtime\";\nexport * from \"./vite-plugin\";\n\nexport type {\n  MiddlewareContext,\n  MiddlewareFunction,\n  RequestMiddleware,\n  RequestMiddlewareContext,\n  MiddlewareStore,\n  ReadonlyMiddlewareStore,\n  MiddlewareChain,\n  MiddlewareConfig,\n  CookieJar,\n  CookieOptions,\n  RateLimitConfig,\n  RateLimitIncrementResult,\n  RateLimitStorage,\n  RateLimitStatus,\n  MemoryRateLimitStorageOptions,\n  NextFunction,\n  MiddlewareResult,\n  FarmMiddlewareConfig,\n} from \"./types\";\n","/**\n * Middleware Chain Builder\n */\n\nimport type {\n  MiddlewareChain,\n  MiddlewareFunction,\n  MiddlewareContext,\n  MiddlewareConfig,\n  RateLimitConfig,\n  RateLimitStorage,\n  RateLimitStatus,\n  RateLimitIncrementResult,\n  MemoryRateLimitStorageOptions,\n  MiddlewareResult,\n} from \"./types\";\n\nconst DEFAULT_MEMORY_RATE_LIMIT_ENTRIES = 100_000;\n\nexport class UnsupportedRateLimitStorageError extends TypeError {\n  constructor() {\n    super(\n      \"RateLimitStorage must implement atomic increment(key, windowMs). Legacy get/set adapters can lose increments under concurrency. Use memoryRateLimitStorage() for one process or redisRateLimitStorage() from @farm.js/cache-redis for production.\",\n    );\n    this.name = \"UnsupportedRateLimitStorageError\";\n  }\n}\n\n/** Create an atomic, process-local fixed-window rate-limit store. */\nexport function memoryRateLimitStorage(\n  options: MemoryRateLimitStorageOptions = {},\n): RateLimitStorage {\n  const maxEntries = options.maxEntries ?? DEFAULT_MEMORY_RATE_LIMIT_ENTRIES;\n  if (!Number.isSafeInteger(maxEntries) || maxEntries <= 0) {\n    throw new TypeError(\"memoryRateLimitStorage maxEntries must be a positive safe integer.\");\n  }\n\n  const records = new Map<string, RateLimitIncrementResult>();\n\n  function read(key: string, now: number): RateLimitIncrementResult | null {\n    const record = records.get(key);\n    if (!record) return null;\n    if (record.resetAt <= now) {\n      records.delete(key);\n      return null;\n    }\n    return record;\n  }\n\n  function pruneExpired(now: number): void {\n    for (const [key, record] of records) {\n      if (record.resetAt <= now) records.delete(key);\n    }\n  }\n\n  return {\n    increment(key, windowMs) {\n      if (!Number.isSafeInteger(windowMs) || windowMs <= 0) {\n        throw new TypeError(\"Rate-limit windowMs must be a positive safe integer.\");\n      }\n      const now = Date.now();\n      const current = read(key, now);\n      if (current) {\n        const next = { count: current.count + 1, resetAt: current.resetAt };\n        records.set(key, next);\n        return next;\n      }\n\n      if (records.size >= maxEntries) pruneExpired(now);\n      if (records.size >= maxEntries) {\n        throw new Error(\n          `Process-local rate-limit storage reached its ${maxEntries} active-key capacity. Configure a shared production adapter or increase maxEntries.`,\n        );\n      }\n\n      const next = { count: 1, resetAt: now + windowMs };\n      records.set(key, next);\n      return next;\n    },\n    get(key) {\n      const record = read(key, Date.now());\n      return record ? { ...record } : null;\n    },\n  };\n}\n\nconst defaultRateLimitStorage = memoryRateLimitStorage();\n\nfunction parseTimeWindow(window: string): number {\n  const match = window.match(/^(\\d+)(ms|s|m|h|d)$/);\n  if (!match) throw new Error(`Invalid time window: ${window}`);\n\n  const [, amount, unit] = match;\n  const value = Number.parseInt(amount, 10);\n\n  const multipliers: Record<string, number> = {\n    ms: 1,\n    s: 1000,\n    m: 60 * 1000,\n    h: 60 * 60 * 1000,\n    d: 24 * 60 * 60 * 1000,\n  };\n\n  const windowMs = value * multipliers[unit];\n  if (!Number.isSafeInteger(windowMs) || windowMs <= 0) {\n    throw new Error(`Invalid time window: ${window}`);\n  }\n  return windowMs;\n}\n\nfunction createRateLimitMiddleware(config: RateLimitConfig): MiddlewareFunction {\n  if (!Number.isSafeInteger(config.requests) || config.requests <= 0) {\n    throw new TypeError(\"Rate limit requests must be a positive safe integer.\");\n  }\n  const windowMs = parseTimeWindow(config.window);\n  const storage = config.storage || defaultRateLimitStorage;\n  assertAtomicRateLimitStorage(storage);\n\n  return async (ctx: MiddlewareContext, next) => {\n    const key = config.keyGenerator\n      ? config.keyGenerator(ctx)\n      : `${ctx.request.socket.remoteAddress}:${ctx.pathname}`;\n\n    const current = await storage.increment(key, windowMs);\n    assertRateLimitIncrementResult(current);\n    const now = Date.now();\n    const resetIn = Math.max(1, Math.ceil((current.resetAt - now) / 1000));\n    const remaining = Math.max(0, config.requests - current.count);\n    setRateLimitHeaders(ctx, config.requests, remaining, resetIn, Math.ceil(windowMs / 1000));\n\n    if (current.count > config.requests) {\n      setMiddlewareResponseHeader(ctx, \"Retry-After\", String(resetIn));\n      if (config.onLimit) {\n        const result = await config.onLimit(ctx);\n        if (result) return result;\n      }\n\n      ctx.json(\n        {\n          error: \"Rate limit exceeded\",\n          retryAfter: resetIn,\n        },\n        429,\n      );\n      return;\n    }\n\n    return next();\n  };\n}\n\nfunction assertAtomicRateLimitStorage(storage: RateLimitStorage): void {\n  if (!storage || typeof storage.increment !== \"function\") {\n    throw new UnsupportedRateLimitStorageError();\n  }\n}\n\nfunction assertRateLimitIncrementResult(\n  result: RateLimitIncrementResult,\n): asserts result is RateLimitIncrementResult {\n  if (\n    !result ||\n    !Number.isSafeInteger(result.count) ||\n    result.count <= 0 ||\n    !Number.isFinite(result.resetAt) ||\n    result.resetAt <= 0\n  ) {\n    throw new TypeError(\n      \"RateLimitStorage.increment() must return a positive integer count and a resetAt timestamp.\",\n    );\n  }\n}\n\nfunction setRateLimitHeaders(\n  ctx: MiddlewareContext,\n  limit: number,\n  remaining: number,\n  resetIn: number,\n  windowSeconds: number,\n): void {\n  setMiddlewareResponseHeader(ctx, \"RateLimit-Policy\", `\"farm\";q=${limit};w=${windowSeconds}`);\n  setMiddlewareResponseHeader(ctx, \"RateLimit\", `\"farm\";r=${remaining};t=${resetIn}`);\n}\n\nfunction setMiddlewareResponseHeader(ctx: MiddlewareContext, name: string, value: string): void {\n  ctx.headers.set(name, value);\n  if (!ctx.response.headersSent && !ctx.response.writableEnded) {\n    ctx.response.setHeader(name, value);\n  }\n}\n\nfunction matchPattern(pattern: string | RegExp, pathname: string): boolean {\n  if (pattern instanceof RegExp) {\n    return pattern.test(pathname);\n  }\n\n  // Protect glob stars, escape every regex metacharacter, then restore the\n  // globs — otherwise \"/promo.html\" also matches \"/promoXhtml\" and a pattern\n  // containing \"(\" throws at request time.\n  const regexPattern = pattern\n    .replace(/\\*\\*/g, \"__DOUBLE_STAR__\")\n    .replace(/\\*/g, \"__SINGLE_STAR__\")\n    .replace(/[.+?^${}()|[\\]\\\\/]/g, \"\\\\$&\")\n    .replace(/__DOUBLE_STAR__/g, \".*\")\n    .replace(/__SINGLE_STAR__/g, \"[^/]+\");\n\n  const regex = new RegExp(`^${regexPattern}$`);\n  return regex.test(pathname);\n}\n\nclass MiddlewareChainImpl implements MiddlewareChain {\n  private handlers: MiddlewareFunction[] = [];\n  public config?: MiddlewareConfig;\n  private basePath: string;\n\n  constructor(basePath = \"/\") {\n    this.basePath =\n      basePath === \"/\" ? \"/\" : basePath.endsWith(\"/\") ? basePath.slice(0, -1) : basePath;\n  }\n\n  /**\n   * Set the base path for this middleware chain (called by manager when loading)\n   */\n  setBasePath(path: string): void {\n    this.basePath = path === \"/\" ? \"/\" : path.endsWith(\"/\") ? path.slice(0, -1) : path;\n  }\n\n  use(fn: MiddlewareFunction): MiddlewareChain {\n    this.handlers.push(fn);\n    return this;\n  }\n\n  /**\n   * Normalize a path pattern - auto-scope to middleware route\n   * If middleware is in /contact, then \"/api\" becomes \"/contact/api\"\n   */\n  private normalizePattern(pattern: string): string {\n    // If we're at root middleware, use pattern as-is\n    if (this.basePath === \"/\") {\n      // Ensure it starts with /\n      return pattern.startsWith(\"/\") ? pattern : `/${pattern}`;\n    }\n\n    // For route-specific middleware, always scope the pattern\n    // Remove leading / from pattern if present, then join with basePath\n    const cleanPattern = pattern.startsWith(\"/\") ? pattern.slice(1) : pattern;\n    return `${this.basePath}/${cleanPattern}`;\n  }\n\n  /**\n   * Conditionally run middleware based on a condition.\n   * Only supports boolean values or functions that evaluate to boolean.\n   * Route-based string matching has been removed - use function conditions instead.\n   *\n   * @example\n   * .when(true, (ctx, next) => { ... })  // Always run\n   * .when((ctx) => ctx.data.get('flag'), (ctx, next) => { ... })  // Conditional\n   * .when((ctx) => ctx.pathname === '/contact', (ctx, next) => { ... })  // Path-based condition\n   */\n  when(\n    condition: boolean | ((ctx: MiddlewareContext) => boolean),\n    fn: MiddlewareFunction | ((chain: MiddlewareChain) => void),\n  ): MiddlewareChain {\n    const conditionalMiddleware: MiddlewareFunction = async (ctx, next) => {\n      // Evaluate condition - boolean or function\n      const shouldRun = typeof condition === \"function\" ? condition(ctx) : condition;\n\n      if (!shouldRun) {\n        return next();\n      }\n\n      if (typeof fn === \"function\" && fn.length === 2) {\n        return (fn as MiddlewareFunction)(ctx, next);\n      } else {\n        const subChain = middleware(this.basePath);\n        (fn as (chain: MiddlewareChain) => void)(subChain);\n        const { handlers } = subChain.build();\n\n        let index = 0;\n        let returnedResponse: Response | undefined;\n        const executeNext = async (): Promise<MiddlewareResult> => {\n          if (index < handlers.length) {\n            const handler = handlers[index++];\n            const result = await handler(ctx, executeNext);\n            if (result instanceof Response) {\n              returnedResponse = result;\n              return result;\n            }\n          } else {\n            const result = await next();\n            if (result instanceof Response) {\n              returnedResponse = result;\n              return result;\n            }\n          }\n          return returnedResponse;\n        };\n\n        return executeNext();\n      }\n    };\n    this.handlers.push(conditionalMiddleware);\n    return this;\n  }\n\n  rateLimit(config: RateLimitConfig): MiddlewareChain {\n    this.handlers.push(createRateLimitMiddleware(config));\n    return this;\n  }\n\n  redirect(source: string, destination: string, permanent = false): MiddlewareChain {\n    const redirectMiddleware: MiddlewareFunction = async (ctx, next) => {\n      // Auto-scope source pattern to the middleware route\n      const normalizedSource = this.normalizePattern(source);\n      if (matchPattern(normalizedSource, ctx.pathname)) {\n        ctx.redirect(destination, permanent ? 308 : 307);\n        return;\n      }\n      return next();\n    };\n\n    this.handlers.push(redirectMiddleware);\n    return this;\n  }\n\n  /**\n   * Rewrite the current middleware route to a new destination.\n   * Since each middleware file is route-specific, the source is automatically\n   * the middleware's route, so you only need to specify the destination.\n   *\n   * @param destination - The destination path to rewrite to\n   * @param condition - Optional boolean or function that evaluates to boolean.\n   *                    If provided and evaluates to false, rewrite is skipped.\n   *                    If not provided, rewrite always happens.\n   *\n   * @example\n   * // In /contact/middleware.ts\n   * .rewrite('/about')  // Always rewrites /contact to /about\n   * .rewrite('/about', true)  // Always rewrites\n   * .rewrite('/about', false)  // Never rewrites\n   * .rewrite('/about', (ctx) => ctx.data.get('shouldRewrite'))  // Conditional rewrite\n   */\n  rewrite(\n    destination: string,\n    condition?: boolean | ((ctx: MiddlewareContext) => boolean),\n  ): MiddlewareChain {\n    const rewriteMiddleware: MiddlewareFunction = async (ctx, next) => {\n      // Check condition if provided\n      if (condition !== undefined) {\n        const shouldRewrite = typeof condition === \"function\" ? condition(ctx) : condition;\n        if (!shouldRewrite) {\n          return next();\n        }\n      }\n\n      // If this middleware is route-specific (not root)\n      if (this.basePath !== \"/\") {\n        // Rewrite when the pathname exactly matches this middleware's route\n        // This rewrites the entire route (e.g., /contact -> /about)\n        if (ctx.pathname === this.basePath) {\n          ctx.rewrite(destination);\n        }\n        // Also handle sub-routes: rewrite /contact/something to /destination/something\n        else if (ctx.pathname.startsWith(this.basePath + \"/\")) {\n          const subPath = ctx.pathname.slice(this.basePath.length);\n          const newPath = destination + subPath;\n          ctx.rewrite(newPath);\n        }\n      } else {\n        // For root middleware, this is less common\n        // Only rewrite if pathname matches exactly (edge case)\n        ctx.rewrite(destination);\n      }\n      return next();\n    };\n\n    this.handlers.push(rewriteMiddleware);\n    return this;\n  }\n\n  build() {\n    return {\n      handlers: this.handlers,\n      config: this.config,\n    };\n  }\n}\n\n/**\n * Get rate limit status for a key\n * @example\n * const status = await getRateLimitStatus('user:123', 100, storage);\n */\nexport async function getRateLimitStatus(\n  key: string,\n  limit: number,\n  storage: RateLimitStorage = defaultRateLimitStorage,\n): Promise<RateLimitStatus> {\n  if (!Number.isSafeInteger(limit) || limit <= 0) {\n    throw new TypeError(\"Rate limit must be a positive safe integer.\");\n  }\n  assertAtomicRateLimitStorage(storage);\n  if (typeof storage.get !== \"function\") {\n    throw new TypeError(\n      \"getRateLimitStatus() requires a RateLimitStorage adapter that implements get(key).\",\n    );\n  }\n  const record = await storage.get(key);\n\n  if (!record) {\n    return {\n      requests: 0,\n      limit,\n      remaining: limit,\n      resetIn: null,\n      resetAt: null,\n      isLimited: false,\n    };\n  }\n  assertRateLimitIncrementResult(record);\n\n  const now = Date.now();\n\n  if (record.resetAt && now > record.resetAt) {\n    return {\n      requests: 0,\n      limit,\n      remaining: limit,\n      resetIn: null,\n      resetAt: null,\n      isLimited: false,\n    };\n  }\n\n  const requests = record.count || 0;\n  const remaining = Math.max(0, limit - requests);\n  const isLimited = requests >= limit;\n\n  let resetIn: number | null = null;\n  let resetAt: Date | null = null;\n\n  if (record.resetAt) {\n    const remainingMs = record.resetAt - now;\n    resetIn = remainingMs > 0 ? Math.ceil(remainingMs / 1000) : null;\n    resetAt = new Date(record.resetAt);\n  }\n\n  return {\n    requests,\n    limit,\n    remaining,\n    resetIn,\n    resetAt,\n    isLimited,\n  };\n}\n\nexport function middleware(basePath = \"/\"): MiddlewareChain {\n  return new MiddlewareChainImpl(basePath);\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { Readable } from \"node:stream\";\nimport type { FarmRequest } from \"../types\";\nimport { _setCurrentRequestResolver } from \"./request-bridge\";\n\nconst REQUEST_STORAGE_KEY = Symbol.for(\"@farm.js/core/request-storage\");\n\nfunction getRequestStore(): AsyncLocalStorage<Request> {\n  const runtime = globalThis as typeof globalThis & Record<PropertyKey, unknown>;\n  const existing = runtime[REQUEST_STORAGE_KEY];\n  if (existing instanceof AsyncLocalStorage) {\n    return existing as AsyncLocalStorage<Request>;\n  }\n\n  const storage = new AsyncLocalStorage<Request>();\n  runtime[REQUEST_STORAGE_KEY] = storage;\n  return storage;\n}\n\nconst requestStore = getRequestStore();\n\n_setCurrentRequestResolver(() => requestStore.getStore());\n\nexport interface FarmRequestURLOptions {\n  origin?: string | URL;\n  trustProxy?: boolean;\n}\n\nexport function resolveFarmRequestURL(req: FarmRequest, options: FarmRequestURLOptions = {}): URL {\n  if (options.origin) {\n    return new URL(req.url || \"/\", options.origin);\n  }\n\n  const forwardedHost = options.trustProxy\n    ? firstForwardedHeaderValue(req.headers[\"x-forwarded-host\"])\n    : undefined;\n  const fallbackHost = firstForwardedHeaderValue(req.headers.host) || \"localhost\";\n  const forwardedProto = options.trustProxy\n    ? firstForwardedHeaderValue(req.headers[\"x-forwarded-proto\"])\n    : undefined;\n  const normalizedProto = forwardedProto?.toLowerCase();\n  const proto =\n    normalizedProto === \"https\" || normalizedProto === \"http\"\n      ? normalizedProto\n      : isEncryptedFarmRequest(req)\n        ? \"https\"\n        : \"http\";\n  return new URL(req.url || \"/\", resolveRequestOrigin(proto, forwardedHost, fallbackHost));\n}\n\nexport function createWebRequestFromFarmRequest(\n  req: FarmRequest,\n  options: FarmRequestURLOptions = {},\n): Request {\n  const fullUrl = resolveFarmRequestURL(req, options).toString();\n\n  const headers = new Headers();\n  for (const [key, value] of Object.entries(req.headers)) {\n    if (value == null) {\n      continue;\n    }\n\n    if (Array.isArray(value)) {\n      for (const item of value) {\n        headers.append(key, item);\n      }\n      continue;\n    }\n\n    headers.set(key, value);\n  }\n\n  const method = (req.method || \"GET\").toUpperCase();\n  const init: RequestInit & { duplex?: \"half\" } = {\n    method: req.method,\n    headers,\n  };\n\n  if (method !== \"GET\" && method !== \"HEAD\") {\n    init.body = Readable.toWeb(req) as ReadableStream<Uint8Array>;\n    init.duplex = \"half\";\n  }\n\n  return new Request(fullUrl, init);\n}\n\nfunction isEncryptedFarmRequest(req: FarmRequest): boolean {\n  return Boolean((req.socket as { encrypted?: boolean } | undefined)?.encrypted);\n}\n\nfunction firstForwardedHeaderValue(value: string | string[] | undefined): string | undefined {\n  const first = Array.isArray(value) ? value[0] : value;\n  const token = first?.split(\",\", 1)[0]?.trim();\n  return token || undefined;\n}\n\nfunction resolveRequestOrigin(proto: \"http\" | \"https\", host: string | undefined, fallback: string) {\n  for (const candidate of [host, fallback, \"localhost\"]) {\n    if (!candidate) continue;\n    if (/[\\s/?#@\\\\]/u.test(candidate)) continue;\n    try {\n      const url = new URL(`${proto}://${candidate}`);\n      if (url.username || url.password || url.pathname !== \"/\" || url.search || url.hash) continue;\n      return url.origin;\n    } catch {\n      // Try the next host instead of turning an untrusted proxy header into a 500.\n    }\n  }\n  return `${proto}://localhost`;\n}\n\nexport async function _runWithCurrentRequest<T>(\n  request: Request,\n  fn: () => Promise<T> | T,\n): Promise<T> {\n  return requestStore.run(request, fn);\n}\n\nexport function getCurrentRequest(): Request {\n  const request = requestStore.getStore();\n  if (!request) {\n    throw new Error(\n      \"No current request is available. getCurrentRequest() can only be used during server rendering.\",\n    );\n  }\n\n  return request;\n}\n\n// Some runtimes (StackBlitz WebContainers among them) lose AsyncLocalStorage\n// context across async boundaries mid-render. Callers whose feature can\n// degrade gracefully should use this instead of getCurrentRequest() so a\n// missing store never turns into a 500.\nexport function getCurrentRequestOrNull(): Request | null {\n  return requestStore.getStore() ?? null;\n}\n","type CurrentRequestResolver = () => Request | undefined;\n\nconst CURRENT_REQUEST_RESOLVER_KEY = Symbol.for(\"farm.currentRequestResolver\");\n\ntype GlobalWithCurrentRequestResolver = typeof globalThis & {\n  [CURRENT_REQUEST_RESOLVER_KEY]?: CurrentRequestResolver;\n};\n\nfunction getGlobalState(): GlobalWithCurrentRequestResolver {\n  return globalThis as GlobalWithCurrentRequestResolver;\n}\n\nexport function _setCurrentRequestResolver(resolver: CurrentRequestResolver | undefined): void {\n  getGlobalState()[CURRENT_REQUEST_RESOLVER_KEY] = resolver;\n}\n\nexport function _resolveCurrentRequest(): Request | undefined {\n  return getGlobalState()[CURRENT_REQUEST_RESOLVER_KEY]?.();\n}\n","import type { CookieOptions } from \"./types\";\n\nfunction decodeCookieValue(value: string): string {\n  try {\n    return decodeURIComponent(value);\n  } catch {\n    // Cookies are not required to be percent-encoded; keep the raw value\n    // instead of failing the whole request on malformed encoding.\n    return value;\n  }\n}\n\nexport function parseMiddlewareCookieHeader(cookieHeader?: string | null): Record<string, string> {\n  const cookies = Object.create(null) as Record<string, string>;\n  if (!cookieHeader) return cookies;\n\n  for (const cookie of cookieHeader.split(\";\")) {\n    const separator = cookie.indexOf(\"=\");\n    if (separator < 0) continue;\n\n    const name = cookie.slice(0, separator).trim();\n    if (!name) continue;\n\n    const value = cookie.slice(separator + 1).trim();\n    cookies[name] = decodeCookieValue(value);\n  }\n\n  return cookies;\n}\n\n/**\n * Apply the attributes a cookie name prefix makes mandatory.\n *\n * Browsers reject a `Set-Cookie` whose name starts with `__Host-` or\n * `__Secure-` unless it carries `Secure` (and, for `__Host-`, `Path=/` with no\n * `Domain`). A rejected header is discarded silently, so emitting one without\n * these attributes makes both a set and a *deletion* a no-op — a logout that\n * looks like it worked while the session cookie stays live. The attributes are\n * therefore derived from the name rather than trusted from the caller.\n */\nexport function applyCookieNamePrefixRequirements(\n  name: string,\n  options: CookieOptions,\n): CookieOptions {\n  if (name.startsWith(\"__Host-\")) {\n    return { ...options, secure: true, path: \"/\", domain: undefined };\n  }\n  if (name.startsWith(\"__Secure-\")) {\n    return { ...options, secure: true };\n  }\n  return options;\n}\n\nexport function serializeMiddlewareCookie(\n  name: string,\n  value: string,\n  options: CookieOptions = {},\n): string {\n  const resolved = applyCookieNamePrefixRequirements(name, options);\n  let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\n\n  if (resolved.maxAge != null) cookie += `; Max-Age=${resolved.maxAge}`;\n  if (resolved.expires) cookie += `; Expires=${resolved.expires.toUTCString()}`;\n  cookie += `; Path=${resolved.path || \"/\"}`;\n  if (resolved.domain) cookie += `; Domain=${resolved.domain}`;\n  if (resolved.secure) cookie += \"; Secure\";\n  if (resolved.httpOnly) cookie += \"; HttpOnly\";\n  if (resolved.sameSite) {\n    cookie += `; SameSite=${resolved.sameSite.charAt(0).toUpperCase()}${resolved.sameSite.slice(1)}`;\n  }\n\n  return cookie;\n}\n\n/**\n * Serialize the tombstone that removes a cookie. A deletion only matches the\n * stored cookie when its `Path` and `Domain` match the ones it was set with,\n * so callers must be able to pass them through.\n */\nexport function serializeMiddlewareCookieDeletion(\n  name: string,\n  options: CookieOptions = {},\n): string {\n  return serializeMiddlewareCookie(name, \"\", { ...options, maxAge: 0, expires: new Date(0) });\n}\n","/**\n * Middleware Context Implementation\n */\n\nimport type { IncomingMessage, ServerResponse } from \"http\";\nimport type { ViteDevServer } from \"vite\";\nimport type { MiddlewareContext, CookieJar, CookieOptions } from \"./types\";\nimport type { FarmServerConfig, ResolvedFarmServerConfig } from \"../server-http\";\nimport { resolveFarmRequestURL } from \"../server/request\";\nimport {\n  parseMiddlewareCookieHeader,\n  serializeMiddlewareCookie as serializeCookie,\n  serializeMiddlewareCookieDeletion,\n} from \"./cookie-header\";\n\n/**\n * Serialize a cookie\n */\n/**\n * Cookie Jar implementation\n */\nclass CookieJarImpl implements CookieJar {\n  private cookies: Record<string, string>;\n  private setCookies: string[];\n\n  constructor(\n    private req: IncomingMessage,\n    private res: ServerResponse,\n  ) {\n    this.cookies = parseMiddlewareCookieHeader(req.headers.cookie);\n    const existing = res.getHeader(\"Set-Cookie\");\n    this.setCookies = Array.isArray(existing)\n      ? existing.map(String)\n      : existing === undefined\n        ? []\n        : [String(existing)];\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\n    // Update Set-Cookie header\n    this.res.setHeader(\"Set-Cookie\", this.setCookies);\n  }\n\n  delete(name: string, options: CookieOptions = {}): void {\n    delete this.cookies[name];\n    // Path and Domain must match the cookie that was set, or the tombstone\n    // addresses a different cookie and the original survives.\n    this.setCookies.push(serializeMiddlewareCookieDeletion(name, options));\n    this.res.setHeader(\"Set-Cookie\", this.setCookies);\n  }\n\n  getAll(): Record<string, string> {\n    return { ...this.cookies };\n  }\n}\n\n/**\n * Create a middleware context from request/response\n */\nexport function createContext(\n  req: IncomingMessage,\n  res: ServerResponse,\n  viteServer?: ViteDevServer,\n  parent?: MiddlewareContext[\"parent\"],\n  server?: FarmServerConfig | ResolvedFarmServerConfig,\n): MiddlewareContext {\n  const url = resolveFarmRequestURL(req, { trustProxy: server?.trustProxy });\n  const headers = new Map<string, string>();\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 cookies = new CookieJarImpl(req, res);\n\n  if (parent?.headers) {\n    for (const [key, value] of Object.entries(parent.headers)) {\n      headers.set(key, value);\n    }\n  }\n\n  let handled = false;\n\n  const applyResponseHeaders = () => {\n    for (const [key, value] of headers) {\n      try {\n        res.setHeader(key, value);\n      } catch {\n        // Keep helper behavior aligned with the middleware manager: an invalid\n        // optional header must not prevent the response itself from completing.\n      }\n    }\n  };\n\n  const ctx: MiddlewareContext = {\n    request: req,\n    response: res,\n    url,\n    pathname: url.pathname,\n    searchParams: url.searchParams,\n    method: req.method || \"GET\",\n    params: {},\n    route: url.pathname,\n    parent,\n    vite: {\n      isDev: process.env.NODE_ENV !== \"production\",\n      hmr: !!viteServer?.hot,\n      server: viteServer,\n    },\n    data,\n    locals,\n    headers,\n    cookies,\n    _handled: false,\n\n    redirect(redirectUrl: string, status = 307): void {\n      if (handled) {\n        console.warn(\"Response already sent, cannot redirect\");\n        return;\n      }\n\n      ctx._redirectUrl = redirectUrl;\n      ctx._handled = true;\n      handled = true;\n\n      applyResponseHeaders();\n      res.writeHead(status, {\n        Location: redirectUrl,\n        \"Content-Type\": \"text/plain\",\n      });\n      res.end(`Redirecting to ${redirectUrl}`);\n    },\n\n    rewrite(rewriteUrl: string): void {\n      ctx._rewriteUrl = rewriteUrl;\n      // Update the URL for downstream middleware\n      const newUrl = new URL(rewriteUrl, `http://${req.headers.host || \"localhost\"}`);\n      ctx.url = newUrl;\n      ctx.pathname = newUrl.pathname;\n      ctx.searchParams = newUrl.searchParams;\n      ctx.route = newUrl.pathname;\n      // Update the original request URL\n      req.url = rewriteUrl;\n    },\n\n    json(jsonData: any, status = 200): void {\n      if (handled) {\n        console.warn(\"Response already sent, cannot send JSON\");\n        return;\n      }\n\n      ctx._handled = true;\n      handled = true;\n\n      applyResponseHeaders();\n      res.writeHead(status, {\n        \"Content-Type\": \"application/json\",\n      });\n      res.end(JSON.stringify(jsonData));\n    },\n\n    text(content: string, status = 200): void {\n      if (handled) {\n        console.warn(\"Response already sent, cannot send text\");\n        return;\n      }\n\n      ctx._handled = true;\n      handled = true;\n\n      applyResponseHeaders();\n      res.writeHead(status, {\n        \"Content-Type\": \"text/plain\",\n      });\n      res.end(content);\n    },\n\n    html(content: string, status = 200): void {\n      if (handled) {\n        console.warn(\"Response already sent, cannot send HTML\");\n        return;\n      }\n\n      ctx._handled = true;\n      handled = true;\n\n      applyResponseHeaders();\n      res.writeHead(status, {\n        \"Content-Type\": \"text/html\",\n      });\n      res.end(content);\n    },\n  };\n\n  return ctx;\n}\n","/**\n * Middleware Manager\n *\n * Discovers and executes middleware files in the file system\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { ViteDevServer } from \"vite\";\nimport { decodeRouteSegment } from \"../utils/decode\";\nimport type { IncomingMessage, ServerResponse } from \"http\";\nimport type {\n  FarmMiddlewareConfig,\n  MiddlewareFunction,\n  MiddlewareMatcher,\n  MiddlewareConfig,\n  MiddlewareContext,\n  MiddlewareResult,\n} from \"./types\";\nimport { createContext } from \"./context\";\nimport { normalizeMiddlewareModule } from \"./module\";\nimport { logger } from \"../utils\";\nimport { sendWebResponse } from \"../server/response\";\nimport { emitFarmEvent } from \"../observability\";\nimport { stripFarmLocaleFromPathname } from \"../i18n/routing\";\nimport type { ResolvedFarmI18nConfig } from \"../i18n/types\";\nimport { createCliColors } from \"../cli-colors\";\nimport { appendMiddlewareRoutePath } from \"./path\";\nimport type { FarmServerConfig, ResolvedFarmServerConfig } from \"../server-http\";\nimport { resolveFarmRequestURL } from \"../server/request\";\n\nexport interface DiscoveredMiddleware {\n  path: string;\n  filePath: string;\n  handlers: MiddlewareFunction[];\n  config?: MiddlewareConfig;\n  source?: \"config\" | \"file\";\n}\n\nfunction isMiddlewareResponse(value: unknown): value is Response {\n  return value instanceof Response;\n}\n\n/**\n * Middleware Manager - discovers and executes middleware\n */\nexport class MiddlewareManager {\n  private middleware: DiscoveredMiddleware[] = [];\n  private configMiddleware: DiscoveredMiddleware[] = [];\n  private globalConfig?: MiddlewareConfig;\n  private viteServer?: ViteDevServer;\n  private appDirs: string[];\n  private i18n?: ResolvedFarmI18nConfig;\n  private server?: FarmServerConfig | ResolvedFarmServerConfig;\n\n  constructor(\n    appDir: string | readonly string[],\n    viteServer?: ViteDevServer,\n    config?: FarmMiddlewareConfig,\n    i18n?: ResolvedFarmI18nConfig,\n    server?: FarmServerConfig | ResolvedFarmServerConfig,\n  ) {\n    this.appDirs = Array.isArray(appDir) ? [...appDir] : [appDir as string];\n    this.viteServer = viteServer;\n    this.i18n = i18n;\n    this.server = server;\n    this.configure(config);\n  }\n\n  configure(config?: FarmMiddlewareConfig): void {\n    this.configMiddleware = [];\n    this.globalConfig = undefined;\n\n    if (!config) return;\n\n    const entries = Array.isArray(config) ? config : [config];\n\n    for (const [index, entry] of entries.entries()) {\n      const handlers = this.getConfigHandlers(entry);\n      const middlewareConfig = this.toMiddlewareConfig(entry);\n\n      if (handlers.length === 0) {\n        this.globalConfig = middlewareConfig;\n        continue;\n      }\n\n      this.configMiddleware.push({\n        path: \"/\",\n        filePath: `farm.config.ts#middleware-${index}`,\n        handlers,\n        config: middlewareConfig,\n        source: \"config\",\n      });\n    }\n  }\n\n  /**\n   * Discover all middleware.ts files\n   */\n  async discover(): Promise<void> {\n    const middlewareByPath = new Map<string, DiscoveredMiddleware>();\n    for (const appDir of this.appDirs) {\n      const discovered: DiscoveredMiddleware[] = [];\n      await this.discoverInDirectory(appDir, \"/\", discovered);\n      for (const middleware of discovered) {\n        middlewareByPath.set(middleware.path, middleware);\n      }\n    }\n    this.middleware = Array.from(middlewareByPath.values());\n\n    // Sort by path depth (root first, then nested)\n    this.middleware.sort((a, b) => {\n      const depthA = a.path.split(\"/\").filter(Boolean).length;\n      const depthB = b.path.split(\"/\").filter(Boolean).length;\n      return depthA - depthB;\n    });\n\n    if (process.env.FARM_VERBOSE && this.middleware.length > 0) {\n      logger.success(`Discovered ${this.middleware.length} middleware files`);\n      for (const mw of this.middleware) {\n        logger.info(`  ${mw.path} (${mw.handlers.length} handlers)`);\n      }\n    }\n  }\n\n  /**\n   * Recursively discover middleware files\n   */\n  private async discoverInDirectory(\n    dir: string,\n    routePath: string,\n    discovered: DiscoveredMiddleware[],\n  ): Promise<void> {\n    if (!fs.existsSync(dir)) {\n      return;\n    }\n\n    // Check for middleware.ts in current directory\n    const middlewareFile = this.findMiddlewareFile(dir);\n    if (middlewareFile) {\n      const middleware = await this.loadMiddleware(middlewareFile, routePath);\n      if (middleware) {\n        discovered.push(middleware);\n      }\n    }\n\n    // Recursively check subdirectories\n    const entries = fs.readdirSync(dir, { withFileTypes: true });\n    for (const entry of entries) {\n      if (entry.isDirectory() && !entry.name.startsWith(\".\") && !entry.name.startsWith(\"_\")) {\n        const subPath = path.join(dir, entry.name);\n        const subRoutePath = appendMiddlewareRoutePath(routePath, entry.name);\n        await this.discoverInDirectory(subPath, subRoutePath, discovered);\n      }\n    }\n  }\n\n  /**\n   * Find middleware file in directory\n   */\n  private findMiddlewareFile(dir: string): string | null {\n    const extensions = [\".ts\", \".tsx\", \".js\", \".jsx\"];\n    for (const ext of extensions) {\n      const filePath = path.join(dir, `middleware${ext}`);\n      if (fs.existsSync(filePath)) {\n        return filePath;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Load a middleware file\n   */\n  private async loadMiddleware(filePath: string, routePath: string): Promise<DiscoveredMiddleware> {\n    try {\n      // Load the module\n      let module: any;\n      if (this.viteServer) {\n        module = await this.viteServer.ssrLoadModule(filePath);\n      } else {\n        const fileUrl = `file://${filePath}`;\n        module = await import(/* @vite-ignore */ fileUrl);\n      }\n\n      const normalized = normalizeMiddlewareModule(module, routePath);\n      if (!normalized) {\n        throw new Error(\"must export a default handler or a named middleware handler\");\n      }\n\n      return {\n        path: routePath,\n        filePath,\n        handlers: normalized.handlers,\n        config: normalized.config,\n        source: \"file\",\n      };\n    } catch (error) {\n      throw new Error(`Failed to load middleware ${filePath}: ${error}`);\n    }\n  }\n\n  /**\n   * Execute middleware for a request\n   */\n  async execute(req: IncomingMessage, res: ServerResponse): Promise<boolean> {\n    const url = resolveFarmRequestURL(req, { trustProxy: this.server?.trustProxy });\n    const pathname = url.pathname;\n    const routePathname = this.i18n?.enabled\n      ? stripFarmLocaleFromPathname(pathname, this.i18n)\n      : pathname;\n    const method = req.method || \"GET\";\n    const startTime = Date.now();\n\n    let parentData: MiddlewareContext[\"parent\"] | undefined;\n    let ctx = createContext(req, res, this.viteServer, undefined, this.server);\n\n    if (this.globalConfig) {\n      const globalMatch = this.matchesConfig(routePathname, this.globalConfig, ctx);\n      if (!globalMatch.matched) {\n        return false;\n      }\n      if (globalMatch.params) {\n        ctx.params = { ...ctx.params, ...globalMatch.params };\n      }\n    }\n\n    // Find applicable middleware (config entries first, then cascading files)\n    const applicable: Array<{\n      mw: DiscoveredMiddleware;\n      routeMatch: { matched: boolean; params?: Record<string, string> };\n    }> = [\n      ...this.configMiddleware.map((mw) => ({ mw, routeMatch: { matched: true } })),\n      ...this.middleware\n        .map((mw) => ({ mw, routeMatch: this.matchRoutePath(routePathname, mw.path) }))\n        .filter((entry) => entry.routeMatch.matched),\n    ];\n\n    if (applicable.length === 0) {\n      return false; // No middleware to run\n    }\n    const pc = createCliColors();\n    const log = [\n      pc.dim(\"[\") + pc.bold(pc.blue(\"FARM\")) + pc.dim(\"]\"),\n      pc.dim(\"[\") + pc.bold(pc.magenta(\"MIDDLEWARE\")) + pc.dim(\"]\"),\n      pc.dim(\"[\") + pc.bold(pc.white(method.padEnd(3))) + pc.dim(\"]\"),\n      pc.gray(\"Executing middleware: \"),\n      pc.gray(pathname),\n      pc.dim(` (${(Date.now() - startTime).toFixed(2)}ms)`),\n    ].join(\" \");\n    console.log(log);\n\n    // Execute middleware in cascade order\n    for (const entry of applicable) {\n      // Check matcher configuration\n      const { mw, routeMatch } = entry;\n      const configMatch = mw.config\n        ? this.matchesConfig(routePathname, mw.config, ctx)\n        : { matched: true };\n      if (!configMatch.matched) {\n        continue;\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      // Create new context with parent data\n      if (parentData) {\n        ctx = createContext(req, res, this.viteServer, parentData, this.server);\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\n      const middlewareStartTime = Date.now();\n      const middlewareEvent = {\n        route: mw.path,\n        pathname,\n        name: mw.filePath,\n      };\n      emitFarmEvent({ type: \"middleware.start\", ...middlewareEvent });\n\n      try {\n        // Execute all handlers in this middleware\n        let handlerIndex = 0;\n        let returnedResponse: Response | undefined;\n        const executeNext = async (): Promise<MiddlewareResult> => {\n          if (handlerIndex < mw.handlers.length) {\n            const handler = mw.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        const response = isMiddlewareResponse(result) ? result : returnedResponse;\n        if (response) {\n          if (!res.headersSent && !res.writableEnded) {\n            for (const [key, value] of ctx.headers) {\n              try {\n                res.setHeader(key, value);\n              } catch (error) {}\n            }\n          }\n          emitFarmEvent({\n            type: \"middleware.shortCircuit\",\n            ...middlewareEvent,\n            status: response.status,\n          });\n          await sendWebResponse(res, response);\n          return true;\n        }\n\n        // Check if response has been sent or handled by middleware helpers.\n        if (ctx._handled || res.headersSent || res.writableEnded) {\n          emitFarmEvent({\n            type: \"middleware.shortCircuit\",\n            ...middlewareEvent,\n            status: res.statusCode,\n          });\n          return true;\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: Object.fromEntries(ctx.headers),\n      };\n    }\n\n    if (!res.headersSent && !res.writableEnded) {\n      for (const [key, value] of ctx.headers) {\n        try {\n          res.setHeader(key, value);\n        } catch (error) {}\n      }\n    }\n\n    (req as any).__FARM_MIDDLEWARE_DATA__ = new Map(ctx.data);\n    (req as any).__FARM_MIDDLEWARE_CONTEXT__ = new Map(ctx.locals);\n\n    return false; // Continue to page rendering\n  }\n\n  /**\n   * Check if pathname matches middleware config\n   */\n  private matchesConfig(\n    pathname: string,\n    config: MiddlewareConfig,\n    ctx: MiddlewareContext,\n  ): { matched: boolean; params?: Record<string, string> } {\n    // Check exclusions\n    if (config.exclude) {\n      for (const pattern of config.exclude) {\n        if (this.matchPattern(pattern, pathname).matched) {\n          return { matched: false };\n        }\n      }\n    }\n\n    // Check matchers\n    if (config.matcher) {\n      for (const matcher of this.toMatcherList(config.matcher)) {\n        if (typeof matcher === \"string\" || matcher instanceof RegExp) {\n          const result = this.matchPattern(matcher, pathname);\n          if (result.matched) {\n            return result;\n          }\n        } else if (typeof matcher === \"function\" && matcher(ctx)) {\n          return { matched: true };\n        }\n      }\n      return { matched: false };\n    }\n\n    return { matched: true };\n  }\n\n  /**\n   * Match a pattern against pathname\n   */\n  private 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      // Strip a trailing slash before the wildcard so `/admin/(.*)` matches the\n      // `/admin` subtree like `/admin/**` does. Without this the prefix keeps\n      // its slash and the check becomes startsWith(\"/admin//\"), which no path\n      // satisfies, so the matcher silently matches nothing.\n      const prefix = pattern.slice(0, -4).replace(/\\/$/, \"\");\n      return { matched: pathname === prefix || pathname.startsWith(`${prefix}/`) };\n    }\n\n    const { regex, params } = this.compilePathPattern(pattern);\n    const match = regex.exec(pathname);\n    if (!match) {\n      return { matched: false };\n    }\n\n    const values: Record<string, string> = {};\n    params.forEach((param, index) => {\n      values[param] = decodeRouteSegment(match[index + 1] || \"\");\n    });\n\n    return {\n      matched: true,\n      params: Object.keys(values).length > 0 ? values : undefined,\n    };\n  }\n\n  /**\n   * Reload middleware (for HMR)\n   */\n  async reload(): Promise<void> {\n    await this.discover();\n  }\n\n  getMiddlewares(): DiscoveredMiddleware[] {\n    return [...this.configMiddleware, ...this.middleware];\n  }\n\n  hasMiddleware(): boolean {\n    return this.configMiddleware.length > 0 || this.middleware.length > 0;\n  }\n\n  private matchRoutePath(\n    pathname: string,\n    middlewarePath: string,\n  ): { matched: boolean; params?: Record<string, string> } {\n    if (middlewarePath === \"/\") return { matched: true };\n\n    const exactMatch = this.matchPattern(middlewarePath, pathname);\n    if (exactMatch.matched) {\n      return exactMatch;\n    }\n\n    const nestedMatch = this.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\n  private toMatcherList(matcher: MiddlewareConfig[\"matcher\"]): MiddlewareMatcher[] {\n    if (!matcher) return [];\n    return Array.isArray(matcher) ? matcher : [matcher];\n  }\n\n  private getConfigHandlers(\n    entry:\n      | MiddlewareConfig\n      | (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\n  private 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\n  private 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 } = this.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 `/${this.escapeRegex(segment).replace(/\\\\\\*/g, \"[^/]*\")}`;\n    });\n\n    return {\n      regex: new RegExp(`^${parts.join(\"\")}$`),\n      params,\n    };\n  }\n\n  private 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\n  private escapeRegex(value: string): string {\n    return value.replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\");\n  }\n}\n","/**\n * Decode a percent-encoded path segment, falling back to the raw value.\n *\n * Request paths are not guaranteed to be validly percent-encoded, so\n * `decodeURIComponent` can throw on input that is still a legal URL: a\n * latin-1 escape such as `caf%E9` from an old link, or a truncated `%ZZ`\n * from a crawler. A malformed segment simply will not match a known route,\n * which is a 404, so it must not throw out of route matching.\n */\nexport function decodeRouteSegment(segment: string): string {\n  try {\n    return decodeURIComponent(segment);\n  } catch {\n    return segment;\n  }\n}\n","import { createWebRequestFromFarmRequest } from \"../server/request\";\nimport type {\n  MiddlewareConfig,\n  MiddlewareContext,\n  MiddlewareFunction,\n  MiddlewareModule,\n  MiddlewareStore,\n  RequestMiddlewareContext,\n} from \"./types\";\n\nexport interface NormalizedMiddlewareModule {\n  handlers: MiddlewareFunction[];\n  config?: MiddlewareConfig;\n}\n\nfunction isWebRequest(request: unknown): request is Request {\n  return typeof Request !== \"undefined\" && request instanceof Request;\n}\n\nfunction toWebRequest(ctx: MiddlewareContext): Request {\n  if (isWebRequest(ctx.request)) {\n    return ctx.request;\n  }\n  return createWebRequestFromFarmRequest(ctx.request, { origin: ctx.url.origin });\n}\n\nfunction createRequestMiddlewareContext(\n  ctx: MiddlewareContext,\n): RequestMiddlewareContext<Record<string, any>, Record<string, any>> {\n  const context = {\n    get url() {\n      return ctx.url;\n    },\n    get pathname() {\n      return ctx.pathname;\n    },\n    get searchParams() {\n      return ctx.searchParams;\n    },\n    get method() {\n      return ctx.method;\n    },\n    get params() {\n      return ctx.params;\n    },\n    get route() {\n      return ctx.route;\n    },\n    get locals() {\n      return ctx.locals as MiddlewareStore<Record<string, any>>;\n    },\n    get data() {\n      return ctx.data as MiddlewareStore<Record<string, any>>;\n    },\n    get headers() {\n      return ctx.headers;\n    },\n    get cookies() {\n      return ctx.cookies;\n    },\n    get(key: string) {\n      return ctx.locals.get(key);\n    },\n    has(key: string) {\n      return ctx.locals.has(key);\n    },\n    set(key: string, value: any) {\n      ctx.locals.set(key, value);\n    },\n    delete(key: string) {\n      return ctx.locals.delete(key);\n    },\n    redirect(url: string, status?: number) {\n      ctx.redirect(url, status);\n    },\n    rewrite(url: string) {\n      ctx.rewrite(url);\n    },\n    json(data: any, status?: number) {\n      ctx.json(data, status);\n    },\n    text(content: string, status?: number) {\n      ctx.text(content, status);\n    },\n    html(content: string, status?: number) {\n      ctx.html(content, status);\n    },\n  } satisfies RequestMiddlewareContext;\n\n  return context;\n}\n\n/**\n * Normalize the two supported middleware file styles to Farm's internal chain.\n */\nexport function normalizeMiddlewareModule(\n  middlewareModule: MiddlewareModule | Record<string, any>,\n  routePath: string,\n): NormalizedMiddlewareModule | null {\n  const module = middlewareModule as MiddlewareModule;\n  const defaultExport = module.default;\n  const namedExport = module.middleware;\n  const hasNamedExport = typeof namedExport === \"function\";\n\n  if (namedExport !== undefined && !hasNamedExport) {\n    throw new TypeError(\"The named middleware export must be a function\");\n  }\n\n  if (defaultExport && hasNamedExport) {\n    throw new Error(\n      \"A middleware file cannot export both a default handler and a named middleware handler\",\n    );\n  }\n\n  if (hasNamedExport) {\n    return {\n      handlers: [\n        async (ctx) => {\n          return namedExport(toWebRequest(ctx), createRequestMiddlewareContext(ctx));\n        },\n      ],\n      config: module.config,\n    };\n  }\n\n  if (defaultExport && typeof defaultExport === \"object\" && \"build\" in defaultExport) {\n    if (typeof (defaultExport as any).setBasePath === \"function\") {\n      (defaultExport as any).setBasePath(routePath);\n    }\n    const built = (defaultExport as any).build();\n    const handlers = Array.isArray(built?.handlers)\n      ? built.handlers.filter((handler: unknown) => typeof handler === \"function\")\n      : [];\n    return handlers.length > 0\n      ? {\n          handlers,\n          config: module.config || built?.config,\n        }\n      : null;\n  }\n\n  if (typeof defaultExport === \"function\") {\n    return {\n      handlers: [defaultExport as MiddlewareFunction],\n      config: module.config,\n    };\n  }\n\n  return null;\n}\n","import type { RouteSegment, ParsedRoute } from \"./types\";\nimport path from \"path\";\nimport {\n  assertBrowserStableRoutePath,\n  assertTerminalCatchAll,\n  assertUniqueRouteParameters,\n} from \"./routing/specificity\";\nimport { searchParamsToObject } from \"./search-params\";\nimport { decodeRouteSegment } from \"./utils/decode\";\n\nexport function parseRoutePath(filePath: string): ParsedRoute {\n  const segments: RouteSegment[] = [];\n  const normalizedPath = filePath.replace(/\\\\/g, \"/\");\n  const pathParts = normalizedPath.split(\"/\").filter(Boolean);\n\n  const fileName = pathParts.pop() || \"\";\n  const fileType = getRouteType(fileName);\n  const routePath = `/${pathParts.join(\"/\")}`;\n  assertBrowserStableRoutePath(routePath);\n  assertTerminalCatchAll(routePath);\n  assertUniqueRouteParameters(routePath);\n\n  for (const part of pathParts) {\n    // Route groups like `(marketing)` organize files without adding URL\n    // segments. Mirrors isRouteGroup in router.ts for programmatic routes.\n    if (part.startsWith(\"(\") && part.endsWith(\")\")) continue;\n    if (part.startsWith(\"[\") && part.endsWith(\"]\")) {\n      let segment = part.slice(1, -1);\n      const isDynamic = true;\n      let isOptional = false;\n      let isCatchAll = false;\n\n      if (segment.startsWith(\"[\") && segment.endsWith(\"]\")) {\n        isOptional = true;\n        segment = segment.slice(1, -1);\n        if (segment.startsWith(\"...\")) {\n          segment = segment.slice(3);\n          isCatchAll = true;\n        }\n      } else if (segment.startsWith(\"...\")) {\n        segment = segment.slice(3);\n        isCatchAll = true;\n      }\n\n      segments.push({ segment, isDynamic, isOptional, isCatchAll });\n    } else {\n      segments.push({\n        segment: part,\n        isDynamic: false,\n        isOptional: false,\n        isCatchAll: false,\n      });\n    }\n  }\n\n  return {\n    segments,\n    filePath: normalizedPath,\n    type: fileType,\n  };\n}\n\nfunction getRouteType(fileName: string): ParsedRoute[\"type\"] {\n  const baseName = fileName.replace(/\\.(tsx?|jsx?|vue|svelte|mdx?|markdown)$/, \"\");\n\n  switch (baseName) {\n    case \"page\":\n      return \"page\";\n    case \"layout\":\n      return \"layout\";\n    case \"loading\":\n      return \"loading\";\n    case \"error\":\n      return \"error\";\n    case \"not-found\":\n      return \"not-found\";\n    default:\n      return \"page\";\n  }\n}\n\nexport function segmentsToPattern(segments: RouteSegment[]): string {\n  if (segments.length === 0) return \"/\";\n\n  return (\n    \"/\" +\n    segments\n      .map((segment) => {\n        if (!segment.isDynamic) return segment.segment;\n\n        if (segment.isCatchAll) {\n          return segment.isOptional ? `*${segment.segment}?` : `*${segment.segment}`;\n        }\n\n        return `:${segment.segment}`;\n      })\n      .join(\"/\")\n  );\n}\n\nexport function matchRoute(\n  url: string,\n  segments: RouteSegment[],\n): { params: Record<string, string>; matches: boolean } {\n  const urlParts = url.split(\"/\").filter(Boolean).map(decodeRouteSegment);\n  const params: Record<string, string> = {};\n  if (segments.length === 0) {\n    return { params, matches: urlParts.length === 0 };\n  }\n\n  let urlIndex = 0;\n  let segmentIndex = 0;\n\n  while (segmentIndex < segments.length && urlIndex <= urlParts.length) {\n    const segment = segments[segmentIndex];\n\n    if (!segment.isDynamic) {\n      if (urlParts[urlIndex] !== segment.segment) {\n        return { params: {}, matches: false };\n      }\n      urlIndex++;\n      segmentIndex++;\n    } else if (segment.isCatchAll) {\n      const remainingParts = urlParts.slice(urlIndex);\n\n      if (remainingParts.length === 0 && !segment.isOptional) {\n        return { params: {}, matches: false };\n      }\n\n      params[segment.segment] = remainingParts.join(\"/\");\n      urlIndex = urlParts.length;\n      segmentIndex++;\n    } else {\n      if (urlIndex >= urlParts.length) {\n        return { params: {}, matches: false };\n      }\n\n      params[segment.segment] = urlParts[urlIndex];\n      urlIndex++;\n      segmentIndex++;\n    }\n  }\n\n  const matches = segmentIndex === segments.length && urlIndex === urlParts.length;\n\n  return { params, matches };\n}\n\n/** Match a route segment chain as an owner of the pathname or one of its descendants. */\nexport function matchRoutePrefix(url: string, segments: RouteSegment[]): boolean {\n  const urlParts = url.split(\"/\").filter(Boolean).map(decodeRouteSegment);\n  let urlIndex = 0;\n\n  for (const segment of segments) {\n    if (segment.isCatchAll) {\n      return segment.isOptional || urlIndex < urlParts.length;\n    }\n\n    const urlPart = urlParts[urlIndex];\n    if (urlPart === undefined) return false;\n    if (!segment.isDynamic && segment.segment !== urlPart) return false;\n    urlIndex++;\n  }\n\n  return true;\n}\n\nexport function resolveAppPath(root: string, ...paths: string[]): string {\n  return path.resolve(root, ...paths);\n}\n\n/**\n * Convert an absolute module path inside the project root to a root-relative\n * URL path with forward slashes (e.g. `/src/app/page.tsx`), for values the\n * client passes to dynamic `import()`. On Windows the naive root-prefix slice\n * yields `\\src\\app\\page.tsx`, which is not a valid module specifier. Returns\n * undefined for paths outside the root so callers keep their own fallbacks.\n */\nexport function toRootRelativeUrlPath(\n  absolutePath: string,\n  projectRoot: string,\n): string | undefined {\n  if (absolutePath === projectRoot) return \"\";\n  if (absolutePath.startsWith(`${projectRoot}/`) || absolutePath.startsWith(`${projectRoot}\\\\`)) {\n    return absolutePath.slice(projectRoot.length).replace(/\\\\/g, \"/\");\n  }\n  return undefined;\n}\n\n/**\n * Normalize a filesystem path to forward slashes. Node's fs accepts these on\n * every platform, and module ids handed to bundlers (e.g. Nitro handler and\n * task entries) must not contain backslashes.\n */\nexport function toPosixPath(filePath: string): string {\n  return filePath.replace(/\\\\/g, \"/\");\n}\n\nexport function toViteModuleId(filePath: string, root: string): string {\n  if (!path.isAbsolute(filePath)) return filePath;\n\n  const relativePath = path.relative(root, filePath);\n  if (relativePath && !relativePath.startsWith(\"..\") && !path.isAbsolute(relativePath)) {\n    return `/${relativePath.split(path.sep).join(\"/\")}`;\n  }\n\n  const normalizedPath = filePath.replace(/\\\\/g, \"/\");\n  return normalizedPath.startsWith(\"/\") ? `/@fs${normalizedPath}` : `/@fs/${normalizedPath}`;\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n  try {\n    const fs = await import(\"fs/promises\");\n    await fs.access(filePath);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nexport async function globFiles(pattern: string, cwd: string): Promise<string[]> {\n  const glob = await import(\"fast-glob\");\n  return glob.default(pattern, { cwd, absolute: false });\n}\n\nexport function parseSearchParams(\n  searchParams: URLSearchParams,\n): Record<string, string | string[]> {\n  return searchParamsToObject(searchParams) as Record<string, string | string[]>;\n}\n\nexport const logger = {\n  info: (message: string) => console.log(`[info] ${message}`),\n  success: (message: string) => console.log(`[success] ${message}`),\n  warn: (message: string) => console.warn(`⚠️  ${message}`),\n  error: (message: string) => console.error(`❌ ${message}`),\n  ready: (message: string) => console.log(`${message}`),\n  event: (message: string) => console.log(`  ${message}`),\n};\n","import type { ServerResponse } from \"node:http\";\n\ninterface ResponseEventWatcher<T> {\n  promise: Promise<T>;\n  dispose(): void;\n}\n\n/**\n * Watch a real Node response without requiring every Node-compatible response\n * adapter or test double to extend EventEmitter. The framework only needs\n * disconnect handling when the response exposes both halves of the listener\n * lifecycle; otherwise callers can still send ordinary non-blocked bodies.\n */\nfunction watchResponseEvent<T>(\n  res: ServerResponse,\n  events: ReadonlyArray<readonly [event: string, value: T]>,\n): ResponseEventWatcher<T> | null {\n  if (typeof res.once !== \"function\" || typeof res.removeListener !== \"function\") {\n    return null;\n  }\n\n  let settled = false;\n  const listeners = events.map(([event, value]) => {\n    const listener = () => {\n      if (settled) return;\n      settled = true;\n      dispose();\n      resolvePromise(value);\n    };\n    return { event, listener };\n  });\n  let resolvePromise!: (value: T) => void;\n  const promise = new Promise<T>((resolve) => {\n    resolvePromise = resolve;\n    for (const { event, listener } of listeners) {\n      res.once(event, listener);\n    }\n  });\n  const dispose = () => {\n    for (const { event, listener } of listeners) {\n      res.removeListener(event, listener);\n    }\n  };\n\n  return { promise, dispose };\n}\n\n/**\n * Waits until the response can accept more writes. Resolves false when the\n * client is gone (close or error): a disconnected socket never emits drain,\n * so waiting on drain alone leaks the pending handler, its reader lock, and\n * the response body for the life of the process.\n */\nasync function waitForWritable(res: ServerResponse): Promise<boolean> {\n  if (res.writableEnded || res.destroyed) {\n    return false;\n  }\n\n  const watcher = watchResponseEvent(res, [\n    [\"drain\", true],\n    [\"close\", false],\n    [\"error\", false],\n  ]);\n  if (!watcher) {\n    return false;\n  }\n\n  try {\n    return await watcher.promise;\n  } finally {\n    watcher.dispose();\n  }\n}\n\n/**\n * Older Fetch implementations expose repeated Set-Cookie fields as one\n * comma-joined value. Split only at a comma followed by another cookie-pair;\n * commas inside Expires dates remain part of the current cookie. RFC cookie\n * values exclude commas, so a comma followed by a cookie-pair is unambiguous\n * for valid Set-Cookie syntax once the original field boundaries are lost.\n */\nfunction splitSetCookieHeader(value: string): string[] {\n  const cookies: string[] = [];\n  let start = 0;\n\n  for (let index = 0; index < value.length; index += 1) {\n    if (value[index] !== \",\") continue;\n\n    let next = index + 1;\n    while (value[next] === \" \" || value[next] === \"\\t\") next += 1;\n\n    const equals = value.indexOf(\"=\", next);\n    if (equals === -1) continue;\n\n    const separator = value.slice(next, equals);\n    if (separator.length === 0 || /[;,\\s]/.test(separator)) continue;\n\n    cookies.push(value.slice(start, index).trim());\n    start = next;\n    index = next - 1;\n  }\n\n  cookies.push(value.slice(start).trim());\n  return cookies.filter(Boolean);\n}\n\nexport function applyWebResponseHeaders(\n  res: Pick<ServerResponse, \"setHeader\"> & Partial<Pick<ServerResponse, \"getHeader\">>,\n  headers: Headers,\n  options: { appendSetCookie?: boolean } = {},\n): void {\n  const responseHeaders = headers as Headers & {\n    getSetCookie?: () => string[];\n    raw?: () => Record<string, string[]>;\n  };\n  const rawSetCookies = responseHeaders.raw?.()[\"set-cookie\"];\n  const setCookies = responseHeaders.getSetCookie?.() || rawSetCookies || [];\n  const existing =\n    options.appendSetCookie && typeof res.getHeader === \"function\"\n      ? res.getHeader(\"Set-Cookie\")\n      : undefined;\n  const existingCookies = Array.isArray(existing)\n    ? existing.map(String)\n    : existing === undefined\n      ? []\n      : [String(existing)];\n\n  let fallbackSetCookie = \"\";\n  headers.forEach((value, key) => {\n    if (key.toLowerCase() === \"set-cookie\") {\n      fallbackSetCookie = value;\n      return;\n    }\n    res.setHeader(key, value);\n  });\n\n  const cookies =\n    setCookies.length > 0\n      ? setCookies\n      : fallbackSetCookie\n        ? splitSetCookieHeader(fallbackSetCookie)\n        : [];\n  if (cookies.length > 0) {\n    res.setHeader(\"Set-Cookie\", [...existingCookies, ...cookies]);\n  }\n}\n\nexport async function sendWebResponse(res: ServerResponse, response: Response): Promise<void> {\n  res.statusCode = response.status;\n  applyWebResponseHeaders(res, response.headers, { appendSetCookie: true });\n\n  if (!response.body) {\n    res.end();\n    return;\n  }\n\n  if (typeof res.write !== \"function\") {\n    const body = await response.arrayBuffer();\n    res.end(Buffer.from(body));\n    return;\n  }\n\n  const reader = response.body.getReader();\n  const disconnectWatcher = watchResponseEvent(res, [\n    [\"close\", true],\n    [\"error\", true],\n  ]);\n\n  try {\n    while (true) {\n      if (res.destroyed) {\n        // The client disconnected mid-response; drop the rest of the body so\n        // the handler can return.\n        void reader.cancel().catch(() => {});\n        return;\n      }\n\n      const read = reader.read().then((result) => ({ type: \"read\" as const, result }));\n      const next = disconnectWatcher\n        ? await Promise.race([\n            read,\n            disconnectWatcher.promise.then(() => ({ type: \"disconnect\" as const })),\n          ])\n        : await read;\n      if (next.type === \"disconnect\") {\n        void reader.cancel().catch(() => {});\n        return;\n      }\n\n      const { done, value } = next.result;\n      if (done) {\n        break;\n      }\n\n      if (!value || value.byteLength === 0) {\n        continue;\n      }\n\n      if (!res.write(value)) {\n        if (!(await waitForWritable(res))) {\n          void reader.cancel().catch(() => {});\n          return;\n        }\n      }\n    }\n\n    res.end();\n  } catch (error) {\n    // Releasing the lock does not stop the producer. Cancel it when the\n    // downstream write fails, without waiting on app-owned cleanup or letting\n    // a cancellation failure replace the original error.\n    void reader.cancel(error).catch(() => {});\n    if (!res.writableEnded) {\n      const responseError = error instanceof Error ? error : new Error(String(error));\n      if (typeof res.destroy === \"function\") {\n        res.destroy(responseError);\n      } else {\n        res.end();\n      }\n    }\n    throw error;\n  } finally {\n    disconnectWatcher?.dispose();\n    try {\n      reader.releaseLock();\n    } catch {\n      // A disconnect can win the race with a pending read. Cancelling the\n      // reader settles it asynchronously, so there may be no lock to release\n      // synchronously here.\n    }\n  }\n}\n","import {\n  context,\n  createContextKey,\n  isSpanContextValid,\n  propagation,\n  SpanKind,\n  SpanStatusCode,\n  trace,\n  type Attributes,\n  type Context,\n  type Span,\n} from \"@opentelemetry/api\";\nimport type { FarmEvent } from \"./observability\";\n\nexport const FARM_TRACER_NAME = \"@farm.js/core\";\n\nexport type FarmTraceSpanKind =\n  | \"request\"\n  | \"render\"\n  | \"middleware\"\n  | \"api\"\n  | \"integration\"\n  | \"storage\"\n  | \"ppr\"\n  | \"build\"\n  | \"plugin\";\n\nexport interface FarmTracingConfig {\n  /** Enable Farm's OpenTelemetry spans. */\n  enabled?: boolean;\n  /** Span families to record. All families are enabled by default. */\n  spans?: readonly FarmTraceSpanKind[];\n  /** Add Farm lifecycle events to the active span. Defaults to true. */\n  recordEvents?: boolean;\n  /** Static attributes added to every Farm-created span. */\n  attributes?: Attributes;\n  /** Path prefixes that should not create request spans. */\n  ignorePaths?: readonly string[];\n}\n\nexport type FarmTracingUserConfig = boolean | FarmTracingConfig;\n\nexport interface FarmResolvedTracingConfig {\n  enabled: boolean;\n  spans: ReadonlySet<FarmTraceSpanKind>;\n  recordEvents: boolean;\n  attributes: Attributes;\n  ignorePaths: readonly string[];\n}\n\nexport interface FarmTraceContext {\n  traceId: string;\n  spanId: string;\n  traceSampled: boolean;\n}\n\nexport interface FarmRequestSpanOptions {\n  getStatusCode?: () => number | undefined;\n  onStart?: () => void;\n  onComplete?: (status: number, durationMs: number) => void;\n  onError?: (error: unknown, durationMs: number) => void;\n}\n\nexport interface FarmSpanOptions {\n  kind?: FarmTraceSpanKind;\n  attributes?: Attributes;\n  spanKind?: SpanKind;\n}\n\nconst ALL_SPAN_KINDS: readonly FarmTraceSpanKind[] = [\n  \"request\",\n  \"render\",\n  \"middleware\",\n  \"api\",\n  \"integration\",\n  \"storage\",\n  \"ppr\",\n  \"build\",\n  \"plugin\",\n];\n\nconst DEFAULT_IGNORED_PATHS = [\n  \"/@vite/\",\n  \"/@fs/\",\n  \"/@id/\",\n  \"/@react-refresh\",\n  \"/node_modules/\",\n  \"/__vite\",\n  \"/.well-known/appspecific/\",\n];\nconst FARM_REQUEST_METHOD_CONTEXT_KEY = createContextKey(\"@farm.js/core/request-method\");\n\nlet tracingState: FarmResolvedTracingConfig = normalizeFarmTracingConfig(false);\n\nexport function normalizeFarmTracingConfig(\n  config: FarmTracingUserConfig | undefined,\n): FarmResolvedTracingConfig {\n  if (!config) {\n    return {\n      enabled: false,\n      spans: new Set(ALL_SPAN_KINDS),\n      recordEvents: true,\n      attributes: {},\n      ignorePaths: DEFAULT_IGNORED_PATHS,\n    };\n  }\n\n  if (config === true) {\n    return {\n      enabled: true,\n      spans: new Set(ALL_SPAN_KINDS),\n      recordEvents: true,\n      attributes: {},\n      ignorePaths: DEFAULT_IGNORED_PATHS,\n    };\n  }\n\n  return {\n    enabled: config.enabled ?? true,\n    spans: new Set(config.spans ?? ALL_SPAN_KINDS),\n    recordEvents: config.recordEvents ?? true,\n    attributes: { ...config.attributes },\n    ignorePaths: [...DEFAULT_IGNORED_PATHS, ...(config.ignorePaths ?? [])],\n  };\n}\n\nexport function configureFarmTracing(\n  config: FarmTracingUserConfig | FarmResolvedTracingConfig | undefined,\n): void {\n  if (isResolvedFarmTracingConfig(config)) {\n    tracingState = {\n      ...config,\n      spans: new Set(config.spans),\n      attributes: { ...config.attributes },\n      ignorePaths: [...config.ignorePaths],\n    };\n    return;\n  }\n  tracingState = normalizeFarmTracingConfig(config as FarmTracingUserConfig | undefined);\n}\n\nfunction isResolvedFarmTracingConfig(\n  config: FarmTracingUserConfig | FarmResolvedTracingConfig | undefined,\n): config is FarmResolvedTracingConfig {\n  return (\n    !!config &&\n    typeof config === \"object\" &&\n    typeof config.enabled === \"boolean\" &&\n    config.spans instanceof Set &&\n    typeof config.recordEvents === \"boolean\" &&\n    Array.isArray(config.ignorePaths)\n  );\n}\n\nexport function getFarmTracingConfig(): FarmResolvedTracingConfig {\n  return tracingState;\n}\n\nexport function resetFarmTracing(): void {\n  tracingState = normalizeFarmTracingConfig(false);\n}\n\nexport function getFarmTraceContext(): FarmTraceContext | undefined {\n  return getSpanTraceContext(trace.getSpan(context.active()));\n}\n\nexport async function runWithFarmSpan<T>(\n  name: string,\n  handler: () => T | Promise<T>,\n  options: FarmSpanOptions = {},\n): Promise<T> {\n  const spanFamily = options.kind;\n  if (!tracingState.enabled || (spanFamily !== undefined && !tracingState.spans.has(spanFamily))) {\n    return await handler();\n  }\n\n  const tracer = trace.getTracer(FARM_TRACER_NAME);\n  return await tracer.startActiveSpan(\n    name,\n    {\n      kind: options.spanKind ?? SpanKind.INTERNAL,\n      attributes: {\n        ...tracingState.attributes,\n        ...options.attributes,\n      },\n    },\n    async (span) => {\n      try {\n        return await handler();\n      } catch (error) {\n        recordSpanError(span, error);\n        throw error;\n      } finally {\n        span.end();\n      }\n    },\n  );\n}\n\nexport async function _runWithFarmRequestSpan<T>(\n  request: Request,\n  handler: () => T | Promise<T>,\n  options: FarmRequestSpanOptions = {},\n): Promise<T> {\n  const startedAt = Date.now();\n  const url = new URL(request.url);\n  const shouldTrace =\n    tracingState.enabled &&\n    tracingState.spans.has(\"request\") &&\n    !tracingState.ignorePaths.some((prefix) => url.pathname.startsWith(prefix));\n\n  if (!shouldTrace) {\n    options.onStart?.();\n    try {\n      const result = await handler();\n      options.onComplete?.(resolveResultStatus(result, options), Date.now() - startedAt);\n      return result;\n    } catch (error) {\n      options.onError?.(error, Date.now() - startedAt);\n      throw error;\n    }\n  }\n\n  const extractedContext = propagation.extract(context.active(), request.headers, {\n    keys(carrier) {\n      return Array.from(carrier.keys());\n    },\n    get(carrier, key) {\n      return carrier.get(key) ?? undefined;\n    },\n  });\n  const requestContext = extractedContext.setValue(FARM_REQUEST_METHOD_CONTEXT_KEY, request.method);\n  const tracer = trace.getTracer(FARM_TRACER_NAME);\n  const attributes: Attributes = {\n    ...tracingState.attributes,\n    \"http.request.method\": request.method,\n    \"url.path\": url.pathname,\n    \"url.scheme\": url.protocol.replace(/:$/, \"\"),\n    \"server.address\": url.hostname,\n  };\n  if (url.port) attributes[\"server.port\"] = Number(url.port);\n\n  return await tracer.startActiveSpan(\n    `${request.method} ${url.pathname}`,\n    { kind: SpanKind.SERVER, attributes },\n    requestContext,\n    async (span) => {\n      options.onStart?.();\n      try {\n        const result = await handler();\n        const status = resolveResultStatus(result, options);\n        setResponseStatus(span, status);\n        options.onComplete?.(status, Date.now() - startedAt);\n        return result;\n      } catch (error) {\n        recordSpanError(span, error);\n        options.onError?.(error, Date.now() - startedAt);\n        throw error;\n      } finally {\n        span.end();\n      }\n    },\n  );\n}\n\nexport function recordFarmEventTrace(event: FarmEvent): FarmTraceContext | undefined {\n  if (!tracingState.enabled) return undefined;\n\n  const activeContext = context.active();\n  const activeSpan = trace.getSpan(activeContext);\n  const traceContext = getSpanTraceContext(activeSpan);\n  if (activeSpan && traceContext) {\n    if (event.type === \"route.matched\") {\n      const method =\n        (activeContext.getValue(FARM_REQUEST_METHOD_CONTEXT_KEY) as string | undefined) ?? \"HTTP\";\n      activeSpan.updateName(`${method} ${event.route}`);\n      activeSpan.setAttribute(\"http.route\", event.route);\n      activeSpan.setAttribute(\"farm.route\", event.route);\n    }\n\n    if (tracingState.recordEvents) {\n      activeSpan.addEvent(event.type, toEventAttributes(event), event.timestamp);\n    }\n\n    const error = event.type === \"request.error\" ? undefined : getEventError(event);\n    if (error !== undefined) {\n      // A recoverable render error (caught by an error boundary) still fires\n      // React's onError while the request returns a valid response, so record\n      // the exception for visibility but let the actual response status\n      // (setResponseStatus) decide the span status instead of forcing the whole\n      // request trace to ERROR. A genuinely fatal render error surfaces through\n      // the request outcome (a thrown handler or a >= 500 status) and is marked\n      // there.\n      if (event.type === \"render.error\") {\n        recordSpanException(activeSpan, error);\n      } else {\n        recordSpanError(activeSpan, error);\n      }\n    }\n  }\n\n  const completedTraceContext = recordCompletedEventSpan(event, activeContext);\n  return traceContext ?? completedTraceContext;\n}\n\nfunction recordCompletedEventSpan(\n  event: FarmEvent,\n  parentContext: Context,\n): FarmTraceContext | undefined {\n  const descriptor = getCompletedSpanDescriptor(event);\n  if (!descriptor || !tracingState.spans.has(descriptor.kind)) return undefined;\n\n  const tracer = trace.getTracer(FARM_TRACER_NAME);\n  const span = tracer.startSpan(\n    descriptor.name,\n    {\n      kind: SpanKind.INTERNAL,\n      startTime: event.timestamp - descriptor.durationMs,\n      attributes: {\n        ...tracingState.attributes,\n        ...toEventAttributes(event),\n        \"farm.event.type\": event.type,\n      },\n    },\n    parentContext,\n  );\n\n  const status = \"status\" in event && typeof event.status === \"number\" ? event.status : undefined;\n  if (status !== undefined) setResponseStatus(span, status);\n  const error = getEventError(event);\n  if (error !== undefined) recordSpanError(span, error);\n  const traceContext = getSpanTraceContext(span);\n  span.end(event.timestamp);\n  return traceContext;\n}\n\nfunction getCompletedSpanDescriptor(\n  event: FarmEvent,\n): { kind: FarmTraceSpanKind; name: string; durationMs: number } | undefined {\n  if (!(\"durationMs\" in event) || typeof event.durationMs !== \"number\") return undefined;\n\n  switch (event.type) {\n    case \"render.complete\":\n      return { kind: \"render\", name: `farm.render ${event.route}`, durationMs: event.durationMs };\n    case \"render.stream.shellReady\":\n      return {\n        kind: \"render\",\n        name: `farm.render.shell ${event.route}`,\n        durationMs: event.durationMs,\n      };\n    case \"render.stream.complete\":\n      return {\n        kind: \"render\",\n        name: `farm.render.stream ${event.route}`,\n        durationMs: event.durationMs,\n      };\n    case \"middleware.complete\":\n      return {\n        kind: \"middleware\",\n        name: `farm.middleware ${event.name ?? event.route ?? \"anonymous\"}`,\n        durationMs: event.durationMs,\n      };\n    case \"api.request.complete\":\n    case \"api.error\":\n      return {\n        kind: \"api\",\n        name: `farm.api ${event.method} ${event.route}`,\n        durationMs: event.durationMs,\n      };\n    case \"integration.api.call.complete\":\n      return {\n        kind: \"integration\",\n        name: `farm.integration ${event.integration}.${event.operation}`,\n        durationMs: event.durationMs,\n      };\n    case \"storage.query.complete\":\n      return {\n        kind: \"storage\",\n        name: `farm.storage ${event.operation}`,\n        durationMs: event.durationMs,\n      };\n    case \"ppr.refresh.complete\":\n      return {\n        kind: \"ppr\",\n        name: `farm.ppr.refresh ${event.route}`,\n        durationMs: event.durationMs,\n      };\n    case \"build.complete\":\n      return {\n        kind: \"build\",\n        name: `farm.build${event.target ? ` ${event.target}` : \"\"}`,\n        durationMs: event.durationMs,\n      };\n    case \"plugin.hook.complete\":\n      return {\n        kind: \"plugin\",\n        name: `farm.plugin ${event.plugin}.${event.hook}`,\n        durationMs: event.durationMs,\n      };\n    default:\n      return undefined;\n  }\n}\n\n// A runtime-agnostic, non-cryptographic digest (FNV-1a). This module is bundled\n// into browser and edge runtimes, so it must not import node:crypto; the digest\n// only needs to redact the raw cache key while keeping cache events correlatable,\n// which does not require a cryptographic hash.\nfunction hashFarmCacheKey(value: string): string {\n  let hash = 0x811c9dc5;\n  for (let index = 0; index < value.length; index++) {\n    hash ^= value.charCodeAt(index);\n    hash = Math.imul(hash, 0x01000193);\n  }\n  return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n\nfunction toEventAttributes(event: FarmEvent): Attributes {\n  const attributes: Attributes = {};\n  // A cache event's `key` embeds the serialized arguments of the cached call\n  // (e.g. `unstable_cache(getUser)(email)` serializes the email into the key),\n  // so it must never be exported verbatim to a tracing backend. Emit a stable\n  // digest under `farm.key_hash` instead, preserving cross-event correlation\n  // without shipping the sensitive payload.\n  const redactKey = typeof event.type === \"string\" && event.type.startsWith(\"cache.\");\n  for (const [key, value] of Object.entries(event)) {\n    if (\n      key === \"timestamp\" ||\n      key === \"level\" ||\n      key === \"error\" ||\n      key === \"traceId\" ||\n      key === \"spanId\" ||\n      key === \"traceSampled\" ||\n      value === undefined\n    ) {\n      continue;\n    }\n    if (redactKey && key === \"key\" && typeof value === \"string\") {\n      attributes[\"farm.key_hash\"] = hashFarmCacheKey(value);\n      continue;\n    }\n    if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n      attributes[`farm.${key}`] = value;\n    } else if (Array.isArray(value)) {\n      if (value.every((entry) => typeof entry === \"string\")) {\n        attributes[`farm.${key}`] = value as string[];\n      } else if (value.every((entry) => typeof entry === \"number\")) {\n        attributes[`farm.${key}`] = value as number[];\n      } else if (value.every((entry) => typeof entry === \"boolean\")) {\n        attributes[`farm.${key}`] = value as boolean[];\n      }\n    }\n  }\n  return attributes;\n}\n\nfunction getEventError(event: FarmEvent): unknown {\n  return \"error\" in event ? event.error : undefined;\n}\n\nfunction recordSpanException(span: Span, error: unknown): Error {\n  const normalized = error instanceof Error ? error : new Error(String(error));\n  span.recordException(normalized);\n  return normalized;\n}\n\nfunction recordSpanError(span: Span, error: unknown): void {\n  const normalized = recordSpanException(span, error);\n  span.setStatus({ code: SpanStatusCode.ERROR, message: normalized.message });\n}\n\nfunction setResponseStatus(span: Span, status: number): void {\n  span.setAttribute(\"http.response.status_code\", status);\n  if (status >= 500) {\n    span.setStatus({ code: SpanStatusCode.ERROR });\n  }\n}\n\nfunction resolveResultStatus<T>(result: T, options: FarmRequestSpanOptions): number {\n  if (result instanceof Response) return result.status;\n  return options.getStatusCode?.() ?? 200;\n}\n\nfunction getSpanTraceContext(span: Span | undefined): FarmTraceContext | undefined {\n  if (!span) return undefined;\n  const spanContext = span.spanContext();\n  if (!isSpanContextValid(spanContext)) return undefined;\n  return {\n    traceId: spanContext.traceId,\n    spanId: spanContext.spanId,\n    traceSampled: (spanContext.traceFlags & 0x01) === 0x01,\n  };\n}\n","import {\n  _runWithFarmRequestSpan,\n  configureFarmTracing,\n  getFarmTraceContext,\n  normalizeFarmTracingConfig,\n  recordFarmEventTrace,\n  resetFarmTracing,\n  runWithFarmSpan,\n  type FarmRequestSpanOptions,\n  type FarmResolvedTracingConfig,\n  type FarmSpanOptions,\n  type FarmTraceContext,\n  type FarmTraceSpanKind,\n  type FarmTracingConfig,\n  type FarmTracingUserConfig,\n} from \"./tracing\";\n\nexport type FarmEventLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface FarmEventBase {\n  type: string;\n  timestamp: number;\n  level: FarmEventLevel;\n  requestId?: string;\n  traceId?: string;\n  spanId?: string;\n  traceSampled?: boolean;\n  route?: string;\n  pathname?: string;\n}\n\nexport type FarmRequestEvent =\n  | (FarmEventBase & { type: \"request.start\"; method: string; pathname: string })\n  | (FarmEventBase & {\n      type: \"request.complete\";\n      method: string;\n      pathname: string;\n      status: number;\n      durationMs: number;\n    })\n  | (FarmEventBase & {\n      type: \"request.error\";\n      method: string;\n      pathname: string;\n      durationMs: number;\n      error: unknown;\n    });\n\nexport type FarmServerEvent =\n  | (FarmEventBase & {\n      type: \"server.start\";\n      mode: \"dev\" | \"preview\" | \"production\";\n      port?: number;\n    })\n  | (FarmEventBase & { type: \"server.ready\"; url?: string })\n  | (FarmEventBase & { type: \"server.shutdown\"; reason?: string });\n\nexport type FarmRouteEvent =\n  | (FarmEventBase & { type: \"route.discovered\"; route: string; filePath: string })\n  | (FarmEventBase & {\n      type: \"route.matched\";\n      pathname: string;\n      route: string;\n      params?: Record<string, string>;\n    })\n  | (FarmEventBase & { type: \"route.notFound\"; pathname: string })\n  | (FarmEventBase & { type: \"route.redirect\"; from: string; to: string; status?: number })\n  | (FarmEventBase & { type: \"route.rewrite\"; from: string; to: string });\n\nexport type FarmRenderEvent =\n  | (FarmEventBase & { type: \"render.start\"; route: string; pathname?: string })\n  | (FarmEventBase & {\n      type: \"render.complete\";\n      route: string;\n      durationMs: number;\n      status?: number;\n    })\n  | (FarmEventBase & { type: \"render.error\"; route?: string; error: unknown })\n  | (FarmEventBase & { type: \"render.stream.start\"; route: string })\n  | (FarmEventBase & { type: \"render.stream.shellReady\"; route: string; durationMs: number })\n  | (FarmEventBase & { type: \"render.stream.complete\"; route: string; durationMs: number });\n\nexport type FarmCacheEvent =\n  | (FarmEventBase & {\n      type: \"cache.hit\";\n      key: string;\n      route?: string;\n      tags?: readonly string[];\n      revalidate?: number | false;\n      stale?: boolean;\n    })\n  | (FarmEventBase & { type: \"cache.miss\"; key: string; route?: string; reason?: string })\n  | (FarmEventBase & {\n      type: \"cache.set\";\n      key: string;\n      route?: string;\n      tags?: readonly string[];\n      revalidate?: number | false;\n    })\n  | (FarmEventBase & { type: \"cache.dedupe\"; key: string })\n  | (FarmEventBase & { type: \"cache.bypass\"; key?: string; route?: string; reason: string })\n  | (FarmEventBase & {\n      type: \"cache.stale\";\n      key: string;\n      route?: string;\n      tags?: readonly string[];\n      revalidate?: number | false;\n    })\n  | (FarmEventBase & { type: \"cache.revalidatePath\"; path: string; count: number })\n  | (FarmEventBase & {\n      type: \"cache.revalidateTag\";\n      tag: string;\n      profile?: unknown;\n      count: number;\n    })\n  | (FarmEventBase & { type: \"cache.updateTag\"; tag: string; count: number })\n  | (FarmEventBase & {\n      type: \"cache.invalidated\";\n      key?: string;\n      route?: string;\n      tag?: string;\n      reason?: string;\n      count?: number;\n    })\n  | (FarmEventBase & { type: \"cache.delete\"; key: string; deleted: boolean })\n  | (FarmEventBase & { type: \"cache.clear\"; count: number })\n  | (FarmEventBase & {\n      type: \"cache.error\";\n      key?: string;\n      operation: \"get\" | \"set\" | \"delete\" | \"revalidate\";\n      error: unknown;\n    });\n\nexport type FarmPPREvent =\n  | (FarmEventBase & { type: \"ppr.shell.hit\"; route: string; key: string })\n  | (FarmEventBase & { type: \"ppr.shell.miss\"; route: string; key: string })\n  | (FarmEventBase & {\n      type: \"ppr.shell.cached\";\n      route: string;\n      key: string;\n      revalidate?: number;\n    })\n  | (FarmEventBase & { type: \"ppr.shell.bypass\"; route: string; reason: string })\n  | (FarmEventBase & {\n      type: \"ppr.shell.invalidated\";\n      route: string;\n      reason?: string;\n      count?: number;\n    })\n  | (FarmEventBase & { type: \"ppr.suspense.holeDetected\"; route: string })\n  | (FarmEventBase & { type: \"ppr.refresh.start\"; route: string })\n  | (FarmEventBase & { type: \"ppr.refresh.complete\"; route: string; durationMs: number })\n  | (FarmEventBase & { type: \"ppr.refresh.error\"; route: string; error: unknown });\n\nexport type FarmAPIEvent =\n  | (FarmEventBase & { type: \"api.request.start\"; route: string; method: string })\n  | (FarmEventBase & {\n      type: \"api.request.complete\";\n      route: string;\n      method: string;\n      status: number;\n      durationMs: number;\n    })\n  | (FarmEventBase & {\n      type: \"api.validation.failed\";\n      route: string;\n      method: string;\n      issues?: unknown;\n    })\n  | (FarmEventBase & {\n      type: \"api.error\";\n      route: string;\n      method: string;\n      durationMs: number;\n      error: unknown;\n    });\n\nexport type FarmIntegrationEvent =\n  | (FarmEventBase & { type: \"integration.registered\"; name: string })\n  | (FarmEventBase & { type: \"integration.config.validated\"; name: string })\n  | (FarmEventBase & { type: \"integration.ready\"; name: string })\n  | (FarmEventBase & { type: \"integration.disposed\"; name: string })\n  | (FarmEventBase & {\n      type: \"integration.api.call.start\";\n      integration: string;\n      operation: string;\n    })\n  | (FarmEventBase & {\n      type: \"integration.api.call.complete\";\n      integration: string;\n      operation: string;\n      durationMs: number;\n    })\n  | (FarmEventBase & {\n      type: \"integration.api.call.error\";\n      integration: string;\n      operation: string;\n      error: unknown;\n    })\n  | (FarmEventBase & { type: \"integration.webhook.received\"; integration: string; event?: string })\n  | (FarmEventBase & { type: \"integration.webhook.verified\"; integration: string; event?: string })\n  | (FarmEventBase & { type: \"integration.webhook.failed\"; integration: string; reason: string });\n\nexport type FarmMiddlewareEvent =\n  | (FarmEventBase & { type: \"middleware.start\"; route?: string; name?: string })\n  | (FarmEventBase & {\n      type: \"middleware.complete\";\n      route?: string;\n      name?: string;\n      durationMs: number;\n    })\n  | (FarmEventBase & {\n      type: \"middleware.shortCircuit\";\n      route?: string;\n      name?: string;\n      status?: number;\n    })\n  | (FarmEventBase & { type: \"middleware.error\"; route?: string; name?: string; error: unknown });\n\nexport type FarmStorageEvent =\n  | (FarmEventBase & { type: \"storage.query.start\"; integration?: string; operation: string })\n  | (FarmEventBase & {\n      type: \"storage.query.complete\";\n      integration?: string;\n      operation: string;\n      durationMs: number;\n    })\n  | (FarmEventBase & {\n      type: \"storage.query.error\";\n      integration?: string;\n      operation: string;\n      error: unknown;\n    })\n  | (FarmEventBase & { type: \"storage.schema.ready\"; integration?: string })\n  | (FarmEventBase & { type: \"storage.schema.error\"; integration?: string; error: unknown });\n\nexport type FarmBuildEvent =\n  | (FarmEventBase & { type: \"build.start\"; target?: string })\n  | (FarmEventBase & { type: \"build.complete\"; target?: string; durationMs: number })\n  | (FarmEventBase & { type: \"build.error\"; target?: string; error: unknown })\n  | (FarmEventBase & { type: \"routes.generated\"; pageCount: number; apiCount?: number })\n  | (FarmEventBase & { type: \"types.generated\"; filePath: string })\n  | (FarmEventBase & { type: \"manifest.generated\"; routeCount: number });\n\nexport type FarmPluginEvent =\n  | (FarmEventBase & { type: \"plugin.hook.start\"; plugin: string; hook: string })\n  | (FarmEventBase & {\n      type: \"plugin.hook.complete\";\n      plugin: string;\n      hook: string;\n      durationMs: number;\n    })\n  | (FarmEventBase & { type: \"plugin.hook.error\"; plugin: string; hook: string; error: unknown });\n\nexport type FarmErrorEvent = FarmEventBase & {\n  type: \"error\";\n  source: string;\n  error: unknown;\n  route?: string;\n};\n\nexport type FarmEvent =\n  | FarmRequestEvent\n  | FarmServerEvent\n  | FarmRouteEvent\n  | FarmRenderEvent\n  | FarmCacheEvent\n  | FarmPPREvent\n  | FarmAPIEvent\n  | FarmIntegrationEvent\n  | FarmMiddlewareEvent\n  | FarmStorageEvent\n  | FarmBuildEvent\n  | FarmPluginEvent\n  | FarmErrorEvent;\n\nexport type FarmEventType = FarmEvent[\"type\"];\nexport type FarmEventHandler = (event: FarmEvent) => void | Promise<void>;\n\nexport type FarmEventInput = FarmEvent extends infer T\n  ? T extends FarmEvent\n    ? Omit<T, \"timestamp\" | \"level\"> & Partial<Pick<T, \"timestamp\" | \"level\">>\n    : never\n  : never;\n\nexport type FarmObservabilityUserConfig =\n  | boolean\n  | {\n      logs?: boolean;\n      onEvent?: FarmEventHandler | readonly FarmEventHandler[];\n      events?: readonly FarmEventType[];\n      tracing?: FarmTracingUserConfig;\n    };\n\nexport interface FarmResolvedObservabilityConfig {\n  logs: boolean;\n  handlers: FarmEventHandler[];\n  events?: Set<FarmEventType>;\n  tracing: FarmResolvedTracingConfig;\n}\n\nexport interface FarmEventSubscriptionOptions {\n  /** Receive events even when they are excluded by `observability.events`. */\n  unfiltered?: boolean;\n}\n\nconst runtimeHandlers = new Set<FarmEventHandler>();\nconst unfilteredRuntimeHandlers = new Set<FarmEventHandler>();\nlet observabilityState: FarmResolvedObservabilityConfig = {\n  logs: false,\n  handlers: [],\n  tracing: normalizeFarmTracingConfig(false),\n};\n\nexport function configureFarmObservability(config: FarmObservabilityUserConfig | undefined): void {\n  observabilityState = normalizeFarmObservabilityConfig(config);\n  configureFarmTracing(observabilityState.tracing);\n}\n\nexport function normalizeFarmObservabilityConfig(\n  config: FarmObservabilityUserConfig | undefined,\n): FarmResolvedObservabilityConfig {\n  if (config === undefined || config === false) {\n    return { logs: false, handlers: [], tracing: normalizeFarmTracingConfig(false) };\n  }\n\n  if (config === true) {\n    return { logs: true, handlers: [], tracing: normalizeFarmTracingConfig(false) };\n  }\n\n  const handlers = config.onEvent\n    ? Array.isArray(config.onEvent)\n      ? [...config.onEvent]\n      : [config.onEvent]\n    : [];\n\n  return {\n    logs: config.logs ?? false,\n    handlers,\n    events: config.events ? new Set(config.events) : undefined,\n    tracing: normalizeFarmTracingConfig(config.tracing),\n  };\n}\n\nexport function onFarmEvent(\n  handler: FarmEventHandler,\n  options: FarmEventSubscriptionOptions = {},\n): () => void {\n  const handlers = options.unfiltered ? unfilteredRuntimeHandlers : runtimeHandlers;\n  handlers.add(handler);\n  return () => {\n    handlers.delete(handler);\n  };\n}\n\nexport function resetFarmObservability(): void {\n  runtimeHandlers.clear();\n  unfilteredRuntimeHandlers.clear();\n  observabilityState = {\n    logs: false,\n    handlers: [],\n    tracing: normalizeFarmTracingConfig(false),\n  };\n  resetFarmTracing();\n}\n\nexport function emitFarmEvent(input: FarmEventInput): FarmEvent {\n  const event = {\n    timestamp: Date.now(),\n    level: inferFarmEventLevel(input.type),\n    ...input,\n  } as FarmEvent;\n\n  const traceContext = recordFarmEventTrace(event);\n  if (traceContext) {\n    event.traceId = traceContext.traceId;\n    event.spanId = traceContext.spanId;\n    event.traceSampled = traceContext.traceSampled;\n  }\n\n  notifyFarmEventHandlers(event, unfilteredRuntimeHandlers);\n\n  if (!shouldEmitFarmEvent(event)) return event;\n\n  if (observabilityState.logs) {\n    logFarmEvent(event);\n  }\n\n  notifyFarmEventHandlers(event, [...observabilityState.handlers, ...runtimeHandlers]);\n\n  return event;\n}\n\nfunction notifyFarmEventHandlers(event: FarmEvent, handlers: Iterable<FarmEventHandler>): void {\n  for (const handler of handlers) {\n    try {\n      Promise.resolve(handler(event)).catch((error) => {\n        console.warn(`[farm:observability] event handler failed: ${formatError(error)}`);\n      });\n    } catch (error) {\n      console.warn(`[farm:observability] event handler failed: ${formatError(error)}`);\n    }\n  }\n}\n\nexport async function runWithFarmRequestSpan<T>(\n  request: Request,\n  handler: () => T | Promise<T>,\n  options: FarmRequestSpanOptions = {},\n): Promise<T> {\n  const url = new URL(request.url);\n  const method = request.method || \"GET\";\n  return await _runWithFarmRequestSpan(request, handler, {\n    ...options,\n    onStart() {\n      emitFarmEvent({ type: \"request.start\", method, pathname: url.pathname });\n      options.onStart?.();\n    },\n    onComplete(status, durationMs) {\n      emitFarmEvent({\n        type: \"request.complete\",\n        method,\n        pathname: url.pathname,\n        status,\n        durationMs,\n      });\n      options.onComplete?.(status, durationMs);\n    },\n    onError(error, durationMs) {\n      emitFarmEvent({\n        type: \"request.error\",\n        method,\n        pathname: url.pathname,\n        durationMs,\n        error,\n      });\n      options.onError?.(error, durationMs);\n    },\n  });\n}\n\nexport { configureFarmTracing, getFarmTraceContext, normalizeFarmTracingConfig, runWithFarmSpan };\nexport type {\n  FarmRequestSpanOptions,\n  FarmResolvedTracingConfig,\n  FarmSpanOptions,\n  FarmTraceContext,\n  FarmTraceSpanKind,\n  FarmTracingConfig,\n  FarmTracingUserConfig,\n};\n\nfunction shouldEmitFarmEvent(event: FarmEvent): boolean {\n  if (\n    !observabilityState.logs &&\n    observabilityState.handlers.length === 0 &&\n    runtimeHandlers.size === 0\n  ) {\n    return false;\n  }\n\n  if (observabilityState.events && !observabilityState.events.has(event.type)) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction inferFarmEventLevel(type: FarmEventType): FarmEventLevel {\n  if (type === \"error\" || type.endsWith(\".error\") || type.endsWith(\".failed\")) {\n    return \"error\";\n  }\n  if (\n    type.endsWith(\".bypass\") ||\n    type.endsWith(\".invalidated\") ||\n    type.endsWith(\".stale\") ||\n    type.endsWith(\".notFound\")\n  ) {\n    return \"warn\";\n  }\n  if (\n    type.endsWith(\".hit\") ||\n    type.endsWith(\".miss\") ||\n    type.endsWith(\".start\") ||\n    type.endsWith(\".shellReady\")\n  ) {\n    return \"debug\";\n  }\n  return \"info\";\n}\n\nfunction logFarmEvent(event: FarmEvent): void {\n  const message = `[farm:${event.level}] ${event.type}${formatFarmEventDetails(event)}`;\n  switch (event.level) {\n    case \"error\":\n      console.error(message);\n      break;\n    case \"warn\":\n      console.warn(message);\n      break;\n    default:\n      console.log(message);\n      break;\n  }\n}\n\nfunction formatFarmEventDetails(event: FarmEvent): string {\n  const details: string[] = [];\n  const record = event as unknown as Record<string, unknown>;\n\n  for (const key of [\n    \"route\",\n    \"pathname\",\n    \"method\",\n    \"status\",\n    \"key\",\n    \"tag\",\n    \"path\",\n    \"reason\",\n    \"durationMs\",\n    \"integration\",\n    \"operation\",\n    \"plugin\",\n    \"hook\",\n    \"target\",\n    \"count\",\n  ]) {\n    const value = record[key];\n    if (value !== undefined) {\n      details.push(`${key}=${formatDetailValue(value)}`);\n    }\n  }\n\n  return details.length > 0 ? ` ${details.join(\" \")}` : \"\";\n}\n\nfunction formatDetailValue(value: unknown): string {\n  if (typeof value === \"string\") {\n    return value;\n  }\n  if (typeof value === \"number\" || typeof value === \"boolean\") {\n    return String(value);\n  }\n  try {\n    return JSON.stringify(value);\n  } catch {\n    return String(value);\n  }\n}\n\nfunction formatError(error: unknown): string {\n  return error instanceof Error ? error.message : String(error);\n}\n","const FARM_BASE_PATH = Symbol.for(\"farm.basePath\");\n\nfunction getFarmGlobalState(): Record<PropertyKey, unknown> {\n  return globalThis as unknown as Record<PropertyKey, unknown>;\n}\n\n/** @internal Configure the app-wide base path for framework link rendering. */\nexport function setFarmBasePath(basePath: string | undefined): void {\n  getFarmGlobalState()[FARM_BASE_PATH] = normalizeFarmBasePath(basePath);\n}\n\n/** @internal Read the app-wide base path used by framework links. */\nexport function getFarmBasePath(): string {\n  return (getFarmGlobalState()[FARM_BASE_PATH] as string | undefined) ?? \"\";\n}\n\nexport function applyFarmBasePath(href: string, basePath = getFarmBasePath()): string {\n  const normalizedBasePath = normalizeFarmBasePath(basePath);\n  if (!normalizedBasePath || !href.startsWith(\"/\") || href.startsWith(\"//\")) return href;\n  const canonicalHref = canonicalizeAppRelativeHref(href);\n  if (\n    canonicalHref === normalizedBasePath ||\n    canonicalHref.startsWith(`${normalizedBasePath}/`) ||\n    canonicalHref.startsWith(`${normalizedBasePath}?`) ||\n    canonicalHref.startsWith(`${normalizedBasePath}#`)\n  ) {\n    return canonicalHref;\n  }\n  return `${normalizedBasePath}${canonicalHref}`;\n}\n\nfunction canonicalizeAppRelativeHref(href: string): string {\n  const origin = \"http://farm.local\";\n  const resolved = new URL(href, origin);\n  if (resolved.origin !== origin) {\n    throw new Error(\"Farm app-relative href cannot change the URL origin.\");\n  }\n  return `${resolved.pathname}${resolved.search}${resolved.hash}`;\n}\n\nexport function stripFarmBasePath(pathname: string, basePath = getFarmBasePath()): string {\n  const normalizedBasePath = normalizeFarmBasePath(basePath);\n  if (!normalizedBasePath) return pathname || \"/\";\n  if (pathname === normalizedBasePath) return \"/\";\n  if (!pathname.startsWith(`${normalizedBasePath}/`)) return pathname || \"/\";\n  return pathname.slice(normalizedBasePath.length) || \"/\";\n}\n\nexport function normalizeFarmBasePath(basePath: string | undefined): string {\n  if (!basePath || basePath === \"/\") return \"\";\n\n  const hasUnstableCharacters = (candidate: string) =>\n    candidate.includes(\"\\\\\") ||\n    Array.from(candidate).some((character) => {\n      const code = character.charCodeAt(0);\n      return code <= 31 || (code >= 127 && code <= 159);\n    });\n\n  if (hasUnstableCharacters(basePath)) {\n    throw new Error(\"Farm basePath cannot contain backslashes or control characters.\");\n  }\n\n  const pathname = basePath.trim();\n  if (!pathname || pathname === \"/\") return \"\";\n  if (pathname.includes(\"?\") || pathname.includes(\"#\")) {\n    throw new Error(\"Farm basePath cannot contain a query string or hash.\");\n  }\n  if (pathname.startsWith(\"//\") || /^[a-z][a-z\\d+.-]*:\\/\\//i.test(pathname)) {\n    throw new Error('Farm basePath must be a pathname such as \"/docs\", not a URL.');\n  }\n\n  for (const segment of pathname.split(\"/\")) {\n    let decoded = segment;\n    try {\n      decoded = decodeURIComponent(segment);\n    } catch {\n      // Malformed escapes remain literal in URL pathnames and cannot be dot segments.\n    }\n    if (hasUnstableCharacters(decoded)) {\n      throw new Error(\"Farm basePath cannot contain backslashes or control characters.\");\n    }\n    if (decoded.includes(\"/\")) {\n      throw new Error(\"Farm basePath cannot contain percent-encoded path separators.\");\n    }\n    if (decoded === \".\" || decoded === \"..\") {\n      throw new Error('Farm basePath cannot contain \".\" or \"..\" path segments.');\n    }\n  }\n\n  return `/${pathname}`.replace(/\\/{2,}/g, \"/\").replace(/\\/+$/, \"\");\n}\n\n/** Normalize a configured application base path while preserving `/` for root. */\nexport function normalizeFarmConfigBasePath(basePath: string | undefined): string {\n  return normalizeFarmBasePath(basePath) || \"/\";\n}\n","import { applyFarmBasePath, stripFarmBasePath } from \"../base-path\";\nimport type { FarmI18nDirection, FarmI18nRouting, ResolvedFarmI18nConfig } from \"./types\";\n\nexport interface FarmLocalePathConfig {\n  locales: readonly string[];\n  defaultLocale: string;\n  routing: FarmI18nRouting;\n  basePath?: string;\n}\n\nexport interface FarmLocalePathMatch {\n  locale?: string;\n  pathname: string;\n  explicit: boolean;\n}\n\nconst RTL_LANGUAGES = new Set([\n  \"ar\",\n  \"arc\",\n  \"ckb\",\n  \"dv\",\n  \"fa\",\n  \"he\",\n  \"ku\",\n  \"nqo\",\n  \"ps\",\n  \"sd\",\n  \"syr\",\n  \"ug\",\n  \"ur\",\n  \"yi\",\n]);\n\nexport function resolveFarmLocalePath(\n  pathname: string,\n  config: FarmLocalePathConfig,\n): FarmLocalePathMatch {\n  const normalized = normalizePathname(stripFarmBasePath(pathname, config.basePath));\n  if (config.routing === \"none\") {\n    return { pathname: normalized, explicit: false };\n  }\n\n  const segments = normalized.split(\"/\").filter(Boolean);\n  const firstSegment = segments[0];\n  const locale = config.locales.find(\n    (candidate) => candidate.toLowerCase() === firstSegment?.toLowerCase(),\n  );\n  if (!locale) {\n    return { pathname: normalized, explicit: false };\n  }\n\n  const remaining = segments.slice(1);\n  return {\n    locale,\n    pathname: remaining.length > 0 ? `/${remaining.join(\"/\")}` : \"/\",\n    explicit: true,\n  };\n}\n\nexport function stripFarmLocaleFromPathname(\n  pathname: string,\n  config: FarmLocalePathConfig,\n): string {\n  return resolveFarmLocalePath(pathname, config).pathname;\n}\n\nexport function localizeFarmPathname(\n  pathname: string,\n  locale: string,\n  config: FarmLocalePathConfig,\n): string {\n  const internalPathname = resolveFarmLocalePath(pathname, config).pathname;\n  let localizedPathname = internalPathname;\n  if (config.routing === \"none\") {\n    return applyFarmBasePath(localizedPathname, config.basePath);\n  }\n  if (config.routing === \"prefix-except-default\" && locale === config.defaultLocale) {\n    return applyFarmBasePath(localizedPathname, config.basePath);\n  }\n  localizedPathname = internalPathname === \"/\" ? `/${locale}` : `/${locale}${internalPathname}`;\n  return applyFarmBasePath(localizedPathname, config.basePath);\n}\n\nexport function localizeFarmHref(\n  href: string,\n  locale: string,\n  config: FarmLocalePathConfig,\n): string {\n  if (!href.startsWith(\"/\") || href.startsWith(\"//\")) return href;\n  const url = new URL(href, \"http://farm.local\");\n  url.pathname = localizeFarmPathname(url.pathname, locale, config);\n  return `${url.pathname}${url.search}${url.hash}`;\n}\n\nexport function getFarmLocaleDirection(\n  locale: string,\n  direction: ResolvedFarmI18nConfig[\"direction\"] | undefined,\n): FarmI18nDirection {\n  const configured = direction?.[locale];\n  if (configured) return configured;\n  const language = locale.split(\"-\")[0]?.toLowerCase() || locale.toLowerCase();\n  return RTL_LANGUAGES.has(language) ? \"rtl\" : \"ltr\";\n}\n\nfunction normalizePathname(pathname: string): string {\n  const withLeadingSlash = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n  if (withLeadingSlash === \"/\") return \"/\";\n  return withLeadingSlash.replace(/\\/{2,}/g, \"/\").replace(/\\/$/, \"\") || \"/\";\n}\n","import picocolors from \"picocolors\";\n\n/**\n * Create colors for Farm's terminal output.\n *\n * Some interactive terminal hosts advertise a limited TERM value or set\n * NO_COLOR for captured subprocess output even though they render ANSI styles.\n * Prefer the actual stream type so the dev server remains colored in a TTY,\n * while redirected output stays plain.\n */\nexport function createCliColors(interactive = process.stdout.isTTY === true) {\n  return picocolors.createColors(interactive);\n}\n","export function appendMiddlewareRoutePath(routePath: string, directoryName: string): string {\n  if (directoryName.startsWith(\"(\") && directoryName.endsWith(\")\")) {\n    return routePath;\n  }\n\n  return routePath === \"/\" ? `/${directoryName}` : `${routePath}/${directoryName}`;\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","/**\n * Middleware helper utilities for pages\n */\n\nimport type { MiddlewareProps } from \"../types\";\n\n/**\n * Unwrap middleware data from PageProps\n *\n * @example\n * ```tsx\n * export default async function Page(props: PageProps) {\n *   const { user, stats } = await unwrapMiddleware(props.middleware, {\n *     user: null,\n *     stats: { views: 0, clicks: 0 }\n *   });\n *\n *   return <div>Welcome {user?.name}</div>;\n * }\n * ```\n */\nexport function unwrapMiddleware<T extends Record<string, any>>(\n  middleware: MiddlewareProps | undefined,\n  defaults?: Partial<T>,\n): Partial<T> {\n  if (!middleware) {\n    return (defaults || {}) as Partial<T>;\n  }\n\n  const result: any = { ...defaults };\n\n  for (const [key, value] of middleware.data) {\n    result[key] = value;\n  }\n\n  return result as Partial<T>;\n}\n\n/**\n * Get a single value from middleware with a default\n *\n * @example\n * ```tsx\n * export default async function Page(props: PageProps) {\n *   const user = await getMiddlewareValue(props.middleware, 'user', null);\n *   return <div>Welcome {user?.name || 'Guest'}</div>;\n * }\n * ```\n */\nexport function getFromMiddleware<T = any>(\n  middleware: MiddlewareProps | undefined,\n  key: string,\n  defaultValue?: T,\n): T | undefined {\n  if (!middleware) {\n    return defaultValue;\n  }\n\n  const value = middleware.data.get(key);\n  return value !== undefined ? value : defaultValue;\n}\n\n/**\n * Check if middleware data exists\n */\nexport function hasMiddlewareData(middleware: MiddlewareProps | undefined): boolean {\n  if (!middleware) return false;\n  return middleware.data.size > 0;\n}\n","import type {\n  CookieJar,\n  CookieOptions,\n  FarmMiddlewareConfig,\n  MiddlewareConfig,\n  MiddlewareContext,\n  MiddlewareFunction,\n  MiddlewareMatcher,\n  MiddlewareModule,\n  MiddlewareResult,\n} from \"./types\";\nimport { emitFarmEvent } from \"../observability\";\nimport { decodeRouteSegment } from \"../utils/decode\";\nimport { normalizeMiddlewareModule } from \"./module\";\nimport { stripFarmLocaleFromPathname } from \"../i18n/routing\";\nimport type { ResolvedFarmI18nConfig } from \"../i18n/types\";\nimport type { ResolvedFarmServerConfig } from \"../server-http\";\nimport {\n  parseMiddlewareCookieHeader,\n  serializeMiddlewareCookie as serializeCookie,\n  serializeMiddlewareCookieDeletion,\n} from \"./cookie-header\";\n\nexport interface ProductionMiddlewareModuleEntry {\n  path: string;\n  filePath?: string;\n  module: MiddlewareModule | Record<string, any>;\n}\n\nexport interface ProductionMiddlewareRunnerOptions {\n  config?: FarmMiddlewareConfig | null;\n  modules?: ProductionMiddlewareModuleEntry[];\n  i18n?: ResolvedFarmI18nConfig;\n  server?: Pick<ResolvedFarmServerConfig, \"trustProxy\">;\n}\n\nexport interface ProductionMiddlewareResult {\n  request: Request;\n  response: Response | null;\n  data: Map<string, any>;\n  context: Map<string, any>;\n  headers: Headers;\n  handled: boolean;\n}\n\ninterface ProductionMiddlewareEntry {\n  path: string;\n  filePath: string;\n  handlers: MiddlewareFunction[];\n  config?: MiddlewareConfig;\n  source: \"config\" | \"file\";\n}\n\ninterface WebMiddlewareContextState {\n  ctx: MiddlewareContext;\n  headers: WebResponseHeaderMap;\n  getRequest(): Request;\n  getResponse(): Response | null;\n}\n\ninterface WebResponseShimState {\n  response: Record<string, any>;\n  getResponse(method: string): Response | null;\n}\n\nconst FARM_SET_COOKIE_HEADERS = Symbol(\"farm.setCookieHeaders\");\n\ntype InternalMiddlewareParent = MiddlewareContext[\"parent\"] & {\n  [FARM_SET_COOKIE_HEADERS]?: string[];\n};\n\nclass WebResponseHeaderMap extends Map<string, string> {\n  private setCookies: string[] = [];\n\n  override set(key: string, value: string): this {\n    if (key.toLowerCase() === \"set-cookie\") {\n      this.setCookies = [value];\n      super.set(\"Set-Cookie\", value);\n      return this;\n    }\n    return super.set(key, value);\n  }\n\n  override delete(key: string): boolean {\n    if (key.toLowerCase() === \"set-cookie\") {\n      this.setCookies = [];\n      return super.delete(\"Set-Cookie\") || super.delete(\"set-cookie\");\n    }\n    return super.delete(key);\n  }\n\n  override clear(): void {\n    this.setCookies = [];\n    super.clear();\n  }\n\n  appendSetCookie(value: string): void {\n    this.setCookies.push(value);\n    super.set(\"Set-Cookie\", value);\n  }\n\n  replaceSetCookies(values: readonly string[]): void {\n    this.setCookies = [...values];\n    super.delete(\"Set-Cookie\");\n    super.delete(\"set-cookie\");\n    if (this.setCookies.length > 0) {\n      super.set(\"Set-Cookie\", this.setCookies[this.setCookies.length - 1]);\n    }\n  }\n\n  getSetCookies(): readonly string[] {\n    return this.setCookies;\n  }\n}\n\nclass WebCookieJar implements CookieJar {\n  private cookies: Record<string, string>;\n\n  constructor(\n    request: Request,\n    private headers: WebResponseHeaderMap,\n  ) {\n    this.cookies = parseMiddlewareCookieHeader(request.headers.get(\"cookie\"));\n  }\n\n  get(name: string): string | undefined {\n    return this.cookies[name];\n  }\n\n  set(name: string, value: string, options: CookieOptions = {}): void {\n    this.cookies[name] = value;\n    const cookieString = serializeCookie(name, value, options);\n    this.headers.appendSetCookie(cookieString);\n  }\n\n  delete(name: string, options: CookieOptions = {}): void {\n    delete this.cookies[name];\n    // Path and Domain must match the cookie that was set, or the tombstone\n    // addresses a different cookie and the original survives.\n    this.headers.appendSetCookie(serializeMiddlewareCookieDeletion(name, options));\n  }\n\n  getAll(): Record<string, string> {\n    return { ...this.cookies };\n  }\n}\n\nfunction mapToHeaders(map: WebResponseHeaderMap): Headers {\n  const headers = new Headers();\n  for (const [key, value] of map) {\n    if (key.toLowerCase() === \"set-cookie\") continue;\n    headers.set(key, value);\n  }\n  for (const cookie of map.getSetCookies()) {\n    headers.append(\"Set-Cookie\", cookie);\n  }\n  return headers;\n}\n\nfunction headersToRecord(headers: Map<string, string>): Record<string, string> {\n  return Object.fromEntries(headers);\n}\n\nfunction isMiddlewareResponse(value: unknown): value is Response {\n  return value instanceof Response;\n}\n\nfunction findHeaderName(headers: WebResponseHeaderMap, name: string): string | undefined {\n  const normalizedName = name.toLowerCase();\n  return [...headers.keys()].find((key) => key.toLowerCase() === normalizedName);\n}\n\nfunction createResponseShim(headers: WebResponseHeaderMap): WebResponseShimState {\n  const bodyChunks: Uint8Array[] = [];\n  const encoder = new TextEncoder();\n\n  const response = {\n    headersSent: false,\n    writableEnded: false,\n    statusCode: 200,\n    statusMessage: \"\",\n    setHeader(name: string, value: string | number | readonly string[]) {\n      const existingName = findHeaderName(headers, name);\n      if (existingName) headers.delete(existingName);\n      if (name.toLowerCase() === \"set-cookie\") {\n        headers.replaceSetCookies(Array.isArray(value) ? value.map(String) : [String(value)]);\n      } else {\n        headers.set(name, Array.isArray(value) ? value.join(\", \") : String(value));\n      }\n      return this;\n    },\n    getHeader(name: string) {\n      if (name.toLowerCase() === \"set-cookie\") {\n        const cookies = headers.getSetCookies();\n        return cookies.length > 0 ? [...cookies] : undefined;\n      }\n      const existingName = findHeaderName(headers, name);\n      return existingName ? headers.get(existingName) : undefined;\n    },\n    hasHeader(name: string) {\n      return name.toLowerCase() === \"set-cookie\"\n        ? headers.getSetCookies().length > 0\n        : findHeaderName(headers, name) !== undefined;\n    },\n    getHeaderNames() {\n      return [...headers.keys()].map((name) => name.toLowerCase());\n    },\n    getHeaders() {\n      return Object.fromEntries(\n        [...headers.keys()].map((name) => [name.toLowerCase(), this.getHeader(name)]),\n      );\n    },\n    removeHeader(name: string) {\n      const existingName = findHeaderName(headers, name);\n      if (existingName) headers.delete(existingName);\n    },\n    appendHeader(name: string, value: string | readonly string[]) {\n      const values = Array.isArray(value) ? value.map(String) : [String(value)];\n      if (name.toLowerCase() === \"set-cookie\") {\n        for (const item of values) headers.appendSetCookie(item);\n        return this;\n      }\n      const existing = this.getHeader(name);\n      return this.setHeader(name, existing ? `${String(existing)}, ${values.join(\", \")}` : values);\n    },\n    writeHead(\n      status: number,\n      statusMessageOrHeaders?: string | Record<string, string | number | readonly string[]>,\n      responseHeaders?: Record<string, string | number | readonly string[]>,\n    ) {\n      this.statusCode = status;\n      const nextHeaders =\n        typeof statusMessageOrHeaders === \"string\" ? responseHeaders : statusMessageOrHeaders;\n      if (typeof statusMessageOrHeaders === \"string\") {\n        this.statusMessage = statusMessageOrHeaders;\n      }\n      if (nextHeaders) {\n        for (const [key, value] of Object.entries(nextHeaders)) {\n          this.setHeader(key, value);\n        }\n      }\n      this.headersSent = true;\n      return this;\n    },\n    flushHeaders() {\n      this.headersSent = true;\n    },\n    write(\n      chunk: string | Uint8Array,\n      encodingOrCallback?: string | (() => void),\n      callback?: () => void,\n    ) {\n      bodyChunks.push(typeof chunk === \"string\" ? encoder.encode(chunk) : new Uint8Array(chunk));\n      this.headersSent = true;\n      const done = typeof encodingOrCallback === \"function\" ? encodingOrCallback : callback;\n      done?.();\n      return true;\n    },\n    end(\n      chunk?: string | Uint8Array | (() => void),\n      encodingOrCallback?: string | (() => void),\n      callback?: () => void,\n    ) {\n      if (typeof chunk === \"string\" || chunk instanceof Uint8Array) {\n        bodyChunks.push(typeof chunk === \"string\" ? encoder.encode(chunk) : new Uint8Array(chunk));\n      }\n      this.headersSent = true;\n      this.writableEnded = true;\n      const done =\n        typeof chunk === \"function\"\n          ? chunk\n          : typeof encodingOrCallback === \"function\"\n            ? encodingOrCallback\n            : callback;\n      done?.();\n      return this;\n    },\n  };\n\n  return {\n    response,\n    getResponse(method: string) {\n      if (!response.headersSent && !response.writableEnded) return null;\n\n      const bodyLength = bodyChunks.reduce((total, chunk) => total + chunk.byteLength, 0);\n      const body = new Uint8Array(bodyLength);\n      let offset = 0;\n      for (const chunk of bodyChunks) {\n        body.set(chunk, offset);\n        offset += chunk.byteLength;\n      }\n\n      const bodyAllowed =\n        method.toUpperCase() !== \"HEAD\" &&\n        response.statusCode !== 204 &&\n        response.statusCode !== 205 &&\n        response.statusCode !== 304;\n      return new Response(bodyAllowed && bodyLength > 0 ? body : null, {\n        status: response.statusCode,\n        statusText: response.statusMessage || undefined,\n        headers: mapToHeaders(headers),\n      });\n    },\n  };\n}\n\nfunction withNodeRequestShape(request: Request, trustProxy: boolean): Request {\n  const requestWithShape = request as Request & {\n    socket?: { remoteAddress?: string };\n  };\n\n  if (!requestWithShape.socket) {\n    const forwardedFor = trustProxy\n      ? request.headers.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim()\n      : undefined;\n    try {\n      requestWithShape.socket = {\n        remoteAddress: forwardedFor || \"127.0.0.1\",\n      };\n    } catch {\n      // Some Request implementations may not be extensible.\n    }\n  }\n\n  return requestWithShape;\n}\n\nfunction createHandledResponse(\n  body: BodyInit | null,\n  init: ResponseInit,\n  headers: WebResponseHeaderMap,\n): Response {\n  const responseHeaders = new Headers();\n  for (const [key, value] of headers) {\n    if (key.toLowerCase() === \"set-cookie\") continue;\n    responseHeaders.set(key, value);\n  }\n  for (const [key, value] of new Headers(init.headers)) {\n    responseHeaders.set(key, value);\n  }\n  for (const cookie of headers.getSetCookies()) {\n    responseHeaders.append(\"Set-Cookie\", cookie);\n  }\n  return new Response(body, { ...init, headers: responseHeaders });\n}\n\nfunction createWebMiddlewareContext(\n  request: Request,\n  parent?: MiddlewareContext[\"parent\"],\n  trustProxy = false,\n): WebMiddlewareContextState {\n  let currentRequest = withNodeRequestShape(request, trustProxy);\n  let handledResponse: Response | null = null;\n  const url = new URL(currentRequest.url);\n  const data = parent?.data ? new Map(parent.data) : new Map<string, any>();\n  const locals = parent?.locals ? new Map(parent.locals) : new Map<string, any>();\n  const headers = new WebResponseHeaderMap();\n\n  if (parent?.headers) {\n    for (const [key, value] of Object.entries(parent.headers)) {\n      if (key.toLowerCase() === \"set-cookie\") continue;\n      headers.set(key, value);\n    }\n  }\n  const parentCookies = (parent as InternalMiddlewareParent | undefined)?.[FARM_SET_COOKIE_HEADERS];\n  if (parentCookies) headers.replaceSetCookies(parentCookies);\n  const responseShim = createResponseShim(headers);\n\n  const ctx = {\n    request: currentRequest as any,\n    response: responseShim.response as any,\n    url,\n    pathname: url.pathname,\n    searchParams: url.searchParams,\n    method: currentRequest.method || \"GET\",\n    params: {},\n    route: url.pathname,\n    parent,\n    vite: {\n      isDev: false,\n      hmr: false,\n    },\n    data,\n    locals,\n    headers,\n    cookies: new WebCookieJar(currentRequest, headers),\n    _handled: false as boolean,\n    _redirectUrl: undefined as string | undefined,\n    _rewriteUrl: undefined as string | undefined,\n\n    redirect(redirectUrl: string, status = 307): void {\n      ctx._redirectUrl = redirectUrl;\n      ctx._handled = true;\n      handledResponse = createHandledResponse(\n        `Redirecting to ${redirectUrl}`,\n        {\n          status,\n          headers: {\n            Location: redirectUrl,\n            \"Content-Type\": \"text/plain\",\n          },\n        },\n        headers,\n      );\n    },\n\n    rewrite(rewriteUrl: string): void {\n      ctx._rewriteUrl = rewriteUrl;\n      const nextUrl = new URL(rewriteUrl, currentRequest.url);\n      currentRequest = withNodeRequestShape(new Request(nextUrl, currentRequest), trustProxy);\n      ctx.request = currentRequest as any;\n      ctx.url = nextUrl;\n      ctx.pathname = nextUrl.pathname;\n      ctx.searchParams = nextUrl.searchParams;\n      ctx.route = nextUrl.pathname;\n    },\n\n    json(jsonData: any, status = 200): void {\n      ctx._handled = true;\n      handledResponse = createHandledResponse(\n        JSON.stringify(jsonData),\n        {\n          status,\n          headers: {\n            \"Content-Type\": \"application/json\",\n          },\n        },\n        headers,\n      );\n    },\n\n    text(content: string, status = 200): void {\n      ctx._handled = true;\n      handledResponse = createHandledResponse(\n        content,\n        {\n          status,\n          headers: {\n            \"Content-Type\": \"text/plain\",\n          },\n        },\n        headers,\n      );\n    },\n\n    html(content: string, status = 200): void {\n      ctx._handled = true;\n      handledResponse = createHandledResponse(\n        content,\n        {\n          status,\n          headers: {\n            \"Content-Type\": \"text/html\",\n          },\n        },\n        headers,\n      );\n    },\n  } satisfies MiddlewareContext;\n\n  return {\n    ctx,\n    headers,\n    getRequest: () => currentRequest,\n    getResponse: () => handledResponse || responseShim.getResponse(currentRequest.method),\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    // Strip a trailing slash before the wildcard so `/admin/(.*)` matches the\n    // `/admin` subtree like `/admin/**` does. Without this the prefix keeps its\n    // slash and the check becomes startsWith(\"/admin//\"), which no path\n    // satisfies, so the matcher silently matches nothing — an auth gate written\n    // that way would never run.\n    const prefix = pattern.slice(0, -4).replace(/\\/$/, \"\");\n    return { matched: pathname === prefix || pathname.startsWith(`${prefix}/`) };\n  }\n\n  const { regex, params } = compilePathPattern(pattern);\n  const match = regex.exec(pathname);\n  if (!match) {\n    return { matched: false };\n  }\n\n  const values: Record<string, string> = {};\n  params.forEach((param, index) => {\n    values[param] = decodeRouteSegment(match[index + 1] || \"\");\n  });\n\n  return {\n    matched: true,\n    params: Object.keys(values).length > 0 ? values : undefined,\n  };\n}\n\n/**\n * Decide whether a middleware entry's `export const config` applies to a path.\n *\n * Exported so the standalone dev plugin matches exactly what the production\n * runner does instead of maintaining a parallel implementation.\n */\nexport function matchesMiddlewareConfig(\n  pathname: string,\n  config: MiddlewareConfig,\n  ctx: MiddlewareContext,\n): { matched: boolean; params?: Record<string, string> } {\n  if (config.exclude) {\n    for (const pattern of config.exclude) {\n      if (matchPattern(pattern, pathname).matched) {\n        return { matched: false };\n      }\n    }\n  }\n\n  if (config.matcher) {\n    for (const matcher of toMatcherList(config.matcher)) {\n      if (typeof matcher === \"string\" || matcher instanceof RegExp) {\n        const result = matchPattern(matcher, pathname);\n        if (result.matched) {\n          return result;\n        }\n      } else if (typeof matcher === \"function\" && matcher(ctx)) {\n        return { matched: true };\n      }\n    }\n    return { matched: false };\n  }\n\n  return { matched: true };\n}\n\nfunction matchRoutePath(\n  pathname: string,\n  middlewarePath: string,\n): { matched: boolean; params?: Record<string, string> } {\n  if (middlewarePath === \"/\") return { matched: true };\n\n  const exactMatch = matchPattern(middlewarePath, pathname);\n  if (exactMatch.matched) {\n    return exactMatch;\n  }\n\n  const nestedMatch = matchPattern(`${middlewarePath}/:__farmRest*`, pathname);\n  if (!nestedMatch.matched) {\n    return { matched: false };\n  }\n\n  const params = { ...nestedMatch.params };\n  delete params.__farmRest;\n  return {\n    matched: true,\n    params: Object.keys(params).length > 0 ? params : undefined,\n  };\n}\n\nfunction getConfigHandlers(\n  entry: MiddlewareConfig & {\n    handler?: MiddlewareFunction;\n    handlers?: MiddlewareFunction[];\n  },\n): MiddlewareFunction[] {\n  const handlers: MiddlewareFunction[] = [];\n  if (\"handler\" in entry && typeof entry.handler === \"function\") {\n    handlers.push(entry.handler);\n  }\n  if (\"handlers\" in entry && Array.isArray(entry.handlers)) {\n    handlers.push(...entry.handlers.filter((handler) => typeof handler === \"function\"));\n  }\n  return handlers;\n}\n\nfunction toMiddlewareConfig(\n  entry: MiddlewareConfig & {\n    handler?: MiddlewareFunction;\n    handlers?: MiddlewareFunction[];\n  },\n): MiddlewareConfig {\n  const { matcher, exclude, runtime } = entry;\n  return { matcher, exclude, runtime };\n}\n\nfunction normalizeConfigMiddleware(config?: FarmMiddlewareConfig | null): {\n  entries: ProductionMiddlewareEntry[];\n  globalConfig?: MiddlewareConfig;\n} {\n  const entries: ProductionMiddlewareEntry[] = [];\n  let globalConfig: MiddlewareConfig | undefined;\n\n  if (!config) {\n    return { entries, globalConfig };\n  }\n\n  const configEntries = Array.isArray(config) ? config : [config];\n  for (const [index, entry] of configEntries.entries()) {\n    const handlers = getConfigHandlers(entry);\n    const middlewareConfig = toMiddlewareConfig(entry);\n\n    if (handlers.length === 0) {\n      globalConfig = middlewareConfig;\n      continue;\n    }\n\n    entries.push({\n      path: \"/\",\n      filePath: `farm.config.ts#middleware-${index}`,\n      handlers,\n      config: middlewareConfig,\n      source: \"config\",\n    });\n  }\n\n  return { entries, globalConfig };\n}\n\nfunction normalizeFileMiddleware(\n  modules: ProductionMiddlewareModuleEntry[] = [],\n): ProductionMiddlewareEntry[] {\n  const entries: ProductionMiddlewareEntry[] = [];\n\n  for (const moduleEntry of modules) {\n    const normalized = normalizeMiddlewareModule(moduleEntry.module, moduleEntry.path);\n    if (!normalized) {\n      continue;\n    }\n\n    entries.push({\n      path: moduleEntry.path,\n      filePath: moduleEntry.filePath || moduleEntry.path,\n      handlers: normalized.handlers,\n      config: normalized.config,\n      source: \"file\",\n    });\n  }\n\n  return entries;\n}\n\nasync function executeHandlers(\n  handlers: MiddlewareFunction[],\n  ctx: MiddlewareContext,\n): Promise<Response | undefined> {\n  let handlerIndex = 0;\n  let returnedResponse: Response | undefined;\n  const executeNext = async (): Promise<MiddlewareResult> => {\n    if (handlerIndex < handlers.length) {\n      const handler = handlers[handlerIndex++];\n      const result = await handler(ctx, executeNext);\n      if (isMiddlewareResponse(result)) {\n        returnedResponse = result;\n        return result;\n      }\n    }\n    return returnedResponse;\n  };\n\n  const result = await executeNext();\n  return isMiddlewareResponse(result) ? result : returnedResponse;\n}\n\nfunction emptyResult(request: Request): ProductionMiddlewareResult {\n  return {\n    request,\n    response: null,\n    data: new Map(),\n    context: new Map(),\n    headers: new Headers(),\n    handled: false,\n  };\n}\n\nexport function createProductionMiddlewareRunner(options: ProductionMiddlewareRunnerOptions = {}) {\n  const configMiddleware = normalizeConfigMiddleware(options.config);\n  const fileMiddleware = normalizeFileMiddleware(options.modules);\n  const entries = [...configMiddleware.entries, ...fileMiddleware];\n  const globalConfig = configMiddleware.globalConfig;\n\n  return async function runProductionMiddleware(\n    request: Request,\n  ): Promise<ProductionMiddlewareResult> {\n    if (!globalConfig && entries.length === 0) {\n      return emptyResult(request);\n    }\n\n    let contextState = createWebMiddlewareContext(\n      request,\n      undefined,\n      options.server?.trustProxy === true,\n    );\n    let ctx = contextState.ctx;\n    let currentRequest = contextState.getRequest();\n    const initialPathname = options.i18n?.enabled\n      ? stripFarmLocaleFromPathname(ctx.pathname, options.i18n)\n      : ctx.pathname;\n    let parentData: MiddlewareContext[\"parent\"] | undefined;\n\n    if (globalConfig) {\n      const globalMatch = matchesMiddlewareConfig(initialPathname, globalConfig, ctx);\n      if (!globalMatch.matched) {\n        return emptyResult(request);\n      }\n      if (globalMatch.params) {\n        ctx.params = { ...ctx.params, ...globalMatch.params };\n      }\n    }\n\n    const applicable = entries\n      .map((entry) => ({\n        entry,\n        routeMatch:\n          entry.source === \"config\"\n            ? { matched: true }\n            : matchRoutePath(initialPathname, entry.path),\n      }))\n      .filter((candidate) => candidate.routeMatch.matched);\n\n    if (applicable.length === 0) {\n      return {\n        request: currentRequest,\n        response: null,\n        data: new Map(ctx.data),\n        context: new Map(ctx.locals),\n        headers: mapToHeaders(contextState.headers),\n        handled: false,\n      };\n    }\n\n    for (const candidate of applicable) {\n      const { entry, routeMatch } = candidate;\n      const configMatch = entry.config\n        ? matchesMiddlewareConfig(initialPathname, entry.config, ctx)\n        : { matched: true };\n      if (!configMatch.matched) {\n        continue;\n      }\n\n      if (parentData) {\n        contextState = createWebMiddlewareContext(\n          currentRequest,\n          parentData,\n          options.server?.trustProxy === true,\n        );\n        ctx = contextState.ctx;\n      }\n\n      if (routeMatch.params) {\n        ctx.params = { ...ctx.params, ...routeMatch.params };\n      }\n      if (configMatch.params) {\n        ctx.params = { ...ctx.params, ...configMatch.params };\n      }\n\n      const middlewareStartTime = Date.now();\n      const middlewareEvent = {\n        route: entry.path,\n        pathname: initialPathname,\n        name: entry.filePath,\n      };\n      emitFarmEvent({ type: \"middleware.start\", ...middlewareEvent });\n\n      try {\n        const returnedResponse = await executeHandlers(entry.handlers, ctx);\n        currentRequest = contextState.getRequest();\n\n        if (returnedResponse) {\n          const response = applyProductionMiddlewareHeaders(\n            returnedResponse,\n            mapToHeaders(contextState.headers),\n          );\n          emitFarmEvent({\n            type: \"middleware.shortCircuit\",\n            ...middlewareEvent,\n            status: response.status,\n          });\n          return {\n            request: currentRequest,\n            response,\n            data: new Map(ctx.data),\n            context: new Map(ctx.locals),\n            headers: mapToHeaders(contextState.headers),\n            handled: true,\n          };\n        }\n\n        if (ctx._handled || ctx.response.headersSent || ctx.response.writableEnded) {\n          const response = contextState.getResponse() || new Response(null);\n          emitFarmEvent({\n            type: \"middleware.shortCircuit\",\n            ...middlewareEvent,\n            status: response.status,\n          });\n          return {\n            request: currentRequest,\n            response,\n            data: new Map(ctx.data),\n            context: new Map(ctx.locals),\n            headers: mapToHeaders(contextState.headers),\n            handled: true,\n          };\n        }\n\n        emitFarmEvent({\n          type: \"middleware.complete\",\n          ...middlewareEvent,\n          durationMs: Date.now() - middlewareStartTime,\n        });\n      } catch (error) {\n        emitFarmEvent({\n          type: \"middleware.error\",\n          ...middlewareEvent,\n          error,\n        });\n        throw error;\n      }\n\n      parentData = {\n        data: new Map(ctx.data),\n        locals: new Map(ctx.locals),\n        headers: headersToRecord(contextState.headers),\n        [FARM_SET_COOKIE_HEADERS]: [...contextState.headers.getSetCookies()],\n      } as InternalMiddlewareParent;\n    }\n\n    return {\n      request: currentRequest,\n      response: null,\n      data: new Map(ctx.data),\n      context: new Map(ctx.locals),\n      headers: mapToHeaders(contextState.headers),\n      handled: false,\n    };\n  };\n}\n\nexport function applyProductionMiddlewareHeaders(\n  response: Response,\n  middlewareHeaders?: Headers | null,\n): Response {\n  if (!middlewareHeaders || Array.from(middlewareHeaders.keys()).length === 0) {\n    return response;\n  }\n\n  const headers = new Headers(response.headers);\n  const getSetCookie = (middlewareHeaders as Headers & { getSetCookie?: () => string[] })\n    .getSetCookie;\n  const setCookies = getSetCookie\n    ? getSetCookie.call(middlewareHeaders)\n    : middlewareHeaders.get(\"set-cookie\")\n      ? [middlewareHeaders.get(\"set-cookie\")!]\n      : [];\n  for (const [key, value] of middlewareHeaders) {\n    if (key.toLowerCase() === \"set-cookie\") continue;\n    // A returned Response's headers are authoritative and preserved (matching\n    // the dev runtime, where the Response is applied after ctx.headers). ctx\n    // headers only add keys the Response did not already set.\n    if (headers.has(key)) continue;\n    headers.set(key, value);\n  }\n  for (const cookie of setCookies) {\n    headers.append(\"Set-Cookie\", cookie);\n  }\n\n  return new Response(response.body, {\n    status: response.status,\n    statusText: response.statusText,\n    headers,\n  });\n}\n","/**\n * Standalone Vite middleware support used by Farm's RSC and API plugins.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { Plugin, ViteDevServer } from \"vite\";\nimport { MiddlewareManager } from \"./manager\";\n\nexport interface FarmMiddlewarePluginOptions {\n  /** Source directory (default: `src`). */\n  srcDir?: string;\n  /** Enable debug logging. */\n  debug?: boolean;\n}\n\nfunction getMiddlewareAppDirectory(root: string, srcDir: string): string {\n  const sourceDirectory = path.join(root, srcDir);\n  const appDirectory = path.join(sourceDirectory, \"app\");\n  return fs.existsSync(appDirectory) ? appDirectory : sourceDirectory;\n}\n\nexport function farmMiddlewarePlugin(options: FarmMiddlewarePluginOptions = {}): Plugin {\n  const srcDir = options.srcDir ?? \"src\";\n  let manager: MiddlewareManager | null = null;\n  let discoveryComplete = false;\n  let discoveryPromise: Promise<void> | null = null;\n\n  const discover = async (server: ViteDevServer): Promise<void> => {\n    manager = new MiddlewareManager(getMiddlewareAppDirectory(server.config.root, srcDir), server);\n    await manager.discover();\n    discoveryComplete = true;\n  };\n\n  return {\n    name: \"@farm.js/core:middleware\",\n    enforce: \"pre\",\n\n    configureServer(server) {\n      discoveryPromise = discover(server);\n      void discoveryPromise.catch((error) => {\n        console.error(\"[FARM] Middleware discovery error:\", error);\n      });\n\n      const execute = async (\n        req: IncomingMessage,\n        res: ServerResponse,\n        _pathname?: string,\n        sharedData?: Map<string, any>,\n      ): Promise<boolean> => {\n        if (discoveryPromise) {\n          await discoveryPromise;\n        }\n\n        if (!manager) {\n          return false;\n        }\n\n        const handled = await manager.execute(req, res);\n        const middlewareData = (req as any).__FARM_MIDDLEWARE_DATA__;\n        if (sharedData && middlewareData instanceof Map) {\n          for (const [key, value] of middlewareData) {\n            sharedData.set(key, value);\n          }\n        }\n        return handled;\n      };\n\n      (server as any).__farmMiddleware__ = {\n        execute,\n        getMiddlewares: () => manager?.getMiddlewares() ?? [],\n        isReady: () => discoveryComplete,\n        waitForDiscovery: () => discoveryPromise,\n      };\n    },\n\n    async handleHotUpdate({ file, server, modules }) {\n      if (!/^middleware\\.[tj]sx?$/.test(path.basename(file))) {\n        return;\n      }\n\n      for (const module of modules) {\n        server.moduleGraph.invalidateModule(module);\n      }\n\n      await manager?.reload();\n      server.ws.send({ type: \"full-reload\", path: \"*\" });\n      return [];\n    },\n  };\n}\n"],"mappings":"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","names":["next","path","context","module","picocolors","middleware","module","result","match","context","middleware","isMiddlewareResponse","matchPattern","match","result","path","fs","module"]}