{"version":3,"sources":["../src/preload.ts"],"sourcesContent":["export type FarmPreloadMode = \"warn\" | \"enforce\";\n\nexport interface FarmPreloadUserConfig {\n  /** Report excess hints or remove the lower-priority hints. @default \"enforce\" */\n  mode?: FarmPreloadMode;\n  /** Maximum image preload hints per document. @default 1 */\n  maxImages?: number;\n  /** Maximum font preload hints per document. @default 2 */\n  maxFonts?: number;\n}\n\nexport interface ResolvedFarmPreloadConfig {\n  mode: FarmPreloadMode;\n  maxImages: number;\n  maxFonts: number;\n}\n\nexport interface FarmPerformanceConfig {\n  preload?: FarmPreloadUserConfig;\n}\n\nexport interface ResolvedFarmPerformanceConfig {\n  preload: ResolvedFarmPreloadConfig;\n}\n\nexport type FarmPreloadKind = \"image\" | \"font\";\n\nexport interface FarmPreloadBudgetWarning {\n  kind: FarmPreloadKind;\n  count: number;\n  budget: number;\n  removed: number;\n}\n\nexport interface FarmManagedPreloads {\n  value: string;\n  warnings: FarmPreloadBudgetWarning[];\n}\n\nexport interface FarmManagedDocumentPreloads {\n  html: string;\n  linkHeader: string;\n  warnings: FarmPreloadBudgetWarning[];\n}\n\nconst DEFAULT_PRELOAD_CONFIG: ResolvedFarmPreloadConfig = {\n  mode: \"enforce\",\n  maxImages: 1,\n  maxFonts: 2,\n};\n\nconst reportedWarnings = new Map<string, number>();\nconst PRELOAD_WARNING_TTL_MS = 60_000;\nconst MAX_REPORTED_PRELOAD_WARNINGS = 256;\n\nexport function resolveFarmPerformanceConfig(\n  config: FarmPerformanceConfig | undefined,\n): ResolvedFarmPerformanceConfig {\n  return {\n    preload: {\n      mode: config?.preload?.mode === \"warn\" ? \"warn\" : \"enforce\",\n      maxImages: normalizeBudget(config?.preload?.maxImages, DEFAULT_PRELOAD_CONFIG.maxImages),\n      maxFonts: normalizeBudget(config?.preload?.maxFonts, DEFAULT_PRELOAD_CONFIG.maxFonts),\n    },\n  };\n}\n\n/**\n * Apply image and font budgets to HTML preload elements. High-priority image\n * hints are retained before ordinary hints, making an explicitly preloaded LCP\n * image the winner when a document contains too many React-generated hints.\n */\nexport function manageFarmHtmlPreloads(\n  html: string,\n  config: ResolvedFarmPreloadConfig,\n): FarmManagedPreloads {\n  const elements = findHtmlLinkElements(html);\n  const candidates = elements.flatMap((element, index) => {\n    const kind = getHtmlPreloadKind(element.value);\n    return kind\n      ? [\n          {\n            index,\n            kind,\n            highPriority:\n              readHtmlAttribute(element.value, \"fetchpriority\")?.toLowerCase() === \"high\",\n          },\n        ]\n      : [];\n  });\n\n  const budget = selectPreloadsWithinBudget(candidates, config);\n  if (config.mode === \"warn\" || budget.removed.size === 0) {\n    return { value: html, warnings: budget.warnings };\n  }\n\n  return {\n    value: removeHtmlLinkElements(html, elements, budget.removed),\n    warnings: budget.warnings,\n  };\n}\n\n/** Apply the same budgets to HTTP Link preload hints, including Farm fonts. */\nexport function manageFarmLinkHeaderPreloads(\n  value: string,\n  config: ResolvedFarmPreloadConfig,\n): FarmManagedPreloads {\n  if (!value) return { value, warnings: [] };\n\n  const links = splitLinkHeader(value);\n  const candidates = links.flatMap((link, index) => {\n    const kind = getLinkHeaderPreloadKind(link);\n    return kind\n      ? [\n          {\n            index,\n            kind,\n            highPriority: getLinkHeaderParameter(link, \"fetchpriority\")?.toLowerCase() === \"high\",\n          },\n        ]\n      : [];\n  });\n  const budget = selectPreloadsWithinBudget(candidates, config);\n\n  return {\n    value:\n      config.mode === \"enforce\"\n        ? links.filter((_, index) => !budget.removed.has(index)).join(\", \")\n        : value,\n    warnings: budget.warnings,\n  };\n}\n\n/** Apply a single document budget across HTML and HTTP Link header hints. */\nexport function manageFarmDocumentPreloads(\n  html: string,\n  linkHeader: string,\n  config: ResolvedFarmPreloadConfig,\n): FarmManagedDocumentPreloads {\n  const elements = findHtmlLinkElements(html);\n  const links = linkHeader ? splitLinkHeader(linkHeader) : [];\n  const headerOffset = elements.length;\n  const candidates: PreloadCandidate[] = [];\n\n  for (const [index, element] of elements.entries()) {\n    const kind = getHtmlPreloadKind(element.value);\n    if (!kind) continue;\n    candidates.push({\n      index,\n      kind,\n      highPriority: readHtmlAttribute(element.value, \"fetchpriority\")?.toLowerCase() === \"high\",\n    });\n  }\n  for (const [index, link] of links.entries()) {\n    const kind = getLinkHeaderPreloadKind(link);\n    if (!kind) continue;\n    candidates.push({\n      index: headerOffset + index,\n      kind,\n      highPriority: getLinkHeaderParameter(link, \"fetchpriority\")?.toLowerCase() === \"high\",\n    });\n  }\n\n  const budget = selectPreloadsWithinBudget(candidates, config);\n  if (config.mode === \"warn\" || budget.removed.size === 0) {\n    return { html, linkHeader, warnings: budget.warnings };\n  }\n\n  return {\n    html: removeHtmlLinkElements(html, elements, budget.removed),\n    linkHeader: links.filter((_, index) => !budget.removed.has(headerOffset + index)).join(\", \"),\n    warnings: budget.warnings,\n  };\n}\n\n/** Rate-limit identical route-and-budget warnings within a server process. */\nexport function reportFarmPreloadWarnings(\n  warnings: FarmPreloadBudgetWarning[],\n  context = \"the rendered document\",\n): void {\n  const now = Date.now();\n  for (const [key, reportedAt] of reportedWarnings) {\n    if (now - reportedAt >= PRELOAD_WARNING_TTL_MS) reportedWarnings.delete(key);\n  }\n\n  for (const warning of warnings) {\n    const key = `${context}:${warning.kind}:${warning.count}:${warning.budget}:${warning.removed}`;\n    const reportedAt = reportedWarnings.get(key);\n    if (reportedAt !== undefined && now - reportedAt < PRELOAD_WARNING_TTL_MS) continue;\n    reportedWarnings.set(key, now);\n    while (reportedWarnings.size > MAX_REPORTED_PRELOAD_WARNINGS) {\n      const oldest = reportedWarnings.keys().next().value;\n      if (oldest === undefined) break;\n      reportedWarnings.delete(oldest);\n    }\n\n    const action = warning.removed > 0 ? ` Removed ${warning.removed} lower-priority hint(s).` : \"\";\n    const recommendation =\n      warning.kind === \"image\"\n        ? ' Mark only the LCP image with `preload` or `fetchPriority=\"high\"`.'\n        : \" Set `preload: false` on fonts that are not required above the fold.\";\n    console.warn(\n      `[Farm.js] ${context} emitted ${warning.count} ${warning.kind} preload hints ` +\n        `(budget: ${warning.budget}).${action}${recommendation}`,\n    );\n  }\n}\n\nexport function clearReportedFarmPreloadWarnings(): void {\n  reportedWarnings.clear();\n}\n\ninterface PreloadCandidate {\n  index: number;\n  kind: FarmPreloadKind;\n  highPriority: boolean;\n}\n\nfunction selectPreloadsWithinBudget(\n  candidates: PreloadCandidate[],\n  config: ResolvedFarmPreloadConfig,\n): { removed: Set<number>; warnings: FarmPreloadBudgetWarning[] } {\n  const removed = new Set<number>();\n  const warnings: FarmPreloadBudgetWarning[] = [];\n\n  for (const kind of [\"image\", \"font\"] as const) {\n    const matching = candidates.filter((candidate) => candidate.kind === kind);\n    const limit = kind === \"image\" ? config.maxImages : config.maxFonts;\n    if (matching.length <= limit) continue;\n\n    const retained = new Set(\n      [...matching]\n        .sort(\n          (left, right) =>\n            Number(right.highPriority) - Number(left.highPriority) || left.index - right.index,\n        )\n        .slice(0, limit)\n        .map((candidate) => candidate.index),\n    );\n\n    if (config.mode === \"enforce\") {\n      for (const candidate of matching) {\n        if (!retained.has(candidate.index)) removed.add(candidate.index);\n      }\n    }\n\n    warnings.push({\n      kind,\n      count: matching.length,\n      budget: limit,\n      removed: config.mode === \"enforce\" ? matching.length - retained.size : 0,\n    });\n  }\n\n  return { removed, warnings };\n}\n\nfunction getHtmlPreloadKind(link: string): FarmPreloadKind | undefined {\n  const rel = readHtmlAttribute(link, \"rel\")?.toLowerCase().split(/\\s+/) || [];\n  if (!rel.includes(\"preload\")) return undefined;\n  return normalizePreloadKind(readHtmlAttribute(link, \"as\"));\n}\n\nfunction getLinkHeaderPreloadKind(link: string): FarmPreloadKind | undefined {\n  const relations = getLinkHeaderParameter(link, \"rel\")?.toLowerCase().split(/\\s+/) ?? [];\n  if (!relations.includes(\"preload\")) return undefined;\n  return normalizePreloadKind(getLinkHeaderParameter(link, \"as\"));\n}\n\nfunction getLinkHeaderParameter(link: string, name: string): string | undefined {\n  const uriEnd = link.indexOf(\">\");\n  if (uriEnd === -1) return undefined;\n\n  for (const parameter of splitLinkParameters(link.slice(uriEnd + 1))) {\n    const separator = parameter.indexOf(\"=\");\n    const parameterName = (separator === -1 ? parameter : parameter.slice(0, separator))\n      .trim()\n      .toLowerCase();\n    if (parameterName !== name.toLowerCase() || separator === -1) continue;\n    const rawValue = parameter.slice(separator + 1).trim();\n    if (rawValue.startsWith('\"') && rawValue.endsWith('\"')) {\n      return rawValue.slice(1, -1).replace(/\\\\([\\\\\"])/g, \"$1\");\n    }\n    return rawValue;\n  }\n  return undefined;\n}\n\nfunction splitLinkParameters(value: string): string[] {\n  const parameters: string[] = [];\n  let start = 0;\n  let quoted = false;\n  for (let index = 0; index < value.length; index += 1) {\n    const character = value[index];\n    if (character === '\"' && !isEscaped(value, index)) quoted = !quoted;\n    else if (character === \";\" && !quoted) {\n      const parameter = value.slice(start, index).trim();\n      if (parameter) parameters.push(parameter);\n      start = index + 1;\n    }\n  }\n  const parameter = value.slice(start).trim();\n  if (parameter) parameters.push(parameter);\n  return parameters;\n}\n\nfunction normalizePreloadKind(value: string | undefined): FarmPreloadKind | undefined {\n  const normalized = value?.toLowerCase();\n  return normalized === \"image\" || normalized === \"font\" ? normalized : undefined;\n}\n\nfunction readHtmlAttribute(element: string, name: string): string | undefined {\n  const match = element.match(\n    new RegExp(`\\\\s${name}\\\\s*=\\\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\\\s>]+))`, \"i\"),\n  );\n  return match?.[1] ?? match?.[2] ?? match?.[3];\n}\n\ninterface HtmlLinkElement {\n  start: number;\n  end: number;\n  value: string;\n}\n\nfunction findHtmlLinkElements(html: string): HtmlLinkElement[] {\n  const elements: HtmlLinkElement[] = [];\n  const lowerHtml = html.toLowerCase();\n  let cursor = 0;\n\n  while (cursor < html.length) {\n    const start = html.indexOf(\"<\", cursor);\n    if (start === -1) break;\n\n    if (lowerHtml.startsWith(\"<!--\", start)) {\n      const commentEnd = lowerHtml.indexOf(\"-->\", start + 4);\n      cursor = commentEnd === -1 ? html.length : commentEnd + 3;\n      continue;\n    }\n\n    const rawText = lowerHtml\n      .slice(start)\n      .match(/^<(script|style|template|textarea|title|noscript|svg)(?=[\\s/>])/);\n    if (rawText?.[1]) {\n      const openingEnd = findHtmlTagEnd(html, start);\n      if (openingEnd === -1) break;\n      if (rawText[1] === \"svg\" && html[openingEnd - 2] === \"/\") {\n        cursor = openingEnd;\n        continue;\n      }\n      const closingStart = findHtmlClosingTag(lowerHtml, rawText[1], openingEnd);\n      if (closingStart === -1) {\n        cursor = html.length;\n        continue;\n      }\n      const closingEnd = findHtmlTagEnd(html, closingStart);\n      cursor = closingEnd === -1 ? html.length : closingEnd;\n      continue;\n    }\n\n    if (/^<link(?=[\\s/>])/i.test(html.slice(start))) {\n      const end = findHtmlTagEnd(html, start);\n      if (end === -1) break;\n      elements.push({ start, end, value: html.slice(start, end) });\n      cursor = end;\n      continue;\n    }\n\n    if (/^<\\/?[A-Za-z][\\w:-]*(?=[\\s/>])/.test(html.slice(start))) {\n      const end = findHtmlTagEnd(html, start);\n      cursor = end === -1 ? html.length : end;\n      continue;\n    }\n\n    cursor = start + 1;\n  }\n\n  return elements;\n}\n\nfunction findHtmlClosingTag(html: string, tagName: string, start: number): number {\n  const prefix = `</${tagName}`;\n  let candidate = html.indexOf(prefix, start);\n  while (candidate !== -1) {\n    const boundary = html[candidate + prefix.length];\n    if (boundary === \">\" || boundary === \"/\" || /\\s/.test(boundary ?? \"\")) return candidate;\n    candidate = html.indexOf(prefix, candidate + prefix.length);\n  }\n  return -1;\n}\n\nfunction findHtmlTagEnd(html: string, start: number): number {\n  let quote: '\"' | \"'\" | undefined;\n  for (let index = start + 1; index < html.length; index += 1) {\n    const character = html[index];\n    if (quote) {\n      if (character === quote) quote = undefined;\n    } else if (character === '\"' || character === \"'\") {\n      quote = character;\n    } else if (character === \">\") {\n      return index + 1;\n    }\n  }\n  return -1;\n}\n\nfunction removeHtmlLinkElements(\n  html: string,\n  elements: HtmlLinkElement[],\n  removed: ReadonlySet<number>,\n): string {\n  let cursor = 0;\n  let output = \"\";\n  for (const [index, element] of elements.entries()) {\n    if (!removed.has(index)) continue;\n    output += html.slice(cursor, element.start);\n    cursor = element.end;\n  }\n  return output + html.slice(cursor);\n}\n\nfunction splitLinkHeader(value: string): string[] {\n  const links: string[] = [];\n  let start = 0;\n  let insideAngleBrackets = false;\n  let quoted = false;\n\n  for (let index = 0; index < value.length; index += 1) {\n    const character = value[index];\n    if (quoted) {\n      if (character === '\"' && !isEscaped(value, index)) quoted = false;\n      continue;\n    }\n    if (character === '\"') {\n      quoted = true;\n    } else if (character === \"<\") {\n      insideAngleBrackets = true;\n    } else if (character === \">\") {\n      insideAngleBrackets = false;\n    } else if (character === \",\" && !insideAngleBrackets) {\n      links.push(value.slice(start, index).trim());\n      start = index + 1;\n    }\n  }\n\n  links.push(value.slice(start).trim());\n  return links.filter(Boolean);\n}\n\nfunction isEscaped(value: string, index: number): boolean {\n  let backslashes = 0;\n  for (let cursor = index - 1; cursor >= 0 && value[cursor] === \"\\\\\"; cursor -= 1) {\n    backslashes += 1;\n  }\n  return backslashes % 2 === 1;\n}\n\nfunction normalizeBudget(value: number | undefined, fallback: number): number {\n  return typeof value === \"number\" && Number.isFinite(value) && value >= 0\n    ? Math.floor(value)\n    : fallback;\n}\n"],"mappings":"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","names":["parameter"]}