{"version":3,"sources":["../src/middleware/production-runtime.ts"],"sourcesContent":["import type {\n  CookieJar,\n  CookieOptions,\n  FarmMiddlewareConfig,\n  MiddlewareConfig,\n  MiddlewareContext,\n  MiddlewareFunction,\n  MiddlewareMatcher,\n  MiddlewareModule,\n  MiddlewareResult,\n} from \"./types\";\nimport { emitFarmEvent } from \"../observability\";\nimport { decodeRouteSegment } from \"../utils/decode\";\nimport { normalizeMiddlewareModule } from \"./module\";\nimport { stripFarmLocaleFromPathname } from \"../i18n/routing\";\nimport type { ResolvedFarmI18nConfig } from \"../i18n/types\";\nimport type { ResolvedFarmServerConfig } from \"../server-http\";\nimport {\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"],"mappings":"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","names":["match","result"]}