{"version":3,"sources":["../src/plugins/redirects.ts","../src/plugins/headers.ts","../src/plugins/env.ts","../src/plugins/compression.ts","../src/plugins/logger.ts"],"sourcesContent":["import type { FarmPlugin, FarmPluginContext } from \"../plugin\";\nimport type { RedirectConfig } from \"../config\";\nimport type { FarmRequest, FarmResponse } from \"../types\";\nimport type { ResolvedFarmI18nConfig } from \"../i18n/types\";\nimport { isFarmRedirectStatus } from \"../navigation-errors\";\nimport { appendFarmRedirectQuery } from \"../redirect-query\";\nimport { resolveFarmRequestURL } from \"../server/request\";\nimport {\n  compileConfigRoutePattern,\n  interpolateConfigRouteDestination,\n  localizeConfigRouteDestination,\n  resolveConfigRoutePathname,\n} from \"./route-pattern\";\n\nexport function createRedirectsPlugin(\n  redirects: RedirectConfig[],\n  {\n    beforeRequest: overrideBeforeRequest,\n    afterResponse: overrideAfterResponse,\n    i18n,\n  }: {\n    beforeRequest?: (\n      req: FarmRequest,\n      res: FarmResponse,\n      context: FarmPluginContext,\n    ) => void | Promise<void>;\n    afterResponse?: (\n      req: FarmRequest,\n      res: FarmResponse,\n      context: FarmPluginContext,\n    ) => void | Promise<void>;\n    i18n?: ResolvedFarmI18nConfig;\n  } = {},\n): FarmPlugin {\n  for (const redirect of redirects) {\n    if (redirect.statusCode !== undefined && !isFarmRedirectStatus(redirect.statusCode)) {\n      throw new RangeError(\n        `Redirect \"${redirect.source}\" statusCode must be one of 301, 302, 303, 307, or 308.`,\n      );\n    }\n  }\n  const compiledRedirects = redirects.map((redirect) => ({\n    redirect,\n    pattern: compileConfigRoutePattern(redirect.source),\n  }));\n\n  return {\n    name: \"farm:redirects\",\n    enforce: \"pre\",\n    async beforeRequest(req, res, context) {\n      if (overrideBeforeRequest) {\n        await overrideBeforeRequest(req, res, context);\n      }\n      const url = resolveFarmRequestURL(req);\n      const routePath = resolveConfigRoutePathname(url.pathname, i18n);\n      const pathname = routePath.pathname;\n\n      for (const { redirect, pattern } of compiledRedirects) {\n        const match = pathname.match(pattern.regex);\n        if (match) {\n          const localizedDestination = localizeConfigRouteDestination(\n            interpolateConfigRouteDestination(redirect.destination, match, pattern.tokens),\n            routePath.locale,\n            i18n,\n          );\n          const destination = appendFarmRedirectQuery(localizedDestination, url.search);\n\n          const statusCode = redirect.statusCode ?? (redirect.permanent ? 308 : 307);\n\n          res.writeHead(statusCode, {\n            Location: destination,\n          });\n          res.end();\n          return;\n        }\n      }\n    },\n\n    async afterResponse(req, res, context) {\n      if (overrideAfterResponse) {\n        await overrideAfterResponse(req, res, context);\n      }\n    },\n  };\n}\n","import type { FarmPlugin, FarmPluginContext } from \"../plugin\";\nimport type { HeaderConfig } from \"../config\";\nimport type { FarmRequest, FarmResponse } from \"../types\";\nimport type { ResolvedFarmI18nConfig } from \"../i18n/types\";\nimport { resolveFarmRequestURL } from \"../server/request\";\nimport { compileConfigRoutePattern, resolveConfigRoutePathname } from \"./route-pattern\";\n\nconst FARM_CONFIG_HEADERS_FINALIZER = Symbol.for(\"farm.configHeadersFinalizer\");\n\nfunction appendConfiguredLinkHeader(res: FarmResponse, value: string): void {\n  const current = res.getHeader(\"Link\");\n  if (current === undefined) {\n    res.setHeader(\"Link\", value);\n    return;\n  }\n\n  const currentValue = Array.isArray(current) ? current.join(\", \") : String(current);\n  if (currentValue !== value && !currentValue.endsWith(`, ${value}`)) {\n    res.setHeader(\"Link\", `${currentValue}, ${value}`);\n  }\n}\n\nfunction appendConfiguredSetCookieHeader(res: FarmResponse, value: string): void {\n  const current = res.getHeader(\"Set-Cookie\");\n  if (current === undefined) {\n    res.setHeader(\"Set-Cookie\", value);\n    return;\n  }\n\n  const values = (Array.isArray(current) ? current : [current]).map(String);\n  if (!values.includes(value)) {\n    res.setHeader(\"Set-Cookie\", [...values, value]);\n  }\n}\n\nfunction applyResponseHeaders(\n  res: FarmResponse,\n  matchedHeaders: readonly HeaderConfig[\"headers\"][],\n): void {\n  for (const headers of matchedHeaders) {\n    for (const header of headers) {\n      const key = header.key.toLowerCase();\n      if (key === \"link\") {\n        appendConfiguredLinkHeader(res, header.value);\n      } else if (key === \"set-cookie\") {\n        appendConfiguredSetCookieHeader(res, header.value);\n      } else {\n        res.setHeader(header.key, header.value);\n      }\n    }\n  }\n}\n\nfunction applyWriteHeadHeaders(res: FarmResponse, headers: unknown): void {\n  if (Array.isArray(headers)) {\n    let setCookieWritten = false;\n    for (let index = 0; index + 1 < headers.length; index += 2) {\n      const key = String(headers[index]);\n      const value = headers[index + 1] as string | number | readonly string[];\n      if (key.toLowerCase() === \"set-cookie\" && setCookieWritten) {\n        const current = res.getHeader(\"Set-Cookie\");\n        const values = (Array.isArray(current) ? current : [current]).filter(\n          (entry) => entry !== undefined,\n        );\n        res.setHeader(\"Set-Cookie\", [...values, ...(Array.isArray(value) ? value : [value])]);\n      } else {\n        res.setHeader(key, value);\n        if (key.toLowerCase() === \"set-cookie\") setCookieWritten = true;\n      }\n    }\n    return;\n  }\n\n  if (!headers || typeof headers !== \"object\") return;\n  for (const [key, value] of Object.entries(headers)) {\n    if (value !== undefined) res.setHeader(key, value);\n  }\n}\n\nexport function createHeadersPlugin(\n  headers: HeaderConfig[],\n  {\n    beforeRequest: overrideBeforeRequest,\n    afterResponse: overrideAfterResponse,\n    i18n,\n  }: {\n    beforeRequest?: (\n      req: FarmRequest,\n      res: FarmResponse,\n      context: FarmPluginContext,\n    ) => void | Promise<void>;\n    afterResponse?: (\n      req: FarmRequest,\n      res: FarmResponse,\n      context: FarmPluginContext,\n    ) => void | Promise<void>;\n    i18n?: ResolvedFarmI18nConfig;\n  } = {},\n): FarmPlugin {\n  const compiledHeaders = headers.map((config) => ({\n    config,\n    pattern: compileConfigRoutePattern(config.source),\n  }));\n\n  return {\n    name: \"farm:headers\",\n    enforce: \"pre\",\n\n    async beforeRequest(req, res, context) {\n      if (overrideBeforeRequest) {\n        await overrideBeforeRequest(req, res, context);\n      }\n      const url = resolveFarmRequestURL(req);\n      const pathname = resolveConfigRoutePathname(url.pathname, i18n).pathname;\n      const matchedHeaders = compiledHeaders\n        .filter(({ pattern }) => pattern.regex.test(pathname))\n        .map(({ config }) => config.headers);\n\n      applyResponseHeaders(res, matchedHeaders);\n\n      const responseWithFinalizer = res as FarmResponse & {\n        [FARM_CONFIG_HEADERS_FINALIZER]?: boolean;\n      };\n      if (matchedHeaders.length === 0 || responseWithFinalizer[FARM_CONFIG_HEADERS_FINALIZER]) {\n        return;\n      }\n\n      responseWithFinalizer[FARM_CONFIG_HEADERS_FINALIZER] = true;\n      const writeHead = res.writeHead;\n      res.writeHead = ((statusCode: number, ...args: unknown[]) => {\n        const statusMessage = typeof args[0] === \"string\" ? (args.shift() as string) : undefined;\n        applyWriteHeadHeaders(res, args[0]);\n        applyResponseHeaders(res, matchedHeaders);\n        return statusMessage === undefined\n          ? (writeHead as any).call(res, statusCode)\n          : (writeHead as any).call(res, statusCode, statusMessage);\n      }) as FarmResponse[\"writeHead\"];\n    },\n\n    async afterResponse(req, res, context) {\n      if (overrideAfterResponse) {\n        await overrideAfterResponse(req, res, context);\n      }\n    },\n  };\n}\n","import type { FarmPlugin, FarmPluginContext } from \"../plugin\";\nimport type { FarmRequest, FarmResponse } from \"../types\";\n\nexport function createEnvPlugin(\n  env: Record<string, string>,\n  {\n    beforeRequest: overrideBeforeRequest,\n    afterResponse: overrideAfterResponse,\n  }: {\n    beforeRequest?: (\n      req: FarmRequest,\n      res: FarmResponse,\n      context: FarmPluginContext,\n    ) => void | Promise<void>;\n    afterResponse?: (\n      req: FarmRequest,\n      res: FarmResponse,\n      context: FarmPluginContext,\n    ) => void | Promise<void>;\n  } = {},\n): FarmPlugin {\n  return {\n    name: \"farm:env\",\n\n    configResolved(config, context) {\n      for (const [key, value] of Object.entries(env)) {\n        process.env[key] = value;\n      }\n    },\n\n    async beforeRequest(req, res, context) {\n      if (overrideBeforeRequest) {\n        await overrideBeforeRequest(req, res, context);\n      }\n    },\n\n    async afterResponse(req, res, context) {\n      if (overrideAfterResponse) {\n        await overrideAfterResponse(req, res, context);\n      }\n    },\n  };\n}\n","import type { FarmPlugin, FarmPluginContext } from \"../plugin\";\nimport type { FarmRequest, FarmResponse } from \"../types\";\nimport { pipeline, Readable } from \"node:stream\";\nimport { constants, createBrotliCompress, createGzip } from \"node:zlib\";\n\ntype SupportedEncoding = \"br\" | \"gzip\";\n\nconst Q_VALUE = /^(?:0(?:\\.\\d{0,3})?|1(?:\\.0{0,3})?)$/;\n\nfunction parseEncodingQuality(header: string): Map<string, number> {\n  const qualities = new Map<string, number>();\n\n  for (const item of header.split(\",\")) {\n    const [rawEncoding, ...parameters] = item.trim().split(\";\");\n    const encoding = rawEncoding?.trim().toLowerCase();\n    if (!encoding) continue;\n\n    let quality = 1;\n    for (const parameter of parameters) {\n      const [rawName, rawValue] = parameter.split(\"=\", 2);\n      if (rawName?.trim().toLowerCase() !== \"q\") continue;\n      const value = rawValue?.trim() ?? \"\";\n      quality = Q_VALUE.test(value) ? Number(value) : 0;\n    }\n\n    qualities.set(encoding, Math.max(qualities.get(encoding) ?? 0, quality));\n  }\n\n  return qualities;\n}\n\nfunction selectEncoding(header: string): SupportedEncoding | undefined {\n  if (!header.trim()) return undefined;\n\n  const qualities = parseEncodingQuality(header);\n  const wildcard = qualities.get(\"*\") ?? 0;\n  const quality = (encoding: SupportedEncoding) => qualities.get(encoding) ?? wildcard;\n  const brotli = quality(\"br\");\n  const gzip = quality(\"gzip\");\n\n  if (brotli <= 0 && gzip <= 0) return undefined;\n  return brotli >= gzip ? \"br\" : \"gzip\";\n}\n\nfunction isCompressionEligible(request: Request, response: Response): boolean {\n  if (\n    (request.method !== \"HEAD\" && !response.body) ||\n    response.status === 204 ||\n    response.status === 205 ||\n    response.status === 304 ||\n    response.headers.has(\"content-encoding\") ||\n    response.headers.has(\"content-range\") ||\n    response.headers.get(\"cache-control\")?.toLowerCase().includes(\"no-transform\")\n  ) {\n    return false;\n  }\n\n  const mediaType = response.headers.get(\"content-type\")?.split(\";\", 1)[0]?.trim().toLowerCase();\n  return mediaType !== \"text/event-stream\";\n}\n\nfunction appendVary(headers: Headers, value: string): void {\n  const current = headers.get(\"vary\");\n  const values = current\n    ? current\n        .split(\",\")\n        .map((item) => item.trim())\n        .filter(Boolean)\n    : [];\n  if (values.includes(\"*\")) return;\n  if (!values.some((item) => item.toLowerCase() === value.toLowerCase())) {\n    values.push(value);\n  }\n  headers.set(\"vary\", values.join(\", \"));\n}\n\nfunction compressResponse(response: Response, encoding: SupportedEncoding): Response {\n  // Both compressors must flush per chunk. Without an explicit flush mode brotli\n  // buffers until its 4 MB window fills or the source ends, so a streaming SSR,\n  // RSC, or NDJSON response delivers nothing to the client until it completes -\n  // and `selectEncoding` prefers brotli on every tie, so that is the default\n  // path for an ordinary browser.\n  const compressor =\n    encoding === \"br\"\n      ? createBrotliCompress({ flush: constants.BROTLI_OPERATION_FLUSH })\n      : createGzip({ flush: constants.Z_SYNC_FLUSH });\n  const input = Readable.fromWeb(response.body as any);\n  const output = pipeline(input, compressor, () => {\n    // pipeline forwards source failures to the compressed body and destroys\n    // the source when the response consumer cancels it. The web stream owns\n    // observing the resulting destination error.\n  });\n  const headers = new Headers(response.headers);\n\n  headers.set(\"content-encoding\", encoding);\n  headers.delete(\"content-length\");\n  appendVary(headers, \"Accept-Encoding\");\n\n  const etag = headers.get(\"etag\");\n  if (etag && !etag.startsWith(\"W/\")) {\n    headers.set(\"etag\", `W/${etag}`);\n  }\n\n  return new Response(Readable.toWeb(output) as ReadableStream<Uint8Array>, {\n    status: response.status,\n    statusText: response.statusText,\n    headers,\n  });\n}\n\nfunction varyIdentityResponse(response: Response): Response {\n  const headers = new Headers(response.headers);\n  appendVary(headers, \"Accept-Encoding\");\n\n  return new Response(response.body, {\n    status: response.status,\n    statusText: response.statusText,\n    headers,\n  });\n}\n\nexport function createCompressionPlugin({\n  beforeRequest: overrideBeforeRequest,\n  afterResponse: overrideAfterResponse,\n}: {\n  beforeRequest?: (\n    req: FarmRequest,\n    res: FarmResponse,\n    context: FarmPluginContext,\n  ) => void | Promise<void>;\n  afterResponse?: (\n    req: FarmRequest,\n    res: FarmResponse,\n    context: FarmPluginContext,\n  ) => void | Promise<void>;\n} = {}): FarmPlugin {\n  return {\n    name: \"farm:compression\",\n    enforce: \"post\",\n\n    runtime: {\n      after({ request, response, isProd }) {\n        if (!isProd || !isCompressionEligible(request, response)) return;\n\n        if (request.method === \"HEAD\") return varyIdentityResponse(response);\n\n        const encoding = selectEncoding(request.headers.get(\"accept-encoding\") ?? \"\");\n        if (!encoding) return varyIdentityResponse(response);\n        return compressResponse(response, encoding);\n      },\n    },\n\n    async beforeRequest(req, res, context) {\n      if (overrideBeforeRequest) {\n        await overrideBeforeRequest(req, res, context);\n      }\n    },\n\n    async afterResponse(req, res, context) {\n      if (overrideAfterResponse) {\n        await overrideAfterResponse(req, res, context);\n      }\n    },\n  };\n}\n","import type { FarmPlugin, FarmPluginContext } from \"../plugin\";\nimport type { FarmResponse } from \"../types\";\nimport type { FarmRequest } from \"../types\";\n\nexport function createLoggerPlugin({\n  beforeRequest,\n  afterResponse,\n}: {\n  beforeRequest?: (\n    req: FarmRequest,\n    res: FarmResponse,\n    context: FarmPluginContext,\n  ) => void | Promise<void>;\n  afterResponse?: (\n    req: FarmRequest,\n    res: FarmResponse,\n    context: FarmPluginContext,\n  ) => void | Promise<void>;\n} = {}): FarmPlugin {\n  const plugin: FarmPlugin = {\n    name: \"farm:logger\",\n    enforce: \"post\",\n  };\n\n  if (beforeRequest) {\n    plugin.beforeRequest = async (req, res, context) => {\n      await beforeRequest(req, res, context);\n    };\n  }\n  if (afterResponse) {\n    plugin.afterResponse = async (req, res, context) => {\n      await afterResponse(req, res, context);\n    };\n  }\n\n  return plugin;\n}\n"],"mappings":"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","names":[]}