{"version":3,"sources":["../src/content/quality.ts","../src/content/readability.ts","../src/content/extract.ts","../src/content/html-to-text/extract.ts","../src/utils/normalize-url.ts","../src/feed/atom/clean-text.ts","../src/feed/atom/parse-date.ts","../src/feed/atom/extract-entry.ts","../src/feed/atom/xml-parser.ts","../src/feed/atom/extract-feed.ts","../src/feed/atom/parse.ts","../src/feed/detect.ts","../src/feed/json-feed/validate.ts","../src/feed/json-feed/parse.ts","../src/feed/normalize.ts","../src/feed/rss/clean-text.ts","../src/feed/rss/parse-date.ts","../src/feed/rss/xml-parser.ts","../src/feed/rss/extract-channel.ts","../src/feed/rss/extract-item.ts","../src/feed/rss/extract-namespaces.ts","../src/feed/rss/parse.ts","../src/feed/parse.ts","../src/feed/sitemap/xml-parser.ts","../src/feed/sitemap/parse.ts","../src/pluck/types.ts","../src/pluck/encoding.ts","../src/pluck/pluck.ts","../src/utils/html-parser.ts","../src/utils/meta-helpers.ts","../src/metadata/opengraph/extract.ts","../src/metadata/schema-org/parse-json-ld.ts","../src/metadata/schema-org/extract.ts","../src/metadata/seo/extract.ts","../src/metadata/twitter-card/extract.ts","../src/gather/website/description.ts","../src/utils/link-helpers.ts","../src/metadata/icons/extract.ts","../src/gather/website/image.ts","../src/metadata/language/extract.ts","../src/gather/website/language.ts","../src/metadata/links/extract.ts","../src/gather/website/links.ts","../src/utils/clean-title.ts","../src/gather/website/title.ts","../src/metadata/canonical/extract.ts","../src/gather/website/url.ts","../src/gather/article/index.ts","../src/gather/feed.ts","../src/metadata/feed-discovery/heuristics.ts","../src/metadata/feed-discovery/extract.ts","../src/gather/website/icon.ts","../src/gather/website/index.ts","../src/metadata/analytics/extract.ts","../src/metadata/assets/extract.ts","../src/metadata/copyright/extract.ts","../src/metadata/dublin-core/extract.ts","../src/metadata/geo/extract.ts","../src/metadata/monetization/extract.ts","../src/metadata/news/extract.ts","../src/metadata/pagination/extract.ts","../src/metadata/robots/parse-directives.ts","../src/metadata/robots/extract.ts","../src/metadata/security/extract.ts","../src/metadata/sitemap-discovery/heuristics.ts","../src/metadata/sitemap-discovery/extract.ts","../src/metadata/social-profiles/extract.ts","../src/metadata/verification/extract.ts","../src/swoop/errors.ts","../src/swoop/console.ts","../src/swoop/env/async.ts","../src/swoop/env/base.ts","../src/swoop/env/browser.ts","../src/swoop/env/cookie.ts","../src/swoop/env/fetch.ts","../src/swoop/env/navigation.ts","../src/swoop/env/permissive.ts","../src/swoop/env/xhr.ts","../src/swoop/lifecycle.ts","../src/swoop/probes.ts","../src/swoop/scripts/loader.ts","../src/swoop/utils.ts","../src/swoop/vm/bootstrap.ts","../src/swoop/vm/modules.ts","../src/swoop/wait.ts","../src/swoop/engines/vm.ts","../src/swoop/scripts/discover.ts","../src/swoop/swoop.ts"],"names":["Readability","countWords","decodeEntities","extractContent","extractAtomDate","extractPerson","extractPersons","extractLink","extractLinks","extractCategory","extractCategories","extractTextContent","normalizeFeedUrls","stripCDATA","normalizeWhitespace","cleanText","removeDoctype","removeComments","parseElement","extractCDATA","restoreCDATA","parseAttributes","findClosingTag","querySelector","querySelectorAll","normalizeItemUrls","cleanXMLDeclaration","getText","validate","normalizeOptions","linkedomParseHTML","extractImages","getStringProperty","items","parseSizeString","getEffectiveBaseUrl","extractNews","nodeSetTimeout","nodeClearTimeout","nodeSetInterval","nodeClearInterval","nodeSetImmediate","nodeClearImmediate","init","vm","code"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Content quality assessment.\n *\n * @remarks\n * Analyzes extracted content to provide quality metrics.\n *\n * @packageDocumentation\n */\n\nimport type { ContentQuality, ExtractedContent } from './types.js';\n\n/**\n * Calculate word count from text.\n *\n * @param text - Text to count words in\n * @returns Number of words\n */\nexport function countWords(text: string): number {\n  // Remove extra whitespace and split on word boundaries\n  const words = text.trim().split(/\\s+/).filter(Boolean);\n  return words.length;\n}\n\n/**\n * Calculate reading time in minutes.\n *\n * @remarks\n * Uses average reading speed of 200 words per minute.\n *\n * @param wordCount - Number of words\n * @returns Estimated reading time in minutes\n */\nexport function calculateReadingTime(wordCount: number): number {\n  const wordsPerMinute = 200;\n  const minutes = wordCount / wordsPerMinute;\n  return Math.max(1, Math.round(minutes));\n}\n\n/**\n * Count paragraphs in HTML content.\n *\n * @param html - HTML content\n * @returns Number of paragraph tags\n */\nfunction countParagraphs(html: string): number {\n  const matches = html.match(/<p[^>]*>/gi);\n  return matches ? matches.length : 0;\n}\n\n/**\n * Count images in HTML content.\n *\n * @param html - HTML content\n * @returns Number of image tags\n */\nfunction countImages(html: string): number {\n  const matches = html.match(/<img[^>]*>/gi);\n  return matches ? matches.length : 0;\n}\n\n/**\n * Count links in HTML content.\n *\n * @param html - HTML content\n * @returns Number of anchor tags\n */\nfunction countLinks(html: string): number {\n  const matches = html.match(/<a[^>]*>/gi);\n  return matches ? matches.length : 0;\n}\n\n/**\n * Calculate link density.\n *\n * @remarks\n * Ratio of link text to total text. Lower is generally better for articles.\n *\n * @param html - HTML content\n * @param textContent - Plain text content\n * @returns Link density (0-1)\n */\nfunction calculateLinkDensity(html: string, textContent: string): number {\n  // Extract all link text\n  const linkMatches = html.match(/<a[^>]*>(.*?)<\\/a>/gi);\n  if (!linkMatches) {\n    return 0;\n  }\n\n  const linkText = linkMatches.map((match) => match.replace(/<[^>]*>/g, '')).join(' ');\n\n  const linkLength = linkText.length;\n  const totalLength = textContent.length;\n\n  if (totalLength === 0) {\n    return 0;\n  }\n\n  return Math.min(1, linkLength / totalLength);\n}\n\n/**\n * Calculate average words per sentence.\n *\n * @param text - Text content\n * @returns Average words per sentence\n */\nfunction calculateAvgWordsPerSentence(text: string): number {\n  // Split on sentence boundaries (., !, ?)\n  const sentences = text.split(/[.!?]+/).filter((s) => s.trim().length > 0);\n\n  if (sentences.length === 0) {\n    return 0;\n  }\n\n  const totalWords = countWords(text);\n  return Math.round(totalWords / sentences.length);\n}\n\n/**\n * Calculate quality score.\n *\n * @remarks\n * Composite score based on multiple factors:\n * - Length (longer is better, up to a point)\n * - Link density (lower is better)\n * - Paragraph count (more is better)\n * - Images (some is good, too many is bad)\n *\n * @param metrics - Quality metrics\n * @returns Score from 0-100\n */\nfunction calculateQualityScore(metrics: Omit<ContentQuality, 'qualityScore'>): number {\n  let score = 0;\n\n  // Length score (0-30 points)\n  // Optimal: 1000-5000 words\n  if (metrics.wordCount >= 1000 && metrics.wordCount <= 5000) {\n    score += 30;\n  } else if (metrics.wordCount >= 500 && metrics.wordCount < 1000) {\n    score += 20;\n  } else if (metrics.wordCount < 500) {\n    score += 10;\n  } else {\n    score += 15; // Very long articles\n  }\n\n  // Link density score (0-25 points)\n  // Lower is better for articles\n  if (metrics.linkDensity < 0.1) {\n    score += 25;\n  } else if (metrics.linkDensity < 0.2) {\n    score += 15;\n  } else if (metrics.linkDensity < 0.3) {\n    score += 5;\n  }\n\n  // Paragraph score (0-20 points)\n  if (metrics.paragraphCount >= 10) {\n    score += 20;\n  } else if (metrics.paragraphCount >= 5) {\n    score += 15;\n  } else if (metrics.paragraphCount >= 3) {\n    score += 10;\n  }\n\n  // Image score (0-15 points)\n  // Some images are good, too many is suspicious\n  if (metrics.imageCount >= 1 && metrics.imageCount <= 10) {\n    score += 15;\n  } else if (metrics.imageCount === 0) {\n    score += 10;\n  } else {\n    score += 5;\n  }\n\n  // Readability score (0-10 points)\n  // Optimal: 15-20 words per sentence\n  if (metrics.avgWordsPerSentence >= 15 && metrics.avgWordsPerSentence <= 25) {\n    score += 10;\n  } else if (metrics.avgWordsPerSentence >= 10 && metrics.avgWordsPerSentence <= 30) {\n    score += 5;\n  }\n\n  return Math.min(100, score);\n}\n\n/**\n * Assess content quality.\n *\n * @remarks\n * Analyzes extracted content and returns comprehensive quality metrics.\n *\n * @param content - Extracted content\n * @returns Quality assessment\n *\n * @example\n * ```typescript\n * const content = extractContent(html);\n * if (content.success) {\n *   const quality = assessContentQuality(content);\n *   console.log(`Quality score: ${quality.qualityScore}/100`);\n *   console.log(`Reading time: ${quality.readingTime} minutes`);\n * }\n * ```\n */\nexport function assessContentQuality(content: ExtractedContent): ContentQuality {\n  const wordCount = countWords(content.textContent);\n  const charCount = content.textContent.length;\n  const readingTime = calculateReadingTime(wordCount);\n  const avgWordsPerSentence = calculateAvgWordsPerSentence(content.textContent);\n  const paragraphCount = countParagraphs(content.content);\n  const imageCount = countImages(content.content);\n  const linkCount = countLinks(content.content);\n  const linkDensity = calculateLinkDensity(content.content, content.textContent);\n\n  const metrics = {\n    wordCount,\n    charCount,\n    readingTime,\n    avgWordsPerSentence,\n    paragraphCount,\n    imageCount,\n    linkCount,\n    linkDensity,\n  };\n\n  const qualityScore = calculateQualityScore(metrics);\n\n  return {\n    ...metrics,\n    qualityScore,\n  };\n}\n","/**\n * Mozilla Readability wrapper with linkedom.\n *\n * @remarks\n * Provides a clean interface to Mozilla Readability using linkedom as the DOM implementation.\n *\n * @packageDocumentation\n */\n\nimport { Readability } from '@mozilla/readability';\nimport type { ContentExtractionOptions } from './types.js';\n\n/**\n * Readability result from Mozilla's library.\n */\nexport interface ReadabilityResult {\n  title: string;\n  content: string;\n  textContent: string;\n  excerpt: string;\n  byline: string | null;\n  siteName: string | null;\n  lang: string | null;\n  dir: string | null;\n  publishedTime: string | null;\n  length: number;\n}\n\n/**\n * Check if HTML content is probably readerable.\n *\n * @remarks\n * Quick check to determine if content extraction is likely to succeed.\n * This is a heuristic check and may produce false positives/negatives.\n *\n * @param doc - Pre-parsed Document to check\n * @param options - Readability check options\n * @returns True if content appears to be an article\n *\n * @example\n * ```typescript\n * import { parseHTML } from '../utils/html-parser.js';\n *\n * const doc = parseHTML(html);\n * if (isProbablyReaderable(doc)) {\n *   const result = extractContent(doc);\n * }\n * ```\n */\nexport function isProbablyReaderable(\n  doc: Document,\n  options?: {\n    minContentLength?: number;\n    minScore?: number;\n  },\n): boolean {\n  try {\n    // Simple heuristic: check for common article indicators\n    const hasArticleTag = !!doc.querySelector('article');\n    const hasMainTag = !!doc.querySelector('main');\n    const hasContentDivs = doc.querySelectorAll('div.content, div.article, div.post').length > 0;\n    const hasParagraphs = doc.querySelectorAll('p').length >= 3;\n\n    // Calculate rough content length\n    const textContent = doc.textContent || '';\n    const contentLength = textContent.trim().length;\n    const minLength = options?.minContentLength || 140;\n\n    return (\n      contentLength >= minLength && (hasArticleTag || hasMainTag || hasContentDivs || hasParagraphs)\n    );\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Extract article content using Mozilla Readability.\n *\n * @remarks\n * Runs Readability extraction on a pre-parsed Document.\n * The original document is not modified (uses cloned document).\n *\n * @param doc - Pre-parsed Document to extract from\n * @param options - Extraction options\n * @returns Readability result or null if extraction failed\n *\n * @example\n * ```typescript\n * import { parseHTML } from '../utils/html-parser.js';\n * import { extractSEO } from '../metadata/index.js';\n *\n * const doc = parseHTML(html);\n * const metadata = extractSEO(doc);\n * const content = extractWithReadability(doc, { baseUrl: 'https://example.com' });\n *\n * if (content) {\n *   console.log(content.title);\n *   console.log(content.textContent);\n * }\n * ```\n */\nexport function extractWithReadability(\n  doc: Document,\n  options: ContentExtractionOptions = {},\n): ReadabilityResult | null {\n  // Clone document to avoid mutations\n  const documentClone = doc.cloneNode(true) as Document;\n\n  // Create Readability instance with options\n  const reader = new Readability(documentClone, {\n    debug: options.debug || false,\n    charThreshold: options.charThreshold || 500,\n    maxElemsToParse: options.maxElemsToParse || 0,\n    keepClasses: options.keepClasses || false,\n    classesToPreserve: options.classesToPreserve || [],\n    disableJSONLD: options.disableJSONLD || false,\n  });\n\n  // Parse and return result\n  const article = reader.parse();\n\n  if (!article) {\n    return null;\n  }\n\n  return {\n    title: article.title || '',\n    content: article.content || '',\n    textContent: article.textContent || '',\n    excerpt: article.excerpt || '',\n    byline: article.byline || null,\n    siteName: article.siteName || null,\n    lang: article.lang || null,\n    dir: article.dir || null,\n    publishedTime: article.publishedTime || null,\n    length: article.length || 0,\n  };\n}\n","/**\n * Main content extraction module.\n *\n * @remarks\n * Extracts article content from HTML using Mozilla Readability.\n * Never throws exceptions - always returns a ContentResult.\n *\n * @packageDocumentation\n */\n\nimport { calculateReadingTime } from './quality.js';\nimport { extractWithReadability, isProbablyReaderable } from './readability.js';\nimport type {\n  ContentExtractionOptions,\n  ContentResult,\n  ExtractedContent,\n  ExtractionErrorType,\n  ExtractionFailure,\n} from './types.js';\n\n/**\n * Count words in text.\n *\n * @param text - Text to count words in\n * @returns Number of words\n */\nfunction countWords(text: string): number {\n  const words = text.trim().split(/\\s+/).filter(Boolean);\n  return words.length;\n}\n\n/**\n * Create an extraction failure result.\n *\n * @param errorType - Type of error\n * @param error - Error message\n * @param readerable - Whether content passed readability check\n * @param extractionTime - Time spent attempting extraction\n * @param details - Additional error details\n * @returns Extraction failure object\n */\nfunction createFailure(\n  errorType: ExtractionErrorType,\n  error: string,\n  readerable: boolean,\n  extractionTime: number,\n  details?: unknown,\n): ExtractionFailure {\n  const result: ExtractionFailure = {\n    success: false,\n    error,\n    errorType,\n    readerable,\n    extractionTime,\n  };\n\n  if (details !== undefined) {\n    result.details = details;\n  }\n\n  return result;\n}\n\n/**\n * Extract article content from HTML.\n *\n * @remarks\n * Uses Mozilla Readability to extract clean article content from a pre-parsed Document.\n * This function never throws exceptions - always returns a ContentResult.\n *\n * Error handling:\n * - Returns success: false for any extraction failure\n * - Categorizes errors by type for better handling\n * - Includes extraction time even for failures\n *\n * @param doc - Pre-parsed Document to extract content from\n * @param options - Extraction options\n * @returns Extraction result (success or failure)\n *\n * @example\n * ```typescript\n * import { parseHTML } from '../utils/html-parser.js';\n * import { extractSEO } from '../metadata/index.js';\n *\n * const doc = parseHTML(html);\n * const metadata = extractSEO(doc);\n * const content = extractContent(doc, {\n *   baseUrl: 'https://example.com/article',\n *   charThreshold: 300,\n *   checkReadability: true,\n * });\n *\n * if (content.success) {\n *   console.log(content.title);\n *   console.log(content.wordCount);\n *   console.log(`${content.readingTime} min read`);\n * } else {\n *   console.error(content.error);\n * }\n * ```\n */\nexport function extractContent(\n  doc: Document,\n  options: ContentExtractionOptions = {},\n): ContentResult {\n  const startTime = Date.now();\n\n  // Validate input\n  if (!doc || typeof doc !== 'object' || !doc.documentElement) {\n    return createFailure(\n      'INVALID_HTML',\n      'Input must be a valid Document object',\n      false,\n      Date.now() - startTime,\n    );\n  }\n\n  // Check readability if requested\n  let readerable = false;\n  if (options.checkReadability) {\n    try {\n      readerable = isProbablyReaderable(doc);\n      if (!readerable) {\n        return createFailure(\n          'NOT_READERABLE',\n          'Content does not appear to be a readable article',\n          false,\n          Date.now() - startTime,\n        );\n      }\n    } catch (error) {\n      // Readability check failed, but continue anyway\n      if (options.debug) {\n        console.warn('Readability check failed:', error);\n      }\n    }\n  }\n\n  // Extract content with Readability\n  let article: ReturnType<typeof extractWithReadability> | null;\n  try {\n    article = extractWithReadability(doc, options);\n  } catch (error) {\n    const errorMessage = error instanceof Error ? error.message : String(error);\n    return createFailure(\n      'PARSE_ERROR',\n      `Failed to parse HTML: ${errorMessage}`,\n      readerable,\n      Date.now() - startTime,\n      error,\n    );\n  }\n\n  // Check if extraction succeeded\n  if (!article) {\n    return createFailure(\n      'EXTRACTION_FAILED',\n      'Readability could not extract content from this page',\n      readerable,\n      Date.now() - startTime,\n    );\n  }\n\n  // Check if content meets minimum requirements\n  if (!article.title && !article.textContent) {\n    return createFailure(\n      'EXTRACTION_FAILED',\n      'Extracted content has no title or text',\n      readerable,\n      Date.now() - startTime,\n    );\n  }\n\n  // Calculate metrics\n  const wordCount = countWords(article.textContent);\n  const readingTime = calculateReadingTime(wordCount);\n\n  // Build success result\n  const result: ExtractedContent = {\n    success: true,\n    title: article.title,\n    content: article.content,\n    textContent: article.textContent,\n    excerpt: article.excerpt,\n    length: article.length,\n    wordCount,\n    readingTime,\n    readerable: readerable || true, // If we got here, it was readable enough\n    extractionTime: Date.now() - startTime,\n  };\n\n  // Add optional fields if present\n  if (article.byline) {\n    result.byline = article.byline;\n  }\n  if (article.siteName) {\n    result.siteName = article.siteName;\n  }\n  if (article.lang) {\n    result.lang = article.lang;\n  }\n  if (article.dir) {\n    result.dir = article.dir as 'ltr' | 'rtl';\n  }\n  if (article.publishedTime) {\n    result.publishedTime = article.publishedTime;\n  }\n\n  return result;\n}\n","/**\n * HTML to text conversion.\n *\n * @remarks\n * Convert HTML to plain text using a zero-dependency streaming tokenizer.\n * Pure, deterministic transformation suitable for logs, previews, classification,\n * and search indexing. Preserves essential structure by inserting newlines at\n * block boundaries, handles entities, and provides configurable options.\n *\n * @packageDocumentation\n */\n\nimport type { HtmlToTextOptions } from './types.js';\n\n/**\n * Convert an HTML string to plain text.\n *\n * @remarks\n * This function uses a streaming tokenizer to parse HTML and extract text content.\n * It handles block elements, whitespace preservation, HTML entities, tables, and more.\n *\n * Features:\n * - Preserves document structure with appropriate line breaks\n * - Handles HTML entities (numeric and common named entities)\n * - Configurable link and image handling\n * - Table rendering with configurable cell separators\n * - Whitespace preservation for code/pre blocks\n * - Optional hard-wrapping at column width\n *\n * @param html - HTML string (fragment or full document)\n * @param options - Conversion options\n * @returns Plain text string\n *\n * @throws {TypeError} If html is not a string\n *\n * @example\n * ```typescript\n * const html = '<div><h1>Hello</h1><p>World!</p></div>';\n * const text = htmlToText(html);\n * console.log(text); // \"Hello\\n\\nWorld!\"\n * ```\n *\n * @example\n * ```typescript\n * const html = '<a href=\"https://example.com\">Visit</a>';\n * const text = htmlToText(html, { links: 'inline' });\n * console.log(text); // \"Visit (https://example.com)\"\n * ```\n */\nexport function htmlToText(html: string, options: HtmlToTextOptions = {}): string {\n  if (typeof html !== 'string') {\n    throw new TypeError('Expected html to be a string');\n  }\n\n  const settings = normalizeOptions(options);\n\n  // Fast path: empty input\n  if (html.length === 0) {\n    return '';\n  }\n\n  // Sets and constants for classification\n  const preservedTagSet = toSet(settings.preserveTags);\n  const excludedTagSet = toSet(\n    settings.excludeTags.concat(settings.mode === 'document' ? ['head'] : []),\n  );\n  const blockTagSet = BLOCK_TAG_SET;\n\n  // Table state\n  let insideTable = 0;\n  let cellBuffer: string[] = [];\n  const cellSep = settings.tableCellSeparator === 'tab' ? '\\t' : ' ';\n\n  // Stack state\n  const tagStack: string[] = [];\n  let preserveWhitespace = false;\n  let excludeDepth = 0;\n\n  // Link/image context\n  let currentAnchorHref: string | null = null;\n  let inAnchor = false;\n  let anchorHasText = false;\n\n  // Output buffer\n  const out: string[] = [];\n\n  // Simple streaming tokenizer\n  const length = html.length;\n  let i = 0;\n\n  while (i < length) {\n    const ch = html.charCodeAt(i);\n\n    if (ch === 60 /* < */) {\n      // Parse tag\n      const tagStart = i;\n      const end = html.indexOf('>', tagStart + 1);\n\n      if (end === -1) {\n        // Malformed tail: treat as text\n        emitText(html.slice(i), out, settings, preserveWhitespace);\n        break;\n      }\n\n      const rawTag = html.slice(tagStart + 1, end);\n      i = end + 1;\n\n      const isClosing = rawTag[0] === '/';\n      const tagBody = isClosing ? rawTag.slice(1) : rawTag;\n      const spaceIdx = indexOfSpace(tagBody);\n      let tagName = (spaceIdx === -1 ? tagBody : tagBody.slice(0, spaceIdx)).toLowerCase();\n\n      // Remove trailing slash for self-closing tags without space (e.g., <br/>)\n      if (tagName.endsWith('/')) {\n        tagName = tagName.slice(0, -1);\n      }\n\n      if (isClosing) {\n        // Closing tag\n        handleTagClose(tagName);\n      } else {\n        // Opening or self-closing tag\n        const selfClosing = rawTag.endsWith('/') || SELF_CLOSING_TAG_SET.has(tagName);\n        const attrs = spaceIdx === -1 ? '' : tagBody.slice(spaceIdx + 1);\n        handleTagOpen(tagName, attrs, selfClosing);\n      }\n      continue;\n    }\n\n    // Text node\n    const nextTag = html.indexOf('<', i);\n    const text = nextTag === -1 ? html.slice(i) : html.slice(i, nextTag);\n    i = nextTag === -1 ? length : nextTag;\n\n    if (excludeDepth > 0) {\n      continue;\n    }\n\n    if (insideTable > 0) {\n      // Accumulate raw text for the current cell\n      cellBuffer.push(text);\n    } else {\n      // Track if anchor has text before potentially suppressing it\n      if (inAnchor && /\\S/.test(text)) {\n        anchorHasText = true;\n      }\n\n      // Suppress text content when inside a link that should be removed\n      const shouldSuppressText = inAnchor && settings.links === 'remove';\n      if (!shouldSuppressText) {\n        emitText(text, out, settings, preserveWhitespace);\n      }\n    }\n  }\n\n  let result = out.join('');\n\n  // Capture leading/trailing whitespace before collapse (for trim: false)\n  const leadingMatch = result.match(/^(\\s*)/);\n  const trailingMatch = result.match(/(\\s*)$/);\n  const leadingWs = leadingMatch ? leadingMatch[1] : '';\n  const trailingWs = trailingMatch ? trailingMatch[1] : '';\n\n  if (settings.collapseWhitespace) {\n    result = collapseWhitespace(result, settings.maxNewlines, settings.trim);\n  }\n\n  if (settings.wrap != null && settings.wrap > 0) {\n    result = hardWrap(result, settings.wrap);\n  }\n\n  // Remove preserve markers (they were used during collapse and wrap)\n  result = result.replace(new RegExp(PRESERVE_OPEN, 'g'), '');\n  result = result.replace(new RegExp(PRESERVE_CLOSE, 'g'), '');\n\n  if (settings.trim) {\n    result = result.trim();\n  } else if (settings.collapseWhitespace && (leadingWs || trailingWs)) {\n    // Restore some whitespace when trim: false but collapse removed it\n    // At least preserve one space if there was any leading/trailing whitespace\n    if (leadingWs && !result.startsWith(' ') && !result.startsWith('\\n')) {\n      result = ` ${result}`;\n    }\n    if (trailingWs && !result.endsWith(' ') && !result.endsWith('\\n')) {\n      result = `${result} `;\n    }\n  }\n\n  return result;\n\n  // --- Helper functions ---\n\n  function pushTag(name: string): void {\n    tagStack.push(name);\n    if (preservedTagSet.has(name)) {\n      preserveWhitespace = true;\n    }\n    if (excludedTagSet.has(name)) {\n      excludeDepth += 1;\n    }\n    if (name === 'table') {\n      insideTable += 1;\n    }\n  }\n\n  function popTag(name: string): void {\n    // Pop until matching name (best-effort against malformed HTML)\n    for (let idx = tagStack.length - 1; idx >= 0; idx -= 1) {\n      const t = tagStack[idx];\n      tagStack.length = idx;\n\n      if (preservedTagSet.has(t)) {\n        preserveWhitespace = false;\n      }\n      if (excludedTagSet.has(t)) {\n        excludeDepth = Math.max(0, excludeDepth - 1);\n      }\n      if (t === 'table') {\n        insideTable = Math.max(0, insideTable - 1);\n      }\n      if (t === name) {\n        break;\n      }\n    }\n  }\n\n  function handleTagOpen(tagName: string, attrs: string, selfClosing: boolean): void {\n    if (excludedTagSet.has(tagName)) {\n      pushTag(tagName);\n      return;\n    }\n\n    if (tagName === 'br') {\n      out.push('\\n');\n      return;\n    }\n\n    if (tagName === 'a') {\n      currentAnchorHref = extractAttr(attrs, 'href');\n      inAnchor = true;\n      anchorHasText = false;\n      pushTag(tagName);\n      if (selfClosing) {\n        handleTagClose(tagName);\n      }\n      return;\n    }\n\n    if (tagName === 'img') {\n      if (settings.images === 'alt') {\n        const alt = extractAttr(attrs, 'alt');\n        if (alt) {\n          emitText(alt, out, settings, true);\n        }\n      }\n      // If we are between anchors, keep a separating space to avoid collapsing words\n      if (inAnchor) {\n        out.push(' ');\n      }\n      return;\n    }\n\n    if (tagName === 'td' || tagName === 'th') {\n      if (insideTable > 0) {\n        cellBuffer = [];\n      }\n      pushTag(tagName);\n      if (selfClosing) {\n        handleTagClose(tagName);\n      }\n      return;\n    }\n\n    if (tagName === 'tr') {\n      pushTag(tagName);\n      if (selfClosing) {\n        handleTagClose(tagName);\n      }\n      return;\n    }\n\n    // If entering a whitespace-preserved tag and previous output isn't at line start,\n    // insert a newline to separate block context from pre/code content.\n    if (preservedTagSet.has(tagName) && tagName !== 'code') {\n      ensureNewline(out);\n    }\n\n    pushTag(tagName);\n    if (selfClosing) {\n      handleTagClose(tagName);\n    }\n  }\n\n  function handleTagClose(tagName: string): void {\n    if (excludedTagSet.has(tagName)) {\n      popTag(tagName);\n      return;\n    }\n\n    if (tagName === 'a') {\n      const shouldInline =\n        !!currentAnchorHref &&\n        (settings.links === 'inline' || (!anchorHasText && settings.images === 'remove'));\n\n      if (shouldInline && currentAnchorHref) {\n        const prev = out.length > 0 ? out[out.length - 1] : '';\n        const needSpace = anchorHasText\n          ? prev.length > 0 && !prev.endsWith(' ') && !prev.endsWith('\\n')\n          : true;\n\n        if (needSpace) {\n          out.push(' ');\n        }\n        out.push('(', currentAnchorHref, ')');\n      }\n\n      currentAnchorHref = null;\n      inAnchor = false;\n      anchorHasText = false;\n      popTag(tagName);\n      return;\n    }\n\n    if (tagName === 'td' || tagName === 'th') {\n      if (insideTable > 0) {\n        const text = cellBuffer.join('');\n        const normalized = settings.collapseWhitespace\n          ? collapseWhitespace(\n              processText(text, settings, preserveWhitespace),\n              settings.maxNewlines,\n              settings.trim,\n            )\n          : processText(text, settings, preserveWhitespace);\n\n        // Append separator (we'll remove trailing separator on row close)\n        out.push(normalized, cellSep);\n        cellBuffer = [];\n      }\n      popTag(tagName);\n      return;\n    }\n\n    if (tagName === 'tr') {\n      // Remove trailing cell separator if present\n      if (out.length > 0 && out[out.length - 1] === cellSep) {\n        out.pop();\n      }\n      ensureNewline(out);\n      popTag(tagName);\n      return;\n    }\n\n    if (blockTagSet.has(tagName)) {\n      // Block elements end with a newline\n      ensureNewline(out);\n    }\n\n    popTag(tagName);\n  }\n}\n\n// --- Normalization and helpers ---\n\ninterface NormalizedOptions {\n  mode: 'fragment' | 'document';\n  links: 'text' | 'inline' | 'remove';\n  images: 'alt' | 'remove';\n  collapseWhitespace: boolean;\n  maxNewlines: number;\n  wrap: number | null;\n  tableCellSeparator: 'tab' | 'space';\n  excludeTags: string[];\n  decodeEntities: boolean;\n  preserveTags: string[];\n  trim: boolean;\n}\n\nfunction normalizeOptions(o: HtmlToTextOptions): NormalizedOptions {\n  return {\n    mode: o.mode === 'document' ? 'document' : 'fragment',\n    links: o.links === 'inline' || o.links === 'remove' ? o.links : 'text',\n    images: o.images === 'remove' ? 'remove' : 'alt',\n    collapseWhitespace: o.collapseWhitespace !== false,\n    maxNewlines: typeof o.maxNewlines === 'number' && o.maxNewlines >= 1 ? o.maxNewlines : 2,\n    wrap: typeof o.wrap === 'number' && o.wrap > 0 ? Math.floor(o.wrap) : null,\n    tableCellSeparator: o.tableCellSeparator === 'space' ? 'space' : 'tab',\n    excludeTags: Array.isArray(o.excludeTags)\n      ? o.excludeTags.map((x) => String(x).toLowerCase())\n      : ['script', 'style', 'noscript', 'template', 'svg', 'canvas'],\n    decodeEntities: o.decodeEntities !== false,\n    preserveTags: Array.isArray(o.preserveTags)\n      ? o.preserveTags.map((x) => String(x).toLowerCase())\n      : ['pre', 'code', 'textarea'],\n    trim: o.trim !== false,\n  };\n}\n\nfunction toSet(arr: string[]): Set<string> {\n  return new Set(arr);\n}\n\nfunction emitText(\n  text: string,\n  out: string[],\n  settings: NormalizedOptions,\n  preserveWhitespace: boolean,\n): void {\n  if (text.length === 0) {\n    return;\n  }\n  const processed = processText(text, settings, preserveWhitespace);\n  out.push(processed);\n}\n\nfunction processText(\n  text: string,\n  settings: NormalizedOptions,\n  preserveWhitespace: boolean,\n): string {\n  let t = text;\n\n  if (settings.decodeEntities) {\n    t = decodeEntities(t);\n  }\n\n  if (preserveWhitespace) {\n    // Mark region to bypass global collapse\n    return PRESERVE_OPEN + t + PRESERVE_CLOSE;\n  }\n\n  if (settings.collapseWhitespace) {\n    // Collapse all whitespace (including newlines) to single spaces\n    t = t.replace(/[\\t\\f\\v\\r\\n ]+/g, ' ');\n  }\n\n  return t;\n}\n\nfunction ensureNewline(out: string[]): void {\n  if (out.length === 0) {\n    return;\n  }\n  const last = out[out.length - 1];\n  if (last.endsWith('\\n')) {\n    return;\n  }\n  out.push('\\n');\n}\n\nfunction collapseWhitespace(input: string, maxNewlines: number, trim: boolean): string {\n  if (input.indexOf(PRESERVE_OPEN) === -1) {\n    return collapseWhitespaceGlobal(input, maxNewlines, trim);\n  }\n\n  let result = '';\n  let idx = 0;\n\n  while (idx < input.length) {\n    const open = input.indexOf(PRESERVE_OPEN, idx);\n    if (open === -1) {\n      result += collapseWhitespaceGlobal(input.slice(idx), maxNewlines, trim);\n      break;\n    }\n\n    result += collapseWhitespaceGlobal(input.slice(idx, open), maxNewlines, trim);\n    const close = input.indexOf(PRESERVE_CLOSE, open + 1);\n\n    if (close === -1) {\n      // Unmatched: treat rest as normal\n      result += collapseWhitespaceGlobal(input.slice(open + 1), maxNewlines, trim);\n      break;\n    }\n\n    // Keep preserved content with markers (for hardWrap to respect)\n    result += input.slice(open, close + 1);\n    idx = close + 1;\n  }\n\n  return result;\n}\n\nfunction collapseWhitespaceGlobal(input: string, maxNewlines: number, trim: boolean): string {\n  let s = input.replace(/[\\u00A0]/g, ' '); // nbsp → space early\n  // Normalize CRLF/CR to LF\n  s = s.replace(/\\r\\n?|\\u2028|\\u2029/g, '\\n');\n\n  if (trim) {\n    // Aggressive collapse: remove spaces around newlines\n    s = s.replace(/[ \\t\\f\\v]+\\n/g, '\\n');\n    s = s.replace(/\\n[ \\t\\f\\v]+/g, '\\n');\n  }\n\n  // Limit newline runs\n  const re = new RegExp(`\\\\n{${maxNewlines + 1},}`, 'g');\n  s = s.replace(re, '\\n'.repeat(maxNewlines));\n  // Collapse remaining horizontal whitespace\n  s = s.replace(/[ \\t\\f\\v]{2,}/g, ' ');\n  return s;\n}\n\nfunction hardWrap(input: string, width: number): string {\n  const lines = input.split('\\n');\n  const wrapped: string[] = [];\n\n  for (const line of lines) {\n    // Don't wrap lines that contain preserved content\n    if (line.includes(PRESERVE_OPEN)) {\n      wrapped.push(line);\n      continue;\n    }\n\n    if (line.length <= width) {\n      wrapped.push(line);\n      continue;\n    }\n\n    let start = 0;\n    while (start < line.length) {\n      const end = Math.min(start + width, line.length);\n      wrapped.push(line.slice(start, end));\n      start = end;\n    }\n  }\n\n  return wrapped.join('\\n');\n}\n\nfunction decodeEntities(s: string): string {\n  // Numeric (decimal and hex)\n  s = s.replace(/&#(\\d+);/g, (_, d) => safeFromCodePoint(Number(d)));\n  s = s.replace(/&#x([0-9a-fA-F]+);/g, (_, h) => safeFromCodePoint(Number.parseInt(h, 16)));\n  // Common named entities\n  s = s.replace(/&([a-zA-Z]+);/g, (_, name) => NAMED_ENTITIES[name] || `&${name};`);\n  return s;\n}\n\nfunction safeFromCodePoint(cp: number): string {\n  if (!Number.isFinite(cp) || cp < 0 || cp > 0x10ffff) {\n    return '';\n  }\n  try {\n    return String.fromCodePoint(cp);\n  } catch {\n    return '';\n  }\n}\n\nfunction extractAttr(attrs: string, name: string): string | null {\n  const re = new RegExp(`(?:^|\\\\s)${name}\\\\s*=\\\\s*(\"([^\"]*)\"|'([^']*)'|([^\\\\s>]+))`, 'i');\n  const m = attrs.match(re);\n  if (!m) {\n    return null;\n  }\n  const val = m[2] ?? m[3] ?? m[4] ?? '';\n  return decodeEntities(val);\n}\n\nfunction indexOfSpace(s: string): number {\n  for (let i = 0; i < s.length; i += 1) {\n    const c = s.charCodeAt(i);\n    if (c === 32 || c === 9 || c === 10 || c === 12 || c === 13) {\n      return i;\n    }\n  }\n  return -1;\n}\n\n// --- Classification sets ---\n\nconst BLOCK_TAG_SET = toSet([\n  'p',\n  'div',\n  'section',\n  'article',\n  'header',\n  'footer',\n  'main',\n  'nav',\n  'aside',\n  'h1',\n  'h2',\n  'h3',\n  'h4',\n  'h5',\n  'h6',\n  'ul',\n  'ol',\n  'li',\n  'table',\n  'thead',\n  'tbody',\n  'tfoot',\n  'blockquote',\n  'figure',\n  'figcaption',\n  'hr',\n]);\n\nconst SELF_CLOSING_TAG_SET = toSet([\n  'br',\n  'img',\n  'hr',\n  'meta',\n  'link',\n  'input',\n  'source',\n  'track',\n  'wbr',\n]);\n\n// Markers for preserved regions in collapse pass\nconst PRESERVE_OPEN = '\\u2418'; // symbol for record separator visualization (any rare char)\nconst PRESERVE_CLOSE = '\\u2419';\n\nconst NAMED_ENTITIES: Record<string, string> = Object.freeze({\n  amp: '&',\n  lt: '<',\n  gt: '>',\n  quot: '\"',\n  apos: \"'\",\n  nbsp: '\\u00A0',\n  mdash: '\\u2014',\n  ndash: '\\u2013',\n  hellip: '\\u2026',\n  copy: '\\u00A9',\n  reg: '\\u00AE',\n  trade: '\\u2122',\n  laquo: '\\u00AB',\n  raquo: '\\u00BB',\n  lsquo: '\\u2018',\n  rsquo: '\\u2019',\n  ldquo: '\\u201C',\n  rdquo: '\\u201D',\n  euro: '\\u20AC',\n  middot: '\\u00B7',\n  bull: '\\u2022',\n});\n","/**\n * URL normalization utilities for resolving relative URLs to absolute URLs.\n *\n * @remarks\n * This module provides utilities for converting relative URLs to absolute URLs with\n * best-effort error handling. All functions are designed to never throw errors - if\n * normalization fails, the original string is returned unchanged.\n *\n * Supports all common relative URL formats:\n * - Absolute paths: `/path` → `https://example.com/path`\n * - Relative paths: `./path`, `../path`, `path`\n * - Protocol-relative: `//cdn.com/file` → `https://cdn.com/file`\n *\n * Features HTTP to HTTPS upgrade by default (unless base URL is explicitly HTTP).\n *\n * @packageDocumentation\n */\n\n/**\n * Normalize a URL to absolute form using a base URL.\n *\n * @remarks\n * This function converts relative URLs to absolute URLs. It handles all common\n * relative URL formats and never throws errors. If normalization fails for any\n * reason, the original string is returned unchanged.\n *\n * @example\n * ```typescript\n * // Absolute path\n * normalizeUrl('https://example.com/feed.xml', '/blog/post')\n * // Returns: \"https://example.com/blog/post\"\n *\n * // Relative path\n * normalizeUrl('https://example.com/feeds/rss.xml', '../images/logo.png')\n * // Returns: \"https://example.com/images/logo.png\"\n *\n * // Protocol-relative\n * normalizeUrl('https://example.com/feed.xml', '//cdn.example.com/file.mp3')\n * // Returns: \"https://cdn.example.com/file.mp3\"\n *\n * // No base URL - returns as-is\n * normalizeUrl(null, '/blog/post')\n * // Returns: \"/blog/post\"\n * ```\n *\n * @param baseUrl - Base URL for resolving relative URLs (string or URL object)\n * @param urlString - URL to normalize (can be relative, absolute, protocol-relative, etc.)\n * @returns Normalized absolute URL, or original string if normalization fails\n */\nexport function normalizeUrl(\n  baseUrl: string | URL | null | undefined,\n  urlString: string | null | undefined,\n): string {\n  // Return original if no URL string provided\n  if (!urlString || typeof urlString !== 'string') {\n    return urlString || '';\n  }\n\n  const trimmed = urlString.trim();\n  if (!trimmed) {\n    return urlString;\n  }\n\n  // No base URL - try to validate as absolute or return as-is\n  if (!baseUrl) {\n    return validateOrReturnOriginal(trimmed);\n  }\n\n  try {\n    // Parse base URL\n    const base = typeof baseUrl === 'string' ? new URL(baseUrl) : baseUrl;\n\n    // Check if URL is already absolute\n    if (isAbsoluteUrl(trimmed)) {\n      return validateOrReturnOriginal(trimmed);\n    }\n\n    // Handle protocol-relative URLs (//example.com/path)\n    if (trimmed.startsWith('//')) {\n      const protocol = base.protocol || 'https:';\n      return validateOrReturnOriginal(`${protocol}${trimmed}`);\n    }\n\n    // Handle absolute paths (/path)\n    if (trimmed.startsWith('/')) {\n      const origin = base.origin;\n      return validateOrReturnOriginal(`${origin}${trimmed}`);\n    }\n\n    // Handle relative paths (./path, ../path, or just path)\n    // Use URL constructor to resolve relative to base\n    const resolved = new URL(trimmed, base);\n    return resolved.href;\n  } catch {\n    // If anything fails, return original\n    return urlString;\n  }\n}\n\n/**\n * Check if URL is absolute (has protocol)\n */\nfunction isAbsoluteUrl(url: string): boolean {\n  try {\n    // Try to parse as URL\n    const parsed = new URL(url);\n    // Must have protocol and host\n    return Boolean(parsed.protocol && parsed.host);\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Validate URL or return original\n * Attempts to parse and clean up the URL\n */\nfunction validateOrReturnOriginal(url: string): string {\n  try {\n    const parsed = new URL(url);\n    return parsed.href;\n  } catch {\n    return url;\n  }\n}\n\n/**\n * Normalize multiple URLs at once.\n *\n * @remarks\n * Convenience function for batch URL normalization. Filters out null/undefined values.\n *\n * @param baseUrl - Base URL for resolving relative URLs\n * @param urls - Array of URLs to normalize\n * @returns Array of normalized URLs (nulls/undefined filtered out)\n */\nexport function normalizeUrls(\n  baseUrl: string | URL | null | undefined,\n  urls: (string | null | undefined)[] | null | undefined,\n): string[] {\n  if (!urls || !Array.isArray(urls)) {\n    return [];\n  }\n\n  return urls.map((url) => normalizeUrl(baseUrl, url)).filter((url): url is string => Boolean(url));\n}\n\n/**\n * Upgrade HTTP URLs to HTTPS (unless base URL is explicitly HTTP).\n *\n * @remarks\n * This function implements the HTTPS-by-default policy. HTTP URLs are automatically\n * upgraded to HTTPS unless the base URL itself is HTTP, indicating an HTTP-only site.\n *\n * @param baseUrl - Base URL (determines if HTTP should be kept)\n * @param url - URL to potentially upgrade\n * @returns URL with HTTPS protocol if appropriate, otherwise unchanged\n */\nexport function preferHttps(baseUrl: string | URL | null | undefined, url: string): string {\n  if (!url || !url.startsWith('http://')) {\n    return url;\n  }\n\n  // If base URL is explicitly HTTP, keep HTTP\n  if (baseUrl) {\n    try {\n      const base = typeof baseUrl === 'string' ? new URL(baseUrl) : baseUrl;\n      if (base.protocol === 'http:') {\n        return url;\n      }\n    } catch {\n      // Ignore errors\n    }\n  }\n\n  // Try to upgrade to HTTPS\n  return url.replace(/^http:/, 'https:');\n}\n\n/**\n * Normalize URL and prefer HTTPS protocol.\n *\n * @remarks\n * Convenience function combining {@link normalizeUrl} with {@link preferHttps}.\n * This is the recommended function for most use cases.\n *\n * @param baseUrl - Base URL for resolving relative URLs\n * @param urlString - URL to normalize\n * @returns Normalized absolute URL with HTTPS preference\n */\nexport function normalizeUrlHttps(\n  baseUrl: string | URL | null | undefined,\n  urlString: string | null | undefined,\n): string {\n  const normalized = normalizeUrl(baseUrl, urlString);\n  return preferHttps(baseUrl, normalized);\n}\n","/**\n * Text cleaning utilities for Atom feeds\n */\n\n/**\n * Strip CDATA tags from text\n */\nfunction stripCDATA(text: string): string {\n  return text.replace(/<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>/g, '$1');\n}\n\n/**\n * Decode HTML entities\n */\nfunction decodeEntities(text: string): string {\n  // Common HTML entities\n  const entities: Record<string, string> = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&apos;': \"'\",\n    '&#39;': \"'\",\n  };\n\n  let result = text;\n  for (const [entity, char] of Object.entries(entities)) {\n    result = result.replace(new RegExp(entity, 'g'), char);\n  }\n\n  // Decode numeric entities (&#123; or &#xAB;)\n  result = result.replace(/&#(\\d+);/g, (_match, dec) => {\n    return String.fromCharCode(Number.parseInt(dec, 10));\n  });\n  result = result.replace(/&#x([0-9A-Fa-f]+);/g, (_match, hex) => {\n    return String.fromCharCode(Number.parseInt(hex, 16));\n  });\n\n  return result;\n}\n\n/**\n * Normalize whitespace (collapse multiple spaces, trim)\n */\nfunction normalizeWhitespace(text: string): string {\n  return text.replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * Clean text by applying all transformations\n */\nfunction cleanText(text: string | null | undefined): string {\n  if (!text) {\n    return '';\n  }\n  return normalizeWhitespace(decodeEntities(stripCDATA(text)));\n}\n\n/**\n * Clean text content based on Atom content type\n * @param text - Raw text\n * @param type - Atom content type (text, html, xhtml, or mime type)\n * @returns Cleaned text\n */\nexport function cleanAtomContent(\n  text: string | null | undefined,\n  type: string | null | undefined = 'text',\n): string {\n  if (!text) {\n    return '';\n  }\n\n  const contentType = (type || 'text').toLowerCase().trim();\n\n  // For text type, decode entities and clean whitespace\n  if (contentType === 'text') {\n    return cleanText(text);\n  }\n\n  // For HTML/XHTML, we keep HTML entities and structure\n  // Only normalize whitespace and strip CDATA\n  if (contentType === 'html' || contentType === 'xhtml') {\n    return normalizeWhitespace(stripCDATA(text));\n  }\n\n  // For other mime types (e.g., application/xml), preserve as-is after basic cleaning\n  return normalizeWhitespace(stripCDATA(text));\n}\n\n// Export individual utilities for internal use\nexport { stripCDATA, decodeEntities, normalizeWhitespace, cleanText };\n","/**\n * Atom date parsing utilities\n * Atom uses RFC 3339 / ISO 8601 date format\n * Examples: \"2025-12-17T10:00:00Z\", \"2025-12-17T10:00:00+01:00\"\n */\n\n/**\n * Parse RFC 3339 / ISO 8601 date to ISO 8601 string\n * Atom dates are already in ISO 8601 format, just validate and normalize\n */\nexport function parseRFC3339Date(dateString: string | null | undefined): string | null {\n  if (!dateString || typeof dateString !== 'string') {\n    return null;\n  }\n\n  const trimmed = dateString.trim();\n  if (!trimmed) {\n    return null;\n  }\n\n  try {\n    // JavaScript's Date constructor handles ISO 8601 / RFC 3339 well\n    const date = new Date(trimmed);\n\n    // Check if date is valid\n    if (Number.isNaN(date.getTime())) {\n      return null;\n    }\n\n    // Return as ISO 8601 string\n    return date.toISOString();\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Parse Atom date (alias for clarity)\n */\nexport function parseAtomDate(dateString: string | null | undefined): string | null {\n  return parseRFC3339Date(dateString);\n}\n\n/**\n * Check if a date string is valid\n */\nexport function isValidAtomDate(dateString: string | null | undefined): boolean {\n  return parseRFC3339Date(dateString) !== null;\n}\n","/**\n * Extract Atom entry metadata\n */\n\nimport { cleanAtomContent, cleanText } from './clean-text.js';\nimport { parseAtomDate } from './parse-date.js';\nimport type {\n  AtomCategory,\n  AtomContent,\n  AtomEntry,\n  AtomFeed,\n  AtomLink,\n  AtomPerson,\n} from './types.js';\nimport type { AtomElement } from './xml-parser.js';\n\n/**\n * Extract date from element with fallbacks for different Atom versions and extensions\n * Tries selectors in order: updated (Atom 1.0), modified (Atom 0.3), issued (Atom 0.3), dc:date (Dublin Core)\n */\nfunction extractAtomDate(element: AtomElement): string | null {\n  // Try Atom 1.0 <updated>\n  let dateText = element.querySelector('updated')?.textContent;\n  if (dateText) {\n    const parsed = parseAtomDate(dateText);\n    if (parsed) return parsed;\n  }\n\n  // Try Atom 0.3 <modified>\n  dateText = element.querySelector('modified')?.textContent;\n  if (dateText) {\n    const parsed = parseAtomDate(dateText);\n    if (parsed) return parsed;\n  }\n\n  // Try Atom 0.3 <issued>\n  dateText = element.querySelector('issued')?.textContent;\n  if (dateText) {\n    const parsed = parseAtomDate(dateText);\n    if (parsed) return parsed;\n  }\n\n  // Try Dublin Core <dc:date>\n  const dcDateElements = element.children.filter((child) => child.tagName === 'dc:date');\n  if (dcDateElements.length > 0) {\n    dateText = dcDateElements[0].textContent;\n    if (dateText) {\n      const parsed = parseAtomDate(dateText);\n      if (parsed) return parsed;\n    }\n  }\n\n  return null;\n}\n\n/**\n * Extract person (author, contributor)\n */\nfunction extractPerson(element: AtomElement): AtomPerson | null {\n  const name = element.querySelector('name')?.textContent;\n  if (!name) {\n    return null; // Name is required for person construct\n  }\n\n  const person: AtomPerson = {\n    name: cleanText(name),\n  };\n\n  const email = element.querySelector('email')?.textContent;\n  if (email) {\n    person.email = cleanText(email);\n  }\n\n  const uri = element.querySelector('uri')?.textContent;\n  if (uri) {\n    person.uri = cleanText(uri);\n  }\n\n  return person;\n}\n\n/**\n * Extract all persons of a given tag name\n */\nfunction extractPersons(root: AtomElement, tagName: string): AtomPerson[] {\n  const persons: AtomPerson[] = [];\n  const elements = root.querySelectorAll(tagName);\n\n  for (const element of elements) {\n    const person = extractPerson(element);\n    if (person) {\n      persons.push(person);\n    }\n  }\n\n  return persons;\n}\n\n/**\n * Extract link\n */\nfunction extractLink(element: AtomElement): AtomLink | null {\n  const href = element.getAttribute('href');\n  if (!href) {\n    return null; // href is required\n  }\n\n  const link: AtomLink = {\n    href: cleanText(href),\n  };\n\n  const rel = element.getAttribute('rel');\n  if (rel) {\n    link.rel = cleanText(rel);\n  }\n\n  const type = element.getAttribute('type');\n  if (type) {\n    link.type = cleanText(type);\n  }\n\n  const hreflang = element.getAttribute('hreflang');\n  if (hreflang) {\n    link.hreflang = cleanText(hreflang);\n  }\n\n  const title = element.getAttribute('title');\n  if (title) {\n    link.title = cleanText(title);\n  }\n\n  const length = element.getAttribute('length');\n  if (length) {\n    const lengthNum = Number.parseInt(length, 10);\n    if (!Number.isNaN(lengthNum)) {\n      link.length = lengthNum;\n    }\n  }\n\n  return link;\n}\n\n/**\n * Extract all links\n */\nfunction extractLinks(root: AtomElement): AtomLink[] {\n  const links: AtomLink[] = [];\n  const elements = root.querySelectorAll('link');\n\n  for (const element of elements) {\n    const link = extractLink(element);\n    if (link) {\n      links.push(link);\n    }\n  }\n\n  return links;\n}\n\n/**\n * Extract category\n */\nfunction extractCategory(element: AtomElement): AtomCategory | null {\n  const term = element.getAttribute('term');\n  if (!term) {\n    return null; // term is required\n  }\n\n  const category: AtomCategory = {\n    term: cleanText(term),\n  };\n\n  const scheme = element.getAttribute('scheme');\n  if (scheme) {\n    category.scheme = cleanText(scheme);\n  }\n\n  const label = element.getAttribute('label');\n  if (label) {\n    category.label = cleanText(label);\n  }\n\n  return category;\n}\n\n/**\n * Extract all categories\n */\nfunction extractCategories(root: AtomElement): AtomCategory[] {\n  const categories: AtomCategory[] = [];\n  const elements = root.querySelectorAll('category');\n\n  for (const element of elements) {\n    const category = extractCategory(element);\n    if (category) {\n      categories.push(category);\n    }\n  }\n\n  return categories;\n}\n\n/**\n * Extract content\n */\nfunction extractContent(root: AtomElement): AtomContent | undefined {\n  const element = root.querySelector('content');\n  if (!element) {\n    return undefined;\n  }\n\n  const type = element.getAttribute('type');\n  const src = element.getAttribute('src');\n  const text = element.textContent;\n\n  if (!text && !src) {\n    return undefined;\n  }\n\n  const content: AtomContent = {\n    value: text ? cleanAtomContent(text, type) : '',\n  };\n\n  if (type) {\n    content.type = cleanText(type);\n  }\n\n  if (src) {\n    content.src = cleanText(src);\n  }\n\n  return content;\n}\n\n/**\n * Extract text content with type attribute\n */\nfunction extractTextContent(root: AtomElement, tagName: string): string | undefined {\n  const element = root.querySelector(tagName);\n  if (!element) {\n    return undefined;\n  }\n\n  const text = element.textContent;\n  const type = element.getAttribute('type');\n\n  return text ? cleanAtomContent(text, type) : undefined;\n}\n\n/**\n * Extract Atom entry\n */\nexport function extractEntry(entryElement: AtomElement): AtomEntry {\n  // Required fields\n  const id = entryElement.querySelector('id')?.textContent;\n  if (!id) {\n    throw new Error('Invalid Atom entry: missing required <id> element');\n  }\n\n  const title = extractTextContent(entryElement, 'title');\n  if (!title) {\n    throw new Error('Invalid Atom entry: missing required <title> element');\n  }\n\n  const updated = extractAtomDate(entryElement);\n  if (!updated) {\n    throw new Error(\n      'Invalid Atom entry: missing or invalid date (tried <updated>, <modified>, <issued>, <dc:date>)',\n    );\n  }\n\n  const entry: AtomEntry = {\n    id: cleanText(id),\n    title,\n    updated,\n  };\n\n  // Optional fields\n  const authors = extractPersons(entryElement, 'author');\n  if (authors.length > 0) {\n    entry.authors = authors;\n  }\n\n  const content = extractContent(entryElement);\n  if (content) {\n    entry.content = content;\n  }\n\n  const links = extractLinks(entryElement);\n  if (links.length > 0) {\n    entry.links = links;\n  }\n\n  const summary = extractTextContent(entryElement, 'summary');\n  if (summary) {\n    entry.summary = summary;\n  }\n\n  const categories = extractCategories(entryElement);\n  if (categories.length > 0) {\n    entry.categories = categories;\n  }\n\n  const contributors = extractPersons(entryElement, 'contributor');\n  if (contributors.length > 0) {\n    entry.contributors = contributors;\n  }\n\n  const publishedRaw = entryElement.querySelector('published')?.textContent;\n  if (publishedRaw) {\n    const published = parseAtomDate(publishedRaw);\n    if (published) {\n      entry.published = published;\n    }\n  }\n\n  const rights = extractTextContent(entryElement, 'rights');\n  if (rights) {\n    entry.rights = rights;\n  }\n\n  // Source is a partial feed\n  const source = entryElement.querySelector('source');\n  if (source) {\n    const sourceData: Partial<AtomFeed> = {};\n\n    const sourceId = source.querySelector('id')?.textContent;\n    if (sourceId) {\n      sourceData.id = cleanText(sourceId);\n    }\n\n    const sourceTitle = extractTextContent(source, 'title');\n    if (sourceTitle) {\n      sourceData.title = sourceTitle;\n    }\n\n    const sourceUpdatedRaw = source.querySelector('updated')?.textContent;\n    if (sourceUpdatedRaw) {\n      const sourceUpdated = parseAtomDate(sourceUpdatedRaw);\n      if (sourceUpdated) {\n        sourceData.updated = sourceUpdated;\n      }\n    }\n\n    if (Object.keys(sourceData).length > 0) {\n      entry.source = sourceData;\n    }\n  }\n\n  return entry;\n}\n","/**\n * Minimal Atom-specific XML parser\n * Built specifically for Atom 1.0 feeds with their specific quirks\n */\n\nexport interface AtomElement {\n  /** Tag name (e.g., 'feed', 'entry', 'title') */\n  tagName: string;\n  /** Element attributes */\n  attributes: Record<string, string>;\n  /** Text content (with CDATA stripped) */\n  text: string;\n  /** Child elements */\n  children: AtomElement[];\n  /** Parent element (for traversal) */\n  parent: AtomElement | null;\n\n  /** Query selector - find first matching child */\n  querySelector: (selector: string) => AtomElement | null;\n  /** Query selector all - find all matching children */\n  querySelectorAll: (selector: string) => AtomElement[];\n  /** Get attribute value */\n  getAttribute: (name: string) => string | null;\n  /** Get text content */\n  get textContent(): string;\n}\n\n/**\n * Remove XML comments\n */\nfunction removeComments(xml: string): string {\n  return xml.replace(/<!--[\\s\\S]*?-->/g, '');\n}\n\n/**\n * Remove DOCTYPE declarations\n */\nfunction removeDoctype(xml: string): string {\n  return xml.replace(/<!DOCTYPE[^>]*>/gi, '');\n}\n\n/**\n * Parse Atom XML string into element tree\n */\nexport function parseAtomXML(xml: string): AtomElement {\n  const withoutDoctype = removeDoctype(xml);\n  const withoutComments = removeComments(withoutDoctype);\n  const { text: cleanedXML, cdataMap } = extractCDATA(withoutComments);\n  const root = parseElement(cleanedXML, 0, null, cdataMap).element;\n  return root;\n}\n\n/**\n * Extract CDATA content and replace with placeholder\n */\nfunction extractCDATA(text: string): { text: string; cdataMap: Map<string, string> } {\n  const cdataMap = new Map<string, string>();\n  let counter = 0;\n\n  const processed = text.replace(/<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>/g, (_match, content) => {\n    const placeholder = `__CDATA_${counter}__`;\n    cdataMap.set(placeholder, content);\n    counter++;\n    return placeholder;\n  });\n\n  return { text: processed, cdataMap };\n}\n\n/**\n * Restore CDATA content from placeholders\n */\nfunction restoreCDATA(text: string, cdataMap: Map<string, string>): string {\n  let result = text;\n  for (const [placeholder, content] of cdataMap.entries()) {\n    result = result.replace(placeholder, content);\n  }\n  return result;\n}\n\n/**\n * Parse attributes from opening tag\n */\nfunction parseAttributes(tagContent: string): Record<string, string> {\n  const attributes: Record<string, string> = {};\n  const attrRegex = /(\\S+)=[\"']([^\"']*)[\"']/g;\n  let match: RegExpExecArray | null = attrRegex.exec(tagContent);\n\n  while (match !== null) {\n    attributes[match[1]] = match[2];\n    match = attrRegex.exec(tagContent);\n  }\n\n  return attributes;\n}\n\n/**\n * Find matching closing tag position\n */\nfunction findClosingTag(xml: string, tagName: string, startPos: number): number {\n  const openTag = `<${tagName}`;\n  const closeTag = `</${tagName}>`;\n  let depth = 1;\n  let pos = startPos;\n\n  while (pos < xml.length && depth > 0) {\n    const nextOpen = xml.indexOf(openTag, pos);\n    const nextClose = xml.indexOf(closeTag, pos);\n\n    if (nextClose === -1) {\n      return -1; // No closing tag found\n    }\n\n    if (nextOpen !== -1 && nextOpen < nextClose) {\n      // Found nested opening tag\n      depth++;\n      pos = nextOpen + openTag.length;\n    } else {\n      // Found closing tag\n      depth--;\n      if (depth === 0) {\n        return nextClose;\n      }\n      pos = nextClose + closeTag.length;\n    }\n  }\n\n  return -1;\n}\n\n/**\n * Parse a single element and its children\n */\nfunction parseElement(\n  xml: string,\n  startPos: number,\n  parent: AtomElement | null = null,\n  cdataMap: Map<string, string>,\n): { element: AtomElement; endPos: number } {\n  // Find opening tag\n  const openTagStart = xml.indexOf('<', startPos);\n  if (openTagStart === -1) {\n    throw new Error('No opening tag found');\n  }\n\n  const openTagEnd = xml.indexOf('>', openTagStart);\n  if (openTagEnd === -1) {\n    throw new Error('Unclosed opening tag');\n  }\n\n  const openTagContent = xml.substring(openTagStart + 1, openTagEnd);\n\n  // Check for self-closing tag\n  const isSelfClosing = openTagContent.endsWith('/');\n  const tagContent = isSelfClosing ? openTagContent.slice(0, -1).trim() : openTagContent;\n\n  // Extract tag name and attributes\n  const spaceIndex = tagContent.indexOf(' ');\n  const tagName = spaceIndex === -1 ? tagContent : tagContent.substring(0, spaceIndex);\n  const attributes = spaceIndex === -1 ? {} : parseAttributes(tagContent.substring(spaceIndex));\n\n  const element: AtomElement = {\n    tagName,\n    attributes,\n    text: '',\n    children: [],\n    parent,\n    querySelector: (selector: string) => querySelector(element as AtomElement, selector),\n    querySelectorAll: (selector: string) => querySelectorAll(element as AtomElement, selector),\n    getAttribute: (name: string) => element.attributes[name] ?? null,\n    get textContent() {\n      return element.text;\n    },\n  };\n\n  // Handle self-closing tags\n  if (isSelfClosing) {\n    return {\n      element,\n      endPos: openTagEnd + 1,\n    };\n  }\n\n  // Find closing tag\n  const closingTagStart = findClosingTag(xml, tagName, openTagEnd + 1);\n  if (closingTagStart === -1) {\n    throw new Error(`No closing tag found for <${tagName}>`);\n  }\n\n  // Extract content between opening and closing tags\n  const contentStart = openTagEnd + 1;\n  const content = xml.substring(contentStart, closingTagStart);\n\n  // Parse children and text\n  const children: AtomElement[] = [];\n  const textParts: string[] = [];\n  let pos = 0;\n\n  while (pos < content.length) {\n    const nextTagStart = content.indexOf('<', pos);\n\n    if (nextTagStart === -1) {\n      // No more tags, rest is text\n      textParts.push(content.substring(pos));\n      break;\n    }\n\n    // Text before next tag\n    if (nextTagStart > pos) {\n      textParts.push(content.substring(pos, nextTagStart));\n    }\n\n    // Check if it's a closing tag or comment\n    if (content[nextTagStart + 1] === '/' || content[nextTagStart + 1] === '!') {\n      // Skip closing tags and comments\n      const tagEnd = content.indexOf('>', nextTagStart);\n      if (tagEnd !== -1) {\n        pos = tagEnd + 1;\n      } else {\n        break;\n      }\n      continue;\n    }\n\n    // Parse child element\n    try {\n      const { element: childElement, endPos } = parseElement(\n        xml,\n        contentStart + nextTagStart,\n        element,\n        cdataMap,\n      );\n      children.push(childElement);\n      pos = endPos - contentStart;\n    } catch {\n      // If parsing fails, treat as text\n      pos = nextTagStart + 1;\n    }\n  }\n\n  // Combine and clean text\n  const rawText = textParts.join('').trim();\n  const restoredText = restoreCDATA(rawText, cdataMap);\n  element.text = restoredText;\n  element.children = children;\n\n  const closingTagEnd = closingTagStart + `</${tagName}>`.length;\n\n  return {\n    element,\n    endPos: closingTagEnd,\n  };\n}\n\n/**\n * Query selector - find first matching element\n */\nfunction querySelector(element: AtomElement, selector: string): AtomElement | null {\n  // Search in direct children first\n  for (const child of element.children) {\n    if (child.tagName === selector) {\n      return child;\n    }\n  }\n\n  // Deep search\n  for (const child of element.children) {\n    const result = querySelector(child, selector);\n    if (result) {\n      return result;\n    }\n  }\n\n  return null;\n}\n\n/**\n * Query selector all - find all matching elements\n */\nfunction querySelectorAll(element: AtomElement, selector: string): AtomElement[] {\n  const results: AtomElement[] = [];\n\n  // Search direct children\n  for (const child of element.children) {\n    if (child.tagName === selector) {\n      results.push(child);\n    }\n  }\n\n  // Deep search in children (but don't add duplicates)\n  // const directChildrenTags = new Set(results.map((r) => r.tagName));\n  for (const child of element.children) {\n    const childResults = querySelectorAll(child, selector);\n    for (const childResult of childResults) {\n      if (!results.includes(childResult)) {\n        results.push(childResult);\n      }\n    }\n  }\n\n  return results;\n}\n\n/**\n * Parse XML and return root element\n */\nexport function parseXML(xml: string): AtomElement {\n  // Remove XML declaration and processing instructions\n  const cleaned = xml.replace(/<\\?[^?]*\\?>/g, '').trim();\n  return parseAtomXML(cleaned);\n}\n","/**\n * Extract Atom feed metadata\n */\n\nimport { cleanAtomContent, cleanText } from './clean-text.js';\nimport { parseAtomDate } from './parse-date.js';\nimport type { AtomCategory, AtomFeed, AtomGenerator, AtomLink, AtomPerson } from './types.js';\nimport { parseXML } from './xml-parser.js';\n\n/**\n * Extract date from element with fallbacks for different Atom versions and extensions\n * Tries selectors in order: updated (Atom 1.0), modified (Atom 0.3), issued (Atom 0.3), dc:date (Dublin Core)\n */\nfunction extractAtomDate(element: ReturnType<typeof parseXML>): string | null {\n  // Try Atom 1.0 <updated>\n  let dateText = element.querySelector('updated')?.textContent;\n  if (dateText) {\n    const parsed = parseAtomDate(dateText);\n    if (parsed) return parsed;\n  }\n\n  // Try Atom 0.3 <modified>\n  dateText = element.querySelector('modified')?.textContent;\n  if (dateText) {\n    const parsed = parseAtomDate(dateText);\n    if (parsed) return parsed;\n  }\n\n  // Try Atom 0.3 <issued>\n  dateText = element.querySelector('issued')?.textContent;\n  if (dateText) {\n    const parsed = parseAtomDate(dateText);\n    if (parsed) return parsed;\n  }\n\n  // Try Dublin Core <dc:date>\n  const dcDateElements = element.children.filter((child) => child.tagName === 'dc:date');\n  if (dcDateElements.length > 0) {\n    dateText = dcDateElements[0].textContent;\n    if (dateText) {\n      const parsed = parseAtomDate(dateText);\n      if (parsed) return parsed;\n    }\n  }\n\n  return null;\n}\n\n/**\n * Extract person (author, contributor)\n */\nfunction extractPerson(element: ReturnType<typeof parseXML>): AtomPerson | null {\n  const name = element.querySelector('name')?.textContent;\n  if (!name) {\n    return null; // Name is required for person construct\n  }\n\n  const person: AtomPerson = {\n    name: cleanText(name),\n  };\n\n  const email = element.querySelector('email')?.textContent;\n  if (email) {\n    person.email = cleanText(email);\n  }\n\n  const uri = element.querySelector('uri')?.textContent;\n  if (uri) {\n    person.uri = cleanText(uri);\n  }\n\n  return person;\n}\n\n/**\n * Extract all persons of a given tag name\n */\nfunction extractPersons(root: ReturnType<typeof parseXML>, tagName: string): AtomPerson[] {\n  const persons: AtomPerson[] = [];\n  const elements = root.querySelectorAll(tagName);\n\n  for (const element of elements) {\n    const person = extractPerson(element);\n    if (person) {\n      persons.push(person);\n    }\n  }\n\n  return persons;\n}\n\n/**\n * Extract link\n */\nfunction extractLink(element: ReturnType<typeof parseXML>): AtomLink | null {\n  const href = element.getAttribute('href');\n  if (!href) {\n    return null; // href is required\n  }\n\n  const link: AtomLink = {\n    href: cleanText(href),\n  };\n\n  const rel = element.getAttribute('rel');\n  if (rel) {\n    link.rel = cleanText(rel);\n  }\n\n  const type = element.getAttribute('type');\n  if (type) {\n    link.type = cleanText(type);\n  }\n\n  const hreflang = element.getAttribute('hreflang');\n  if (hreflang) {\n    link.hreflang = cleanText(hreflang);\n  }\n\n  const title = element.getAttribute('title');\n  if (title) {\n    link.title = cleanText(title);\n  }\n\n  const length = element.getAttribute('length');\n  if (length) {\n    const lengthNum = Number.parseInt(length, 10);\n    if (!Number.isNaN(lengthNum)) {\n      link.length = lengthNum;\n    }\n  }\n\n  return link;\n}\n\n/**\n * Extract all links\n */\nfunction extractLinks(root: ReturnType<typeof parseXML>): AtomLink[] {\n  const links: AtomLink[] = [];\n  const elements = root.querySelectorAll('link');\n\n  for (const element of elements) {\n    const link = extractLink(element);\n    if (link) {\n      links.push(link);\n    }\n  }\n\n  return links;\n}\n\n/**\n * Extract category\n */\nfunction extractCategory(element: ReturnType<typeof parseXML>): AtomCategory | null {\n  const term = element.getAttribute('term');\n  if (!term) {\n    return null; // term is required\n  }\n\n  const category: AtomCategory = {\n    term: cleanText(term),\n  };\n\n  const scheme = element.getAttribute('scheme');\n  if (scheme) {\n    category.scheme = cleanText(scheme);\n  }\n\n  const label = element.getAttribute('label');\n  if (label) {\n    category.label = cleanText(label);\n  }\n\n  return category;\n}\n\n/**\n * Extract all categories\n */\nfunction extractCategories(root: ReturnType<typeof parseXML>): AtomCategory[] {\n  const categories: AtomCategory[] = [];\n  const elements = root.querySelectorAll('category');\n\n  for (const element of elements) {\n    const category = extractCategory(element);\n    if (category) {\n      categories.push(category);\n    }\n  }\n\n  return categories;\n}\n\n/**\n * Extract generator\n */\nfunction extractGenerator(root: ReturnType<typeof parseXML>): AtomGenerator | null {\n  const element = root.querySelector('generator');\n  if (!element) {\n    return null;\n  }\n\n  const value = element.textContent;\n  if (!value) {\n    return null;\n  }\n\n  const generator: AtomGenerator = {\n    value: cleanText(value),\n  };\n\n  const uri = element.getAttribute('uri');\n  if (uri) {\n    generator.uri = cleanText(uri);\n  }\n\n  const version = element.getAttribute('version');\n  if (version) {\n    generator.version = cleanText(version);\n  }\n\n  return generator;\n}\n\n/**\n * Extract text content with type attribute\n */\nfunction extractTextContent(\n  root: ReturnType<typeof parseXML>,\n  tagName: string,\n): string | undefined {\n  const element = root.querySelector(tagName);\n  if (!element) {\n    return undefined;\n  }\n\n  const text = element.textContent;\n  const type = element.getAttribute('type');\n\n  return text ? cleanAtomContent(text, type) : undefined;\n}\n\n/**\n * Extract Atom feed-level metadata\n */\nexport function extractFeed(xml: string): AtomFeed {\n  const doc = parseXML(xml);\n\n  // The root element should be the feed\n  const feed = doc.tagName === 'feed' ? doc : doc.querySelector('feed');\n\n  if (!feed) {\n    throw new Error('Invalid Atom feed: missing <feed> element');\n  }\n\n  // Required fields\n  const id = feed.querySelector('id')?.textContent;\n  if (!id) {\n    throw new Error('Invalid Atom feed: missing required <id> element');\n  }\n\n  const title = extractTextContent(feed, 'title');\n  if (!title) {\n    throw new Error('Invalid Atom feed: missing required <title> element');\n  }\n\n  const updated = extractAtomDate(feed);\n  if (!updated) {\n    throw new Error(\n      'Invalid Atom feed: missing or invalid date (tried <updated>, <modified>, <issued>, <dc:date>)',\n    );\n  }\n\n  const result: AtomFeed = {\n    id: cleanText(id),\n    title,\n    updated,\n  };\n\n  // Optional fields\n  const authors = extractPersons(feed, 'author');\n  if (authors.length > 0) {\n    result.authors = authors;\n  }\n\n  const links = extractLinks(feed);\n  if (links.length > 0) {\n    result.links = links;\n  }\n\n  const categories = extractCategories(feed);\n  if (categories.length > 0) {\n    result.categories = categories;\n  }\n\n  const contributors = extractPersons(feed, 'contributor');\n  if (contributors.length > 0) {\n    result.contributors = contributors;\n  }\n\n  const generator = extractGenerator(feed);\n  if (generator) {\n    result.generator = generator;\n  }\n\n  const icon = feed.querySelector('icon')?.textContent;\n  if (icon) {\n    result.icon = cleanText(icon);\n  }\n\n  const logo = feed.querySelector('logo')?.textContent;\n  if (logo) {\n    result.logo = cleanText(logo);\n  }\n\n  const rights = extractTextContent(feed, 'rights');\n  if (rights) {\n    result.rights = rights;\n  }\n\n  const subtitle = extractTextContent(feed, 'subtitle');\n  if (subtitle) {\n    result.subtitle = subtitle;\n  }\n\n  return result;\n}\n","/**\n * Main Atom feed parser\n * Orchestrates feed and entry extraction\n */\n\nimport { normalizeUrlHttps } from '../../utils/normalize-url.js';\nimport { extractEntry } from './extract-entry.js';\nimport { extractFeed } from './extract-feed.js';\nimport type { AtomDocument, AtomEntry, AtomFeed, AtomLink } from './types.js';\nimport { parseXML } from './xml-parser.js';\n\n/**\n * Parse complete Atom feed\n * @param xml - Atom XML string\n * @param baseUrl - Optional base URL for resolving relative URLs\n */\nexport function parseAtom(xml: string, baseUrl?: string | URL): AtomDocument {\n  const doc = parseXML(xml);\n\n  // Extract feed metadata\n  const feed = extractFeed(xml);\n\n  // Extract all entries\n  const entryElements = doc.querySelectorAll('entry');\n  const entries = entryElements.map((entryElement) => extractEntry(entryElement));\n\n  // Apply URL normalization if base URL provided\n  const normalizedFeed = baseUrl ? normalizeFeedUrls(feed, baseUrl) : feed;\n  const normalizedEntries = baseUrl\n    ? entries.map((entry) => normalizeEntryUrls(entry, baseUrl))\n    : entries;\n\n  return {\n    version: '1.0',\n    feed: normalizedFeed,\n    entries: normalizedEntries,\n  };\n}\n\n/**\n * Normalize all URLs in feed\n */\nfunction normalizeFeedUrls(feed: AtomFeed, baseUrl: string | URL): AtomFeed {\n  return {\n    ...feed,\n    links: feed.links ? feed.links.map((link) => normalizeLinkUrls(link, baseUrl)) : feed.links,\n    icon: feed.icon ? normalizeUrlHttps(baseUrl, feed.icon) : feed.icon,\n    logo: feed.logo ? normalizeUrlHttps(baseUrl, feed.logo) : feed.logo,\n  };\n}\n\n/**\n * Normalize all URLs in entry\n */\nfunction normalizeEntryUrls(entry: AtomEntry, baseUrl: string | URL): AtomEntry {\n  return {\n    ...entry,\n    links: entry.links ? entry.links.map((link) => normalizeLinkUrls(link, baseUrl)) : entry.links,\n  };\n}\n\n/**\n * Normalize URLs in link\n */\nfunction normalizeLinkUrls(link: AtomLink, baseUrl: string | URL): AtomLink {\n  return {\n    ...link,\n    href: normalizeUrlHttps(baseUrl, link.href),\n  };\n}\n","/**\n * Feed format detection utilities.\n *\n * @packageDocumentation\n */\n\n/**\n * Feed format type.\n *\n * @remarks\n * Represents the detected or expected format of a feed.\n * - `'rss'` - RSS 2.0, 0.9x, or RSS 1.0 (RDF)\n * - `'atom'` - Atom 1.0\n * - `'json-feed'` - JSON Feed 1.0 or 1.1\n * - `'sitemap'` - XML Sitemap (urlset or sitemapindex)\n * - `'unknown'` - Format could not be determined\n */\nexport type FeedFormat = 'rss' | 'atom' | 'json-feed' | 'sitemap' | 'unknown';\n\n/**\n * Detect feed format from content string.\n *\n * @remarks\n * Analyzes the content to determine if it's RSS, Atom, or JSON Feed.\n * Detection is based on root elements, namespaces, and structure.\n *\n * Detection priority:\n * 1. JSON Feed (checks for JSON with jsonfeed.org version)\n * 2. RSS (checks for `<rss>` or `<rdf:RDF>` root elements)\n * 3. Atom (checks for `<feed>` root element with Atom namespace)\n *\n * @param content - Feed content as string\n * @returns Detected format or 'unknown' if format cannot be determined\n *\n * @example\n * ```typescript\n * const format = detectFormat(feedContent);\n * if (format === 'rss') {\n *   console.log('This is an RSS feed');\n * }\n * ```\n */\nexport function detectFormat(content: string): FeedFormat {\n  if (!content || typeof content !== 'string') {\n    return 'unknown';\n  }\n\n  const trimmed = content.trim();\n\n  // Check for JSON Feed (starts with { or [)\n  if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n    // Try to parse as JSON\n    try {\n      const data = JSON.parse(trimmed);\n      if (\n        data &&\n        typeof data === 'object' &&\n        !Array.isArray(data) &&\n        data.version &&\n        typeof data.version === 'string' &&\n        data.version.includes('jsonfeed.org')\n      ) {\n        return 'json-feed';\n      }\n    } catch {\n      // Not valid JSON\n    }\n    return 'unknown';\n  }\n\n  // Must be XML-based (RSS or Atom)\n  // Remove XML declaration and comments for easier parsing\n  const cleaned = trimmed\n    .replace(/<\\?xml[^?]*\\?>/gi, '')\n    .replace(/<!--[\\s\\S]*?-->/g, '')\n    .trim();\n\n  // Check for RSS root element first (most reliable)\n  if (cleaned.match(/<rss[\\s>]/i)) {\n    return 'rss';\n  }\n\n  // Check for Atom root element\n  if (cleaned.match(/<feed[\\s>]/i)) {\n    return 'atom';\n  }\n\n  // Check for Atom as root namespace (not just xmlns:atom extension)\n  // Only if feed is the root element\n  if (cleaned.match(/<feed[^>]*xmlns=\"http:\\/\\/www\\.w3\\.org\\/2005\\/Atom\"/i)) {\n    return 'atom';\n  }\n\n  // Check for RDF-based RSS 1.0\n  if (cleaned.match(/<rdf:RDF/i) && cleaned.includes('rss/1.0')) {\n    return 'rss';\n  }\n\n  // Check for channel element (common in RSS)\n  if (cleaned.match(/<channel[\\s>]/i)) {\n    return 'rss';\n  }\n\n  // Check for Sitemap (urlset or sitemapindex)\n  if (\n    (cleaned.match(/<urlset[\\s>]/i) || cleaned.match(/<sitemapindex[\\s>]/i)) &&\n    cleaned.includes('sitemaps.org')\n  ) {\n    return 'sitemap';\n  }\n\n  return 'unknown';\n}\n\n/**\n * Check if content is a valid feed (any format).\n *\n * @param content - Feed content as string\n * @returns `true` if content is RSS, Atom, or JSON Feed\n *\n * @example\n * ```typescript\n * if (isFeed(content)) {\n *   const result = parseFeed(content);\n * }\n * ```\n */\nexport function isFeed(content: string): boolean {\n  return detectFormat(content) !== 'unknown';\n}\n\n/**\n * Check if content is RSS format.\n *\n * @param content - Feed content as string\n * @returns `true` if content is RSS (any version)\n */\nexport function isRSS(content: string): boolean {\n  return detectFormat(content) === 'rss';\n}\n\n/**\n * Check if content is Atom format.\n *\n * @param content - Feed content as string\n * @returns `true` if content is Atom 1.0\n */\nexport function isAtom(content: string): boolean {\n  return detectFormat(content) === 'atom';\n}\n\n/**\n * Check if content is JSON Feed format.\n *\n * @param content - Feed content as string\n * @returns `true` if content is JSON Feed (1.0 or 1.1)\n */\nexport function isJSONFeed(content: string): boolean {\n  return detectFormat(content) === 'json-feed';\n}\n\n/**\n * Check if content is XML Sitemap format.\n *\n * @param content - Feed content as string\n * @returns `true` if content is a sitemap (urlset or sitemapindex)\n */\nexport function isSitemapFormat(content: string): boolean {\n  return detectFormat(content) === 'sitemap';\n}\n","/**\n * JSON Feed validation utilities\n */\n\nimport type { JSONFeed } from './types.js';\n\n/**\n * Validation error\n */\nexport interface ValidationError {\n  field: string;\n  message: string;\n}\n\n/**\n * Validate JSON Feed structure\n * Returns array of errors (empty if valid)\n */\nexport function validate(data: unknown): ValidationError[] {\n  const errors: ValidationError[] = [];\n\n  // Must be an object\n  if (!data || typeof data !== 'object' || Array.isArray(data)) {\n    errors.push({ field: 'root', message: 'Feed must be a JSON object' });\n    return errors;\n  }\n\n  const feed = data as Partial<JSONFeed>;\n\n  // Required: version\n  if (!feed.version) {\n    errors.push({ field: 'version', message: 'Missing required field: version' });\n  } else if (typeof feed.version !== 'string') {\n    errors.push({ field: 'version', message: 'Field \"version\" must be a string' });\n  } else if (\n    !feed.version.includes('jsonfeed.org/version/1') &&\n    !feed.version.startsWith('https://jsonfeed.org/version/1')\n  ) {\n    errors.push({\n      field: 'version',\n      message: 'Unsupported version (expected JSON Feed 1.0 or 1.1)',\n    });\n  }\n\n  // Required: title\n  if (!feed.title) {\n    errors.push({ field: 'title', message: 'Missing required field: title' });\n  } else if (typeof feed.title !== 'string') {\n    errors.push({ field: 'title', message: 'Field \"title\" must be a string' });\n  }\n\n  // Required: items\n  if (!feed.items) {\n    errors.push({ field: 'items', message: 'Missing required field: items' });\n  } else if (!Array.isArray(feed.items)) {\n    errors.push({ field: 'items', message: 'Field \"items\" must be an array' });\n  } else {\n    // Validate each item\n    for (let i = 0; i < feed.items.length; i++) {\n      const item = feed.items[i];\n\n      // Each item must have an id\n      if (!item || typeof item !== 'object') {\n        errors.push({ field: `items[${i}]`, message: 'Item must be an object' });\n        continue;\n      }\n\n      if (!item.id) {\n        errors.push({ field: `items[${i}].id`, message: 'Missing required field: id' });\n      } else if (typeof item.id !== 'string') {\n        errors.push({ field: `items[${i}].id`, message: 'Field \"id\" must be a string' });\n      }\n\n      // Must have content_html or content_text\n      if (!item.content_html && !item.content_text) {\n        // This is a warning, not an error (some feeds only have title)\n        // But according to spec, at least one should be present\n      }\n    }\n  }\n\n  return errors;\n}\n\n/**\n * Check if data is valid JSON Feed\n */\nexport function isValid(data: unknown): boolean {\n  return validate(data).length === 0;\n}\n","/**\n * JSON Feed parser\n */\n\nimport { normalizeUrlHttps } from '../../utils/normalize-url.js';\nimport type { JSONFeed, JSONFeedAttachment, JSONFeedDocument, JSONFeedItem } from './types.js';\nimport { validate } from './validate.js';\n\n/**\n * Parse JSON Feed from string\n * @param jsonString - Raw JSON string\n * @param baseUrl - Optional base URL for resolving relative URLs\n * @returns Parsed JSON Feed document\n * @throws Error if JSON is invalid or feed validation fails\n */\nexport function parseJSONFeed(jsonString: string, baseUrl?: string | URL): JSONFeedDocument {\n  // Parse JSON\n  let data: unknown;\n  try {\n    data = JSON.parse(jsonString);\n  } catch (error) {\n    throw new Error(`Invalid JSON: ${error instanceof Error ? error.message : 'Unknown error'}`);\n  }\n\n  // Validate feed structure\n  const errors = validate(data);\n  if (errors.length > 0) {\n    const errorMessages = errors.map((e) => `${e.field}: ${e.message}`).join('; ');\n    throw new Error(`Invalid JSON Feed: ${errorMessages}`);\n  }\n\n  const feed = data as JSONFeed;\n\n  // Extract version\n  const version = extractVersion(feed.version);\n\n  // Apply URL normalization if base URL provided\n  const normalizedFeed = baseUrl ? normalizeFeedUrls(feed, baseUrl) : feed;\n\n  return {\n    version,\n    feed: normalizedFeed,\n  };\n}\n\n/**\n * Normalize all URLs in JSON Feed\n */\nfunction normalizeFeedUrls(feed: JSONFeed, baseUrl: string | URL): JSONFeed {\n  return {\n    ...feed,\n    home_page_url: feed.home_page_url\n      ? normalizeUrlHttps(baseUrl, feed.home_page_url)\n      : feed.home_page_url,\n    feed_url: feed.feed_url ? normalizeUrlHttps(baseUrl, feed.feed_url) : feed.feed_url,\n    icon: feed.icon ? normalizeUrlHttps(baseUrl, feed.icon) : feed.icon,\n    favicon: feed.favicon ? normalizeUrlHttps(baseUrl, feed.favicon) : feed.favicon,\n    items: feed.items ? feed.items.map((item) => normalizeItemUrls(item, baseUrl)) : feed.items,\n  };\n}\n\n/**\n * Normalize all URLs in item\n */\nfunction normalizeItemUrls(item: JSONFeedItem, baseUrl: string | URL): JSONFeedItem {\n  return {\n    ...item,\n    url: item.url ? normalizeUrlHttps(baseUrl, item.url) : item.url,\n    external_url: item.external_url\n      ? normalizeUrlHttps(baseUrl, item.external_url)\n      : item.external_url,\n    image: item.image ? normalizeUrlHttps(baseUrl, item.image) : item.image,\n    banner_image: item.banner_image\n      ? normalizeUrlHttps(baseUrl, item.banner_image)\n      : item.banner_image,\n    attachments: item.attachments\n      ? item.attachments.map((attachment) => normalizeAttachmentUrls(attachment, baseUrl))\n      : item.attachments,\n  };\n}\n\n/**\n * Normalize URLs in attachment\n */\nfunction normalizeAttachmentUrls(\n  attachment: JSONFeedAttachment,\n  baseUrl: string | URL,\n): JSONFeedAttachment {\n  return {\n    ...attachment,\n    url: normalizeUrlHttps(baseUrl, attachment.url),\n  };\n}\n\n/**\n * Extract version number from version URL\n */\nfunction extractVersion(versionUrl: string): string {\n  // Extract version from URLs like:\n  // \"https://jsonfeed.org/version/1.1\"\n  // \"https://jsonfeed.org/version/1\"\n  const match = versionUrl.match(/version\\/([\\d.]+)/);\n  return match ? match[1] : versionUrl;\n}\n","/**\n * Normalize format-specific feeds to unified interface\n */\n\nimport type { AtomDocument } from './atom/types.js';\nimport type { JSONFeedDocument } from './json-feed/types.js';\nimport type { RssFeedExtended, RssItemExtended } from './rss/types.js';\nimport type { Feed, FeedAuthor, FeedEnclosure, FeedItem } from './types.js';\n\n/**\n * Normalize RSS feed to unified format\n */\nexport function normalizeRSS(rss: RssFeedExtended): Feed {\n  const { channel, items } = rss;\n\n  return {\n    format: 'rss',\n    title: channel.title,\n    description: channel.description,\n    url: channel.link,\n    feedUrl: undefined, // RSS doesn't have self-link in standard fields\n    language: channel.language,\n    image: channel.image?.url,\n    authors: channel.managingEditor\n      ? [{ name: channel.managingEditor, email: channel.managingEditor }]\n      : undefined,\n    updated: channel.lastBuildDate || channel.pubDate,\n    items: items.map((item: RssItemExtended): FeedItem => {\n      return {\n        id: item.guid?.value || item.link || item.title || '',\n        title: item.title,\n        url: item.link,\n        contentHtml: item.namespaces?.contentEncoded || item.description,\n        contentText: item.namespaces?.contentEncoded ? undefined : item.description,\n        summary: item.description,\n        published: item.pubDate,\n        authors:\n          item.author || item.namespaces?.dcCreator\n            ? [{ name: item.author || item.namespaces?.dcCreator || '' }]\n            : undefined,\n        tags: item.category,\n        image: item.namespaces?.mediaThumbnail?.[0]?.url,\n        enclosures: item.enclosure\n          ? [\n              {\n                url: item.enclosure.url,\n                type: item.enclosure.type,\n                length: item.enclosure.length,\n              },\n            ]\n          : undefined,\n      };\n    }),\n  };\n}\n\n/**\n * Normalize Atom feed to unified format\n */\nexport function normalizeAtom(atom: AtomDocument): Feed {\n  const { feed, entries } = atom;\n\n  // Find self link\n  const selfLink = feed.links?.find((l) => l.rel === 'self');\n  const alternateLink = feed.links?.find((l) => l.rel === 'alternate' || !l.rel);\n\n  return {\n    format: 'atom',\n    title: feed.title,\n    description: feed.subtitle,\n    url: alternateLink?.href,\n    feedUrl: selfLink?.href,\n    language: undefined, // Atom doesn't have top-level language\n    image: feed.logo || feed.icon,\n    authors: feed.authors?.map(\n      (a): FeedAuthor => ({\n        name: a.name,\n        email: a.email,\n        url: a.uri,\n      }),\n    ),\n    updated: feed.updated,\n    items: entries.map((entry): FeedItem => {\n      const entryAlternateLink = entry.links?.find((l) => l.rel === 'alternate' || !l.rel);\n      const entryRelatedLink = entry.links?.find((l) => l.rel === 'related');\n\n      return {\n        id: entry.id,\n        title: entry.title,\n        url: entryAlternateLink?.href,\n        externalUrl: entryRelatedLink?.href,\n        contentHtml: entry.content?.type === 'html' ? entry.content.value : undefined,\n        contentText: entry.content?.type === 'text' ? entry.content.value : undefined,\n        summary: entry.summary,\n        published: entry.published,\n        modified: entry.updated,\n        authors: entry.authors?.map(\n          (a): FeedAuthor => ({\n            name: a.name,\n            email: a.email,\n            url: a.uri,\n          }),\n        ),\n        tags: entry.categories?.map((c) => c.term),\n        image: undefined, // Atom doesn't have item images in standard\n      };\n    }),\n  };\n}\n\n/**\n * Normalize JSON Feed to unified format\n */\nexport function normalizeJSONFeed(jsonFeed: JSONFeedDocument): Feed {\n  const { feed } = jsonFeed;\n\n  return {\n    format: 'json-feed',\n    title: feed.title,\n    description: feed.description,\n    url: feed.home_page_url,\n    feedUrl: feed.feed_url,\n    language: feed.language,\n    image: feed.icon || feed.favicon,\n    authors: feed.authors?.map(\n      (a): FeedAuthor => ({\n        name: a.name,\n        email: undefined,\n        url: a.url,\n      }),\n    ),\n    updated: undefined, // JSON Feed doesn't have feed-level updated\n    items: feed.items.map((item): FeedItem => {\n      return {\n        id: item.id,\n        title: item.title,\n        url: item.url,\n        externalUrl: item.external_url,\n        contentHtml: item.content_html,\n        contentText: item.content_text,\n        summary: item.summary,\n        published: item.date_published,\n        modified: item.date_modified,\n        authors: item.authors?.map(\n          (a): FeedAuthor => ({\n            name: a.name,\n            email: undefined,\n            url: a.url,\n          }),\n        ),\n        tags: item.tags,\n        image: item.image || item.banner_image,\n        enclosures: item.attachments?.map(\n          (a): FeedEnclosure => ({\n            url: a.url,\n            type: a.mime_type,\n            length: a.size_in_bytes,\n          }),\n        ),\n      };\n    }),\n  };\n}\n","/**\n * Text cleaning utilities for RSS feeds\n * Handles CDATA, HTML entities, and whitespace normalization\n */\n\n/**\n * Strip CDATA tags from text\n * RSS feeds often wrap content in CDATA sections\n * Handles leading/trailing whitespace before CDATA markers\n */\nexport function stripCDATA(text: string): string {\n  if (!text) return text;\n  return text.replace(/^\\s*<!\\[CDATA\\[/, '').replace(/\\]\\]>\\s*$/, '');\n}\n\n/**\n * Decode common HTML entities\n * Basic entity decoding for feed content\n */\nexport function decodeEntities(text: string): string {\n  if (!text) return text;\n\n  const entities: Record<string, string> = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&apos;': \"'\",\n    '&nbsp;': ' ',\n    '&#39;': \"'\",\n    '&#x27;': \"'\",\n  };\n\n  let result = text;\n  for (const [entity, char] of Object.entries(entities)) {\n    result = result.replaceAll(entity, char);\n  }\n\n  // Handle numeric entities\n  result = result.replace(/&#(\\d+);/g, (_, dec) => {\n    return String.fromCharCode(Number.parseInt(dec, 10));\n  });\n\n  result = result.replace(/&#x([0-9a-fA-F]+);/g, (_, hex) => {\n    return String.fromCharCode(Number.parseInt(hex, 16));\n  });\n\n  return result;\n}\n\n/**\n * Normalize whitespace\n * Trim and collapse multiple spaces\n */\nexport function normalizeWhitespace(text: string, preserveLineBreaks = false): string {\n  if (!text) return text;\n\n  let result = text.trim();\n\n  if (preserveLineBreaks) {\n    // Collapse spaces but keep line breaks\n    result = result.replace(/ +/g, ' ');\n    result = result.replace(/\\n +/g, '\\n');\n    result = result.replace(/ +\\n/g, '\\n');\n  } else {\n    // Collapse all whitespace\n    result = result.replace(/\\s+/g, ' ');\n  }\n\n  return result;\n}\n\n/**\n * Clean text from RSS feed\n * Combines CDATA stripping, entity decoding, and whitespace normalization\n */\nexport function cleanText(\n  text: string | null | undefined,\n  options: {\n    stripCdata?: boolean;\n    decodeEntities?: boolean;\n    normalizeWhitespace?: boolean;\n    preserveLineBreaks?: boolean;\n  } = {},\n): string {\n  if (text === null || text === undefined) return '';\n  if (typeof text !== 'string') return '';\n\n  const {\n    stripCdata = true,\n    decodeEntities: shouldDecodeEntities = true,\n    normalizeWhitespace: shouldNormalizeWhitespace = true,\n    preserveLineBreaks = false,\n  } = options;\n\n  let result = text;\n\n  if (stripCdata) {\n    result = stripCDATA(result);\n  }\n\n  if (shouldDecodeEntities) {\n    result = decodeEntities(result);\n  }\n\n  if (shouldNormalizeWhitespace) {\n    result = normalizeWhitespace(result, preserveLineBreaks);\n  }\n\n  return result;\n}\n","/**\n * RSS date parsing utilities\n * RSS 2.0 uses RFC 822 date format\n * Examples: \"Wed, 02 Oct 2002 13:00:00 GMT\", \"Wed, 02 Oct 2002 15:00:00 +0200\"\n */\n\n/**\n * Parse RFC 822 date to ISO 8601 string\n * Returns null if date is invalid or cannot be parsed\n */\nexport function parseRFC822Date(dateString: string | null | undefined): string | null {\n  if (!dateString || typeof dateString !== 'string') {\n    return null;\n  }\n\n  const trimmed = dateString.trim();\n  if (!trimmed) {\n    return null;\n  }\n\n  try {\n    // JavaScript's Date constructor handles RFC 822 format\n    const date = new Date(trimmed);\n\n    // Check if date is valid\n    if (Number.isNaN(date.getTime())) {\n      return null;\n    }\n\n    // Return as ISO 8601 string\n    return date.toISOString();\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Parse RSS pubDate or lastBuildDate\n * Alias for parseRFC822Date for clarity\n */\nexport function parseRSSDate(dateString: string | null | undefined): string | null {\n  return parseRFC822Date(dateString);\n}\n\n/**\n * Check if a date string is valid\n */\nexport function isValidDate(dateString: string | null | undefined): boolean {\n  return parseRFC822Date(dateString) !== null;\n}\n","/**\n * Minimal RSS-specific XML parser\n * Built specifically for RSS feeds without HTML parsing quirks\n */\n\nexport interface RSSElement {\n  /** Tag name (e.g., 'channel', 'item', 'title') */\n  tagName: string;\n  /** Element attributes */\n  attributes: Record<string, string>;\n  /** Text content (with CDATA stripped) */\n  text: string;\n  /** Child elements */\n  children: RSSElement[];\n  /** Parent element (for traversal) */\n  parent: RSSElement | null;\n}\n\n/**\n * Parse RSS XML string into element tree\n */\nexport function parseRSSXML(xml: string): RSSElement {\n  const cleaned = cleanXMLDeclaration(xml);\n  const withoutDoctype = removeDoctype(cleaned);\n  const withoutComments = removeComments(withoutDoctype);\n  const root = parseElement(withoutComments, 0).element;\n  return root;\n}\n\n/**\n * Remove XML declaration and clean whitespace\n */\nfunction cleanXMLDeclaration(xml: string): string {\n  return xml.replace(/<\\?xml[^?]*\\?>/g, '').trim();\n}\n\n/**\n * Remove DOCTYPE declarations\n */\nfunction removeDoctype(xml: string): string {\n  return xml.replace(/<!DOCTYPE[^>]*>/gi, '');\n}\n\n/**\n * Remove XML comments\n */\nfunction removeComments(xml: string): string {\n  return xml.replace(/<!--[\\s\\S]*?-->/g, '');\n}\n\n/**\n * Extract CDATA content and replace with placeholder\n */\nfunction extractCDATA(text: string): { text: string; cdataMap: Map<string, string> } {\n  const cdataMap = new Map<string, string>();\n  let counter = 0;\n\n  const processed = text.replace(/<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>/g, (_match, content) => {\n    const placeholder = `__CDATA_${counter}__`;\n    cdataMap.set(placeholder, content);\n    counter++;\n    return placeholder;\n  });\n\n  return { text: processed, cdataMap };\n}\n\n/**\n * Restore CDATA content from placeholders\n */\nfunction restoreCDATA(text: string, cdataMap: Map<string, string>): string {\n  let result = text;\n  for (const [placeholder, content] of cdataMap.entries()) {\n    result = result.replace(placeholder, content);\n  }\n  return result;\n}\n\n/**\n * Parse attributes from opening tag\n */\nfunction parseAttributes(tagContent: string): Record<string, string> {\n  const attributes: Record<string, string> = {};\n  const attrRegex = /(\\S+)=[\"']([^\"']*)[\"']/g;\n  let match: RegExpExecArray | null = attrRegex.exec(tagContent);\n\n  while (match !== null) {\n    attributes[match[1]] = match[2];\n    match = attrRegex.exec(tagContent);\n  }\n\n  return attributes;\n}\n\n/**\n * Find matching closing tag position\n */\nfunction findClosingTag(xml: string, tagName: string, startPos: number): number {\n  const openTag = `<${tagName}`;\n  const closeTag = `</${tagName}>`;\n  let depth = 1;\n  let pos = startPos;\n\n  while (pos < xml.length && depth > 0) {\n    const nextOpen = xml.indexOf(openTag, pos);\n    const nextClose = xml.indexOf(closeTag, pos);\n\n    if (nextClose === -1) {\n      return -1; // No closing tag found\n    }\n\n    if (nextOpen !== -1 && nextOpen < nextClose) {\n      // Found nested opening tag\n      depth++;\n      pos = nextOpen + openTag.length;\n    } else {\n      // Found closing tag\n      depth--;\n      if (depth === 0) {\n        return nextClose;\n      }\n      pos = nextClose + closeTag.length;\n    }\n  }\n\n  return -1;\n}\n\n/**\n * Parse a single element and its children\n */\nfunction parseElement(\n  xml: string,\n  startPos: number,\n  parent: RSSElement | null = null,\n  cdataMap?: Map<string, string>,\n): { element: RSSElement; endPos: number; cdataMap: Map<string, string> } {\n  // Extract CDATA first (only at top level)\n  const extracted = cdataMap ? { text: xml, cdataMap } : extractCDATA(xml);\n  const cleanedXML = extracted.text;\n  const currentCdataMap = extracted.cdataMap;\n\n  // Find opening tag\n  const openTagStart = cleanedXML.indexOf('<', startPos);\n  if (openTagStart === -1) {\n    throw new Error('No opening tag found');\n  }\n\n  const openTagEnd = cleanedXML.indexOf('>', openTagStart);\n  if (openTagEnd === -1) {\n    throw new Error('Unclosed opening tag');\n  }\n\n  const openTagContent = cleanedXML.substring(openTagStart + 1, openTagEnd);\n\n  // Check for self-closing tag\n  const isSelfClosing = openTagContent.endsWith('/');\n  const tagContent = isSelfClosing ? openTagContent.slice(0, -1).trim() : openTagContent;\n\n  // Extract tag name and attributes\n  const spaceIndex = tagContent.indexOf(' ');\n  const tagName = spaceIndex === -1 ? tagContent : tagContent.substring(0, spaceIndex);\n  const attributes = spaceIndex === -1 ? {} : parseAttributes(tagContent.substring(spaceIndex));\n\n  const element: RSSElement = {\n    tagName,\n    attributes,\n    text: '',\n    children: [],\n    parent,\n  };\n\n  // Handle self-closing tags\n  if (isSelfClosing) {\n    return { element, endPos: openTagEnd + 1, cdataMap: currentCdataMap };\n  }\n\n  // Find closing tag\n  const closingTagPos = findClosingTag(cleanedXML, tagName, openTagEnd + 1);\n  if (closingTagPos === -1) {\n    throw new Error(`No closing tag found for <${tagName}>`);\n  }\n\n  // Extract content between tags\n  const content = cleanedXML.substring(openTagEnd + 1, closingTagPos);\n\n  // Parse children or text content\n  if (content.includes('<')) {\n    // Has child elements\n    let pos = 0;\n    const trimmedContent = content.trim();\n\n    while (pos < trimmedContent.length) {\n      const nextTag = trimmedContent.indexOf('<', pos);\n      if (nextTag === -1) break;\n\n      // Check if it's a closing tag or comment\n      if (trimmedContent[nextTag + 1] === '/' || trimmedContent[nextTag + 1] === '!') {\n        pos = nextTag + 1;\n        continue;\n      }\n\n      try {\n        const { element: child, endPos } = parseElement(\n          trimmedContent,\n          nextTag,\n          element,\n          currentCdataMap,\n        );\n        element.children.push(child);\n        pos = endPos;\n      } catch {\n        pos = nextTag + 1;\n      }\n    }\n\n    // Extract text content (without child elements)\n    let textContent = content.replace(/<[^>]+>/g, '').trim();\n    textContent = restoreCDATA(textContent, currentCdataMap);\n    element.text = textContent;\n  } else {\n    // Pure text content\n    let textContent = content.trim();\n    textContent = restoreCDATA(textContent, currentCdataMap);\n    element.text = textContent;\n  }\n\n  const closingTagEnd = closingTagPos + `</${tagName}>`.length;\n  return { element, endPos: closingTagEnd, cdataMap: currentCdataMap };\n}\n\n/**\n * Query selector - find first matching element\n * XML is case-sensitive, but we'll support case-insensitive matching for convenience\n */\nexport function querySelector(\n  element: RSSElement,\n  selector: string,\n  caseSensitive = false,\n): RSSElement | null {\n  const tagName = caseSensitive ? selector : selector.toLowerCase();\n  const elementTag = caseSensitive ? element.tagName : element.tagName.toLowerCase();\n\n  if (elementTag === tagName) {\n    return element;\n  }\n\n  for (const child of element.children) {\n    const found = querySelector(child, selector, caseSensitive);\n    if (found) return found;\n  }\n\n  return null;\n}\n\n/**\n * Query selector all - find all matching elements\n */\nexport function querySelectorAll(\n  element: RSSElement,\n  selector: string,\n  caseSensitive = false,\n): RSSElement[] {\n  const results: RSSElement[] = [];\n  const tagName = caseSensitive ? selector : selector.toLowerCase();\n  const elementTag = caseSensitive ? element.tagName : element.tagName.toLowerCase();\n\n  if (elementTag === tagName) {\n    results.push(element);\n  }\n\n  for (const child of element.children) {\n    results.push(...querySelectorAll(child, selector, caseSensitive));\n  }\n\n  return results;\n}\n\n/**\n * Get text content of element\n */\nexport function getText(element: RSSElement | null | undefined): string {\n  return element?.text || '';\n}\n\n/**\n * Get attribute value\n */\nexport function getAttribute(element: RSSElement | null | undefined, name: string): string | null {\n  return element?.attributes[name] || null;\n}\n","/**\n * Extract RSS channel (feed-level) metadata\n */\n\nimport { cleanText } from './clean-text.js';\nimport { parseRSSDate } from './parse-date.js';\nimport type { RssChannel } from './types.js';\nimport type { RSSElement } from './xml-parser.js';\nimport { getAttribute, getText, querySelector, querySelectorAll } from './xml-parser.js';\n\n/**\n * Extract channel metadata from RSS feed\n */\nexport function extractChannel(channelElement: RSSElement): RssChannel {\n  const getTextClean = (selector: string): string => {\n    const element = querySelector(channelElement, selector);\n    return cleanText(getText(element));\n  };\n\n  const getNumber = (selector: string): number | undefined => {\n    const text = getTextClean(selector);\n    if (!text) return undefined;\n    const num = Number.parseInt(text, 10);\n    return Number.isNaN(num) ? undefined : num;\n  };\n\n  const getDate = (selector: string): string | undefined => {\n    const text = getTextClean(selector);\n    return parseRSSDate(text) || undefined;\n  };\n\n  const getArray = (selector: string): string[] | undefined => {\n    const elements = querySelectorAll(channelElement, selector);\n    if (elements.length === 0) return undefined;\n    const cleaned = elements.map((el) => cleanText(getText(el))).filter((text) => text.length > 0);\n    return cleaned.length > 0 ? cleaned : undefined;\n  };\n\n  // Required fields\n  const title = getTextClean('title');\n  const link = getTextClean('link');\n  const description = getTextClean('description');\n\n  // Optional fields\n  const language = getTextClean('language') || undefined;\n  const copyright = getTextClean('copyright') || undefined;\n  const managingEditor = getTextClean('managingEditor') || undefined;\n  const webMaster = getTextClean('webMaster') || undefined;\n  const pubDate = getDate('pubDate');\n  const lastBuildDate = getDate('lastBuildDate');\n  const category = getArray('category');\n  const generator = getTextClean('generator') || undefined;\n  const docs = getTextClean('docs') || undefined;\n  const ttl = getNumber('ttl');\n\n  // Image\n  const imageEl = querySelector(channelElement, 'image');\n  const image = imageEl\n    ? {\n        url: cleanText(getText(querySelector(imageEl, 'url'))),\n        title: cleanText(getText(querySelector(imageEl, 'title'))),\n        link: cleanText(getText(querySelector(imageEl, 'link'))),\n        width: (() => {\n          const w = cleanText(getText(querySelector(imageEl, 'width')));\n          return w ? Number.parseInt(w, 10) : undefined;\n        })(),\n        height: (() => {\n          const h = cleanText(getText(querySelector(imageEl, 'height')));\n          return h ? Number.parseInt(h, 10) : undefined;\n        })(),\n        description: cleanText(getText(querySelector(imageEl, 'description'))) || undefined,\n      }\n    : undefined;\n\n  // Cloud\n  const cloudEl = querySelector(channelElement, 'cloud');\n  const cloud = cloudEl\n    ? {\n        domain: getAttribute(cloudEl, 'domain') || '',\n        port: Number.parseInt(getAttribute(cloudEl, 'port') || '0', 10),\n        path: getAttribute(cloudEl, 'path') || '',\n        registerProcedure: getAttribute(cloudEl, 'registerProcedure') || '',\n        protocol: getAttribute(cloudEl, 'protocol') || '',\n      }\n    : undefined;\n\n  // Skip hours and days\n  const skipHoursEl = querySelector(channelElement, 'skipHours');\n  const skipHours = skipHoursEl\n    ? querySelectorAll(skipHoursEl, 'hour')\n        .map((el) => Number.parseInt(getText(el), 10))\n        .filter((n) => !Number.isNaN(n))\n    : undefined;\n\n  const skipDaysEl = querySelector(channelElement, 'skipDays');\n  const skipDays = skipDaysEl\n    ? querySelectorAll(skipDaysEl, 'day')\n        .map((el) => cleanText(getText(el)))\n        .filter((t) => t.length > 0)\n    : undefined;\n\n  const channel: RssChannel = {\n    title,\n    link,\n    description,\n  };\n\n  // Add optional fields only if they exist\n  if (language) channel.language = language;\n  if (copyright) channel.copyright = copyright;\n  if (managingEditor) channel.managingEditor = managingEditor;\n  if (webMaster) channel.webMaster = webMaster;\n  if (pubDate) channel.pubDate = pubDate;\n  if (lastBuildDate) channel.lastBuildDate = lastBuildDate;\n  if (category) channel.category = category;\n  if (generator) channel.generator = generator;\n  if (docs) channel.docs = docs;\n  if (cloud) channel.cloud = cloud;\n  if (ttl) channel.ttl = ttl;\n  if (image) channel.image = image;\n  if (skipHours && skipHours.length > 0) channel.skipHours = skipHours;\n  if (skipDays && skipDays.length > 0) channel.skipDays = skipDays;\n\n  return channel;\n}\n","/**\n * Extract RSS item (article/entry) data\n */\n\nimport { cleanText } from './clean-text.js';\nimport { parseRSSDate } from './parse-date.js';\nimport type { RssEnclosure, RssGuid, RssItem, RssSource } from './types.js';\nimport type { RSSElement } from './xml-parser.js';\nimport { getAttribute, getText, querySelector, querySelectorAll } from './xml-parser.js';\n\n/**\n * Extract item data from RSS feed\n */\nexport function extractItem(itemElement: RSSElement): RssItem {\n  const getTextClean = (selector: string): string | undefined => {\n    const element = querySelector(itemElement, selector);\n    const text = cleanText(getText(element));\n    return text || undefined;\n  };\n\n  const getDate = (selector: string): string | undefined => {\n    const text = getTextClean(selector);\n    return text ? parseRSSDate(text) || undefined : undefined;\n  };\n\n  const getArray = (selector: string): string[] | undefined => {\n    const elements = querySelectorAll(itemElement, selector);\n    if (elements.length === 0) return undefined;\n    const cleaned = elements.map((el) => cleanText(getText(el))).filter((text) => text.length > 0);\n    return cleaned.length > 0 ? cleaned : undefined;\n  };\n\n  // RSS 2.0 spec: An item must have either title or description (or both)\n  const title = getTextClean('title');\n  const link = getTextClean('link');\n  const description = getTextClean('description');\n  const author = getTextClean('author');\n  const category = getArray('category');\n  const comments = getTextClean('comments');\n  const pubDate = getDate('pubDate');\n\n  // Enclosure\n  const enclosureEl = querySelector(itemElement, 'enclosure');\n  const enclosure: RssEnclosure | undefined = enclosureEl\n    ? {\n        url: getAttribute(enclosureEl, 'url') || '',\n        length: Number.parseInt(getAttribute(enclosureEl, 'length') || '0', 10),\n        type: getAttribute(enclosureEl, 'type') || '',\n      }\n    : undefined;\n\n  // GUID\n  const guidEl = querySelector(itemElement, 'guid');\n  const guid: RssGuid | undefined = guidEl\n    ? {\n        value: cleanText(getText(guidEl)),\n        isPermaLink: getAttribute(guidEl, 'isPermaLink')?.toLowerCase() !== 'false',\n      }\n    : undefined;\n\n  // Source\n  const sourceEl = querySelector(itemElement, 'source');\n  const source: RssSource | undefined = sourceEl\n    ? {\n        value: cleanText(getText(sourceEl)),\n        url: getAttribute(sourceEl, 'url') || '',\n      }\n    : undefined;\n\n  const item: RssItem = {};\n\n  // Add fields only if they exist (RSS spec allows items with minimal data)\n  if (title) item.title = title;\n  if (link) item.link = link;\n  if (description) item.description = description;\n  if (author) item.author = author;\n  if (category) item.category = category;\n  if (comments) item.comments = comments;\n  if (enclosure) item.enclosure = enclosure;\n  if (guid) item.guid = guid;\n  if (pubDate) item.pubDate = pubDate;\n  if (source) item.source = source;\n\n  return item;\n}\n\n/**\n * Extract all items from channel\n */\nexport function extractItems(channelElement: RSSElement): RssItem[] {\n  const itemElements = querySelectorAll(channelElement, 'item');\n  return itemElements.map((itemEl) => extractItem(itemEl));\n}\n","/**\n * Extract RSS namespace extensions\n * Common namespaces: content:encoded, dc:creator, media:*, atom:link\n */\n\n// import type { RssMediaContent, RssMediaThumbnail } from './types.js';\nimport { cleanText } from './clean-text.js';\nimport { parseRSSDate } from './parse-date.js';\nimport type { RssNamespaces } from './types.js';\nimport type { RSSElement } from './xml-parser.js';\nimport { getAttribute, getText, querySelector, querySelectorAll } from './xml-parser.js';\n\n/**\n * Extract namespace extensions from item\n */\nexport function extractNamespaces(itemElement: RSSElement): RssNamespaces {\n  const namespaces: RssNamespaces = {};\n\n  // content:encoded - Full content (often HTML)\n  const contentEncoded = querySelector(itemElement, 'content:encoded');\n  if (contentEncoded) {\n    namespaces.contentEncoded = cleanText(getText(contentEncoded), {\n      preserveLineBreaks: true,\n    });\n  }\n\n  // dc:creator - Dublin Core creator (author)\n  const dcCreator = querySelector(itemElement, 'dc:creator');\n  if (dcCreator) {\n    namespaces.dcCreator = cleanText(getText(dcCreator));\n  }\n\n  // dc:date - Dublin Core date (alternative to pubDate)\n  const dcDate = querySelector(itemElement, 'dc:date');\n  if (dcDate) {\n    const dateText = cleanText(getText(dcDate));\n    // dc:date uses ISO 8601, not RFC 822\n    const parsed = parseRSSDate(dateText);\n    if (parsed) {\n      namespaces.dcDate = parsed;\n    }\n  }\n\n  // dc:subject - Dublin Core subject (categories)\n  const dcSubjects = querySelectorAll(itemElement, 'dc:subject');\n  if (dcSubjects.length > 0) {\n    const subjects = dcSubjects\n      .map((el) => cleanText(getText(el)))\n      .filter((text) => text.length > 0);\n    if (subjects.length > 0) {\n      namespaces.dcSubject = subjects;\n    }\n  }\n\n  // media:content - Media RSS content\n  const mediaContents = querySelectorAll(itemElement, 'media:content');\n  if (mediaContents.length > 0) {\n    namespaces.mediaContent = mediaContents.map((el) => ({\n      url: getAttribute(el, 'url') || '',\n      type: getAttribute(el, 'type') || undefined,\n      medium: getAttribute(el, 'medium') || undefined,\n      width: (() => {\n        const w = getAttribute(el, 'width');\n        return w ? Number.parseInt(w, 10) : undefined;\n      })(),\n      height: (() => {\n        const h = getAttribute(el, 'height');\n        return h ? Number.parseInt(h, 10) : undefined;\n      })(),\n    }));\n  }\n\n  // media:thumbnail - Media RSS thumbnail\n  const mediaThumbnails = querySelectorAll(itemElement, 'media:thumbnail');\n  if (mediaThumbnails.length > 0) {\n    namespaces.mediaThumbnail = mediaThumbnails.map((el) => ({\n      url: getAttribute(el, 'url') || '',\n      width: (() => {\n        const w = getAttribute(el, 'width');\n        return w ? Number.parseInt(w, 10) : undefined;\n      })(),\n      height: (() => {\n        const h = getAttribute(el, 'height');\n        return h ? Number.parseInt(h, 10) : undefined;\n      })(),\n    }));\n  }\n\n  return namespaces;\n}\n","/**\n * Main RSS feed parser\n * Orchestrates parsing of RSS 2.0, 0.9x feeds\n */\n\nimport { normalizeUrlHttps } from '../../utils/normalize-url.js';\nimport { extractChannel } from './extract-channel.js';\nimport { extractItem } from './extract-item.js';\nimport { extractNamespaces } from './extract-namespaces.js';\nimport type { RssChannel, RssFeedExtended, RssItem, RssItemExtended } from './types.js';\nimport { parseRSSXML, querySelector, querySelectorAll } from './xml-parser.js';\n\n/**\n * Parse RSS feed from XML string\n * Supports RSS 2.0, 0.92, 0.91, 0.9\n * @param xml - RSS XML string\n * @param baseUrl - Optional base URL for resolving relative URLs\n */\nexport function parseRSS(xml: string, baseUrl?: string | URL): RssFeedExtended {\n  // Parse XML\n  const doc = parseRSSXML(xml);\n\n  // Find RSS root element\n  const rssEl = querySelector(doc, 'rss');\n  if (!rssEl) {\n    throw new Error('Invalid RSS: Missing <rss> root element');\n  }\n\n  // Get RSS version\n  const version = rssEl.attributes.version || '2.0';\n\n  // Find channel element\n  const channelEl = querySelector(rssEl, 'channel');\n  if (!channelEl) {\n    throw new Error('Invalid RSS: Missing <channel> element');\n  }\n\n  // Extract channel metadata\n  const channel = extractChannel(channelEl);\n\n  // Extract items with namespaces\n  const itemElements = querySelectorAll(channelEl, 'item');\n  const items: RssItemExtended[] = itemElements.map((itemEl) => {\n    const item = extractItem(itemEl);\n    const namespaces = extractNamespaces(itemEl);\n\n    // Only add namespaces if any exist\n    if (Object.keys(namespaces).length > 0) {\n      return { ...item, namespaces };\n    }\n\n    return item;\n  });\n\n  // Apply URL normalization if base URL provided\n  const normalizedChannel = baseUrl ? normalizeChannelUrls(channel, baseUrl) : channel;\n  const normalizedItems = baseUrl ? items.map((item) => normalizeItemUrls(item, baseUrl)) : items;\n\n  return {\n    version,\n    channel: normalizedChannel,\n    items: normalizedItems,\n  };\n}\n\n/**\n * Normalize all URLs in channel\n */\nfunction normalizeChannelUrls(channel: RssChannel, baseUrl: string | URL): RssChannel {\n  return {\n    ...channel,\n    link: channel.link ? normalizeUrlHttps(baseUrl, channel.link) : channel.link,\n    image: channel.image\n      ? {\n          ...channel.image,\n          url: normalizeUrlHttps(baseUrl, channel.image.url),\n          link: channel.image.link\n            ? normalizeUrlHttps(baseUrl, channel.image.link)\n            : channel.image.link,\n        }\n      : channel.image,\n    docs: channel.docs ? normalizeUrlHttps(baseUrl, channel.docs) : channel.docs,\n  };\n}\n\n/**\n * Normalize all URLs in item\n */\nfunction normalizeItemUrls(item: RssItem, baseUrl: string | URL): RssItem {\n  return {\n    ...item,\n    link: item.link ? normalizeUrlHttps(baseUrl, item.link) : item.link,\n    comments: item.comments ? normalizeUrlHttps(baseUrl, item.comments) : item.comments,\n    enclosure: item.enclosure\n      ? {\n          ...item.enclosure,\n          url: normalizeUrlHttps(baseUrl, item.enclosure.url),\n        }\n      : item.enclosure,\n  };\n}\n\n/**\n * Detect if content is RSS format\n */\nexport function isRSS(xml: string): boolean {\n  try {\n    const trimmed = xml.trim();\n    // Quick check for RSS markers\n    return (\n      trimmed.includes('<rss') &&\n      (trimmed.includes('version=\"2.0\"') ||\n        trimmed.includes(\"version='2.0'\") ||\n        trimmed.includes('version=\"0.9') ||\n        trimmed.includes(\"version='0.9\"))\n    );\n  } catch {\n    return false;\n  }\n}\n","/**\n * Unified feed parser with automatic format detection.\n *\n * @packageDocumentation\n */\n\nimport { parseAtom } from './atom/index.js';\nimport { detectFormat, type FeedFormat } from './detect.js';\nimport { parseJSONFeed } from './json-feed/index.js';\nimport { normalizeAtom, normalizeJSONFeed, normalizeRSS } from './normalize.js';\nimport { parseRSS } from './rss/index.js';\nimport type { Feed, ParseResult } from './types.js';\n\n/**\n * Parse any feed format with automatic format detection.\n *\n * @remarks\n * This is the main entry point for feed parsing. It automatically detects whether\n * the content is RSS, Atom, or JSON Feed, parses it, and returns a normalized\n * output structure along with the original format-specific data.\n *\n * All relative URLs in the feed are converted to absolute URLs if a base URL is provided.\n * This is essential for feed readers that need to fetch images, enclosures, or follow links.\n *\n * @param content - Feed content as string (XML or JSON)\n * @param baseUrl - Optional base URL for resolving relative URLs (string or URL object)\n * @returns Object containing normalized feed data and original format-specific data\n * @throws Error if format cannot be detected or parsing fails\n *\n * @example\n * ```typescript\n * const feedContent = await fetch('https://example.com/feed.xml').then(r => r.text());\n * const result = parseFeed(feedContent, 'https://example.com/feed.xml');\n *\n * console.log(result.feed.title);\n * console.log(result.feed.items[0].title);\n * console.log(result.feed.items[0].url); // Absolute URL\n * ```\n */\nexport function parseFeed(content: string, baseUrl?: string | URL): ParseResult {\n  const format = detectFormat(content);\n\n  if (format === 'unknown') {\n    throw new Error('Unable to detect feed format. Content must be RSS, Atom, or JSON Feed.');\n  }\n\n  return parseFeedAs(content, format, baseUrl);\n}\n\n/**\n * Parse feed with explicit format specification.\n *\n * @remarks\n * Use this function when you already know the feed format and want to skip\n * automatic detection. This can be slightly faster than {@link parseFeed}\n * and provides more control over the parsing process.\n *\n * @param content - Feed content as string (XML or JSON)\n * @param format - Explicit format to parse as ('rss', 'atom', or 'json-feed')\n * @param baseUrl - Optional base URL for resolving relative URLs\n * @returns Object containing normalized feed data and original format-specific data\n * @throws Error if parsing fails or format is 'unknown'\n *\n * @example\n * ```typescript\n * // Parse known RSS feed\n * const result = parseFeedAs(rssContent, 'rss', 'https://example.com/feed.xml');\n * ```\n */\nexport function parseFeedAs(\n  content: string,\n  format: FeedFormat,\n  baseUrl?: string | URL,\n): ParseResult {\n  if (format === 'unknown') {\n    throw new Error('Cannot parse feed with format \"unknown\"');\n  }\n\n  switch (format) {\n    case 'rss': {\n      const rss = parseRSS(content, baseUrl);\n      return {\n        feed: normalizeRSS(rss),\n        original: rss,\n      };\n    }\n\n    case 'atom': {\n      const atom = parseAtom(content, baseUrl);\n      return {\n        feed: normalizeAtom(atom),\n        original: atom,\n      };\n    }\n\n    case 'json-feed': {\n      const jsonFeed = parseJSONFeed(content, baseUrl);\n      return {\n        feed: normalizeJSONFeed(jsonFeed),\n        original: jsonFeed,\n      };\n    }\n\n    case 'sitemap': {\n      throw new Error(\n        'Sitemaps cannot be parsed with parseFeed(). Use parseSitemap() from the sitemap module instead.',\n      );\n    }\n  }\n}\n\n/**\n * Parse feed and return only normalized data.\n *\n * @remarks\n * Convenience wrapper around {@link parseFeed} that returns only the normalized\n * feed data without the original format-specific data. Use this when you don't\n * need access to format-specific fields.\n *\n * @param content - Feed content as string (XML or JSON)\n * @param baseUrl - Optional base URL for resolving relative URLs\n * @returns Normalized feed data only\n * @throws Error if format cannot be detected or parsing fails\n *\n * @example\n * ```typescript\n * const feed = parseFeedNormalized(content, 'https://example.com/feed.xml');\n * console.log(feed.title);\n * console.log(feed.items.length);\n * ```\n */\nexport function parseFeedNormalized(content: string, baseUrl?: string | URL): Feed {\n  return parseFeed(content, baseUrl).feed;\n}\n","/**\n * Minimal Sitemap-specific XML parser\n * Built specifically for sitemap XML without HTML parsing quirks\n */\n\nexport interface SitemapElement {\n  /** Tag name (e.g., 'url', 'loc', 'urlset') */\n  tagName: string;\n  /** Element attributes */\n  attributes: Record<string, string>;\n  /** Text content */\n  text: string;\n  /** Child elements */\n  children: SitemapElement[];\n  /** Parent element (for traversal) */\n  parent: SitemapElement | null;\n}\n\n/**\n * Parse Sitemap XML string into element tree\n */\nexport function parseSitemapXML(xml: string): SitemapElement {\n  const cleaned = cleanXMLDeclaration(xml);\n  const withoutDoctype = removeDoctype(cleaned);\n  const withoutComments = removeComments(withoutDoctype);\n  const root = parseElement(withoutComments, 0).element;\n  return root;\n}\n\n/**\n * Remove XML declaration and clean whitespace\n */\nfunction cleanXMLDeclaration(xml: string): string {\n  return xml.replace(/<\\?xml[^?]*\\?>/g, '').trim();\n}\n\n/**\n * Remove DOCTYPE declarations\n */\nfunction removeDoctype(xml: string): string {\n  return xml.replace(/<!DOCTYPE[^>]*>/gi, '');\n}\n\n/**\n * Remove XML comments\n */\nfunction removeComments(xml: string): string {\n  return xml.replace(/<!--[\\s\\S]*?-->/g, '');\n}\n\n/**\n * Extract CDATA content and replace with placeholder\n */\nfunction extractCDATA(text: string): { text: string; cdataMap: Map<string, string> } {\n  const cdataMap = new Map<string, string>();\n  let counter = 0;\n\n  const processed = text.replace(/<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>/g, (_match, content) => {\n    const placeholder = `__CDATA_${counter}__`;\n    cdataMap.set(placeholder, content);\n    counter++;\n    return placeholder;\n  });\n\n  return { text: processed, cdataMap };\n}\n\n/**\n * Restore CDATA content from placeholders\n */\nfunction restoreCDATA(text: string, cdataMap: Map<string, string>): string {\n  let result = text;\n  for (const [placeholder, content] of cdataMap.entries()) {\n    result = result.replace(placeholder, content);\n  }\n  return result;\n}\n\n/**\n * Parse attributes from opening tag\n */\nfunction parseAttributes(tagContent: string): Record<string, string> {\n  const attributes: Record<string, string> = {};\n  const attrRegex = /(\\S+)=[\"']([^\"']*)[\"']/g;\n  let match: RegExpExecArray | null = attrRegex.exec(tagContent);\n\n  while (match !== null) {\n    attributes[match[1]] = match[2];\n    match = attrRegex.exec(tagContent);\n  }\n\n  return attributes;\n}\n\n/**\n * Find matching closing tag position\n */\nfunction findClosingTag(xml: string, tagName: string, startPos: number): number {\n  const openTag = `<${tagName}`;\n  const closeTag = `</${tagName}>`;\n  let depth = 1;\n  let pos = startPos;\n\n  while (pos < xml.length && depth > 0) {\n    const nextOpen = xml.indexOf(openTag, pos);\n    const nextClose = xml.indexOf(closeTag, pos);\n\n    if (nextClose === -1) {\n      return -1; // No closing tag found\n    }\n\n    if (nextOpen !== -1 && nextOpen < nextClose) {\n      // Found nested opening tag\n      depth++;\n      pos = nextOpen + openTag.length;\n    } else {\n      // Found closing tag\n      depth--;\n      if (depth === 0) {\n        return nextClose;\n      }\n      pos = nextClose + closeTag.length;\n    }\n  }\n\n  return -1;\n}\n\n/**\n * Parse a single element and its children\n */\nfunction parseElement(\n  xml: string,\n  startPos: number,\n  parent: SitemapElement | null = null,\n  cdataMap?: Map<string, string>,\n): { element: SitemapElement; endPos: number; cdataMap: Map<string, string> } {\n  // Extract CDATA first (only at top level)\n  const extracted = cdataMap ? { text: xml, cdataMap } : extractCDATA(xml);\n  const cleanedXML = extracted.text;\n  const currentCdataMap = extracted.cdataMap;\n\n  // Find opening tag\n  const openTagStart = cleanedXML.indexOf('<', startPos);\n  if (openTagStart === -1) {\n    throw new Error('No opening tag found');\n  }\n\n  const openTagEnd = cleanedXML.indexOf('>', openTagStart);\n  if (openTagEnd === -1) {\n    throw new Error('Unclosed opening tag');\n  }\n\n  const openTagContent = cleanedXML.substring(openTagStart + 1, openTagEnd);\n\n  // Check for self-closing tag\n  const isSelfClosing = openTagContent.endsWith('/');\n  const tagContent = isSelfClosing ? openTagContent.slice(0, -1).trim() : openTagContent;\n\n  // Extract tag name and attributes\n  const spaceIndex = tagContent.indexOf(' ');\n  const tagName = spaceIndex === -1 ? tagContent : tagContent.substring(0, spaceIndex);\n  const attributes = spaceIndex === -1 ? {} : parseAttributes(tagContent.substring(spaceIndex));\n\n  const element: SitemapElement = {\n    tagName,\n    attributes,\n    text: '',\n    children: [],\n    parent,\n  };\n\n  // Handle self-closing tags\n  if (isSelfClosing) {\n    return { element, endPos: openTagEnd + 1, cdataMap: currentCdataMap };\n  }\n\n  // Find closing tag\n  const closingTagPos = findClosingTag(cleanedXML, tagName, openTagEnd + 1);\n  if (closingTagPos === -1) {\n    throw new Error(`No closing tag found for <${tagName}>`);\n  }\n\n  // Extract content between tags\n  const content = cleanedXML.substring(openTagEnd + 1, closingTagPos);\n\n  // Parse children or text content\n  if (content.includes('<')) {\n    // Has child elements\n    let pos = 0;\n    const trimmedContent = content.trim();\n\n    while (pos < trimmedContent.length) {\n      const nextTag = trimmedContent.indexOf('<', pos);\n      if (nextTag === -1) break;\n\n      // Check if it's a closing tag or comment\n      if (trimmedContent[nextTag + 1] === '/' || trimmedContent[nextTag + 1] === '!') {\n        pos = nextTag + 1;\n        continue;\n      }\n\n      try {\n        const { element: child, endPos } = parseElement(\n          trimmedContent,\n          nextTag,\n          element,\n          currentCdataMap,\n        );\n        element.children.push(child);\n        pos = endPos;\n      } catch {\n        pos = nextTag + 1;\n      }\n    }\n\n    // Extract text content (without child elements)\n    let textContent = content.replace(/<[^>]+>/g, '').trim();\n    textContent = restoreCDATA(textContent, currentCdataMap);\n    element.text = textContent;\n  } else {\n    // Pure text content\n    let textContent = content.trim();\n    textContent = restoreCDATA(textContent, currentCdataMap);\n    element.text = textContent;\n  }\n\n  const closingTagEnd = closingTagPos + `</${tagName}>`.length;\n  return { element, endPos: closingTagEnd, cdataMap: currentCdataMap };\n}\n\n/**\n * Query selector - find first matching element (case-insensitive by default)\n */\nexport function querySelector(\n  element: SitemapElement,\n  selector: string,\n  caseSensitive = false,\n): SitemapElement | null {\n  const tagName = caseSensitive ? selector : selector.toLowerCase();\n  const elementTag = caseSensitive ? element.tagName : element.tagName.toLowerCase();\n\n  if (elementTag === tagName) {\n    return element;\n  }\n\n  for (const child of element.children) {\n    const found = querySelector(child, selector, caseSensitive);\n    if (found) return found;\n  }\n\n  return null;\n}\n\n/**\n * Query selector all - find all matching elements\n */\nexport function querySelectorAll(\n  element: SitemapElement,\n  selector: string,\n  caseSensitive = false,\n): SitemapElement[] {\n  const results: SitemapElement[] = [];\n  const tagName = caseSensitive ? selector : selector.toLowerCase();\n  const elementTag = caseSensitive ? element.tagName : element.tagName.toLowerCase();\n\n  if (elementTag === tagName) {\n    results.push(element);\n  }\n\n  for (const child of element.children) {\n    results.push(...querySelectorAll(child, selector, caseSensitive));\n  }\n\n  return results;\n}\n\n/**\n * Get text content of element\n */\nexport function getText(element: SitemapElement | null | undefined): string {\n  return element?.text || '';\n}\n\n/**\n * Get attribute value\n */\nexport function getAttribute(\n  element: SitemapElement | null | undefined,\n  name: string,\n): string | null {\n  return element?.attributes[name] || null;\n}\n\n/**\n * Get first child element by tag name\n */\nexport function getChild(element: SitemapElement, tagName: string): SitemapElement | null {\n  const lowerTag = tagName.toLowerCase();\n  return element.children.find((c) => c.tagName.toLowerCase() === lowerTag) || null;\n}\n\n/**\n * Get all child elements by tag name\n */\nexport function getChildren(element: SitemapElement, tagName: string): SitemapElement[] {\n  const lowerTag = tagName.toLowerCase();\n  return element.children.filter((c) => c.tagName.toLowerCase() === lowerTag);\n}\n","/**\n * Sitemap XML Parser\n * Supports standard sitemaps, sitemap indexes, and Google News extension\n *\n * @packageDocumentation\n */\n\nimport { normalizeUrlHttps } from '../../utils/normalize-url.js';\nimport type {\n  SitemapImage,\n  SitemapIndexEntry,\n  SitemapNews,\n  SitemapParseResult,\n  SitemapUrl,\n  SitemapVideo,\n} from './types.js';\nimport {\n  getChild,\n  getChildren,\n  getText,\n  parseSitemapXML,\n  querySelector,\n  querySelectorAll,\n  type SitemapElement,\n} from './xml-parser.js';\n\n/**\n * Parse a sitemap XML string\n *\n * @param xml - Sitemap XML content\n * @param baseUrl - Optional base URL for resolving relative URLs\n * @returns Parsed sitemap with URLs or sitemap references\n *\n * @example\n * ```typescript\n * const result = parseSitemap(xmlContent, 'https://example.com/sitemap.xml');\n * console.log(result.sitemap.urls.length);\n * ```\n */\nexport function parseSitemap(xml: string, baseUrl?: string | URL): SitemapParseResult {\n  const doc = parseSitemapXML(xml);\n\n  // Check for sitemap index first\n  const sitemapIndex = querySelector(doc, 'sitemapindex');\n  if (sitemapIndex) {\n    return parseSitemapIndex(sitemapIndex, baseUrl);\n  }\n\n  // Check for urlset (standard sitemap)\n  const urlset = querySelector(doc, 'urlset');\n  if (urlset) {\n    return parseUrlset(urlset, baseUrl);\n  }\n\n  // Fallback: try to find URLs anyway (forgiving)\n  const urls = querySelectorAll(doc, 'url');\n  if (urls.length > 0) {\n    return {\n      sitemap: {\n        type: 'urlset',\n        urls: urls.map((url) => extractUrl(url, baseUrl)),\n        sitemaps: [],\n      },\n      isIndex: false,\n    };\n  }\n\n  // Empty sitemap\n  return {\n    sitemap: {\n      type: 'urlset',\n      urls: [],\n      sitemaps: [],\n    },\n    isIndex: false,\n  };\n}\n\n/**\n * Parse a sitemap index\n */\nfunction parseSitemapIndex(element: SitemapElement, baseUrl?: string | URL): SitemapParseResult {\n  const sitemapElements = getChildren(element, 'sitemap');\n\n  const sitemaps: SitemapIndexEntry[] = sitemapElements.map((el) => {\n    const loc = getText(getChild(el, 'loc'));\n    const lastmod = getText(getChild(el, 'lastmod')) || undefined;\n\n    return {\n      loc: baseUrl ? normalizeUrlHttps(baseUrl, loc) : loc,\n      lastmod,\n    };\n  });\n\n  return {\n    sitemap: {\n      type: 'sitemapindex',\n      urls: [],\n      sitemaps,\n    },\n    isIndex: true,\n  };\n}\n\n/**\n * Parse a urlset (standard sitemap)\n */\nfunction parseUrlset(element: SitemapElement, baseUrl?: string | URL): SitemapParseResult {\n  const urlElements = getChildren(element, 'url');\n  const urls = urlElements.map((el) => extractUrl(el, baseUrl));\n\n  return {\n    sitemap: {\n      type: 'urlset',\n      urls,\n      sitemaps: [],\n    },\n    isIndex: false,\n  };\n}\n\n/**\n * Extract a single URL entry with all extensions\n */\nfunction extractUrl(element: SitemapElement, baseUrl?: string | URL): SitemapUrl {\n  const rawLoc = getText(getChild(element, 'loc'));\n  const loc = decodeXmlEntities(rawLoc);\n  const lastmod = getText(getChild(element, 'lastmod')) || undefined;\n  const changefreq = getText(getChild(element, 'changefreq')) || undefined;\n  const priorityText = getText(getChild(element, 'priority'));\n  const priority = priorityText ? Number.parseFloat(priorityText) : undefined;\n\n  const result: SitemapUrl = {\n    loc: baseUrl ? normalizeUrlHttps(baseUrl, loc) : loc,\n    lastmod,\n    changefreq: changefreq as SitemapUrl['changefreq'],\n    priority: priority && !Number.isNaN(priority) ? priority : undefined,\n  };\n\n  // Extract Google News extension\n  const news = extractNews(element);\n  if (news) {\n    result.news = news;\n  }\n\n  // Extract Image extension\n  const images = extractImages(element, baseUrl);\n  if (images.length > 0) {\n    result.images = images;\n  }\n\n  // Extract Video extension\n  const videos = extractVideos(element, baseUrl);\n  if (videos.length > 0) {\n    result.videos = videos;\n  }\n\n  return result;\n}\n\n/**\n * Extract Google News extension data\n */\nfunction extractNews(urlElement: SitemapElement): SitemapNews | undefined {\n  // Look for news:news element (namespaced)\n  const newsEl =\n    getChild(urlElement, 'news:news') ||\n    getChild(urlElement, 'news') ||\n    urlElement.children.find((c) => c.tagName.toLowerCase().endsWith(':news'));\n\n  if (!newsEl) {\n    return undefined;\n  }\n\n  const news: SitemapNews = {};\n\n  // Publication info\n  const pubEl =\n    getChild(newsEl, 'news:publication') ||\n    getChild(newsEl, 'publication') ||\n    newsEl.children.find((c) => c.tagName.toLowerCase().endsWith(':publication'));\n\n  if (pubEl) {\n    const name =\n      getText(getChild(pubEl, 'news:name')) ||\n      getText(getChild(pubEl, 'name')) ||\n      getText(pubEl.children.find((c) => c.tagName.toLowerCase().endsWith(':name')));\n\n    const language =\n      getText(getChild(pubEl, 'news:language')) ||\n      getText(getChild(pubEl, 'language')) ||\n      getText(pubEl.children.find((c) => c.tagName.toLowerCase().endsWith(':language')));\n\n    if (name || language) {\n      news.publication = {\n        name: name || undefined,\n        language: language || undefined,\n      };\n    }\n  }\n\n  // Publication date\n  const pubDate =\n    getText(getChild(newsEl, 'news:publication_date')) ||\n    getText(getChild(newsEl, 'publication_date')) ||\n    getText(newsEl.children.find((c) => c.tagName.toLowerCase().endsWith(':publication_date')));\n\n  if (pubDate) {\n    news.publicationDate = pubDate;\n  }\n\n  // Title\n  const title =\n    getText(getChild(newsEl, 'news:title')) ||\n    getText(getChild(newsEl, 'title')) ||\n    getText(newsEl.children.find((c) => c.tagName.toLowerCase().endsWith(':title')));\n\n  if (title) {\n    news.title = decodeXmlEntities(title);\n  }\n\n  // Keywords\n  const keywords =\n    getText(getChild(newsEl, 'news:keywords')) ||\n    getText(getChild(newsEl, 'keywords')) ||\n    getText(newsEl.children.find((c) => c.tagName.toLowerCase().endsWith(':keywords')));\n\n  if (keywords) {\n    news.keywords = keywords.split(',').map((k) => k.trim());\n  }\n\n  // Stock tickers\n  const stockTickers =\n    getText(getChild(newsEl, 'news:stock_tickers')) ||\n    getText(getChild(newsEl, 'stock_tickers')) ||\n    getText(newsEl.children.find((c) => c.tagName.toLowerCase().endsWith(':stock_tickers')));\n\n  if (stockTickers) {\n    news.stockTickers = stockTickers.split(',').map((t) => t.trim());\n  }\n\n  return Object.keys(news).length > 0 ? news : undefined;\n}\n\n/**\n * Extract Image extension data\n */\nfunction extractImages(urlElement: SitemapElement, baseUrl?: string | URL): SitemapImage[] {\n  const imageElements = urlElement.children.filter(\n    (c) =>\n      c.tagName.toLowerCase() === 'image:image' ||\n      c.tagName.toLowerCase() === 'image' ||\n      c.tagName.toLowerCase().endsWith(':image'),\n  );\n\n  return imageElements\n    .map((imgEl) => {\n      const loc =\n        getText(getChild(imgEl, 'image:loc')) ||\n        getText(getChild(imgEl, 'loc')) ||\n        getText(imgEl.children.find((c) => c.tagName.toLowerCase().endsWith(':loc')));\n\n      if (!loc) return null;\n\n      const image: SitemapImage = {\n        loc: baseUrl ? normalizeUrlHttps(baseUrl, loc) : loc,\n      };\n\n      const caption =\n        getText(getChild(imgEl, 'image:caption')) ||\n        getText(getChild(imgEl, 'caption')) ||\n        getText(imgEl.children.find((c) => c.tagName.toLowerCase().endsWith(':caption')));\n      if (caption) image.caption = decodeXmlEntities(caption);\n\n      const geoLocation =\n        getText(getChild(imgEl, 'image:geo_location')) ||\n        getText(getChild(imgEl, 'geo_location')) ||\n        getText(imgEl.children.find((c) => c.tagName.toLowerCase().endsWith(':geo_location')));\n      if (geoLocation) image.geoLocation = geoLocation;\n\n      const title =\n        getText(getChild(imgEl, 'image:title')) ||\n        getText(getChild(imgEl, 'title')) ||\n        getText(imgEl.children.find((c) => c.tagName.toLowerCase().endsWith(':title')));\n      if (title) image.title = decodeXmlEntities(title);\n\n      const license =\n        getText(getChild(imgEl, 'image:license')) ||\n        getText(getChild(imgEl, 'license')) ||\n        getText(imgEl.children.find((c) => c.tagName.toLowerCase().endsWith(':license')));\n      if (license) image.license = baseUrl ? normalizeUrlHttps(baseUrl, license) : license;\n\n      return image;\n    })\n    .filter((img): img is SitemapImage => img !== null);\n}\n\n/**\n * Extract Video extension data\n */\nfunction extractVideos(urlElement: SitemapElement, baseUrl?: string | URL): SitemapVideo[] {\n  const videoElements = urlElement.children.filter(\n    (c) =>\n      c.tagName.toLowerCase() === 'video:video' ||\n      c.tagName.toLowerCase() === 'video' ||\n      c.tagName.toLowerCase().endsWith(':video'),\n  );\n\n  return videoElements\n    .map((vidEl) => {\n      const thumbnailLoc =\n        getText(getChild(vidEl, 'video:thumbnail_loc')) ||\n        getText(getChild(vidEl, 'thumbnail_loc')) ||\n        getText(vidEl.children.find((c) => c.tagName.toLowerCase().endsWith(':thumbnail_loc')));\n\n      const title =\n        getText(getChild(vidEl, 'video:title')) ||\n        getText(getChild(vidEl, 'title')) ||\n        getText(vidEl.children.find((c) => c.tagName.toLowerCase().endsWith(':title')));\n\n      const description =\n        getText(getChild(vidEl, 'video:description')) ||\n        getText(getChild(vidEl, 'description')) ||\n        getText(vidEl.children.find((c) => c.tagName.toLowerCase().endsWith(':description')));\n\n      // All three are required\n      if (!thumbnailLoc || !title || !description) return null;\n\n      const video: SitemapVideo = {\n        thumbnailLoc: baseUrl ? normalizeUrlHttps(baseUrl, thumbnailLoc) : thumbnailLoc,\n        title: decodeXmlEntities(title),\n        description: decodeXmlEntities(description),\n      };\n\n      // Optional fields\n      const contentLoc =\n        getText(getChild(vidEl, 'video:content_loc')) ||\n        getText(getChild(vidEl, 'content_loc')) ||\n        getText(vidEl.children.find((c) => c.tagName.toLowerCase().endsWith(':content_loc')));\n      if (contentLoc)\n        video.contentLoc = baseUrl ? normalizeUrlHttps(baseUrl, contentLoc) : contentLoc;\n\n      const playerLoc =\n        getText(getChild(vidEl, 'video:player_loc')) ||\n        getText(getChild(vidEl, 'player_loc')) ||\n        getText(vidEl.children.find((c) => c.tagName.toLowerCase().endsWith(':player_loc')));\n      if (playerLoc) video.playerLoc = baseUrl ? normalizeUrlHttps(baseUrl, playerLoc) : playerLoc;\n\n      const duration =\n        getText(getChild(vidEl, 'video:duration')) ||\n        getText(getChild(vidEl, 'duration')) ||\n        getText(vidEl.children.find((c) => c.tagName.toLowerCase().endsWith(':duration')));\n      if (duration) {\n        const dur = Number.parseInt(duration, 10);\n        if (!Number.isNaN(dur)) video.duration = dur;\n      }\n\n      const rating =\n        getText(getChild(vidEl, 'video:rating')) ||\n        getText(getChild(vidEl, 'rating')) ||\n        getText(vidEl.children.find((c) => c.tagName.toLowerCase().endsWith(':rating')));\n      if (rating) {\n        const r = Number.parseFloat(rating);\n        if (!Number.isNaN(r)) video.rating = r;\n      }\n\n      const viewCount =\n        getText(getChild(vidEl, 'video:view_count')) ||\n        getText(getChild(vidEl, 'view_count')) ||\n        getText(vidEl.children.find((c) => c.tagName.toLowerCase().endsWith(':view_count')));\n      if (viewCount) {\n        const vc = Number.parseInt(viewCount, 10);\n        if (!Number.isNaN(vc)) video.viewCount = vc;\n      }\n\n      const publicationDate =\n        getText(getChild(vidEl, 'video:publication_date')) ||\n        getText(getChild(vidEl, 'publication_date')) ||\n        getText(vidEl.children.find((c) => c.tagName.toLowerCase().endsWith(':publication_date')));\n      if (publicationDate) video.publicationDate = publicationDate;\n\n      const familyFriendly =\n        getText(getChild(vidEl, 'video:family_friendly')) ||\n        getText(getChild(vidEl, 'family_friendly')) ||\n        getText(vidEl.children.find((c) => c.tagName.toLowerCase().endsWith(':family_friendly')));\n      if (familyFriendly) {\n        video.familyFriendly = familyFriendly.toLowerCase() === 'yes';\n      }\n\n      const category =\n        getText(getChild(vidEl, 'video:category')) ||\n        getText(getChild(vidEl, 'category')) ||\n        getText(vidEl.children.find((c) => c.tagName.toLowerCase().endsWith(':category')));\n      if (category) video.category = category;\n\n      // Tags (multiple elements)\n      const tagElements = vidEl.children.filter(\n        (c) =>\n          c.tagName.toLowerCase() === 'video:tag' ||\n          c.tagName.toLowerCase() === 'tag' ||\n          c.tagName.toLowerCase().endsWith(':tag'),\n      );\n      if (tagElements.length > 0) {\n        video.tags = tagElements.map((t) => getText(t)).filter(Boolean);\n      }\n\n      return video;\n    })\n    .filter((vid): vid is SitemapVideo => vid !== null);\n}\n\n/**\n * Decode common XML entities\n */\nfunction decodeXmlEntities(text: string): string {\n  return text\n    .replace(/&lt;/g, '<')\n    .replace(/&gt;/g, '>')\n    .replace(/&amp;/g, '&')\n    .replace(/&quot;/g, '\"')\n    .replace(/&apos;/g, \"'\")\n    .replace(/&#(\\d+);/g, (_, code) => String.fromCharCode(Number.parseInt(code, 10)))\n    .replace(/&#x([0-9a-fA-F]+);/g, (_, code) => String.fromCharCode(Number.parseInt(code, 16)));\n}\n\n/**\n * Check if content is a sitemap\n */\nexport function isSitemap(xml: string): boolean {\n  if (!xml || typeof xml !== 'string') {\n    return false;\n  }\n\n  const trimmed = xml.trim();\n\n  // Quick check for sitemap markers\n  return (\n    (trimmed.includes('<urlset') || trimmed.includes('<sitemapindex')) &&\n    trimmed.includes('sitemaps.org')\n  );\n}\n","/**\n * Enhanced fetch types for web scraping.\n *\n * @remarks\n * Types for pluck() - fetch-compatible enhanced HTTP client.\n *\n * @author Anonyfox <max@anonyfox.com>\n * @license MIT\n * @see {@link https://github.com/Anonyfox/ravenjs}\n * @see {@link https://ravenjs.dev}\n * @see {@link https://anonyfox.com}\n *\n * @packageDocumentation\n */\n\n/**\n * Extended RequestInit with pluck-specific options.\n *\n * @remarks\n * Extends standard fetch RequestInit with additional options for\n * robust web scraping. All standard fetch options are supported.\n */\nexport interface PluckInit extends RequestInit {\n  /**\n   * Request timeout in milliseconds.\n   *\n   * @default 30000 (30 seconds)\n   */\n  timeout?: number;\n\n  /**\n   * Maximum number of redirects to follow.\n   *\n   * @default 10\n   */\n  maxRedirects?: number;\n\n  /**\n   * Maximum response size in bytes.\n   *\n   * @default 10485760 (10MB)\n   */\n  maxSize?: number;\n\n  /**\n   * User-Agent header shortcut.\n   *\n   * @remarks\n   * Convenience property that sets the User-Agent header.\n   * Overrides any User-Agent in the headers object.\n   */\n  userAgent?: string;\n\n  /**\n   * Throw error on HTTP error status (4xx, 5xx).\n   *\n   * @default true\n   */\n  throwOnHttpError?: boolean;\n\n  /**\n   * Validate Content-Type header.\n   *\n   * @remarks\n   * If true, throws error if Content-Type is not in allowedContentTypes.\n   *\n   * @default false\n   */\n  strictContentType?: boolean;\n\n  /**\n   * Allowed Content-Type values for strictContentType.\n   *\n   * @default ['text/html', 'text/xml', 'application/xml', 'application/xhtml+xml', 'application/rss+xml', 'application/atom+xml', 'application/json']\n   */\n  allowedContentTypes?: string[];\n\n  /**\n   * Follow redirects automatically.\n   *\n   * @remarks\n   * If false, returns the 3xx response directly without following.\n   *\n   * @default true\n   */\n  followRedirects?: boolean;\n\n  /**\n   * Validate detected encoding.\n   *\n   * @remarks\n   * If true, throws error if detected encoding is invalid or unsupported.\n   *\n   * @default true\n   */\n  validateEncoding?: boolean;\n}\n\n/**\n * Enhanced Response with pluck-specific properties.\n *\n * @remarks\n * Extends standard Response with additional metadata about the request.\n * All standard Response properties and methods are available.\n */\nexport interface PluckResponse extends Response {\n  /**\n   * Final URL after following redirects.\n   */\n  finalUrl: string;\n\n  /**\n   * Original request URL.\n   */\n  originalUrl: string;\n\n  /**\n   * Array of redirect URLs (excluding original and final).\n   */\n  redirectChain: string[];\n\n  /**\n   * Detected character encoding.\n   *\n   * @example 'utf-8', 'windows-1252', 'iso-8859-1'\n   */\n  detectedEncoding: string;\n\n  /**\n   * Request timing information.\n   */\n  timing: {\n    /** Request start timestamp (milliseconds since epoch) */\n    start: number;\n    /** Request end timestamp (milliseconds since epoch) */\n    end: number;\n    /** Total duration in milliseconds */\n    duration: number;\n    /** Time spent in redirects (milliseconds) */\n    redirectDuration?: number;\n  };\n\n  /**\n   * Get response body as UTF-8 text.\n   *\n   * @remarks\n   * Unlike standard text(), this guarantees UTF-8 output regardless\n   * of the source encoding. Uses detected encoding to decode properly.\n   *\n   * @returns UTF-8 decoded text\n   */\n  textUtf8(): Promise<string>;\n}\n\n/**\n * Base error class for pluck errors.\n */\nexport class PluckError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'PluckError';\n    Error.captureStackTrace?.(this, this.constructor);\n  }\n}\n\n/**\n * Network error (connection failed, DNS, etc.).\n */\nexport class PluckNetworkError extends PluckError {\n  constructor(\n    message: string,\n    public readonly cause?: Error,\n  ) {\n    super(message);\n    this.name = 'PluckNetworkError';\n  }\n}\n\n/**\n * Request timeout error.\n */\nexport class PluckTimeoutError extends PluckError {\n  constructor(\n    message: string,\n    public readonly timeoutMs: number,\n  ) {\n    super(message);\n    this.name = 'PluckTimeoutError';\n  }\n}\n\n/**\n * HTTP error (4xx, 5xx status codes).\n */\nexport class PluckHttpError extends PluckError {\n  constructor(\n    message: string,\n    public readonly statusCode: number,\n    public readonly statusText: string,\n    public readonly response: Response,\n  ) {\n    super(message);\n    this.name = 'PluckHttpError';\n  }\n}\n\n/**\n * Response size exceeded maximum.\n */\nexport class PluckSizeError extends PluckError {\n  constructor(\n    message: string,\n    public readonly maxSize: number,\n    public readonly actualSize?: number,\n  ) {\n    super(message);\n    this.name = 'PluckSizeError';\n  }\n}\n\n/**\n * Encoding detection or conversion error.\n */\nexport class PluckEncodingError extends PluckError {\n  constructor(\n    message: string,\n    public readonly encoding?: string,\n    public readonly cause?: Error,\n  ) {\n    super(message);\n    this.name = 'PluckEncodingError';\n  }\n}\n\n/**\n * Too many redirects or redirect loop detected.\n */\nexport class PluckRedirectError extends PluckError {\n  constructor(\n    message: string,\n    public readonly redirectChain: string[],\n    public readonly maxRedirects?: number,\n  ) {\n    super(message);\n    this.name = 'PluckRedirectError';\n  }\n}\n\n/**\n * Invalid or disallowed Content-Type.\n */\nexport class PluckContentTypeError extends PluckError {\n  constructor(\n    message: string,\n    public readonly contentType: string,\n    public readonly allowedTypes?: string[],\n  ) {\n    super(message);\n    this.name = 'PluckContentTypeError';\n  }\n}\n","/**\n * Character encoding detection and conversion.\n *\n * @remarks\n * Detects character encoding from BOM, HTTP headers, and HTML meta tags.\n * Converts all content to UTF-8 using native TextDecoder.\n *\n * @author Anonyfox <max@anonyfox.com>\n * @license MIT\n *\n * @packageDocumentation\n */\n\nimport { PluckEncodingError } from './types.js';\n\n/**\n * Detect character encoding from various sources.\n *\n * @remarks\n * Priority order:\n * 1. BOM (Byte Order Mark) in content\n * 2. charset in Content-Type header\n * 3. <meta charset> in HTML (first 1KB)\n * 4. <meta http-equiv=\"Content-Type\"> in HTML\n * 5. Default to UTF-8\n *\n * @param buffer - Response body as ArrayBuffer\n * @param contentType - Content-Type header value\n * @returns Detected encoding (e.g., 'utf-8', 'windows-1252')\n */\nexport function detectEncoding(buffer: ArrayBuffer, contentType?: string | null): string {\n  // Check BOM first (most reliable)\n  const bomEncoding = detectBOM(buffer);\n  if (bomEncoding) {\n    return bomEncoding;\n  }\n\n  // Check Content-Type header\n  if (contentType) {\n    const headerEncoding = parseCharsetFromContentType(contentType);\n    if (headerEncoding) {\n      return headerEncoding;\n    }\n  }\n\n  // Check first 1KB for meta declarations\n  const preview = new Uint8Array(buffer.slice(0, 1024));\n  const previewText = new TextDecoder('utf-8', { fatal: false }).decode(preview);\n\n  // Check XML declaration first (for RSS/Atom feeds)\n  const xmlEncoding = parseCharsetFromXml(previewText);\n  if (xmlEncoding) {\n    return xmlEncoding;\n  }\n\n  // Check HTML meta tags\n  const metaEncoding = parseCharsetFromHtml(previewText);\n  if (metaEncoding) {\n    return metaEncoding;\n  }\n\n  // Default to UTF-8\n  return 'utf-8';\n}\n\n/**\n * Detect encoding from Byte Order Mark (BOM).\n *\n * @param buffer - Response body as ArrayBuffer\n * @returns Encoding if BOM detected, null otherwise\n */\nfunction detectBOM(buffer: ArrayBuffer): string | null {\n  const bytes = new Uint8Array(buffer);\n\n  // UTF-8 BOM: EF BB BF\n  if (bytes.length >= 3 && bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf) {\n    return 'utf-8';\n  }\n\n  // UTF-16 LE BOM: FF FE\n  if (bytes.length >= 2 && bytes[0] === 0xff && bytes[1] === 0xfe) {\n    return 'utf-16le';\n  }\n\n  // UTF-16 BE BOM: FE FF\n  if (bytes.length >= 2 && bytes[0] === 0xfe && bytes[1] === 0xff) {\n    return 'utf-16be';\n  }\n\n  return null;\n}\n\n/**\n * Parse charset from Content-Type header.\n *\n * @param contentType - Content-Type header value\n * @returns Encoding if found, null otherwise\n *\n * @example\n * parseCharsetFromContentType('text/html; charset=utf-8') // 'utf-8'\n * parseCharsetFromContentType('text/html; charset=windows-1252') // 'windows-1252'\n */\nexport function parseCharsetFromContentType(contentType: string): string | null {\n  const match = /charset\\s*=\\s*[\"']?([^\"'\\s;]+)/i.exec(contentType);\n  if (match) {\n    return normalizeEncoding(match[1]);\n  }\n  return null;\n}\n\n/**\n * Parse charset from HTML meta tags.\n *\n * @remarks\n * Checks for:\n * - `<meta charset=\"XXX\">`\n * - `<meta http-equiv=\"Content-Type\" content=\"text/html; charset=XXX\">`\n *\n * Uses light regex scanning, not full HTML parsing.\n *\n * @param html - HTML content (typically first 1KB)\n * @returns Encoding if found, null otherwise\n */\nexport function parseCharsetFromHtml(html: string): string | null {\n  // Check <meta charset=\"XXX\">\n  const charsetMatch = /<meta[^>]+charset\\s*=\\s*[\"']?([^\"'\\s>]+)/i.exec(html);\n  if (charsetMatch) {\n    return normalizeEncoding(charsetMatch[1]);\n  }\n\n  // Check <meta http-equiv=\"Content-Type\" content=\"...; charset=XXX\">\n  const httpEquivMatch =\n    /<meta[^>]+http-equiv\\s*=\\s*[\"']?content-type[\"']?[^>]+content\\s*=\\s*[\"']([^\"']+)/i.exec(html);\n  if (httpEquivMatch) {\n    const charset = parseCharsetFromContentType(httpEquivMatch[1]);\n    if (charset) {\n      return charset;\n    }\n  }\n\n  return null;\n}\n\n/**\n * Parse charset from XML declaration.\n *\n * @remarks\n * Checks for: `<?xml version=\"1.0\" encoding=\"XXX\"?>`\n *\n * @param xml - XML content (typically first 1KB)\n * @returns Encoding if found, null otherwise\n */\nexport function parseCharsetFromXml(xml: string): string | null {\n  // Check <?xml ... encoding=\"XXX\"?>\n  const xmlDeclMatch = /<\\?xml[^?]*encoding\\s*=\\s*[\"']([^\"']+)[\"'][^?]*\\?>/i.exec(xml);\n  if (xmlDeclMatch) {\n    return normalizeEncoding(xmlDeclMatch[1]);\n  }\n\n  return null;\n}\n\n/**\n * Normalize encoding name to standard form.\n *\n * @remarks\n * Handles common aliases and variations.\n *\n * @param encoding - Raw encoding name\n * @returns Normalized encoding name\n */\nfunction normalizeEncoding(encoding: string): string {\n  const normalized = encoding.toLowerCase().trim();\n\n  // Common aliases\n  const aliases: Record<string, string> = {\n    utf8: 'utf-8',\n    'iso-8859-1': 'latin1',\n    'iso-88591': 'latin1',\n    'iso8859-1': 'latin1',\n    'windows-1252': 'windows-1252',\n    cp1252: 'windows-1252',\n    ansi: 'windows-1252',\n  };\n\n  return aliases[normalized] || normalized;\n}\n\n/**\n * Decode buffer to UTF-8 string.\n *\n * @remarks\n * Uses native TextDecoder with the detected encoding.\n * Always returns UTF-8 string, regardless of source encoding.\n *\n * @param buffer - Response body as ArrayBuffer\n * @param encoding - Character encoding (e.g., 'utf-8', 'windows-1252')\n * @param validate - Whether to throw on invalid encoding\n * @returns UTF-8 decoded string\n * @throws PluckEncodingError if encoding is invalid and validate=true\n */\nexport function decodeToUtf8(buffer: ArrayBuffer, encoding: string, validate = true): string {\n  try {\n    const decoder = new TextDecoder(encoding, { fatal: validate });\n    return decoder.decode(buffer);\n  } catch (error) {\n    if (validate) {\n      throw new PluckEncodingError(\n        `Failed to decode content with encoding '${encoding}': ${error}`,\n        encoding,\n        error as Error,\n      );\n    }\n\n    // Fallback to UTF-8 with error replacement\n    const decoder = new TextDecoder('utf-8', { fatal: false });\n    return decoder.decode(buffer);\n  }\n}\n\n/**\n * Check if encoding is supported by TextDecoder.\n *\n * @param encoding - Encoding name to check\n * @returns True if encoding is supported\n */\nexport function isEncodingSupported(encoding: string): boolean {\n  try {\n    new TextDecoder(encoding);\n    return true;\n  } catch {\n    return false;\n  }\n}\n","/**\n * Enhanced fetch for web scraping.\n *\n * @remarks\n * fetch-compatible HTTP client with robust handling of real-world web content.\n *\n * @author Anonyfox <max@anonyfox.com>\n * @license MIT\n * @see {@link https://github.com/Anonyfox/ravenjs}\n * @see {@link https://ravenjs.dev}\n * @see {@link https://anonyfox.com}\n *\n * @packageDocumentation\n */\n\nimport { decodeToUtf8, detectEncoding } from './encoding.js';\nimport type { PluckInit, PluckResponse } from './types.js';\nimport {\n  PluckContentTypeError,\n  PluckHttpError,\n  PluckNetworkError,\n  PluckRedirectError,\n  PluckSizeError,\n  PluckTimeoutError,\n} from './types.js';\n\n// Default options\nconst DEFAULT_TIMEOUT = 30000; // 30 seconds\nconst DEFAULT_MAX_REDIRECTS = 10;\nconst DEFAULT_MAX_SIZE = 10 * 1024 * 1024; // 10MB\nconst DEFAULT_USER_AGENT =\n  'Mozilla/5.0 (compatible; Magpie-HTML/1.0; +https://github.com/Anonyfox/magpie-html)';\nconst DEFAULT_ALLOWED_CONTENT_TYPES = [\n  'text/html',\n  'text/xml',\n  'application/xml',\n  'application/xhtml+xml',\n  'application/rss+xml',\n  'application/atom+xml',\n  'application/json',\n];\n\n/**\n * Enhanced fetch for web scraping.\n *\n * @remarks\n * Drop-in replacement for fetch() with enhanced error handling, encoding detection,\n * redirect tracking, and size limits. Perfect for scraping HTML, feeds, and APIs.\n *\n * Features:\n * - Manual redirect tracking with full chain\n * - Automatic encoding detection and UTF-8 conversion\n * - Configurable timeouts and size limits\n * - Smart default headers for web scraping\n * - Content-Type validation\n * - Comprehensive error types\n *\n * @param input - URL string or Request object\n * @param init - Request options (extends standard RequestInit)\n * @returns Enhanced Response with additional metadata\n * @throws {PluckTimeoutError} Request timeout\n * @throws {PluckNetworkError} Network or DNS error\n * @throws {PluckHttpError} HTTP error status (4xx, 5xx)\n * @throws {PluckRedirectError} Too many redirects or loop\n * @throws {PluckSizeError} Response too large\n * @throws {PluckEncodingError} Invalid encoding\n * @throws {PluckContentTypeError} Invalid content type\n *\n * @example\n * ```typescript\n * // Basic usage (works like fetch)\n * const response = await pluck('https://example.com');\n * const html = await response.text();\n *\n * // With enhancements\n * console.log(response.redirectChain);\n * console.log(response.detectedEncoding);\n * console.log(response.timing);\n * ```\n *\n * @example\n * ```typescript\n * // With options\n * const response = await pluck('https://example.com', {\n *   timeout: 60000,\n *   maxRedirects: 5,\n *   userAgent: 'MyBot/1.0',\n *   throwOnHttpError: true\n * });\n * ```\n */\nexport async function pluck(\n  input: string | URL | Request,\n  init?: PluckInit,\n): Promise<PluckResponse> {\n  const startTime = Date.now();\n\n  // Parse options\n  const options = normalizeOptions(init);\n  const originalUrl = typeof input === 'string' || input instanceof URL ? String(input) : input.url;\n\n  // Setup timeout signal\n  const signal = AbortSignal.timeout(options.timeout);\n\n  try {\n    // Follow redirects manually to capture chain\n    const { response, redirectChain, redirectDuration } = await followRedirects(\n      input,\n      options,\n      signal,\n    );\n\n    const finalUrl = response.url;\n\n    // Check HTTP status\n    if (options.throwOnHttpError && !response.ok) {\n      throw new PluckHttpError(\n        `HTTP ${response.status}: ${response.statusText}`,\n        response.status,\n        response.statusText,\n        response,\n      );\n    }\n\n    // Validate Content-Type\n    if (options.strictContentType) {\n      validateContentType(response, options.allowedContentTypes);\n    }\n\n    // Read response with size limit\n    const buffer = await readResponseWithSizeLimit(response, options.maxSize);\n\n    // Detect encoding\n    const contentType = response.headers.get('content-type');\n    const detectedEncoding = detectEncoding(buffer, contentType);\n\n    // Decode to UTF-8\n    const utf8Content = decodeToUtf8(buffer, detectedEncoding, options.validateEncoding);\n\n    // Create enhanced response\n    const endTime = Date.now();\n    const enhancedResponse = createPluckResponse(response, {\n      originalUrl,\n      finalUrl,\n      redirectChain,\n      detectedEncoding,\n      utf8Content,\n      timing: {\n        start: startTime,\n        end: endTime,\n        duration: endTime - startTime,\n        redirectDuration,\n      },\n    });\n\n    return enhancedResponse;\n  } catch (error) {\n    // Convert errors to pluck error types\n    if (error instanceof PluckTimeoutError || error instanceof PluckNetworkError) {\n      throw error;\n    }\n\n    if ((error as Error).name === 'TimeoutError') {\n      throw new PluckTimeoutError(`Request timeout after ${options.timeout}ms`, options.timeout);\n    }\n\n    if (error instanceof TypeError) {\n      // Network errors from fetch are TypeErrors\n      throw new PluckNetworkError(`Network error: ${error.message}`, error);\n    }\n\n    // Re-throw pluck errors as-is\n    throw error;\n  }\n}\n\n/**\n * Normalize pluck options with defaults.\n */\nfunction normalizeOptions(\n  init?: PluckInit,\n): Required<Omit<PluckInit, keyof RequestInit>> & RequestInit {\n  return {\n    ...init,\n    timeout: init?.timeout ?? DEFAULT_TIMEOUT,\n    maxRedirects: init?.maxRedirects ?? DEFAULT_MAX_REDIRECTS,\n    maxSize: init?.maxSize ?? DEFAULT_MAX_SIZE,\n    userAgent: init?.userAgent ?? DEFAULT_USER_AGENT,\n    throwOnHttpError: init?.throwOnHttpError ?? true,\n    strictContentType: init?.strictContentType ?? false,\n    allowedContentTypes: init?.allowedContentTypes ?? DEFAULT_ALLOWED_CONTENT_TYPES,\n    followRedirects: init?.followRedirects ?? true,\n    validateEncoding: init?.validateEncoding ?? true,\n  };\n}\n\n/**\n * Follow redirects manually to capture the chain.\n */\nasync function followRedirects(\n  input: string | URL | Request,\n  options: ReturnType<typeof normalizeOptions>,\n  signal: AbortSignal,\n): Promise<{ response: Response; redirectChain: string[]; redirectDuration: number }> {\n  let url = typeof input === 'string' || input instanceof URL ? String(input) : input.url;\n  const redirectChain: string[] = [];\n  const redirectStart = Date.now();\n  const seenUrls = new Set<string>();\n\n  // If not following redirects, just do one request\n  if (!options.followRedirects) {\n    const response = await fetchWithHeaders(url, options, signal, false);\n    return { response, redirectChain: [], redirectDuration: 0 };\n  }\n\n  for (let i = 0; i <= options.maxRedirects; i++) {\n    // Detect redirect loops\n    if (seenUrls.has(url)) {\n      throw new PluckRedirectError(\n        `Redirect loop detected: ${url}`,\n        redirectChain,\n        options.maxRedirects,\n      );\n    }\n    seenUrls.add(url);\n\n    // Fetch with manual redirect handling\n    const response = await fetchWithHeaders(url, options, signal, true);\n\n    // Check if it's a redirect\n    if (response.status >= 300 && response.status < 400) {\n      const location = response.headers.get('location');\n      if (!location) {\n        throw new PluckRedirectError('Redirect response missing Location header', redirectChain);\n      }\n\n      // Add current URL to chain\n      redirectChain.push(url);\n\n      // Resolve relative/absolute location\n      try {\n        url = new URL(location, url).href;\n      } catch {\n        throw new PluckRedirectError(\n          `Invalid redirect location: ${location}`,\n          redirectChain,\n          options.maxRedirects,\n        );\n      }\n\n      // Validate redirect URL scheme\n      if (!url.startsWith('http://') && !url.startsWith('https://')) {\n        throw new PluckRedirectError(\n          `Invalid redirect scheme: ${url}`,\n          redirectChain,\n          options.maxRedirects,\n        );\n      }\n\n      continue;\n    }\n\n    // Not a redirect, return response\n    const redirectDuration = Date.now() - redirectStart;\n    return { response, redirectChain, redirectDuration };\n  }\n\n  // Too many redirects\n  throw new PluckRedirectError(\n    `Too many redirects (>${options.maxRedirects})`,\n    redirectChain,\n    options.maxRedirects,\n  );\n}\n\n/**\n * Fetch with smart default headers.\n */\nasync function fetchWithHeaders(\n  url: string,\n  options: ReturnType<typeof normalizeOptions>,\n  signal: AbortSignal,\n  manualRedirect: boolean,\n): Promise<Response> {\n  const headers = new Headers(options.headers);\n\n  // Set User-Agent\n  if (!headers.has('user-agent')) {\n    headers.set('user-agent', options.userAgent);\n  }\n\n  // Set Accept\n  if (!headers.has('accept')) {\n    headers.set('accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');\n  }\n\n  // Set Accept-Language\n  if (!headers.has('accept-language')) {\n    headers.set('accept-language', 'en-US,en;q=0.9');\n  }\n\n  return fetch(url, {\n    ...options,\n    headers,\n    signal,\n    redirect: manualRedirect ? 'manual' : 'follow',\n  });\n}\n\n/**\n * Read response body with size limit.\n */\nasync function readResponseWithSizeLimit(\n  response: Response,\n  maxSize: number,\n): Promise<ArrayBuffer> {\n  const contentLength = response.headers.get('content-length');\n  if (contentLength) {\n    const size = Number.parseInt(contentLength, 10);\n    if (size > maxSize) {\n      throw new PluckSizeError(\n        `Response size ${size} bytes exceeds maximum ${maxSize} bytes`,\n        maxSize,\n        size,\n      );\n    }\n  }\n\n  // Read response\n  const buffer = await response.arrayBuffer();\n\n  // Check actual size\n  if (buffer.byteLength > maxSize) {\n    throw new PluckSizeError(\n      `Response size ${buffer.byteLength} bytes exceeds maximum ${maxSize} bytes`,\n      maxSize,\n      buffer.byteLength,\n    );\n  }\n\n  return buffer;\n}\n\n/**\n * Validate Content-Type header.\n */\nfunction validateContentType(response: Response, allowedTypes: string[]): void {\n  const contentType = response.headers.get('content-type');\n  if (!contentType) {\n    throw new PluckContentTypeError('Missing Content-Type header', '(missing)', allowedTypes);\n  }\n\n  // Parse Content-Type (ignore charset and other parameters)\n  const mimeType = contentType.split(';')[0].trim().toLowerCase();\n\n  // Check if allowed\n  const isAllowed = allowedTypes.some((allowed) => {\n    const pattern = allowed.toLowerCase().replace('*', '.*');\n    return new RegExp(`^${pattern}$`).test(mimeType);\n  });\n\n  if (!isAllowed) {\n    throw new PluckContentTypeError(\n      `Content-Type '${mimeType}' not allowed`,\n      mimeType,\n      allowedTypes,\n    );\n  }\n}\n\n/**\n * Create enhanced PluckResponse from standard Response.\n */\nfunction createPluckResponse(\n  response: Response,\n  metadata: {\n    originalUrl: string;\n    finalUrl: string;\n    redirectChain: string[];\n    detectedEncoding: string;\n    utf8Content: string;\n    timing: PluckResponse['timing'];\n  },\n): PluckResponse {\n  // Store UTF-8 content for textUtf8() method\n  let utf8ContentCache: string | null = metadata.utf8Content;\n\n  // Create enhanced response object\n  const enhancedResponse = response as PluckResponse;\n\n  // Add our enhancements\n  enhancedResponse.originalUrl = metadata.originalUrl;\n  enhancedResponse.finalUrl = metadata.finalUrl;\n  enhancedResponse.redirectChain = metadata.redirectChain;\n  enhancedResponse.detectedEncoding = metadata.detectedEncoding;\n  enhancedResponse.timing = metadata.timing;\n\n  // Add textUtf8() method\n  enhancedResponse.textUtf8 = async () => {\n    if (utf8ContentCache === null) {\n      throw new Error('Response body already consumed');\n    }\n    const content = utf8ContentCache;\n    utf8ContentCache = null; // Consume once\n    return content;\n  };\n\n  return enhancedResponse;\n}\n","/**\n * HTML parsing utilities using linkedom.\n *\n * @remarks\n * This module provides a simple wrapper around linkedom for consistent\n * HTML parsing across all metadata extraction modules. Parsing should happen\n * once at the top level and the parsed document passed to all extractors.\n *\n * @packageDocumentation\n */\n\nimport { parseHTML as linkedomParseHTML } from 'linkedom';\n\n/**\n * Parse HTML string into a DOM document.\n *\n * @remarks\n * Parses HTML using linkedom, providing a standards-compliant DOM implementation.\n * This should be called once per document, with the result passed to all metadata\n * extractors for performance.\n *\n * Never throws - returns a document even for malformed HTML.\n *\n * @param html - HTML string to parse\n * @param baseUrl - Optional base URL for resolving relative URLs\n * @returns Parsed DOM document\n *\n * @example\n * ```typescript\n * const doc = parseHTML('<html><head><title>Test</title></head></html>');\n * const title = doc.querySelector('title')?.textContent;\n * ```\n */\nexport function parseHTML(html: string, baseUrl?: string): Document {\n  const { document } = linkedomParseHTML(html, {\n    url: baseUrl || 'https://example.com',\n  });\n  return document;\n}\n\n// Export Document type alias for convenience\n// Note: This is the standard DOM Document type from linkedom\nexport type HTMLDocument = Document;\n\n/**\n * Input type that accepts either a parsed Document or raw HTML string.\n * This allows extractor functions to be more forgiving.\n */\nexport type DocumentInput = Document | string;\n\n/**\n * Ensure input is a parsed Document.\n * If given a string, parses it. If given a Document, returns it as-is.\n *\n * @param input - Either a parsed Document or raw HTML string\n * @param baseUrl - Optional base URL (only used if parsing string)\n * @returns Parsed Document\n */\nexport function ensureDocument(input: DocumentInput, baseUrl?: string): Document {\n  if (typeof input === 'string') {\n    return parseHTML(input, baseUrl);\n  }\n  return input;\n}\n","/**\n * Meta tag extraction helpers.\n *\n * @remarks\n * Generic utilities for extracting content from <meta> tags in parsed HTML documents.\n * These helpers work with parsed HTMLElement from linkedom.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../utils/html-parser.js';\n\n/**\n * Get content from a meta tag by name attribute.\n *\n * @remarks\n * Extracts the content attribute from a meta tag matching the specified name.\n * Returns undefined if not found.\n *\n * @param doc - Parsed HTML document\n * @param name - Value of the name attribute to search for\n * @returns Content attribute value, or undefined if not found\n *\n * @example\n * ```typescript\n * const description = getMetaContent(doc, 'description');\n * const keywords = getMetaContent(doc, 'keywords');\n * ```\n */\nexport function getMetaContent(doc: Document, name: string): string | undefined {\n  const element = doc.querySelector(`meta[name=\"${name}\"]`);\n  return element?.getAttribute('content') || undefined;\n}\n\n/**\n * Get content from a meta tag by property attribute (OpenGraph, etc.).\n *\n * @remarks\n * Extracts the content attribute from a meta tag matching the specified property.\n * Used primarily for OpenGraph (og:*) and Facebook (fb:*) tags.\n *\n * @param doc - Parsed HTML document\n * @param property - Value of the property attribute to search for\n * @returns Content attribute value, or undefined if not found\n *\n * @example\n * ```typescript\n * const ogTitle = getMetaProperty(doc, 'og:title');\n * const ogImage = getMetaProperty(doc, 'og:image');\n * ```\n */\nexport function getMetaProperty(doc: Document, property: string): string | undefined {\n  const element = doc.querySelector(`meta[property=\"${property}\"]`);\n  return element?.getAttribute('content') || undefined;\n}\n\n/**\n * Get all meta tag contents matching a name pattern.\n *\n * @remarks\n * Finds all meta tags where the name attribute starts with the given prefix.\n * Returns a Map of name → content for all matches.\n *\n * Useful for extracting groups of related meta tags (e.g., all \"twitter:*\" tags).\n *\n * @param doc - Parsed HTML document\n * @param namePrefix - Prefix to match against name attributes\n * @returns Map of name to content values\n *\n * @example\n * ```typescript\n * const twitterTags = getAllMetaByName(doc, 'twitter:');\n * // Map { 'twitter:card' => 'summary', 'twitter:site' => '@example', ... }\n * ```\n */\nexport function getAllMetaByName(doc: Document, namePrefix: string): Map<string, string> {\n  const result = new Map<string, string>();\n  const elements = doc.querySelectorAll(`meta[name^=\"${namePrefix}\"]`);\n\n  for (const element of Array.from(elements)) {\n    const name = element.getAttribute('name');\n    const content = element.getAttribute('content');\n    if (name && content) {\n      result.set(name, content);\n    }\n  }\n\n  return result;\n}\n\n/**\n * Get all meta tag contents matching a property pattern.\n *\n * @remarks\n * Finds all meta tags where the property attribute starts with the given prefix.\n * Returns a Map of property → content for all matches.\n *\n * Useful for extracting groups of related property tags (e.g., all \"og:*\" tags).\n *\n * @param doc - Parsed HTML document\n * @param propertyPrefix - Prefix to match against property attributes\n * @returns Map of property to content values\n *\n * @example\n * ```typescript\n * const ogTags = getAllMetaByProperty(doc, 'og:');\n * // Map { 'og:title' => 'Page Title', 'og:image' => 'https://...', ... }\n * ```\n */\nexport function getAllMetaByProperty(doc: Document, propertyPrefix: string): Map<string, string> {\n  const result = new Map<string, string>();\n  const elements = doc.querySelectorAll(`meta[property^=\"${propertyPrefix}\"]`);\n\n  for (const element of Array.from(elements)) {\n    const property = element.getAttribute('property');\n    const content = element.getAttribute('content');\n    if (property && content) {\n      result.set(property, content);\n    }\n  }\n\n  return result;\n}\n\n/**\n * Get all values for a specific meta property that can appear multiple times.\n *\n * @remarks\n * Some meta tags can appear multiple times (e.g., og:image, article:author).\n * This function collects all values into an array.\n *\n * @param doc - Parsed HTML document\n * @param property - Property attribute value to search for\n * @returns Array of all content values (empty if none found)\n *\n * @example\n * ```typescript\n * const images = getAllMetaPropertyValues(doc, 'og:image');\n * // ['https://example.com/image1.jpg', 'https://example.com/image2.jpg']\n * ```\n */\nexport function getAllMetaPropertyValues(doc: Document, property: string): string[] {\n  const elements = doc.querySelectorAll(`meta[property=\"${property}\"]`);\n  const values: string[] = [];\n\n  for (const element of Array.from(elements)) {\n    const content = element.getAttribute('content');\n    if (content) {\n      values.push(content);\n    }\n  }\n\n  return values;\n}\n\n/**\n * Get content from meta tag by http-equiv attribute.\n *\n * @remarks\n * Extracts the content attribute from a meta tag matching the specified http-equiv value.\n * Used for HTTP header equivalents like Content-Security-Policy, X-UA-Compatible, etc.\n *\n * @param doc - Parsed HTML document\n * @param httpEquiv - Value of the http-equiv attribute to search for\n * @returns Content attribute value, or undefined if not found\n *\n * @example\n * ```typescript\n * const csp = getMetaHttpEquiv(doc, 'Content-Security-Policy');\n * const compat = getMetaHttpEquiv(doc, 'X-UA-Compatible');\n * ```\n */\nexport function getMetaHttpEquiv(doc: Document, httpEquiv: string): string | undefined {\n  const element = doc.querySelector(`meta[http-equiv=\"${httpEquiv}\" i]`);\n  return element?.getAttribute('content') || undefined;\n}\n","/**\n * OpenGraph metadata extraction.\n *\n * @remarks\n * Extracts Open Graph protocol metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport {\n  type HTMLDocument as Document,\n  type DocumentInput,\n  ensureDocument,\n} from '../../utils/html-parser.js';\nimport { getAllMetaPropertyValues, getMetaProperty } from '../../utils/meta-helpers.js';\nimport type {\n  OpenGraphArticle,\n  OpenGraphAudio,\n  OpenGraphBook,\n  OpenGraphImage,\n  OpenGraphMetadata,\n  OpenGraphProfile,\n  OpenGraphVideo,\n} from './types.js';\n\n/**\n * Extract OpenGraph metadata from parsed HTML document.\n *\n * @remarks\n * Extracts Open Graph protocol metadata including basic metadata,\n * article data, video/audio, images, books, and profiles.\n *\n * @param doc - Parsed HTML document\n * @returns OpenGraph metadata object\n *\n * @example\n * ```typescript\n * const doc = parseHTML(htmlString);\n * const og = extractOpenGraph(doc);\n * console.log(og.title);\n * console.log(og.image);\n * console.log(og.article?.publishedTime);\n * ```\n */\nexport function extractOpenGraph(input: DocumentInput): OpenGraphMetadata {\n  const doc = ensureDocument(input);\n  const metadata: OpenGraphMetadata = {};\n\n  // Extract basic OpenGraph properties\n  metadata.title = getMetaProperty(doc, 'og:title');\n  metadata.type = getMetaProperty(doc, 'og:type');\n  metadata.image = getMetaProperty(doc, 'og:image');\n  metadata.url = getMetaProperty(doc, 'og:url');\n  metadata.description = getMetaProperty(doc, 'og:description');\n  metadata.siteName = getMetaProperty(doc, 'og:site_name');\n  metadata.locale = getMetaProperty(doc, 'og:locale');\n\n  // Alternate locales (can be multiple)\n  const alternateLocales = getAllMetaPropertyValues(doc, 'og:locale:alternate');\n  if (alternateLocales.length > 0) {\n    metadata.localeAlternate = alternateLocales;\n  }\n\n  // Extract article metadata\n  const article = extractArticle(doc);\n  if (Object.keys(article).length > 0) {\n    metadata.article = article;\n  }\n\n  // Extract video metadata\n  const video = extractVideo(doc);\n  if (Object.keys(video).length > 0) {\n    metadata.video = video;\n  }\n\n  // Extract audio metadata\n  const audio = extractAudio(doc);\n  if (Object.keys(audio).length > 0) {\n    metadata.audio = audio;\n  }\n\n  // Extract all images with metadata\n  const images = extractImages(doc);\n  if (images.length > 0) {\n    metadata.images = images;\n  }\n\n  // Extract book metadata\n  const book = extractBook(doc);\n  if (Object.keys(book).length > 0) {\n    metadata.book = book;\n  }\n\n  // Extract profile metadata\n  const profile = extractProfile(doc);\n  if (Object.keys(profile).length > 0) {\n    metadata.profile = profile;\n  }\n\n  // Remove undefined values\n  return Object.fromEntries(\n    Object.entries(metadata).filter(([_, value]) => value !== undefined),\n  ) as OpenGraphMetadata;\n}\n\n/**\n * Extract article-specific metadata.\n */\nfunction extractArticle(doc: Document): OpenGraphArticle {\n  const article: OpenGraphArticle = {};\n\n  article.publishedTime = getMetaProperty(doc, 'article:published_time');\n  article.modifiedTime = getMetaProperty(doc, 'article:modified_time');\n  article.expirationTime = getMetaProperty(doc, 'article:expiration_time');\n  article.section = getMetaProperty(doc, 'article:section');\n\n  // Multiple authors\n  const authors = getAllMetaPropertyValues(doc, 'article:author');\n  if (authors.length > 0) {\n    article.authors = authors;\n  }\n\n  // Multiple tags\n  const tags = getAllMetaPropertyValues(doc, 'article:tag');\n  if (tags.length > 0) {\n    article.tags = tags;\n  }\n\n  return Object.fromEntries(\n    Object.entries(article).filter(([_, value]) => value !== undefined),\n  ) as OpenGraphArticle;\n}\n\n/**\n * Extract video metadata.\n */\nfunction extractVideo(doc: Document): OpenGraphVideo {\n  const video: OpenGraphVideo = {};\n\n  video.url = getMetaProperty(doc, 'og:video') || getMetaProperty(doc, 'og:video:url');\n  video.secureUrl = getMetaProperty(doc, 'og:video:secure_url');\n  video.type = getMetaProperty(doc, 'og:video:type');\n  video.releaseDate = getMetaProperty(doc, 'og:video:release_date');\n\n  // Parse numeric values\n  const width = getMetaProperty(doc, 'og:video:width');\n  if (width) {\n    video.width = Number.parseInt(width, 10);\n  }\n\n  const height = getMetaProperty(doc, 'og:video:height');\n  if (height) {\n    video.height = Number.parseInt(height, 10);\n  }\n\n  const duration = getMetaProperty(doc, 'og:video:duration');\n  if (duration) {\n    video.duration = Number.parseInt(duration, 10);\n  }\n\n  // Multiple tags\n  const tags = getAllMetaPropertyValues(doc, 'og:video:tag');\n  if (tags.length > 0) {\n    video.tags = tags;\n  }\n\n  return Object.fromEntries(\n    Object.entries(video).filter(([_, value]) => value !== undefined),\n  ) as OpenGraphVideo;\n}\n\n/**\n * Extract audio metadata.\n */\nfunction extractAudio(doc: Document): OpenGraphAudio {\n  const audio: OpenGraphAudio = {};\n\n  audio.url = getMetaProperty(doc, 'og:audio') || getMetaProperty(doc, 'og:audio:url');\n  audio.secureUrl = getMetaProperty(doc, 'og:audio:secure_url');\n  audio.type = getMetaProperty(doc, 'og:audio:type');\n\n  return Object.fromEntries(\n    Object.entries(audio).filter(([_, value]) => value !== undefined),\n  ) as OpenGraphAudio;\n}\n\n/**\n * Extract all images with full metadata.\n */\nfunction extractImages(doc: Document): OpenGraphImage[] {\n  const images: OpenGraphImage[] = [];\n\n  // Get all og:image values (can be multiple)\n  const imageUrls = getAllMetaPropertyValues(doc, 'og:image');\n  const imageSecureUrls = getAllMetaPropertyValues(doc, 'og:image:secure_url');\n  const imageTypes = getAllMetaPropertyValues(doc, 'og:image:type');\n  const imageWidths = getAllMetaPropertyValues(doc, 'og:image:width');\n  const imageHeights = getAllMetaPropertyValues(doc, 'og:image:height');\n  const imageAlts = getAllMetaPropertyValues(doc, 'og:image:alt');\n\n  // Build image objects\n  for (let i = 0; i < imageUrls.length; i++) {\n    const image: OpenGraphImage = {\n      url: imageUrls[i],\n      secureUrl: imageSecureUrls[i],\n      type: imageTypes[i],\n      alt: imageAlts[i],\n    };\n\n    // Parse numeric dimensions\n    if (imageWidths[i]) {\n      image.width = Number.parseInt(imageWidths[i], 10);\n    }\n    if (imageHeights[i]) {\n      image.height = Number.parseInt(imageHeights[i], 10);\n    }\n\n    // Remove undefined values\n    images.push(\n      Object.fromEntries(\n        Object.entries(image).filter(([_, value]) => value !== undefined),\n      ) as OpenGraphImage,\n    );\n  }\n\n  return images;\n}\n\n/**\n * Extract book metadata.\n */\nfunction extractBook(doc: Document): OpenGraphBook {\n  const book: OpenGraphBook = {};\n\n  book.isbn = getMetaProperty(doc, 'book:isbn');\n  book.releaseDate = getMetaProperty(doc, 'book:release_date');\n\n  // Multiple authors\n  const authors = getAllMetaPropertyValues(doc, 'book:author');\n  if (authors.length > 0) {\n    book.authors = authors;\n  }\n\n  // Multiple tags\n  const tags = getAllMetaPropertyValues(doc, 'book:tag');\n  if (tags.length > 0) {\n    book.tags = tags;\n  }\n\n  return Object.fromEntries(\n    Object.entries(book).filter(([_, value]) => value !== undefined),\n  ) as OpenGraphBook;\n}\n\n/**\n * Extract profile metadata.\n */\nfunction extractProfile(doc: Document): OpenGraphProfile {\n  const profile: OpenGraphProfile = {};\n\n  profile.firstName = getMetaProperty(doc, 'profile:first_name');\n  profile.lastName = getMetaProperty(doc, 'profile:last_name');\n  profile.username = getMetaProperty(doc, 'profile:username');\n  profile.gender = getMetaProperty(doc, 'profile:gender');\n\n  return Object.fromEntries(\n    Object.entries(profile).filter(([_, value]) => value !== undefined),\n  ) as OpenGraphProfile;\n}\n","/**\n * JSON-LD parsing utilities.\n *\n * @remarks\n * Utilities for parsing and validating JSON-LD structured data.\n *\n * @packageDocumentation\n */\n\nimport type { JsonLdBlock } from './types.js';\n\n/**\n * Parse JSON-LD string into structured block.\n *\n * @remarks\n * Attempts to parse JSON-LD content and extract @type and @context.\n * Returns null if parsing fails.\n *\n * @param jsonString - Raw JSON-LD string\n * @returns Parsed JSON-LD block or null if invalid\n */\nexport function parseJsonLd(jsonString: string): JsonLdBlock | null {\n  if (!jsonString || typeof jsonString !== 'string') {\n    return null;\n  }\n\n  const trimmed = jsonString.trim();\n  if (!trimmed) {\n    return null;\n  }\n\n  try {\n    const parsed = JSON.parse(trimmed);\n\n    // Extract @type\n    let type: string | string[] | undefined;\n    if (parsed['@type']) {\n      type = parsed['@type'];\n    }\n\n    // Extract @context\n    const context = parsed['@context'];\n\n    return {\n      raw: trimmed,\n      parsed,\n      type,\n      context,\n    };\n  } catch {\n    // Invalid JSON - return null\n    return null;\n  }\n}\n\n/**\n * Check if a type matches a target type (case-insensitive, handles arrays).\n *\n * @remarks\n * Handles both string and array @type values.\n * Case-insensitive comparison.\n *\n * @param type - The @type value from JSON-LD\n * @param targetType - The type to match against\n * @returns True if type matches target\n */\nexport function isType(type: string | string[] | undefined, targetType: string): boolean {\n  if (!type) {\n    return false;\n  }\n\n  const target = targetType.toLowerCase();\n\n  if (Array.isArray(type)) {\n    return type.some((t) => t.toLowerCase() === target);\n  }\n\n  return type.toLowerCase() === target;\n}\n\n/**\n * Extract items from @graph array if present.\n *\n * @remarks\n * JSON-LD can contain a @graph array with multiple items.\n * This function extracts those items or returns the object itself if no @graph.\n *\n * @param parsed - Parsed JSON-LD object\n * @returns Array of items\n */\nexport function extractGraphItems(parsed: unknown): unknown[] {\n  if (!parsed || typeof parsed !== 'object') {\n    return [];\n  }\n\n  const obj = parsed as Record<string, unknown>;\n\n  // Check for @graph array\n  if (Array.isArray(obj['@graph'])) {\n    return obj['@graph'];\n  }\n\n  // No @graph - return the object itself\n  return [parsed];\n}\n\n/**\n * Get @type from an object (handles both string and array).\n *\n * @param obj - Object to extract @type from\n * @returns @type value or undefined\n */\nexport function getType(obj: unknown): string | string[] | undefined {\n  if (!obj || typeof obj !== 'object') {\n    return undefined;\n  }\n\n  const record = obj as Record<string, unknown>;\n  const type = record['@type'];\n\n  if (typeof type === 'string' || Array.isArray(type)) {\n    return type as string | string[];\n  }\n\n  return undefined;\n}\n\n/**\n * Check if object matches any of the target types.\n *\n * @param obj - Object to check\n * @param targetTypes - Array of type names to match\n * @returns True if object matches any target type\n */\nexport function matchesAnyType(obj: unknown, targetTypes: string[]): boolean {\n  const type = getType(obj);\n  return targetTypes.some((target) => isType(type, target));\n}\n","/**\n * Schema.org / JSON-LD extraction.\n *\n * @remarks\n * Extracts structured data from JSON-LD script tags.\n *\n * @packageDocumentation\n */\n\nimport { type DocumentInput, ensureDocument } from '../../utils/html-parser.js';\nimport { extractGraphItems, matchesAnyType, parseJsonLd } from './parse-json-ld.js';\nimport type { SchemaOrgMetadata } from './types.js';\n\n/**\n * Extract Schema.org metadata from HTML.\n *\n * @remarks\n * Finds all <script type=\"application/ld+json\"> tags, parses the JSON-LD,\n * and organizes by type for easy access.\n *\n * @param input - Parsed HTML document or raw HTML string\n * @returns Schema.org metadata object\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const schema = extractSchemaOrg(doc);\n *\n * // Or directly with HTML string\n * const schema = extractSchemaOrg(htmlString);\n * ```\n */\nexport function extractSchemaOrg(input: DocumentInput): SchemaOrgMetadata {\n  const doc = ensureDocument(input);\n  const metadata: SchemaOrgMetadata = {\n    jsonLd: [],\n  };\n\n  // Find all JSON-LD script tags\n  const scripts = doc.querySelectorAll('script[type=\"application/ld+json\"]');\n\n  // Parse each script\n  for (const script of Array.from(scripts)) {\n    // Try different ways to get script content\n    const content = script.textContent || script.innerHTML;\n    if (!content) continue;\n\n    const block = parseJsonLd(content);\n    if (block) {\n      metadata.jsonLd.push(block);\n    }\n  }\n\n  // Organize by type for convenience\n  if (metadata.jsonLd.length > 0) {\n    organizeByType(metadata);\n  }\n\n  return metadata;\n}\n\n/**\n * Organize JSON-LD blocks by type for convenience accessors.\n */\nfunction organizeByType(metadata: SchemaOrgMetadata): void {\n  const articles: unknown[] = [];\n  const webPages: unknown[] = [];\n  const breadcrumbs: unknown[] = [];\n  const products: unknown[] = [];\n  const events: unknown[] = [];\n  const recipes: unknown[] = [];\n  const videos: unknown[] = [];\n  const images: unknown[] = [];\n  let organization: unknown | undefined;\n  let person: unknown | undefined;\n\n  // Process each JSON-LD block\n  for (const block of metadata.jsonLd) {\n    // Extract items from @graph if present\n    const items = extractGraphItems(block.parsed);\n\n    for (const item of items) {\n      // Articles (Article, NewsArticle, BlogPosting, etc.)\n      if (matchesAnyType(item, ['Article', 'NewsArticle', 'BlogPosting', 'TechArticle'])) {\n        articles.push(item);\n      }\n\n      // Web pages (WebPage, WebSite)\n      if (matchesAnyType(item, ['WebPage', 'WebSite', 'AboutPage', 'ContactPage'])) {\n        webPages.push(item);\n      }\n\n      // Breadcrumbs\n      if (matchesAnyType(item, ['BreadcrumbList'])) {\n        breadcrumbs.push(item);\n      }\n\n      // Products\n      if (matchesAnyType(item, ['Product'])) {\n        products.push(item);\n      }\n\n      // Events\n      if (matchesAnyType(item, ['Event'])) {\n        events.push(item);\n      }\n\n      // Recipes\n      if (matchesAnyType(item, ['Recipe'])) {\n        recipes.push(item);\n      }\n\n      // Videos\n      if (matchesAnyType(item, ['VideoObject'])) {\n        videos.push(item);\n      }\n\n      // Images\n      if (matchesAnyType(item, ['ImageObject'])) {\n        images.push(item);\n      }\n\n      // Organization (take first one)\n      if (!organization && matchesAnyType(item, ['Organization', 'Corporation'])) {\n        organization = item;\n      }\n\n      // Person (take first one)\n      if (!person && matchesAnyType(item, ['Person'])) {\n        person = item;\n      }\n    }\n  }\n\n  // Add to metadata if found\n  if (articles.length > 0) metadata.articles = articles;\n  if (webPages.length > 0) metadata.webPages = webPages;\n  if (breadcrumbs.length > 0) metadata.breadcrumbs = breadcrumbs;\n  if (products.length > 0) metadata.products = products;\n  if (events.length > 0) metadata.events = events;\n  if (recipes.length > 0) metadata.recipes = recipes;\n  if (videos.length > 0) metadata.videos = videos;\n  if (images.length > 0) metadata.images = images;\n  if (organization) metadata.organization = organization;\n  if (person) metadata.person = person;\n}\n","/**\n * SEO metadata extraction.\n *\n * @remarks\n * Extracts standard SEO meta tags from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport { type DocumentInput, ensureDocument } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { SEOMetadata } from './types.js';\n\n/**\n * Extract SEO metadata from HTML.\n *\n * @remarks\n * Extracts standard SEO meta tags including title, description, keywords,\n * and browser-specific configuration. All fields are optional.\n *\n * @param input - Parsed HTML document or raw HTML string\n * @returns SEO metadata object\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const seo = extractSEO(doc);\n *\n * // Or directly with HTML string\n * const seo = extractSEO(htmlString);\n * ```\n */\nexport function extractSEO(input: DocumentInput): SEOMetadata {\n  const doc = ensureDocument(input);\n  const metadata: SEOMetadata = {};\n\n  // Extract <title> tag\n  const titleElement = doc.querySelector('title');\n  if (titleElement?.textContent) {\n    metadata.title = titleElement.textContent.trim();\n  }\n\n  // Extract meta tags\n  metadata.description = getMetaContent(doc, 'description');\n  metadata.author = getMetaContent(doc, 'author');\n  metadata.generator = getMetaContent(doc, 'generator');\n  metadata.viewport = getMetaContent(doc, 'viewport');\n  metadata.themeColor = getMetaContent(doc, 'theme-color');\n  metadata.colorScheme = getMetaContent(doc, 'color-scheme');\n  metadata.applicationName = getMetaContent(doc, 'application-name');\n  metadata.appleMobileWebAppTitle = getMetaContent(doc, 'apple-mobile-web-app-title');\n  metadata.appleMobileWebAppStatusBarStyle = getMetaContent(\n    doc,\n    'apple-mobile-web-app-status-bar-style',\n  );\n\n  // Extract keywords as array\n  const keywordsString = getMetaContent(doc, 'keywords');\n  if (keywordsString) {\n    metadata.keywords = keywordsString\n      .split(',')\n      .map((k) => k.trim())\n      .filter((k) => k.length > 0);\n  }\n\n  // Parse apple-mobile-web-app-capable as boolean\n  const capable = getMetaContent(doc, 'apple-mobile-web-app-capable');\n  if (capable) {\n    metadata.appleMobileWebAppCapable = capable.toLowerCase() === 'yes';\n  }\n\n  // Remove undefined values to keep the object clean\n  return Object.fromEntries(\n    Object.entries(metadata).filter(([_, value]) => value !== undefined),\n  ) as SEOMetadata;\n}\n","/**\n * Twitter Card metadata extraction.\n *\n * @remarks\n * Extracts Twitter Card metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport {\n  type HTMLDocument as Document,\n  type DocumentInput,\n  ensureDocument,\n} from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { TwitterApp, TwitterCardMetadata, TwitterPlayer } from './types.js';\n\n/**\n * Extract Twitter Card metadata from HTML.\n *\n * @remarks\n * Extracts Twitter Card metadata including card type, site/creator info,\n * title/description, images, app cards, and player cards.\n *\n * @param input - Parsed HTML document or raw HTML string\n * @returns Twitter Card metadata object\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const twitter = extractTwitterCard(doc);\n *\n * // Or directly with HTML string\n * const twitter = extractTwitterCard(htmlString);\n * ```\n */\nexport function extractTwitterCard(input: DocumentInput): TwitterCardMetadata {\n  const doc = ensureDocument(input);\n  const metadata: TwitterCardMetadata = {};\n\n  // Basic Twitter Card properties\n  metadata.card = getMetaContent(doc, 'twitter:card') as TwitterCardMetadata['card'];\n  metadata.site = getMetaContent(doc, 'twitter:site');\n  metadata.creator = getMetaContent(doc, 'twitter:creator');\n  metadata.title = getMetaContent(doc, 'twitter:title');\n  metadata.description = getMetaContent(doc, 'twitter:description');\n  metadata.image = getMetaContent(doc, 'twitter:image');\n  metadata.imageAlt = getMetaContent(doc, 'twitter:image:alt');\n\n  // Extract app card data\n  const app = extractApp(doc);\n  if (Object.keys(app).length > 0) {\n    metadata.app = app;\n  }\n\n  // Extract player card data\n  const player = extractPlayer(doc);\n  if (Object.keys(player).length > 0) {\n    metadata.player = player;\n  }\n\n  // Remove undefined values\n  return Object.fromEntries(\n    Object.entries(metadata).filter(([_, value]) => value !== undefined),\n  ) as TwitterCardMetadata;\n}\n\n/**\n * Extract app card metadata.\n */\nfunction extractApp(doc: Document): TwitterApp {\n  const app: TwitterApp = {};\n\n  // iPhone\n  const iphoneName = getMetaContent(doc, 'twitter:app:name:iphone');\n  const iphoneId = getMetaContent(doc, 'twitter:app:id:iphone');\n  const iphoneUrl = getMetaContent(doc, 'twitter:app:url:iphone');\n  if (iphoneName || iphoneId || iphoneUrl) {\n    app.iphone = { name: iphoneName, id: iphoneId, url: iphoneUrl };\n    // Clean up undefined values\n    app.iphone = Object.fromEntries(\n      Object.entries(app.iphone).filter(([_, value]) => value !== undefined),\n    ) as typeof app.iphone;\n  }\n\n  // iPad\n  const ipadName = getMetaContent(doc, 'twitter:app:name:ipad');\n  const ipadId = getMetaContent(doc, 'twitter:app:id:ipad');\n  const ipadUrl = getMetaContent(doc, 'twitter:app:url:ipad');\n  if (ipadName || ipadId || ipadUrl) {\n    app.ipad = { name: ipadName, id: ipadId, url: ipadUrl };\n    app.ipad = Object.fromEntries(\n      Object.entries(app.ipad).filter(([_, value]) => value !== undefined),\n    ) as typeof app.ipad;\n  }\n\n  // Google Play\n  const googleplayName = getMetaContent(doc, 'twitter:app:name:googleplay');\n  const googleplayId = getMetaContent(doc, 'twitter:app:id:googleplay');\n  const googleplayUrl = getMetaContent(doc, 'twitter:app:url:googleplay');\n  if (googleplayName || googleplayId || googleplayUrl) {\n    app.googleplay = { name: googleplayName, id: googleplayId, url: googleplayUrl };\n    app.googleplay = Object.fromEntries(\n      Object.entries(app.googleplay).filter(([_, value]) => value !== undefined),\n    ) as typeof app.googleplay;\n  }\n\n  return app;\n}\n\n/**\n * Extract player card metadata.\n */\nfunction extractPlayer(doc: Document): TwitterPlayer {\n  const player: TwitterPlayer = {};\n\n  player.url = getMetaContent(doc, 'twitter:player');\n  player.stream = getMetaContent(doc, 'twitter:player:stream');\n\n  // Parse numeric values\n  const width = getMetaContent(doc, 'twitter:player:width');\n  if (width) {\n    player.width = Number.parseInt(width, 10);\n  }\n\n  const height = getMetaContent(doc, 'twitter:player:height');\n  if (height) {\n    player.height = Number.parseInt(height, 10);\n  }\n\n  return Object.fromEntries(\n    Object.entries(player).filter(([_, value]) => value !== undefined),\n  ) as TwitterPlayer;\n}\n","/**\n * Description extraction and aggregation for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractOpenGraph } from '../../metadata/opengraph/index.js';\nimport { extractSchemaOrg } from '../../metadata/schema-org/index.js';\nimport { extractSEO } from '../../metadata/seo/index.js';\nimport { extractTwitterCard } from '../../metadata/twitter-card/index.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\n\n/**\n * Extract page description from multiple sources and pick the longest.\n *\n * @remarks\n * Strategy:\n * 1. Collect all possible descriptions from metadata sources (priority order):\n *    - Schema.org NewsArticle/Article description\n *    - OpenGraph og:description\n *    - Twitter twitter:description\n *    - HTML meta description tag\n * 2. Pick the longest description (no cleaning needed)\n * 3. This ensures we get the most detailed/descriptive summary\n *\n * Note: Does not look in the body content, only metadata tags.\n *\n * @param doc - Parsed HTML document\n * @returns Best available description or undefined if none found\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const description = extractBestDescription(doc);\n * console.log(description); // Most detailed description from metadata\n * ```\n */\nexport function extractBestDescription(doc: Document): string | undefined {\n  const candidates: string[] = [];\n\n  // 1. Schema.org Article/NewsArticle description\n  const schema = extractSchemaOrg(doc);\n  if (schema.articles && schema.articles.length > 0) {\n    for (const article of schema.articles) {\n      const description = getStringProperty(article, 'description');\n      if (description?.trim()) {\n        candidates.push(description.trim());\n      }\n    }\n  }\n\n  // 2. OpenGraph description\n  const og = extractOpenGraph(doc);\n  if (og.description?.trim()) {\n    candidates.push(og.description.trim());\n  }\n\n  // 3. Twitter Card description\n  const twitter = extractTwitterCard(doc);\n  if (twitter.description?.trim()) {\n    candidates.push(twitter.description.trim());\n  }\n\n  // 4. HTML meta description tag\n  const seo = extractSEO(doc);\n  if (seo.description?.trim()) {\n    candidates.push(seo.description.trim());\n  }\n\n  // No candidates found\n  if (candidates.length === 0) {\n    return undefined;\n  }\n\n  // Pick the longest description (more detail is better)\n  candidates.sort((a, b) => b.length - a.length);\n\n  return candidates[0];\n}\n\n/**\n * Safely extract a string property from an unknown object.\n */\nfunction getStringProperty(obj: unknown, prop: string): string | undefined {\n  if (!obj || typeof obj !== 'object') return undefined;\n  const value = (obj as Record<string, unknown>)[prop];\n  return typeof value === 'string' ? value : undefined;\n}\n","/**\n * Link tag extraction helpers.\n *\n * @remarks\n * Generic utilities for extracting data from <link> tags in parsed HTML documents.\n * These helpers work with parsed HTMLElement from linkedom.\n *\n * @packageDocumentation\n */\n\nimport type { HTMLDocument as Document } from '../utils/html-parser.js';\n\n/**\n * Link element data extracted from a <link> tag.\n */\nexport interface LinkData {\n  /** The href attribute value */\n  href: string;\n  /** The rel attribute value (optional) */\n  rel?: string;\n  /** The type attribute value (optional) */\n  type?: string;\n  /** The hreflang attribute value (optional) */\n  hreflang?: string;\n  /** The title attribute value (optional) */\n  title?: string;\n  /** The sizes attribute value (optional) */\n  sizes?: string;\n  /** The media attribute value (optional) */\n  media?: string;\n  /** The color attribute value (optional, used for mask-icon) */\n  color?: string;\n}\n\n/**\n * Get href from a link tag by rel attribute.\n *\n * @remarks\n * Finds the first link tag matching the specified rel attribute and returns its href.\n * Returns undefined if not found.\n *\n * @param doc - Parsed HTML document\n * @param rel - Value of the rel attribute to search for\n * @returns Href attribute value, or undefined if not found\n *\n * @example\n * ```typescript\n * const canonical = getLinkHref(doc, 'canonical');\n * const icon = getLinkHref(doc, 'icon');\n * ```\n */\nexport function getLinkHref(doc: Document, rel: string): string | undefined {\n  const element = doc.querySelector(`link[rel=\"${rel}\"]`);\n  return element?.getAttribute('href') || undefined;\n}\n\n/**\n * Get all link tags matching a rel attribute.\n *\n * @remarks\n * Finds all link tags with the specified rel attribute and extracts\n * their data (href, type, hreflang, etc.).\n *\n * Useful when multiple links can have the same rel (e.g., alternate, icon).\n *\n * @param doc - Parsed HTML document\n * @param rel - Value of the rel attribute to search for\n * @returns Array of link data objects (empty if none found)\n *\n * @example\n * ```typescript\n * const alternates = getAllLinks(doc, 'alternate');\n * // [\n * //   { href: '/fr', hreflang: 'fr', rel: 'alternate' },\n * //   { href: '/de', hreflang: 'de', rel: 'alternate' }\n * // ]\n * ```\n */\nexport function getAllLinks(doc: Document, rel: string): LinkData[] {\n  const elements = doc.querySelectorAll(`link[rel=\"${rel}\"]`);\n  const links: LinkData[] = [];\n\n  for (const element of Array.from(elements)) {\n    const href = element.getAttribute('href');\n    if (!href) continue;\n\n    links.push({\n      href,\n      rel: element.getAttribute('rel') || undefined,\n      type: element.getAttribute('type') || undefined,\n      hreflang: element.getAttribute('hreflang') || undefined,\n      title: element.getAttribute('title') || undefined,\n      sizes: element.getAttribute('sizes') || undefined,\n      media: element.getAttribute('media') || undefined,\n      color: element.getAttribute('color') || undefined,\n    });\n  }\n\n  return links;\n}\n\n/**\n * Get all link tags matching multiple rel values.\n *\n * @remarks\n * Finds all link tags where the rel attribute matches any of the provided values.\n * Useful for finding related link types (e.g., \"icon\" or \"shortcut icon\").\n *\n * @param doc - Parsed HTML document\n * @param rels - Array of rel values to search for\n * @returns Array of link data objects (empty if none found)\n *\n * @example\n * ```typescript\n * const icons = getAllLinksByRels(doc, ['icon', 'shortcut icon']);\n * ```\n */\nexport function getAllLinksByRels(doc: Document, rels: string[]): LinkData[] {\n  const links: LinkData[] = [];\n\n  for (const rel of rels) {\n    links.push(...getAllLinks(doc, rel));\n  }\n\n  return links;\n}\n\n/**\n * Get all link tags matching a rel pattern (prefix).\n *\n * @remarks\n * Finds all link tags where the rel attribute starts with the given prefix.\n * Less common but useful for custom rel types.\n *\n * @param doc - Parsed HTML document\n * @param relPrefix - Prefix to match against rel attributes\n * @returns Array of link data objects (empty if none found)\n *\n * @example\n * ```typescript\n * const appLinks = getAllLinksByPrefix(doc, 'apple-');\n * ```\n */\nexport function getAllLinksByPrefix(doc: Document, relPrefix: string): LinkData[] {\n  const elements = doc.querySelectorAll(`link[rel^=\"${relPrefix}\"]`);\n  const links: LinkData[] = [];\n\n  for (const element of Array.from(elements)) {\n    const href = element.getAttribute('href');\n    if (!href) continue;\n\n    links.push({\n      href,\n      rel: element.getAttribute('rel') || undefined,\n      type: element.getAttribute('type') || undefined,\n      hreflang: element.getAttribute('hreflang') || undefined,\n      title: element.getAttribute('title') || undefined,\n      sizes: element.getAttribute('sizes') || undefined,\n      media: element.getAttribute('media') || undefined,\n      color: element.getAttribute('color') || undefined,\n    });\n  }\n\n  return links;\n}\n","/**\n * Icons and visual assets extraction.\n *\n * @remarks\n * Extracts icon metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport {\n  type HTMLDocument as Document,\n  type DocumentInput,\n  ensureDocument,\n} from '../../utils/html-parser.js';\nimport { getAllLinksByPrefix, getAllLinksByRels, getLinkHref } from '../../utils/link-helpers.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { AppleTouchIcon, IconsMetadata, MaskIcon, MSTile } from './types.js';\n\n/**\n * Extract icons metadata from HTML.\n *\n * @remarks\n * Extracts all icon-related metadata including favicons, Apple touch icons,\n * Safari mask icons, and Microsoft tile configuration.\n *\n * @param input - Parsed HTML document or raw HTML string\n * @returns Icons metadata\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const icons = extractIcons(doc);\n *\n * // Or directly with HTML string\n * const icons = extractIcons(htmlString);\n * ```\n */\nexport function extractIcons(input: DocumentInput): IconsMetadata {\n  const doc = ensureDocument(input);\n  const metadata: IconsMetadata = {};\n\n  // Extract standard favicons\n  const iconLinks = getAllLinksByRels(doc, ['icon', 'shortcut icon']);\n  for (const link of iconLinks) {\n    if (link.rel === 'icon' && !metadata.favicon) {\n      metadata.favicon = link.href;\n    }\n    if (link.rel === 'shortcut icon' && !metadata.shortcutIcon) {\n      metadata.shortcutIcon = link.href;\n    }\n  }\n\n  // Extract Apple touch icons\n  const appleTouchIcons = extractAppleTouchIcons(doc);\n  if (appleTouchIcons.length > 0) {\n    metadata.appleTouchIcons = appleTouchIcons;\n  }\n\n  // Extract Safari mask icon\n  const maskIcon = extractMaskIcon(doc);\n  if (maskIcon) {\n    metadata.maskIcon = maskIcon;\n  }\n\n  // Extract Microsoft tile\n  const msTile = extractMSTile(doc);\n  if (Object.keys(msTile).length > 0) {\n    metadata.msTile = msTile;\n  }\n\n  // Extract fluid icon (legacy)\n  metadata.fluidIcon = getLinkHref(doc, 'fluid-icon');\n\n  // Remove undefined values\n  return Object.fromEntries(\n    Object.entries(metadata).filter(([_, value]) => value !== undefined),\n  ) as IconsMetadata;\n}\n\n/**\n * Extract Apple touch icons.\n */\nfunction extractAppleTouchIcons(doc: Document): AppleTouchIcon[] {\n  const icons: AppleTouchIcon[] = [];\n\n  // Get all apple-touch-icon related links\n  const links = getAllLinksByPrefix(doc, 'apple-touch-icon');\n\n  for (const link of links) {\n    const icon: AppleTouchIcon = {\n      url: link.href,\n      sizes: link.sizes,\n    };\n\n    // Add precomposed flag only if true\n    if (link.rel === 'apple-touch-icon-precomposed') {\n      icon.precomposed = true;\n    }\n\n    // Clean up undefined values\n    icons.push(\n      Object.fromEntries(\n        Object.entries(icon).filter(([_, value]) => value !== undefined),\n      ) as AppleTouchIcon,\n    );\n  }\n\n  return icons;\n}\n\n/**\n * Extract Safari mask icon.\n */\nfunction extractMaskIcon(doc: Document): MaskIcon | undefined {\n  const url = getLinkHref(doc, 'mask-icon');\n  if (!url) {\n    return undefined;\n  }\n\n  // Get color attribute\n  const linkElement = doc.querySelector('link[rel=\"mask-icon\"]');\n  const color = linkElement?.getAttribute('color') || undefined;\n\n  const maskIcon: MaskIcon = { url, color };\n\n  return Object.fromEntries(\n    Object.entries(maskIcon).filter(([_, value]) => value !== undefined),\n  ) as MaskIcon;\n}\n\n/**\n * Extract Microsoft tile metadata.\n */\nfunction extractMSTile(doc: Document): MSTile {\n  const tile: MSTile = {};\n\n  tile.image = getMetaContent(doc, 'msapplication-TileImage');\n  tile.color = getMetaContent(doc, 'msapplication-TileColor');\n  tile.config = getMetaContent(doc, 'msapplication-config');\n\n  return Object.fromEntries(\n    Object.entries(tile).filter(([_, value]) => value !== undefined),\n  ) as MSTile;\n}\n","/**\n * Image/keyvisual extraction and aggregation for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractIcons } from '../../metadata/icons/index.js';\nimport { extractOpenGraph } from '../../metadata/opengraph/index.js';\nimport { extractSchemaOrg } from '../../metadata/schema-org/index.js';\nimport { extractTwitterCard } from '../../metadata/twitter-card/index.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\nimport { normalizeUrl } from '../../utils/normalize-url.js';\n\n/**\n * Extract best keyvisual/image from multiple sources with smart fallbacks.\n *\n * @remarks\n * Strategy (priority order):\n * 1. Schema.org NewsArticle/Article image (largest if array with size metadata)\n * 2. OpenGraph image (optimized for social sharing, often high quality)\n * 3. Twitter Card image (fallback social image)\n * 4. Largest Apple Touch Icon (often high quality app/site icons)\n * 5. Standard favicon (last resort)\n *\n * This ensures we get the best visual representation of the site,\n * prioritizing social media images over generic icons.\n *\n * @param doc - Parsed HTML document\n * @param baseUrl - Base URL for resolving relative URLs\n * @returns Best available image URL (absolute) or undefined if none found\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const image = extractBestImage(doc, 'https://example.com/page');\n * console.log(image); // Absolute URL of best available image\n * ```\n */\nexport function extractBestImage(doc: Document, baseUrl: string): string | undefined {\n  // 1. Try Schema.org Article/NewsArticle image (largest if array)\n  const schema = extractSchemaOrg(doc);\n  if (schema.articles && schema.articles.length > 0) {\n    for (const article of schema.articles) {\n      const imageUrl = extractSchemaImage(article);\n      if (imageUrl?.trim()) {\n        return normalizeUrl(baseUrl, imageUrl.trim());\n      }\n    }\n  }\n\n  // 2. Try OpenGraph image (social media optimized)\n  const og = extractOpenGraph(doc);\n  if (og.image?.trim()) {\n    return normalizeUrl(baseUrl, og.image.trim());\n  }\n\n  // 3. Try Twitter Card image\n  const twitter = extractTwitterCard(doc);\n  if (twitter.image?.trim()) {\n    return normalizeUrl(baseUrl, twitter.image.trim());\n  }\n\n  // 4. Fall back to largest Apple Touch Icon\n  const icons = extractIcons(doc);\n  if (icons.appleTouchIcons && icons.appleTouchIcons.length > 0) {\n    // Find the largest icon by parsing sizes\n    const largest = findLargestIcon(icons.appleTouchIcons);\n    if (largest?.url) {\n      return normalizeUrl(baseUrl, largest.url);\n    }\n  }\n\n  // 5. Fall back to standard favicon\n  if (icons.favicon?.trim()) {\n    return normalizeUrl(baseUrl, icons.favicon.trim());\n  }\n\n  // No image found\n  return undefined;\n}\n\n/**\n * Extract image URL from Schema.org article object.\n *\n * @remarks\n * Handles multiple formats:\n * - String URL\n * - Single ImageObject with url property\n * - Array of ImageObjects (picks largest by width * height)\n *\n * @param article - Schema.org article object\n * @returns Image URL or undefined\n */\nfunction extractSchemaImage(article: unknown): string | undefined {\n  if (!article || typeof article !== 'object') return undefined;\n\n  const image = (article as Record<string, unknown>).image;\n  if (!image) return undefined;\n\n  // Case 1: Direct string URL\n  if (typeof image === 'string') {\n    return image;\n  }\n\n  // Case 2: Single ImageObject\n  if (typeof image === 'object' && !Array.isArray(image)) {\n    const url = getImageUrl(image);\n    if (url) return url;\n  }\n\n  // Case 3: Array of ImageObjects (pick largest)\n  if (Array.isArray(image)) {\n    let largest: { url: string; size: number } | undefined;\n\n    for (const img of image) {\n      if (typeof img === 'string') {\n        // Direct URL in array - return first one\n        return img;\n      }\n\n      const url = getImageUrl(img);\n      if (!url) continue;\n\n      const width = getNumberProperty(img, 'width') || 0;\n      const height = getNumberProperty(img, 'height') || 0;\n      const size = width * height;\n\n      if (!largest || size > largest.size) {\n        largest = { url, size };\n      }\n    }\n\n    return largest?.url;\n  }\n\n  return undefined;\n}\n\n/**\n * Extract URL from ImageObject.\n */\nfunction getImageUrl(img: unknown): string | undefined {\n  if (!img || typeof img !== 'object') return undefined;\n  const obj = img as Record<string, unknown>;\n\n  // Try multiple properties\n  return (\n    getStringProperty(obj, 'url') ||\n    getStringProperty(obj, 'contentUrl') ||\n    getStringProperty(obj, '@id')\n  );\n}\n\n/**\n * Safely extract a string property from an object.\n */\nfunction getStringProperty(obj: Record<string, unknown>, prop: string): string | undefined {\n  const value = obj[prop];\n  return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Safely extract a number property from an object.\n */\nfunction getNumberProperty(obj: unknown, prop: string): number | undefined {\n  if (!obj || typeof obj !== 'object') return undefined;\n  const value = (obj as Record<string, unknown>)[prop];\n\n  if (typeof value === 'number') return value;\n  if (typeof value === 'string') {\n    const parsed = Number.parseInt(value, 10);\n    return Number.isNaN(parsed) ? undefined : parsed;\n  }\n  return undefined;\n}\n\n/**\n * Find the largest Apple Touch Icon by size.\n *\n * @param icons - Array of Apple Touch Icons\n * @returns Largest icon or first icon if sizes not specified\n */\nfunction findLargestIcon(\n  icons: Array<{ url: string; sizes?: string; precomposed?: boolean }>,\n): { url: string; sizes?: string; precomposed?: boolean } | undefined {\n  if (icons.length === 0) {\n    return undefined;\n  }\n\n  let largest = icons[0];\n  let largestSize = parseSizeString(icons[0].sizes);\n\n  for (const icon of icons) {\n    const size = parseSizeString(icon.sizes);\n    if (size > largestSize) {\n      largest = icon;\n      largestSize = size;\n    }\n  }\n\n  return largest;\n}\n\n/**\n * Parse size string (e.g., \"180x180\", \"any\") to numeric value.\n *\n * @param sizeStr - Size string from sizes attribute\n * @returns Numeric size value for comparison (0 if invalid)\n */\nfunction parseSizeString(sizeStr?: string): number {\n  if (!sizeStr) {\n    return 0;\n  }\n\n  // Handle \"any\" as very large\n  if (sizeStr.toLowerCase() === 'any') {\n    return Number.POSITIVE_INFINITY;\n  }\n\n  // Parse \"WxH\" format (e.g., \"180x180\")\n  const match = /^(\\d+)x(\\d+)$/i.exec(sizeStr);\n  if (match) {\n    const width = Number.parseInt(match[1], 10);\n    const height = Number.parseInt(match[2], 10);\n    // Use area (width * height) for comparison\n    return width * height;\n  }\n\n  return 0;\n}\n","/**\n * Language and localization extraction.\n *\n * @remarks\n * Extracts language and locale metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport { type DocumentInput, ensureDocument } from '../../utils/html-parser.js';\nimport {\n  getAllMetaPropertyValues,\n  getMetaContent,\n  getMetaHttpEquiv,\n  getMetaProperty,\n} from '../../utils/meta-helpers.js';\nimport type { LanguageMetadata } from './types.js';\n\n/**\n * Extract language and localization metadata from HTML.\n *\n * @remarks\n * Extracts language information from HTML lang attribute, meta tags,\n * and OpenGraph locale. Normalizes to provide a primary language and region.\n *\n * @param input - Parsed HTML document or raw HTML string\n * @returns Language metadata\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const lang = extractLanguage(doc);\n *\n * // Or directly with HTML string\n * const lang = extractLanguage(htmlString);\n * ```\n */\nexport function extractLanguage(input: DocumentInput): LanguageMetadata {\n  const doc = ensureDocument(input);\n  const metadata: LanguageMetadata = {};\n\n  // Extract HTML lang attribute\n  const htmlElement = doc.querySelector('html');\n  if (htmlElement) {\n    const lang = htmlElement.getAttribute('lang');\n    if (lang) {\n      metadata.htmlLang = lang;\n    }\n  }\n\n  // Extract content-language meta tag (can be http-equiv or name)\n  metadata.contentLanguage =\n    getMetaHttpEquiv(doc, 'content-language') || getMetaContent(doc, 'content-language');\n\n  // Extract OpenGraph locale\n  metadata.ogLocale = getMetaProperty(doc, 'og:locale');\n\n  // Extract OpenGraph alternate locales\n  const alternateLocales = getAllMetaPropertyValues(doc, 'og:locale:alternate');\n  if (alternateLocales.length > 0) {\n    metadata.alternateLocales = alternateLocales;\n  }\n\n  // Determine primary language and region\n  const { primary, region } = parseLanguageCode(\n    metadata.htmlLang || metadata.contentLanguage || metadata.ogLocale,\n  );\n\n  if (primary) {\n    metadata.primary = primary;\n  }\n  if (region) {\n    metadata.region = region;\n  }\n\n  // Remove undefined values\n  return Object.fromEntries(\n    Object.entries(metadata).filter(([_, value]) => value !== undefined),\n  ) as LanguageMetadata;\n}\n\n/**\n * Parse language code to extract language and region.\n *\n * @remarks\n * Handles various formats:\n * - en → { primary: 'en' }\n * - en-US → { primary: 'en', region: 'US' }\n * - en_US → { primary: 'en', region: 'US' }\n * - en-us → { primary: 'en', region: 'US' }\n *\n * @param code - Language code to parse\n * @returns Normalized primary language and region\n */\nfunction parseLanguageCode(code?: string): { primary?: string; region?: string } {\n  if (!code) {\n    return {};\n  }\n\n  // Normalize separators (both - and _ are used)\n  const normalized = code.trim().replace(/_/g, '-');\n\n  // Split on - or space\n  const parts = normalized.split(/[-\\s]/);\n\n  if (parts.length === 0) {\n    return {};\n  }\n\n  // First part is the language code (lowercase)\n  const primary = parts[0].toLowerCase();\n\n  // Second part (if exists) is the region code (uppercase)\n  const region = parts.length > 1 ? parts[1].toUpperCase() : undefined;\n\n  return { primary, region };\n}\n","/**\n * Language extraction and aggregation for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractLanguage } from '../../metadata/language/index.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\n\n/**\n * Language information for a website.\n */\nexport interface WebsiteLanguage {\n  /** Primary language code (ISO 639-1, e.g., 'en', 'de', 'fr') */\n  language?: string;\n  /** Region code (ISO 3166-1 alpha-2, e.g., 'US', 'GB', 'DE') */\n  region?: string;\n}\n\n/**\n * Extract best available language information from the document.\n *\n * @remarks\n * Uses the language metadata extractor to determine the primary language\n * and region of the page. Prioritizes HTML lang attribute, then content-language\n * meta tag, then OpenGraph locale.\n *\n * The returned language code is normalized to ISO 639-1 format (e.g., 'en')\n * and the region code (if available) to ISO 3166-1 alpha-2 (e.g., 'US').\n *\n * @param doc - Parsed HTML document\n * @returns Language information with ISO codes\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const lang = extractBestLanguage(doc);\n * console.log(lang.language); // 'en'\n * console.log(lang.region);   // 'US'\n * ```\n */\nexport function extractBestLanguage(doc: Document): WebsiteLanguage {\n  const metadata = extractLanguage(doc);\n\n  return {\n    language: metadata.primary,\n    region: metadata.region,\n  };\n}\n","/**\n * Links extraction.\n *\n * @remarks\n * Extract navigational links from HTML documents with advanced filtering\n * and categorization for crawler and SEO use cases.\n *\n * @author Anonyfox <max@anonyfox.com>\n * @license MIT\n * @see {@link https://github.com/Anonyfox/ravenjs}\n * @see {@link https://ravenjs.dev}\n * @see {@link https://anonyfox.com}\n *\n * @packageDocumentation\n */\n\nimport {\n  type HTMLDocument as Document,\n  type DocumentInput,\n  ensureDocument,\n} from '../../utils/html-parser.js';\nimport { normalizeUrl } from '../../utils/normalize-url.js';\nimport type { ExtractedLink, LinksExtractionOptions, LinksMetadata } from './types.js';\n\n/**\n * Extract links from HTML.\n *\n * @remarks\n * Extracts all `<a href>` links with comprehensive metadata and filtering options.\n * Perfect for crawlers, SEO analysis, and link discovery.\n *\n * Features:\n * - Internal/external link categorization\n * - Rel attribute filtering (nofollow, ugc, sponsored, etc.)\n * - Automatic URL normalization\n * - Hash link filtering\n * - Scheme filtering (only http/https)\n * - Deduplication\n * - Link text extraction\n *\n * @param input - Parsed HTML document or raw HTML string\n * @param baseUrl - Base URL for resolving relative links and determining internal/external\n * @param options - Extraction options for filtering and categorization\n * @returns Links metadata with categorized links\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const links = extractLinks(doc, 'https://example.com');\n *\n * // Or directly with HTML string\n * const links = extractLinks(htmlString, 'https://example.com');\n *\n * // Get all internal links (same origin)\n * console.log(links.internal);\n *\n * // Get external links excluding nofollow\n * const linksNoFollow = extractLinks(htmlString, 'https://example.com', {\n *   scope: 'external',\n *   excludeRel: ['nofollow']\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Crawler use case - get follow-able links\n * const links = extractLinks(html, baseUrl, {\n *   excludeRel: ['nofollow', 'ugc', 'sponsored'],\n *   includeHashLinks: false\n * });\n * ```\n */\nexport function extractLinks(\n  input: DocumentInput,\n  baseUrl?: string | URL | null,\n  options: LinksExtractionOptions = {},\n): LinksMetadata {\n  const doc = ensureDocument(input);\n  const opts = normalizeOptions(options);\n\n  // Determine effective base URL (from <base> tag or parameter)\n  const effectiveBaseUrl = getEffectiveBaseUrl(doc, baseUrl);\n  const baseOrigin = effectiveBaseUrl ? getOrigin(effectiveBaseUrl) : null;\n\n  // Extract all links\n  const allLinks = extractAllLinks(doc, effectiveBaseUrl, baseOrigin, opts);\n\n  // Categorize links\n  const internal: ExtractedLink[] = [];\n  const external: ExtractedLink[] = [];\n  const nofollow: ExtractedLink[] = [];\n\n  for (const link of allLinks) {\n    if (link.internal) internal.push(link);\n    if (link.external) external.push(link);\n    if (link.nofollow) nofollow.push(link);\n  }\n\n  // Build metadata\n  const metadata: LinksMetadata = {\n    all: allLinks.length > 0 ? allLinks : undefined,\n    internal: internal.length > 0 ? internal : undefined,\n    external: external.length > 0 ? external : undefined,\n    nofollow: nofollow.length > 0 ? nofollow : undefined,\n    totalCount: allLinks.length,\n    internalCount: internal.length,\n    externalCount: external.length,\n    nofollowCount: nofollow.length,\n  };\n\n  // Remove undefined values\n  return Object.fromEntries(\n    Object.entries(metadata).filter(([_, value]) => value !== undefined),\n  ) as LinksMetadata;\n}\n\n/**\n * Normalize extraction options.\n */\nfunction normalizeOptions(options: LinksExtractionOptions): Required<LinksExtractionOptions> {\n  return {\n    scope: options.scope || 'all',\n    excludeRel: options.excludeRel || [],\n    includeRel: options.includeRel || [],\n    includeHashLinks: options.includeHashLinks ?? false,\n    deduplicate: options.deduplicate ?? true,\n    limit: options.limit || Number.POSITIVE_INFINITY,\n  };\n}\n\n/**\n * Get effective base URL from <base> tag or parameter.\n */\nfunction getEffectiveBaseUrl(doc: Document, baseUrl?: string | URL | null): string | null {\n  // Check for <base> tag first\n  const baseElement = doc.querySelector('base[href]');\n  if (baseElement) {\n    const baseHref = baseElement.getAttribute('href');\n    if (baseHref) {\n      try {\n        // If baseUrl is provided, resolve relative base href against it\n        if (baseUrl) {\n          const resolvedBase = normalizeUrl(baseUrl, baseHref);\n          return resolvedBase || null;\n        }\n        return baseHref;\n      } catch {\n        // Fall through to use provided baseUrl\n      }\n    }\n  }\n\n  // Use provided base URL\n  if (baseUrl) {\n    return typeof baseUrl === 'string' ? baseUrl : baseUrl.href;\n  }\n\n  return null;\n}\n\n/**\n * Get origin from URL string.\n */\nfunction getOrigin(url: string): string | null {\n  try {\n    const parsed = new URL(url);\n    return parsed.origin;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Extract all links from document.\n */\nfunction extractAllLinks(\n  doc: Document,\n  baseUrl: string | null,\n  baseOrigin: string | null,\n  options: Required<LinksExtractionOptions>,\n): ExtractedLink[] {\n  const links: ExtractedLink[] = [];\n  const seenUrls = new Set<string>();\n\n  // Get all anchor elements\n  const anchorElements = doc.querySelectorAll('a[href]');\n\n  for (const anchor of Array.from(anchorElements)) {\n    const href = anchor.getAttribute('href');\n    if (!href) continue;\n\n    const trimmedHref = href.trim();\n    if (!trimmedHref) continue;\n\n    // Skip hash-only links if not allowed\n    if (!options.includeHashLinks && trimmedHref.startsWith('#')) {\n      continue;\n    }\n\n    // Check scheme - only allow http/https or relative URLs\n    const scheme = getScheme(trimmedHref);\n    if (scheme && !isHttpLike(scheme)) {\n      continue;\n    }\n\n    // Parse rel attribute\n    const rel = anchor.getAttribute('rel')?.trim() || undefined;\n    const relParts = rel ? rel.toLowerCase().split(/\\s+/).filter(Boolean) : [];\n\n    // Check rel exclusions\n    if (options.excludeRel.length > 0) {\n      const hasExcluded = relParts.some((r) =>\n        options.excludeRel.includes(\n          r as 'nofollow' | 'noopener' | 'noreferrer' | 'ugc' | 'sponsored',\n        ),\n      );\n      if (hasExcluded) continue;\n    }\n\n    // Check rel inclusions\n    if (options.includeRel.length > 0) {\n      const hasIncluded = relParts.some((r) =>\n        options.includeRel.includes(\n          r as 'nofollow' | 'noopener' | 'noreferrer' | 'ugc' | 'sponsored',\n        ),\n      );\n      if (!hasIncluded) continue;\n    }\n\n    // Normalize URL\n    let normalizedUrl: string;\n    try {\n      normalizedUrl = normalizeUrl(baseUrl, trimmedHref) || trimmedHref;\n    } catch {\n      continue;\n    }\n\n    // Deduplicate if enabled\n    if (options.deduplicate) {\n      if (seenUrls.has(normalizedUrl)) continue;\n      seenUrls.add(normalizedUrl);\n    }\n\n    // Determine if internal/external\n    let isInternal = false;\n    let isExternal = false;\n\n    if (baseOrigin) {\n      try {\n        const linkOrigin = getOrigin(normalizedUrl);\n        if (linkOrigin) {\n          isInternal = linkOrigin === baseOrigin;\n          isExternal = linkOrigin !== baseOrigin;\n        }\n      } catch {\n        // Unable to determine, skip classification\n      }\n    }\n\n    // Apply scope filter\n    if (options.scope === 'internal' && !isInternal) continue;\n    if (options.scope === 'external' && !isExternal) continue;\n\n    // Extract link metadata\n    const link: ExtractedLink = {\n      url: normalizedUrl,\n      text: anchor.textContent?.trim() || undefined,\n      title: anchor.getAttribute('title')?.trim() || undefined,\n      rel: rel || undefined,\n      target: anchor.getAttribute('target')?.trim() || undefined,\n      internal: isInternal || undefined,\n      external: isExternal || undefined,\n      nofollow: relParts.includes('nofollow') || undefined,\n      ugc: relParts.includes('ugc') || undefined,\n      sponsored: relParts.includes('sponsored') || undefined,\n      noopener: relParts.includes('noopener') || undefined,\n      noreferrer: relParts.includes('noreferrer') || undefined,\n    };\n\n    // Clean up undefined values\n    links.push(\n      Object.fromEntries(\n        Object.entries(link).filter(([_, value]) => value !== undefined),\n      ) as ExtractedLink,\n    );\n\n    // Check limit\n    if (links.length >= options.limit) {\n      break;\n    }\n  }\n\n  return links;\n}\n\n/**\n * Get URL scheme.\n */\nfunction getScheme(url: string): string {\n  const match = /^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(url);\n  return match ? match[1].toLowerCase() : '';\n}\n\n/**\n * Check if scheme is HTTP-like.\n */\nfunction isHttpLike(scheme: string): boolean {\n  return scheme === 'http' || scheme === 'https' || scheme === '';\n}\n","/**\n * Links extraction and aggregation for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractLinks } from '../../metadata/links/index.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\n\n/**\n * Result of link extraction with internal and external links separated.\n */\nexport interface ExtractedLinksResult {\n  /** Internal links (same domain, excluding current page URL) */\n  internal: string[];\n  /** External links (different domains) */\n  external: string[];\n}\n\n/**\n * Extract and categorize links from a page.\n *\n * @remarks\n * Strategy:\n * 1. Extract all links using the links metadata extractor\n * 2. Separate into internal (same domain) and external (different domains)\n * 3. Exclude the current page URL from internal links (self-reference)\n * 4. Return arrays of unique URL strings\n *\n * @param doc - Parsed HTML document\n * @param pageUrl - Current page URL (for categorization and self-exclusion)\n * @returns Object with internal and external link arrays\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const { internal, external } = extractPageLinks(doc, 'https://example.com/page');\n * console.log(internal); // ['https://example.com/about', 'https://example.com/contact']\n * console.log(external); // ['https://other.com', 'https://twitter.com/...']\n * ```\n */\nexport function extractPageLinks(doc: Document, pageUrl: string): ExtractedLinksResult {\n  // Extract all links with categorization\n  const linksMetadata = extractLinks(doc, pageUrl, {\n    deduplicate: true,\n    includeHashLinks: false, // Exclude #anchor links\n  });\n\n  // Normalize current page URL for comparison (remove hash/query if present)\n  const currentUrl = normalizePageUrl(pageUrl);\n\n  // Extract internal links (exclude self-reference)\n  const internal: string[] = [];\n  if (linksMetadata.internal) {\n    for (const link of linksMetadata.internal) {\n      const normalizedLink = normalizePageUrl(link.url);\n      // Exclude the current page itself\n      if (normalizedLink !== currentUrl) {\n        internal.push(link.url);\n      }\n    }\n  }\n\n  // Extract external links\n  const external: string[] = [];\n  if (linksMetadata.external) {\n    for (const link of linksMetadata.external) {\n      external.push(link.url);\n    }\n  }\n\n  return {\n    internal,\n    external,\n  };\n}\n\n/**\n * Normalize a page URL for comparison (remove hash and query params).\n *\n * @remarks\n * This ensures we can properly detect self-references even if the link\n * includes query parameters or hash fragments.\n *\n * @param url - URL to normalize\n * @returns Normalized URL (origin + pathname)\n */\nfunction normalizePageUrl(url: string): string {\n  try {\n    const parsed = new URL(url);\n    // Return origin + pathname (no query, no hash)\n    return parsed.origin + parsed.pathname;\n  } catch {\n    return url;\n  }\n}\n","/**\n * Title cleaning utilities.\n *\n * @remarks\n * Utilities for cleaning page titles by removing brand names and other noise.\n *\n * @packageDocumentation\n */\n\n/**\n * Common title separators used between content title and brand name.\n */\nconst TITLE_SEPARATORS = [\n  '|',\n  '-',\n  '·',\n  '•',\n  ':',\n  '—', // em dash\n  '–', // en dash\n  '›',\n  '»',\n  '//',\n];\n\n/**\n * Clean a page title by removing brand names and separators.\n *\n * @remarks\n * Many websites use patterns like \"Page Title | Brand Name\" or \"Article - Site Name\".\n * This function applies heuristics to detect and remove the brand portion:\n *\n * 1. Splits on common separators (|, -, ·, :, etc.)\n * 2. Identifies brand by length (usually shorter)\n * 3. Detects domain-like patterns (contains dots)\n * 4. Returns the more meaningful content title\n *\n * If no clear brand pattern is detected, returns the original title.\n *\n * @param title - Raw page title string\n * @returns Cleaned title without brand suffix/prefix\n *\n * @example\n * ```typescript\n * cleanTitle('Breaking News | CNN');           // 'Breaking News'\n * cleanTitle('GitHub - Where the world builds software'); // 'Where the world builds software'\n * cleanTitle('Article Title · example.com');   // 'Article Title'\n * cleanTitle('Simple Title');                  // 'Simple Title' (no change)\n * ```\n */\nexport function cleanTitle(title: string): string {\n  if (!title?.trim()) {\n    return title;\n  }\n\n  const trimmed = title.trim();\n\n  // Try each separator\n  for (const separator of TITLE_SEPARATORS) {\n    if (!trimmed.includes(separator)) {\n      continue;\n    }\n\n    // Detect spacing pattern around separator (check first occurrence)\n    const sepIndex = trimmed.indexOf(separator);\n    const hasSpaceBefore = sepIndex > 0 && trimmed[sepIndex - 1] === ' ';\n    const hasSpaceAfter = sepIndex < trimmed.length - 1 && trimmed[sepIndex + 1] === ' ';\n\n    // Build join string that preserves original spacing\n    let joinStr = separator;\n    if (hasSpaceBefore) joinStr = ` ${joinStr}`;\n    if (hasSpaceAfter) joinStr = `${joinStr} `;\n\n    // Split by separator and clean up parts\n    const parts = trimmed\n      .split(separator)\n      .map((part) => part.trim())\n      .filter((part) => part.length > 0);\n\n    // If only one part after split, continue to next separator\n    if (parts.length < 2) {\n      continue;\n    }\n\n    // For exactly 2 parts, try to identify brand\n    // Common patterns: \"Title | Brand\" or \"Brand | Title\"\n    if (parts.length === 2) {\n      const [first, second] = parts;\n      const brandIndex = identifyBrandIndex([first, second]);\n\n      // Return the non-brand part\n      return brandIndex === 0 ? second : first;\n    }\n\n    // For 3+ parts, heuristic: brand is usually first or last\n    // Keep the middle/longer parts\n    const firstIsBrand = isBrand(parts[0], parts.slice(1));\n    const lastIsBrand = isBrand(parts[parts.length - 1], parts.slice(0, -1));\n\n    if (firstIsBrand && !lastIsBrand) {\n      return parts.slice(1).join(joinStr);\n    }\n    if (lastIsBrand && !firstIsBrand) {\n      return parts.slice(0, -1).join(joinStr);\n    }\n\n    // If both or neither seem like brand, return original (no brand detected)\n    return trimmed;\n  }\n\n  // No brand pattern detected, return original\n  return trimmed;\n}\n\n/**\n * Identify which part is likely the brand (0 or 1).\n *\n * @param parts - Array of exactly 2 title parts\n * @returns Index of the brand part (0 or 1)\n */\nfunction identifyBrandIndex(parts: [string, string]): 0 | 1 {\n  const [first, second] = parts;\n\n  // Check for domain-like pattern (contains dots)\n  const firstHasDots = /\\w+\\.\\w+/.test(first);\n  const secondHasDots = /\\w+\\.\\w+/.test(second);\n\n  if (firstHasDots && !secondHasDots) {\n    return 0; // First is brand (domain)\n  }\n  if (secondHasDots && !firstHasDots) {\n    return 1; // Second is brand (domain)\n  }\n\n  // Check for all-caps pattern (often brands/sites)\n  const firstAllCaps = first === first.toUpperCase() && /[A-Z]/.test(first);\n  const secondAllCaps = second === second.toUpperCase() && /[A-Z]/.test(second);\n\n  if (firstAllCaps && !secondAllCaps && first.length < 20) {\n    return 0; // First is brand (short all-caps)\n  }\n  if (secondAllCaps && !firstAllCaps && second.length < 20) {\n    return 1; // Second is brand (short all-caps)\n  }\n\n  // Default: shorter part is likely the brand\n  return first.length < second.length ? 0 : 1;\n}\n\n/**\n * Check if a part is likely a brand name.\n *\n * @param candidate - Potential brand string\n * @param others - Other parts to compare against\n * @returns True if candidate is likely a brand\n */\nfunction isBrand(candidate: string, others: string[]): boolean {\n  // Domain-like pattern\n  if (/\\w+\\.\\w+/.test(candidate)) {\n    return true;\n  }\n\n  // Very short compared to others\n  const avgLength = others.reduce((sum, s) => sum + s.length, 0) / others.length;\n  if (candidate.length < avgLength * 0.5 && candidate.length < 30) {\n    return true;\n  }\n\n  // All caps and short\n  if (candidate === candidate.toUpperCase() && /[A-Z]/.test(candidate) && candidate.length < 20) {\n    return true;\n  }\n\n  return false;\n}\n","/**\n * Title extraction and aggregation for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractOpenGraph } from '../../metadata/opengraph/index.js';\nimport { extractSchemaOrg } from '../../metadata/schema-org/index.js';\nimport { extractSEO } from '../../metadata/seo/index.js';\nimport { extractTwitterCard } from '../../metadata/twitter-card/index.js';\nimport { cleanTitle } from '../../utils/clean-title.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\n\n/**\n * Extract page title from multiple sources, clean them, and pick the longest.\n *\n * @remarks\n * Strategy:\n * 1. Collect all possible titles from multiple sources (priority order):\n *    - Schema.org NewsArticle/Article headline (cleanest, no brand)\n *    - OpenGraph og:title\n *    - Twitter twitter:title\n *    - Schema.org WebPage name (may include brand)\n *    - HTML <title> tag\n *    - First <h1> element\n * 2. Clean each title to remove brand suffixes\n * 3. Pick the longest cleaned title\n * 4. This ensures we get the most substantial/descriptive title\n *\n * @param doc - Parsed HTML document\n * @returns Best available title or undefined if none found\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const title = extractBestTitle(doc);\n * console.log(title); // Most descriptive title without brand\n * ```\n */\nexport function extractBestTitle(doc: Document): string | undefined {\n  const candidates: string[] = [];\n\n  // 1. Schema.org Article/NewsArticle headline (cleanest, no brand)\n  const schema = extractSchemaOrg(doc);\n  if (schema.articles && schema.articles.length > 0) {\n    for (const article of schema.articles) {\n      const headline = getStringProperty(article, 'headline');\n      if (headline?.trim()) {\n        candidates.push(headline.trim());\n      }\n    }\n  }\n\n  // 2. OpenGraph title\n  const og = extractOpenGraph(doc);\n  if (og.title?.trim()) {\n    candidates.push(og.title.trim());\n  }\n\n  // 3. Twitter Card title\n  const twitter = extractTwitterCard(doc);\n  if (twitter.title?.trim()) {\n    candidates.push(twitter.title.trim());\n  }\n\n  // 4. Schema.org WebPage name (may include brand)\n  if (schema.webPages && schema.webPages.length > 0) {\n    for (const page of schema.webPages) {\n      const name = getStringProperty(page, 'name');\n      if (name?.trim()) {\n        candidates.push(name.trim());\n      }\n    }\n  }\n\n  // 5. HTML <title> tag\n  const seo = extractSEO(doc);\n  if (seo.title?.trim()) {\n    candidates.push(seo.title.trim());\n  }\n\n  // 6. First <h1> element\n  const h1 = doc.querySelector('h1');\n  if (h1?.textContent?.trim()) {\n    candidates.push(h1.textContent.trim());\n  }\n\n  // No candidates found\n  if (candidates.length === 0) {\n    return undefined;\n  }\n\n  // Clean all candidates and pick the longest\n  const cleaned = candidates.map((title) => ({\n    original: title,\n    cleaned: cleanTitle(title),\n  }));\n\n  // Sort by cleaned length (descending) and return the longest\n  cleaned.sort((a, b) => b.cleaned.length - a.cleaned.length);\n\n  return cleaned[0].cleaned;\n}\n\n/**\n * Safely extract a string property from an unknown object.\n */\nfunction getStringProperty(obj: unknown, prop: string): string | undefined {\n  if (!obj || typeof obj !== 'object') return undefined;\n  const value = (obj as Record<string, unknown>)[prop];\n  return typeof value === 'string' ? value : undefined;\n}\n","/**\n * Canonical and alternate URL extraction.\n *\n * @remarks\n * Extracts canonical URLs, alternates, and special versions from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport {\n  type HTMLDocument as Document,\n  type DocumentInput,\n  ensureDocument,\n} from '../../utils/html-parser.js';\nimport { getAllLinks, getLinkHref } from '../../utils/link-helpers.js';\nimport { getMetaProperty } from '../../utils/meta-helpers.js';\nimport type { AlternateLink, AppLinks, CanonicalMetadata } from './types.js';\n\n/**\n * Extract canonical and alternate URL metadata from HTML.\n *\n * @remarks\n * Extracts canonical URLs, language alternates, AMP versions, manifests,\n * and app linking metadata.\n *\n * @param input - Parsed HTML document or raw HTML string\n * @returns Canonical metadata object\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const canonical = extractCanonical(doc);\n *\n * // Or directly with HTML string\n * const canonical = extractCanonical(htmlString);\n * ```\n */\nexport function extractCanonical(input: DocumentInput): CanonicalMetadata {\n  const doc = ensureDocument(input);\n  const metadata: CanonicalMetadata = {};\n\n  // Extract canonical URL\n  metadata.canonical = getLinkHref(doc, 'canonical');\n\n  // Extract alternate links (language versions, feeds, etc.)\n  const alternateLinks = getAllLinks(doc, 'alternate');\n  if (alternateLinks.length > 0) {\n    metadata.alternates = alternateLinks.map((link): AlternateLink => {\n      const alt: AlternateLink = {\n        href: link.href,\n      };\n\n      if (link.hreflang) alt.hreflang = link.hreflang;\n      if (link.type) alt.type = link.type;\n      if (link.title) alt.title = link.title;\n\n      return alt;\n    });\n  }\n\n  // Extract AMP version\n  metadata.amphtml = getLinkHref(doc, 'amphtml');\n\n  // Extract manifest\n  metadata.manifest = getLinkHref(doc, 'manifest');\n\n  // Extract app links\n  const appLinks = extractAppLinks(doc);\n  if (Object.keys(appLinks).length > 0) {\n    metadata.appLinks = appLinks;\n  }\n\n  // Remove undefined values\n  return Object.fromEntries(\n    Object.entries(metadata).filter(([_, value]) => value !== undefined),\n  ) as CanonicalMetadata;\n}\n\n/**\n * Extract app linking metadata.\n */\nfunction extractAppLinks(doc: Document): AppLinks {\n  const appLinks: AppLinks = {};\n\n  // App Links (Facebook standard)\n  appLinks.ios = getMetaProperty(doc, 'al:ios:url');\n  appLinks.android = getMetaProperty(doc, 'al:android:url');\n  appLinks.web = getMetaProperty(doc, 'al:web:url');\n\n  return Object.fromEntries(\n    Object.entries(appLinks).filter(([_, value]) => value !== undefined),\n  ) as AppLinks;\n}\n","/**\n * URL determination for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractCanonical } from '../../metadata/canonical/index.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\n\n/**\n * Extract the best/authoritative URL for a page.\n *\n * @remarks\n * Strategy:\n * 1. Check for canonical URL in <link rel=\"canonical\"> tag (authoritative)\n * 2. Fall back to the final URL after redirects (from fetch)\n *\n * The canonical URL is preferred as it represents the publisher's intended\n * URL for the content, even if accessed via a different URL or redirect chain.\n *\n * @param doc - Parsed HTML document\n * @param finalUrl - Final URL after following redirects (from pluck)\n * @returns Best available URL (canonical or final URL)\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const url = extractBestUrl(doc, 'https://example.com/page');\n * console.log(url); // Canonical URL if present, otherwise finalUrl\n * ```\n */\nexport function extractBestUrl(doc: Document, finalUrl: string): string {\n  // 1. Try canonical URL (authoritative)\n  const canonical = extractCanonical(doc);\n  if (canonical.canonical?.trim()) {\n    return canonical.canonical.trim();\n  }\n\n  // 2. Fall back to final URL after redirects\n  return finalUrl;\n}\n","/**\n * High-level article gathering functionality.\n *\n * @packageDocumentation\n */\n\nimport { htmlToText } from '../../content/html-to-text/index.js';\nimport { calculateReadingTime, countWords, extractContent } from '../../content/index.js';\nimport { pluck } from '../../pluck/index.js';\nimport { parseHTML } from '../../utils/html-parser.js';\nimport type { Article } from '../types.js';\nimport { extractBestDescription } from '../website/description.js';\nimport { extractBestImage } from '../website/image.js';\nimport { extractBestLanguage } from '../website/language.js';\nimport { extractPageLinks } from '../website/links.js';\nimport { extractBestTitle } from '../website/title.js';\nimport { extractBestUrl } from '../website/url.js';\n\n/**\n * Gather article data from a URL in one convenient call.\n *\n * @remarks\n * This is a high-level convenience method that fetches an article page and extracts\n * relevant data. It handles encoding detection, redirects, and provides\n * a unified interface for all article data.\n *\n * This method will be extended incrementally to include metadata extraction,\n * content extraction, and more.\n *\n * @param url - Article URL as string or URL object\n * @returns Gathered article data including URL, content, metadata, language, and links\n * @throws Error if URL is invalid or fetch fails\n *\n * @example\n * ```typescript\n * // Fetch an article and get its data\n * const article = await gatherArticle('https://example.com/article');\n * console.log(article.url);            // Final URL after redirects\n * console.log(article.html);           // Raw HTML content (UTF-8)\n * console.log(article.text);           // Plain text (full page HTML converted)\n * console.log(article.content);        // Cleaned article content (Readability + htmlToText)\n * console.log(article.title);          // Article title (from Readability or metadata)\n * console.log(article.description);    // Article excerpt or description\n * console.log(article.image);          // Article keyvisual/image (from best source)\n * console.log(article.language);       // Language code (ISO 639-1, e.g., 'en')\n * console.log(article.region);         // Region code (ISO 3166-1 alpha-2, e.g., 'US')\n * console.log(article.internalLinks);  // Array of internal link URLs\n * console.log(article.externalLinks);  // Array of external link URLs\n * console.log(article.wordCount);      // Word count (from content or text)\n * console.log(article.readingTime);    // Estimated reading time in minutes\n * ```\n */\nexport async function gatherArticle(url: string | URL): Promise<Article> {\n  // Convert string to URL and validate\n  let articleUrl: URL;\n  try {\n    articleUrl = typeof url === 'string' ? new URL(url) : url;\n  } catch (error) {\n    throw new Error(`Invalid article URL: ${typeof url === 'string' ? url : url.toString()}`, {\n      cause: error,\n    });\n  }\n\n  // Ensure URL is valid (has protocol and host)\n  if (!articleUrl.protocol || !articleUrl.host) {\n    throw new Error(`Invalid article URL: must have protocol and host (${articleUrl.toString()})`);\n  }\n\n  // Fetch the article\n  const response = await pluck(articleUrl);\n  const html = await response.textUtf8();\n\n  // Parse HTML document\n  const doc = parseHTML(html);\n\n  // Extract plain text from HTML\n  const text = htmlToText(html);\n\n  // Extract best URL (canonical or final redirect URL)\n  const pageUrl = extractBestUrl(doc, response.finalUrl);\n\n  // Extract title, description, and content: try Readability first, fall back to metadata\n  let title: string | undefined;\n  let description: string | undefined;\n  let content: string | undefined;\n\n  try {\n    // Try to extract article content with Mozilla Readability\n    const contentResult = extractContent(doc, { baseUrl: pageUrl });\n\n    if (contentResult.success) {\n      // Extract title if available\n      if (contentResult.title?.trim()) {\n        title = contentResult.title.trim();\n      }\n\n      // Extract excerpt/description if available\n      if (contentResult.excerpt?.trim()) {\n        description = contentResult.excerpt.trim();\n      }\n\n      // Extract cleaned HTML content and convert to plain text\n      if (contentResult.content?.trim()) {\n        content = htmlToText(contentResult.content);\n      }\n    }\n  } catch {\n    // Readability extraction failed, will fall back to metadata\n  }\n\n  // If no title from Readability, fall back to metadata title\n  if (!title) {\n    title = extractBestTitle(doc);\n  }\n\n  // If no excerpt from Readability, fall back to metadata description\n  if (!description) {\n    description = extractBestDescription(doc);\n  }\n\n  // Extract best image from metadata\n  const imageUrl = extractBestImage(doc, pageUrl);\n  let image: URL | undefined;\n  if (imageUrl) {\n    try {\n      image = new URL(imageUrl);\n    } catch {\n      // Skip invalid image URL\n    }\n  }\n\n  // Extract language and region\n  const { language, region } = extractBestLanguage(doc);\n\n  // Extract internal and external links\n  const { internal, external } = extractPageLinks(doc, pageUrl);\n  const internalLinks: URL[] = [];\n  for (const link of internal) {\n    try {\n      internalLinks.push(new URL(link));\n    } catch {\n      // Skip invalid URLs\n    }\n  }\n  const externalLinks: URL[] = [];\n  for (const link of external) {\n    try {\n      externalLinks.push(new URL(link));\n    } catch {\n      // Skip invalid URLs\n    }\n  }\n\n  // Calculate word count and reading time\n  // Prefer content (Readability-cleaned) over text (full page)\n  const textForCounting = content?.trim() ? content : text;\n  const wordCount = countWords(textForCounting);\n  const readingTime = calculateReadingTime(wordCount);\n\n  // Return the gathered article data\n  return {\n    url: new URL(pageUrl),\n    html,\n    text,\n    content,\n    title,\n    description,\n    image,\n    language,\n    region,\n    internalLinks,\n    externalLinks,\n    wordCount,\n    readingTime,\n  };\n}\n","/**\n * High-level feed gathering functionality.\n *\n * @packageDocumentation\n */\n\nimport { detectFormat } from '../feed/detect.js';\nimport { parseFeed } from '../feed/parse.js';\nimport { parseSitemap } from '../feed/sitemap/index.js';\nimport type { Feed, FeedItem } from '../feed/types.js';\nimport { pluck } from '../pluck/index.js';\n\n/**\n * Gather and parse a feed from a URL in one convenient call.\n *\n * @remarks\n * This is a high-level convenience method that combines fetching and parsing.\n * It handles encoding detection, redirects, and feed format detection automatically.\n * Falls back to sitemap parsing when standard feed formats aren't detected.\n *\n * @param url - Feed URL as string or URL object\n * @returns Normalized feed data\n * @throws Error if URL is invalid, fetch fails, or feed cannot be parsed\n *\n * @example\n * ```typescript\n * // Fetch and parse a feed\n * const feed = await gatherFeed('https://example.com/feed.xml');\n *\n * console.log(feed.title);\n * console.log(feed.items[0].title);\n * console.log(feed.items[0].url);\n * ```\n */\nexport async function gatherFeed(url: string | URL): Promise<Feed> {\n  // Convert string to URL and validate\n  let feedUrl: URL;\n  try {\n    feedUrl = typeof url === 'string' ? new URL(url) : url;\n  } catch (error) {\n    throw new Error(`Invalid feed URL: ${typeof url === 'string' ? url : url.toString()}`, {\n      cause: error,\n    });\n  }\n\n  // Ensure URL is valid (has protocol and host)\n  if (!feedUrl.protocol || !feedUrl.host) {\n    throw new Error(`Invalid feed URL: must have protocol and host (${feedUrl.toString()})`);\n  }\n\n  // Fetch the feed content\n  const response = await pluck(feedUrl);\n  const content = await response.textUtf8();\n\n  // Detect format and handle accordingly\n  const format = detectFormat(content);\n\n  // Handle sitemaps as fallback\n  if (format === 'sitemap') {\n    return normalizeSitemapToFeed(content, response.finalUrl);\n  }\n\n  // Parse the feed using the final URL (after redirects)\n  const result = parseFeed(content, response.finalUrl);\n\n  return result.feed;\n}\n\n/**\n * Convert a sitemap to the normalized Feed format.\n * This allows sitemaps to be used as a fallback when standard feeds aren't available.\n */\nfunction normalizeSitemapToFeed(content: string, baseUrl: string): Feed {\n  const result = parseSitemap(content, baseUrl);\n\n  // If it's a sitemap index, we can't really normalize it to feed items\n  if (result.isIndex) {\n    const items: FeedItem[] = result.sitemap.sitemaps.map((sitemap, index) => ({\n      id: sitemap.loc || `sitemap-${index}`,\n      url: sitemap.loc,\n      title: `Sitemap: ${sitemap.loc}`,\n      modified: sitemap.lastmod,\n    }));\n\n    return {\n      format: 'sitemap',\n      title: 'Sitemap Index',\n      url: baseUrl,\n      items,\n    };\n  }\n\n  // Convert URLs to feed items\n  const items: FeedItem[] = result.sitemap.urls.map((url, index) => {\n    const item: FeedItem = {\n      id: url.loc || `url-${index}`,\n      url: url.loc,\n      modified: url.lastmod,\n    };\n\n    // Use Google News data if available\n    if (url.news) {\n      item.title = url.news.title;\n      item.published = url.news.publicationDate;\n\n      if (url.news.publication?.name) {\n        item.authors = [{ name: url.news.publication.name }];\n      }\n\n      if (url.news.keywords) {\n        item.tags = url.news.keywords;\n      }\n    }\n\n    // Use first image if available\n    if (url.images && url.images.length > 0) {\n      item.image = url.images[0].loc;\n    }\n\n    return item;\n  });\n\n  // Try to extract a title from the base URL\n  let title = 'Sitemap';\n  try {\n    const urlObj = new URL(baseUrl);\n    title = `${urlObj.hostname} Sitemap`;\n  } catch {\n    // Keep default title\n  }\n\n  return {\n    format: 'sitemap',\n    title,\n    url: baseUrl,\n    items,\n  };\n}\n","/**\n * Feed discovery heuristics.\n *\n * @remarks\n * Common feed URL patterns and heuristics for feed discovery.\n *\n * @packageDocumentation\n */\n\n/**\n * Common feed URL patterns to check.\n *\n * @remarks\n * These are common patterns for feed URLs. They should be checked relative\n * to the site's base URL.\n */\nexport const COMMON_FEED_PATHS = [\n  '/feed',\n  '/feed/',\n  '/feeds',\n  '/feeds/',\n  '/rss',\n  '/rss/',\n  '/rss.xml',\n  '/feed.xml',\n  '/atom.xml',\n  '/index.xml',\n  '/feed.json',\n  '/feed.rss',\n  '/blog/feed',\n  '/blog/rss',\n  '/news/feed',\n  '/news/rss',\n];\n\n/**\n * Generate feed URL suggestions based on the document URL.\n *\n * @remarks\n * Returns common feed URLs that might exist, relative to the document URL.\n * These are just suggestions - not verified to actually exist.\n *\n * @param documentUrl - The URL of the current document\n * @returns Array of suggested feed URLs\n */\nexport function generateFeedSuggestions(documentUrl?: string | URL): string[] {\n  if (!documentUrl) {\n    return COMMON_FEED_PATHS;\n  }\n\n  try {\n    const url = typeof documentUrl === 'string' ? new URL(documentUrl) : documentUrl;\n    const origin = url.origin;\n\n    // Generate full URLs by combining origin with common paths\n    return COMMON_FEED_PATHS.map((path) => `${origin}${path}`);\n  } catch {\n    // If URL parsing fails, return relative paths\n    return COMMON_FEED_PATHS;\n  }\n}\n","/**\n * Feed discovery extraction.\n *\n * @remarks\n * Discovers RSS, Atom, and JSON feeds in HTML documents.\n *\n * @packageDocumentation\n */\n\nimport { type DocumentInput, ensureDocument } from '../../utils/html-parser.js';\nimport { getAllLinks } from '../../utils/link-helpers.js';\nimport { generateFeedSuggestions } from './heuristics.js';\nimport type { DiscoveredFeed, FeedDiscoveryMetadata } from './types.js';\n\n/**\n * Extract feed discovery metadata from HTML.\n *\n * @remarks\n * Finds all feeds declared in <link rel=\"alternate\"> tags and generates\n * suggestions for common feed URL patterns.\n *\n * @param input - Parsed HTML document or raw HTML string\n * @param documentUrl - Optional document URL for generating absolute feed suggestions\n * @returns Feed discovery metadata\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const feeds = extractFeedDiscovery(doc, 'https://example.com');\n *\n * // Or directly with HTML string\n * const feeds = extractFeedDiscovery(htmlString, 'https://example.com');\n * ```\n */\nexport function extractFeedDiscovery(\n  input: DocumentInput,\n  documentUrl?: string | URL,\n): FeedDiscoveryMetadata {\n  const doc = ensureDocument(input);\n  const metadata: FeedDiscoveryMetadata = {\n    feeds: [],\n  };\n\n  // Find all alternate links\n  const alternateLinks = getAllLinks(doc, 'alternate');\n\n  // Filter for feed types and map to DiscoveredFeed format\n  for (const link of alternateLinks) {\n    const feedType = determineFeedType(link.type);\n    if (feedType) {\n      metadata.feeds.push({\n        url: link.href,\n        type: feedType,\n        title: link.title,\n      });\n    }\n  }\n\n  // Clean up undefined titles\n  metadata.feeds = metadata.feeds.map((feed) =>\n    Object.fromEntries(Object.entries(feed).filter(([_, value]) => value !== undefined)),\n  ) as DiscoveredFeed[];\n\n  // Generate suggestions if document URL provided\n  if (documentUrl) {\n    metadata.suggestions = generateFeedSuggestions(documentUrl);\n  }\n\n  return metadata;\n}\n\n/**\n * Determine feed type from MIME type.\n */\nfunction determineFeedType(mimeType?: string): 'rss' | 'atom' | 'json' | 'unknown' | null {\n  if (!mimeType) {\n    return null;\n  }\n\n  const type = mimeType.toLowerCase();\n\n  if (type.includes('rss') || type === 'application/rss+xml') {\n    return 'rss';\n  }\n\n  if (type.includes('atom') || type === 'application/atom+xml') {\n    return 'atom';\n  }\n\n  if (type.includes('json') || type === 'application/feed+json' || type === 'application/json') {\n    return 'json';\n  }\n\n  // If it has xml or json in the type but doesn't match above, it might still be a feed\n  if (type.includes('xml') || type.includes('json')) {\n    return 'unknown';\n  }\n\n  return null;\n}\n","/**\n * Icon extraction and aggregation for websites.\n *\n * @packageDocumentation\n */\n\nimport { extractIcons } from '../../metadata/icons/index.js';\nimport type { AppleTouchIcon } from '../../metadata/icons/types.js';\nimport type { HTMLDocument as Document } from '../../utils/html-parser.js';\n\n/**\n * Extract best icon/favicon from multiple sources with smart fallbacks.\n *\n * @remarks\n * Strategy (priority order):\n * 1. Largest Apple Touch Icon (often high quality, 180x180+)\n * 2. Safari mask icon (SVG, scalable, modern)\n * 3. Standard favicon (most common)\n * 4. Shortcut icon (legacy fallback)\n * 5. Microsoft tile image (Windows)\n * 6. Fluid icon (legacy, rare)\n *\n * This ensures we get the highest quality icon available,\n * prioritizing modern, high-resolution icons over legacy formats.\n *\n * @param doc - Parsed HTML document\n * @returns Best available icon URL or undefined if none found\n *\n * @example\n * ```typescript\n * const doc = parseHTML(html);\n * const icon = extractBestIcon(doc);\n * console.log(icon); // URL of best available icon\n * ```\n */\nexport function extractBestIcon(doc: Document): string | undefined {\n  const icons = extractIcons(doc);\n\n  // Priority 1: Largest Apple Touch Icon (high quality)\n  if (icons.appleTouchIcons && icons.appleTouchIcons.length > 0) {\n    const largest = findLargestAppleTouchIcon(icons.appleTouchIcons);\n    if (largest?.url) {\n      return largest.url;\n    }\n  }\n\n  // Priority 2: Safari mask icon (SVG, scalable)\n  if (icons.maskIcon?.url) {\n    return icons.maskIcon.url;\n  }\n\n  // Priority 3: Standard favicon (most common)\n  if (icons.favicon?.trim()) {\n    return icons.favicon.trim();\n  }\n\n  // Priority 4: Shortcut icon (legacy)\n  if (icons.shortcutIcon?.trim()) {\n    return icons.shortcutIcon.trim();\n  }\n\n  // Priority 5: Microsoft tile image\n  if (icons.msTile?.image?.trim()) {\n    return icons.msTile.image.trim();\n  }\n\n  // Priority 6: Fluid icon (legacy, rare)\n  if (icons.fluidIcon?.trim()) {\n    return icons.fluidIcon.trim();\n  }\n\n  return undefined;\n}\n\n/**\n * Find the largest Apple Touch Icon by size.\n *\n * @remarks\n * Parses size strings like \"180x180\" and compares by area (width * height).\n * Special handling for \"any\" size (treated as largest, typically SVG).\n *\n * @param icons - Array of Apple Touch Icons\n * @returns Largest icon or first icon if sizes not specified\n */\nfunction findLargestAppleTouchIcon(icons: AppleTouchIcon[]): AppleTouchIcon | undefined {\n  if (icons.length === 0) {\n    return undefined;\n  }\n\n  let largest = icons[0];\n  let largestSize = parseSizeString(icons[0].sizes);\n\n  for (const icon of icons) {\n    const size = parseSizeString(icon.sizes);\n    if (size > largestSize) {\n      largest = icon;\n      largestSize = size;\n    }\n  }\n\n  return largest;\n}\n\n/**\n * Parse size string (e.g., \"180x180\", \"any\") to numeric value for comparison.\n *\n * @param sizeStr - Size string from sizes attribute\n * @returns Numeric size value (area = width * height), or 0 if invalid\n */\nfunction parseSizeString(sizeStr?: string): number {\n  if (!sizeStr) {\n    return 0;\n  }\n\n  // Handle \"any\" as very large (typically SVG, scalable)\n  if (sizeStr.toLowerCase() === 'any') {\n    return Number.POSITIVE_INFINITY;\n  }\n\n  // Parse \"WxH\" format (e.g., \"180x180\")\n  const match = /^(\\d+)x(\\d+)$/i.exec(sizeStr);\n  if (match) {\n    const width = Number.parseInt(match[1], 10);\n    const height = Number.parseInt(match[2], 10);\n    // Use area (width * height) for comparison\n    return width * height;\n  }\n\n  return 0;\n}\n","/**\n * High-level website gathering functionality.\n *\n * @packageDocumentation\n */\n\nimport { htmlToText } from '../../content/html-to-text/index.js';\nimport { extractFeedDiscovery } from '../../metadata/feed-discovery/index.js';\nimport { pluck } from '../../pluck/index.js';\nimport { parseHTML } from '../../utils/html-parser.js';\nimport type { Website } from '../types.js';\nimport { extractBestDescription } from './description.js';\nimport { extractBestIcon } from './icon.js';\nimport { extractBestImage } from './image.js';\nimport { extractBestLanguage } from './language.js';\nimport { extractPageLinks } from './links.js';\nimport { extractBestTitle } from './title.js';\nimport { extractBestUrl } from './url.js';\n\n/**\n * Gather website data from a URL in one convenient call.\n *\n * @remarks\n * This is a high-level convenience method that fetches a website and extracts\n * all relevant data. It handles encoding detection, redirects, and provides\n * a unified interface for all website data.\n *\n * This method will be extended incrementally to include metadata extraction,\n * content extraction, and more.\n *\n * @param url - Website URL as string or URL object\n * @returns Gathered website data including final URL, title, description, image, icon, language, html, text, feeds, and links\n * @throws Error if URL is invalid or fetch fails\n *\n * @example\n * ```typescript\n * // Fetch a website and get its data\n * const site = await gatherWebsite('https://example.com');\n * console.log(site.url);            // Final URL after redirects\n * console.log(site.title);          // Page title (cleaned, from best source)\n * console.log(site.description);    // Page description (from best source)\n * console.log(site.image);          // Page image/keyvisual (from best source)\n * console.log(site.icon);           // Best available icon/favicon\n * console.log(site.language);       // Primary language code (ISO 639-1)\n * console.log(site.region);         // Region code (ISO 3166-1 alpha-2)\n * console.log(site.html);           // Raw HTML content (UTF-8)\n * console.log(site.text);           // Plain text content (extracted from HTML)\n * console.log(site.feeds);          // Array of feed URL objects\n * console.log(site.internalLinks);  // Array of internal link URL objects\n * console.log(site.externalLinks);  // Array of external link URL objects\n * ```\n */\nexport async function gatherWebsite(url: string | URL): Promise<Website> {\n  // Convert string to URL and validate\n  let siteUrl: URL;\n  try {\n    siteUrl = typeof url === 'string' ? new URL(url) : url;\n  } catch (error) {\n    throw new Error(`Invalid website URL: ${typeof url === 'string' ? url : url.toString()}`, {\n      cause: error,\n    });\n  }\n\n  // Ensure URL is valid (has protocol and host)\n  if (!siteUrl.protocol || !siteUrl.host) {\n    throw new Error(`Invalid website URL: must have protocol and host (${siteUrl.toString()})`);\n  }\n\n  // Fetch the website\n  const response = await pluck(siteUrl);\n  const html = await response.textUtf8();\n\n  // Parse HTML document\n  const doc = parseHTML(html);\n\n  // Extract plain text from HTML\n  const text = htmlToText(html);\n\n  // Extract best URL (canonical or final redirect URL)\n  const pageUrl = extractBestUrl(doc, response.finalUrl);\n\n  // Extract feed discovery metadata\n  const feedDiscovery = extractFeedDiscovery(doc, pageUrl);\n\n  // Convert feed URLs to URL objects (filter out invalid URLs)\n  const feeds: URL[] = [];\n  for (const feed of feedDiscovery.feeds) {\n    try {\n      feeds.push(new URL(feed.url));\n    } catch {\n      // Skip invalid feed URLs\n    }\n  }\n\n  // Extract best title, description, image, icon, and language from multiple sources\n  const title = extractBestTitle(doc);\n  const description = extractBestDescription(doc);\n  const imageUrl = extractBestImage(doc, pageUrl);\n  const iconUrl = extractBestIcon(doc);\n  const { language, region } = extractBestLanguage(doc);\n\n  // Convert image URL string to URL object\n  let image: URL | undefined;\n  if (imageUrl) {\n    try {\n      image = new URL(imageUrl);\n    } catch {\n      // Skip invalid image URL\n    }\n  }\n\n  // Convert icon URL string to URL object\n  let icon: URL | undefined;\n  if (iconUrl) {\n    try {\n      icon = new URL(iconUrl);\n    } catch {\n      // Skip invalid icon URL\n    }\n  }\n\n  // Extract internal and external links\n  const { internal, external } = extractPageLinks(doc, pageUrl);\n\n  // Convert link strings to URL objects\n  const internalLinks: URL[] = [];\n  for (const link of internal) {\n    try {\n      internalLinks.push(new URL(link));\n    } catch {\n      // Skip invalid URLs\n    }\n  }\n\n  const externalLinks: URL[] = [];\n  for (const link of external) {\n    try {\n      externalLinks.push(new URL(link));\n    } catch {\n      // Skip invalid URLs\n    }\n  }\n\n  // Return the gathered website data\n  return {\n    url: new URL(pageUrl),\n    feeds,\n    title,\n    description,\n    image,\n    icon,\n    language,\n    region,\n    html,\n    text,\n    internalLinks,\n    externalLinks,\n  };\n}\n","/**\n * Analytics and tracking extraction.\n *\n * @remarks\n * Detects analytics service IDs from HTML documents.\n * Privacy-conscious - only extracts IDs, doesn't perform any tracking.\n *\n * @packageDocumentation\n */\n\nimport { type DocumentInput, ensureDocument } from '../../utils/html-parser.js';\nimport type { AnalyticsMetadata } from './types.js';\n\n/**\n * Extract analytics metadata from HTML.\n *\n * @remarks\n * Detects analytics service IDs by examining script tags and their content.\n * Only extracts identifiers, does not track or collect user data.\n *\n * @param input - Parsed HTML document or raw HTML string\n * @returns Analytics metadata\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const analytics = extractAnalytics(doc);\n *\n * // Or directly with HTML string\n * const analytics = extractAnalytics(htmlString);\n * ```\n */\nexport function extractAnalytics(input: DocumentInput): AnalyticsMetadata {\n  const doc = ensureDocument(input);\n  const metadata: AnalyticsMetadata = {};\n\n  // Get all script tags\n  const scripts = doc.querySelectorAll('script');\n\n  const googleAnalytics = new Set<string>();\n  const googleTagManager = new Set<string>();\n  const facebookPixel = new Set<string>();\n  const matomo = new Set<string>();\n  const plausible = new Set<string>();\n  const adobe = new Set<string>();\n  const cloudflare = new Set<string>();\n  const fathom = new Set<string>();\n\n  for (const script of Array.from(scripts)) {\n    const src = script.getAttribute('src') || '';\n    const content = script.textContent || '';\n    const combined = `${src} ${content}`;\n\n    // Google Analytics (GA4: G-, Universal: UA-, Tag Manager: GT-)\n    const gaMatches = combined.matchAll(/\\b(UA-\\d+-\\d+|G-[A-Z0-9]+|GT-[A-Z0-9]+)\\b/g);\n    for (const match of gaMatches) {\n      googleAnalytics.add(match[1]);\n    }\n\n    // Google Tag Manager (GTM-)\n    const gtmMatches = combined.matchAll(/\\b(GTM-[A-Z0-9]+)\\b/g);\n    for (const match of gtmMatches) {\n      googleTagManager.add(match[1]);\n    }\n\n    // Facebook Pixel (numeric IDs in fbq or _fbq)\n    const fbMatches = combined.matchAll(/fbq\\s*\\(\\s*['\"]init['\"]\\s*,\\s*['\"](\\d+)['\"]/g);\n    for (const match of fbMatches) {\n      facebookPixel.add(match[1]);\n    }\n\n    // Matomo/Piwik\n    if (src.includes('matomo') || src.includes('piwik') || content.includes('_paq')) {\n      const matomoIdMatch =\n        content.match(/setSiteId['\"]?\\s*,\\s*['\"]?(\\d+)['\"]?\\s*\\]/) ||\n        content.match(/setSiteId\\s*\\(\\s*['\"]?(\\d+)['\"]?\\s*\\)/);\n      if (matomoIdMatch) {\n        matomo.add(matomoIdMatch[1]);\n      }\n    }\n\n    // Plausible Analytics\n    if (src.includes('plausible.io/js/')) {\n      const domain = script.getAttribute('data-domain');\n      if (domain) {\n        plausible.add(domain);\n      }\n    }\n\n    // Adobe Analytics (Omniture)\n    if (src.includes('omniture') || src.includes('2o7.net') || content.includes('s.t()')) {\n      const adobeIdMatch = content.match(/s_account\\s*=\\s*['\"]([^'\"]+)['\"]/);\n      if (adobeIdMatch) {\n        adobe.add(adobeIdMatch[1]);\n      }\n    }\n\n    // Cloudflare Web Analytics\n    if (src.includes('cloudflareinsights.com')) {\n      const cfBeacon = script.getAttribute('data-cf-beacon');\n      if (cfBeacon) {\n        try {\n          const beacon = JSON.parse(cfBeacon);\n          if (beacon.token) {\n            cloudflare.add(beacon.token);\n          }\n        } catch {\n          // Ignore invalid JSON\n        }\n      }\n    }\n\n    // Fathom Analytics\n    if (src.includes('cdn.usefathom.com')) {\n      const siteId = script.getAttribute('data-site') || script.getAttribute('site');\n      if (siteId) {\n        fathom.add(siteId);\n      }\n    }\n  }\n\n  // Convert Sets to arrays if not empty\n  if (googleAnalytics.size > 0) {\n    metadata.googleAnalytics = Array.from(googleAnalytics);\n  }\n  if (googleTagManager.size > 0) {\n    metadata.googleTagManager = Array.from(googleTagManager);\n  }\n  if (facebookPixel.size > 0) {\n    metadata.facebookPixel = Array.from(facebookPixel);\n  }\n  if (matomo.size > 0) {\n    metadata.matomo = Array.from(matomo);\n  }\n  if (plausible.size > 0) {\n    metadata.plausible = Array.from(plausible);\n  }\n  if (adobe.size > 0) {\n    metadata.adobe = Array.from(adobe);\n  }\n  if (cloudflare.size > 0) {\n    metadata.cloudflare = Array.from(cloudflare);\n  }\n  if (fathom.size > 0) {\n    metadata.fathom = Array.from(fathom);\n  }\n\n  return metadata;\n}\n","/**\n * Assets extraction.\n *\n * @remarks\n * Extracts categorized asset URLs from HTML documents.\n *\n * @author Anonyfox <max@anonyfox.com>\n * @license MIT\n * @see {@link https://github.com/Anonyfox/ravenjs}\n * @see {@link https://ravenjs.dev}\n * @see {@link https://anonyfox.com}\n *\n * @packageDocumentation\n */\n\nimport {\n  type HTMLDocument as Document,\n  type DocumentInput,\n  ensureDocument,\n} from '../../utils/html-parser.js';\nimport { normalizeUrl } from '../../utils/normalize-url.js';\nimport type { AssetsMetadata, ConnectionHint, PreloadResource } from './types.js';\n\n/**\n * Extract assets metadata from HTML.\n *\n * @remarks\n * Extracts all external assets referenced in the document, organized by type.\n * All URLs are normalized to absolute format based on the document's base URL.\n *\n * The extractor finds assets from:\n * - Images: `<img>`, `<picture>`, `srcset`, OpenGraph meta tags\n * - Stylesheets: `<link rel=\"stylesheet\">`\n * - Scripts: `<script src>`\n * - Fonts: CSS `@font-face` and `url()` with font extensions\n * - Media: `<video>`, `<audio>`, `<source>`, `<track>`\n * - Manifests: `<link rel=\"manifest\">`\n * - Preloads: `<link rel=\"preload\">` and `<link rel=\"prefetch\">`\n * - Connection hints: `<link rel=\"dns-prefetch\">` and `<link rel=\"preconnect\">`\n *\n * @param input - Parsed HTML document or raw HTML string\n * @param baseUrl - Optional base URL for resolving relative URLs\n * @returns Assets metadata object with categorized URLs\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const assets = extractAssets(doc, 'https://example.com');\n *\n * // Or directly with HTML string\n * const assets = extractAssets(htmlString, 'https://example.com');\n * ```\n */\nexport function extractAssets(input: DocumentInput, baseUrl?: string | URL | null): AssetsMetadata {\n  const doc = ensureDocument(input);\n  const metadata: AssetsMetadata = {};\n\n  // Determine effective base URL (from <base> tag or parameter)\n  const effectiveBaseUrl = getEffectiveBaseUrl(doc, baseUrl);\n\n  // Extract images\n  const images = extractImages(doc, effectiveBaseUrl);\n  if (images.length > 0) {\n    metadata.images = images;\n  }\n\n  // Extract stylesheets\n  const stylesheets = extractStylesheets(doc, effectiveBaseUrl);\n  if (stylesheets.length > 0) {\n    metadata.stylesheets = stylesheets;\n  }\n\n  // Extract scripts\n  const scripts = extractScripts(doc, effectiveBaseUrl);\n  if (scripts.length > 0) {\n    metadata.scripts = scripts;\n  }\n\n  // Extract fonts from CSS\n  const fonts = extractFonts(doc, effectiveBaseUrl);\n  if (fonts.length > 0) {\n    metadata.fonts = fonts;\n  }\n\n  // Extract media\n  const media = extractMedia(doc, effectiveBaseUrl);\n  if (media.length > 0) {\n    metadata.media = media;\n  }\n\n  // Extract manifests\n  const manifests = extractManifests(doc, effectiveBaseUrl);\n  if (manifests.length > 0) {\n    metadata.manifests = manifests;\n  }\n\n  // Extract preload/prefetch hints\n  const preloads = extractPreloads(doc, effectiveBaseUrl);\n  if (preloads.length > 0) {\n    metadata.preloads = preloads;\n  }\n\n  // Extract connection hints\n  const connectionHints = extractConnectionHints(doc, effectiveBaseUrl);\n  if (connectionHints.length > 0) {\n    metadata.connectionHints = connectionHints;\n  }\n\n  return metadata;\n}\n\n/**\n * Get effective base URL from <base> tag or parameter.\n */\nfunction getEffectiveBaseUrl(doc: Document, baseUrl?: string | URL | null): string | null {\n  // Check for <base> tag first\n  const baseElement = doc.querySelector('base[href]');\n  if (baseElement) {\n    const baseHref = baseElement.getAttribute('href');\n    if (baseHref) {\n      try {\n        // If baseUrl is provided, resolve relative base href against it\n        if (baseUrl) {\n          const resolvedBase = normalizeUrl(baseUrl, baseHref);\n          return resolvedBase || null;\n        }\n        return baseHref;\n      } catch {\n        // Fall through to use provided baseUrl\n      }\n    }\n  }\n\n  // Use provided base URL\n  if (baseUrl) {\n    return typeof baseUrl === 'string' ? baseUrl : baseUrl.href;\n  }\n\n  return null;\n}\n\n/**\n * Extract image URLs.\n */\nfunction extractImages(doc: Document, baseUrl: string | null): string[] {\n  const urls = new Set<string>();\n\n  // Extract from <img src>\n  const imgElements = doc.querySelectorAll('img[src]');\n  for (const img of Array.from(imgElements)) {\n    const src = img.getAttribute('src');\n    if (src) {\n      const normalized = normalizeUrl(baseUrl, src);\n      if (normalized) urls.add(normalized);\n    }\n  }\n\n  // Extract from srcset (img and source elements)\n  const srcsetElements = doc.querySelectorAll('img[srcset], source[srcset]');\n  for (const element of Array.from(srcsetElements)) {\n    const srcset = element.getAttribute('srcset');\n    if (srcset) {\n      const srcsetUrls = parseSrcset(srcset);\n      for (const url of srcsetUrls) {\n        const normalized = normalizeUrl(baseUrl, url);\n        if (normalized) urls.add(normalized);\n      }\n    }\n  }\n\n  // Extract from <picture><source srcset>\n  const pictureSourceElements = doc.querySelectorAll('picture source[srcset]');\n  for (const source of Array.from(pictureSourceElements)) {\n    const srcset = source.getAttribute('srcset');\n    if (srcset) {\n      const srcsetUrls = parseSrcset(srcset);\n      for (const url of srcsetUrls) {\n        const normalized = normalizeUrl(baseUrl, url);\n        if (normalized) urls.add(normalized);\n      }\n    }\n  }\n\n  // Extract from OpenGraph meta tags\n  const ogImages = doc.querySelectorAll('meta[property=\"og:image\"], meta[property=\"og:image:url\"]');\n  for (const meta of Array.from(ogImages)) {\n    const content = meta.getAttribute('content');\n    if (content) {\n      const normalized = normalizeUrl(baseUrl, content);\n      if (normalized) urls.add(normalized);\n    }\n  }\n\n  // Extract from Twitter Card meta tags\n  const twitterImages = doc.querySelectorAll(\n    'meta[name=\"twitter:image\"], meta[name=\"twitter:image:src\"]',\n  );\n  for (const meta of Array.from(twitterImages)) {\n    const content = meta.getAttribute('content');\n    if (content) {\n      const normalized = normalizeUrl(baseUrl, content);\n      if (normalized) urls.add(normalized);\n    }\n  }\n\n  return Array.from(urls);\n}\n\n/**\n * Parse srcset attribute into individual URLs.\n */\nfunction parseSrcset(srcset: string): string[] {\n  const urls: string[] = [];\n  const candidates = srcset.split(',').map((s) => s.trim());\n\n  for (const candidate of candidates) {\n    // srcset format: \"url 1x\" or \"url 100w\" or just \"url\"\n    const parts = candidate.split(/\\s+/);\n    if (parts[0]) {\n      urls.push(parts[0]);\n    }\n  }\n\n  return urls;\n}\n\n/**\n * Extract stylesheet URLs.\n */\nfunction extractStylesheets(doc: Document, baseUrl: string | null): string[] {\n  const urls = new Set<string>();\n\n  const linkElements = doc.querySelectorAll('link[rel=\"stylesheet\"][href]');\n  for (const link of Array.from(linkElements)) {\n    const href = link.getAttribute('href');\n    if (href) {\n      const normalized = normalizeUrl(baseUrl, href);\n      if (normalized) urls.add(normalized);\n    }\n  }\n\n  return Array.from(urls);\n}\n\n/**\n * Extract script URLs.\n */\nfunction extractScripts(doc: Document, baseUrl: string | null): string[] {\n  const urls = new Set<string>();\n\n  const scriptElements = doc.querySelectorAll('script[src]');\n  for (const script of Array.from(scriptElements)) {\n    const src = script.getAttribute('src');\n    if (src) {\n      const normalized = normalizeUrl(baseUrl, src);\n      if (normalized) urls.add(normalized);\n    }\n  }\n\n  return Array.from(urls);\n}\n\n/**\n * Extract font URLs from CSS (inline styles and style tags).\n */\nfunction extractFonts(doc: Document, baseUrl: string | null): string[] {\n  const urls = new Set<string>();\n\n  // Extract from <style> tags\n  const styleElements = doc.querySelectorAll('style');\n  for (const style of Array.from(styleElements)) {\n    const css = style.textContent || '';\n    const fontUrls = extractFontUrlsFromCss(css);\n    for (const url of fontUrls) {\n      const normalized = normalizeUrl(baseUrl, url);\n      if (normalized) urls.add(normalized);\n    }\n  }\n\n  // Extract from inline style attributes\n  const elementsWithStyle = doc.querySelectorAll('[style]');\n  for (const element of Array.from(elementsWithStyle)) {\n    const style = element.getAttribute('style') || '';\n    const fontUrls = extractFontUrlsFromCss(style);\n    for (const url of fontUrls) {\n      const normalized = normalizeUrl(baseUrl, url);\n      if (normalized) urls.add(normalized);\n    }\n  }\n\n  // Also check for preload hints for fonts\n  const fontPreloads = doc.querySelectorAll('link[rel=\"preload\"][as=\"font\"][href]');\n  for (const link of Array.from(fontPreloads)) {\n    const href = link.getAttribute('href');\n    if (href) {\n      const normalized = normalizeUrl(baseUrl, href);\n      if (normalized) urls.add(normalized);\n    }\n  }\n\n  return Array.from(urls);\n}\n\n/**\n * Extract font URLs from CSS content.\n */\nfunction extractFontUrlsFromCss(css: string): string[] {\n  const urls: string[] = [];\n\n  // Match url(...) with font extensions\n  const urlRegex = /url\\(\\s*['\"]?([^'\")]+)['\"]?\\s*\\)/gi;\n  const fontExtensions = /\\.(woff2?|ttf|otf|eot)(\\?.*)?$/i;\n\n  let match: RegExpExecArray | null;\n  // biome-ignore lint/suspicious/noAssignInExpressions: Standard regex pattern matching\n  while ((match = urlRegex.exec(css)) !== null) {\n    const url = match[1];\n    if (url && fontExtensions.test(url)) {\n      urls.push(url);\n    }\n  }\n\n  return urls;\n}\n\n/**\n * Extract media URLs (video, audio, source, track).\n */\nfunction extractMedia(doc: Document, baseUrl: string | null): string[] {\n  const urls = new Set<string>();\n\n  // Video and audio elements with src\n  const mediaElements = doc.querySelectorAll('video[src], audio[src]');\n  for (const media of Array.from(mediaElements)) {\n    const src = media.getAttribute('src');\n    if (src) {\n      const normalized = normalizeUrl(baseUrl, src);\n      if (normalized) urls.add(normalized);\n    }\n  }\n\n  // Source elements (inside video/audio)\n  const sourceElements = doc.querySelectorAll('video source[src], audio source[src], source[src]');\n  for (const source of Array.from(sourceElements)) {\n    const src = source.getAttribute('src');\n    if (src) {\n      const normalized = normalizeUrl(baseUrl, src);\n      if (normalized) urls.add(normalized);\n    }\n  }\n\n  // Track elements (subtitles, captions)\n  const trackElements = doc.querySelectorAll('track[src]');\n  for (const track of Array.from(trackElements)) {\n    const src = track.getAttribute('src');\n    if (src) {\n      const normalized = normalizeUrl(baseUrl, src);\n      if (normalized) urls.add(normalized);\n    }\n  }\n\n  // OpenGraph video\n  const ogVideos = doc.querySelectorAll('meta[property=\"og:video\"], meta[property=\"og:video:url\"]');\n  for (const meta of Array.from(ogVideos)) {\n    const content = meta.getAttribute('content');\n    if (content) {\n      const normalized = normalizeUrl(baseUrl, content);\n      if (normalized) urls.add(normalized);\n    }\n  }\n\n  // OpenGraph audio\n  const ogAudios = doc.querySelectorAll('meta[property=\"og:audio\"], meta[property=\"og:audio:url\"]');\n  for (const meta of Array.from(ogAudios)) {\n    const content = meta.getAttribute('content');\n    if (content) {\n      const normalized = normalizeUrl(baseUrl, content);\n      if (normalized) urls.add(normalized);\n    }\n  }\n\n  return Array.from(urls);\n}\n\n/**\n * Extract manifest URLs.\n */\nfunction extractManifests(doc: Document, baseUrl: string | null): string[] {\n  const urls = new Set<string>();\n\n  const linkElements = doc.querySelectorAll('link[rel=\"manifest\"][href]');\n  for (const link of Array.from(linkElements)) {\n    const href = link.getAttribute('href');\n    if (href) {\n      const normalized = normalizeUrl(baseUrl, href);\n      if (normalized) urls.add(normalized);\n    }\n  }\n\n  return Array.from(urls);\n}\n\n/**\n * Extract preload and prefetch resource hints.\n */\nfunction extractPreloads(doc: Document, baseUrl: string | null): PreloadResource[] {\n  const resources: PreloadResource[] = [];\n\n  // Preload links\n  const preloadElements = doc.querySelectorAll('link[rel=\"preload\"][href]');\n  for (const link of Array.from(preloadElements)) {\n    const href = link.getAttribute('href');\n    if (href) {\n      const normalized = normalizeUrl(baseUrl, href);\n      if (normalized) {\n        const asAttr = link.getAttribute('as');\n        const typeAttr = link.getAttribute('type');\n        const crossoriginAttr = link.getAttribute('crossorigin');\n\n        resources.push({\n          url: normalized,\n          as: asAttr || undefined,\n          type: typeAttr || undefined,\n          crossorigin: crossoriginAttr !== null ? crossoriginAttr || '' : undefined,\n          prefetch: false,\n        });\n      }\n    }\n  }\n\n  // Prefetch links\n  const prefetchElements = doc.querySelectorAll('link[rel=\"prefetch\"][href]');\n  for (const link of Array.from(prefetchElements)) {\n    const href = link.getAttribute('href');\n    if (href) {\n      const normalized = normalizeUrl(baseUrl, href);\n      if (normalized) {\n        const asAttr = link.getAttribute('as');\n        const typeAttr = link.getAttribute('type');\n        const crossoriginAttr = link.getAttribute('crossorigin');\n\n        resources.push({\n          url: normalized,\n          as: asAttr || undefined,\n          type: typeAttr || undefined,\n          crossorigin: crossoriginAttr !== null ? crossoriginAttr || '' : undefined,\n          prefetch: true,\n        });\n      }\n    }\n  }\n\n  // Clean up undefined values (but keep empty strings for boolean attributes like crossorigin)\n  return resources.map((resource) =>\n    Object.fromEntries(\n      Object.entries(resource).filter(([_, value]) => value !== undefined && value !== null),\n    ),\n  ) as PreloadResource[];\n}\n\n/**\n * Extract DNS prefetch and preconnect hints.\n */\nfunction extractConnectionHints(doc: Document, baseUrl: string | null): ConnectionHint[] {\n  const hints: ConnectionHint[] = [];\n\n  // DNS prefetch\n  const dnsPrefetchElements = doc.querySelectorAll('link[rel=\"dns-prefetch\"][href]');\n  for (const link of Array.from(dnsPrefetchElements)) {\n    const href = link.getAttribute('href');\n    if (href) {\n      const normalized = normalizeUrl(baseUrl, href);\n      if (normalized) {\n        hints.push({\n          url: normalized,\n          preconnect: false,\n        });\n      }\n    }\n  }\n\n  // Preconnect\n  const preconnectElements = doc.querySelectorAll('link[rel=\"preconnect\"][href]');\n  for (const link of Array.from(preconnectElements)) {\n    const href = link.getAttribute('href');\n    if (href) {\n      const normalized = normalizeUrl(baseUrl, href);\n      if (normalized) {\n        const crossoriginAttr = link.getAttribute('crossorigin');\n\n        hints.push({\n          url: normalized,\n          preconnect: true,\n          crossorigin: crossoriginAttr !== null ? crossoriginAttr || '' : undefined,\n        });\n      }\n    }\n  }\n\n  // Clean up undefined values (but keep empty strings for boolean attributes like crossorigin)\n  return hints.map((hint) =>\n    Object.fromEntries(\n      Object.entries(hint).filter(([_, value]) => value !== undefined && value !== null),\n    ),\n  ) as ConnectionHint[];\n}\n","/**\n * Copyright and licensing extraction.\n *\n * @remarks\n * Extracts copyright and license metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport { type DocumentInput, ensureDocument } from '../../utils/html-parser.js';\nimport { getLinkHref } from '../../utils/link-helpers.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { CopyrightMetadata } from './types.js';\n\n/**\n * Extract copyright metadata from HTML.\n *\n * @remarks\n * Extracts copyright and licensing information from meta tags, link tags,\n * and Schema.org structured data.\n *\n * @param input - Parsed HTML document or raw HTML string\n * @returns Copyright metadata\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const copyright = extractCopyright(doc);\n *\n * // Or directly with HTML string\n * const copyright = extractCopyright(htmlString);\n * ```\n */\nexport function extractCopyright(input: DocumentInput): CopyrightMetadata {\n  const doc = ensureDocument(input);\n  const metadata: CopyrightMetadata = {};\n\n  // Extract copyright from meta tag\n  metadata.copyright = getMetaContent(doc, 'copyright');\n\n  // Extract license from link tag\n  metadata.license = getLinkHref(doc, 'license');\n\n  // Extract Dublin Core rights (if no copyright yet)\n  if (!metadata.copyright) {\n    metadata.copyright = getMetaContent(doc, 'DC.rights') || getMetaContent(doc, 'dcterms.rights');\n  }\n\n  // Try to parse copyright holder and year from copyright string\n  if (metadata.copyright) {\n    const parsed = parseCopyright(metadata.copyright);\n    if (parsed.holder && !metadata.holder) {\n      metadata.holder = parsed.holder;\n    }\n    if (parsed.year && !metadata.year) {\n      metadata.year = parsed.year;\n    }\n  }\n\n  // Remove undefined values\n  return Object.fromEntries(\n    Object.entries(metadata).filter(([_, value]) => value !== undefined),\n  ) as CopyrightMetadata;\n}\n\n/**\n * Parse copyright string to extract holder and year.\n *\n * @remarks\n * Attempts to extract copyright holder and year from common copyright formats:\n * - \"© 2024 Company Name\"\n * - \"Copyright 2024 Company Name\"\n * - \"(c) 2024 Company Name\"\n *\n * @param copyrightString - Copyright string to parse\n * @returns Parsed holder and year\n */\nfunction parseCopyright(copyrightString: string): { holder?: string; year?: string } {\n  const result: { holder?: string; year?: string } = {};\n\n  // Match year (4 digits)\n  const yearMatch = copyrightString.match(/\\b(19|20)\\d{2}\\b/);\n  if (yearMatch) {\n    result.year = yearMatch[0];\n  }\n\n  // Try to extract holder by removing copyright symbols and year\n  let holder = copyrightString\n    .replace(/©/g, '')\n    .replace(/\\(c\\)/gi, '')\n    .replace(/^copyright\\s+/gi, '') // Only remove \"copyright\" at the start\n    .replace(/\\b(19|20)\\d{2}(-\\d{4})?\\b/g, '') // Remove year or year range\n    .trim();\n\n  // Clean up multiple spaces and leading punctuation\n  holder = holder.replace(/\\s+/g, ' ').replace(/^[,\\-:\\s]+/g, '');\n\n  // Remove trailing \"All rights reserved\" and similar phrases\n  holder = holder.replace(/\\.\\s*all rights reserved\\.?$/gi, '');\n\n  if (holder && holder.length > 0 && holder.length < 200) {\n    result.holder = holder;\n  }\n\n  return result;\n}\n","/**\n * Dublin Core metadata extraction.\n *\n * @remarks\n * Extracts Dublin Core metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport {\n  type HTMLDocument as Document,\n  type DocumentInput,\n  ensureDocument,\n} from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { DublinCoreMetadata } from './types.js';\n\n/**\n * Extract Dublin Core metadata from HTML.\n *\n * @remarks\n * Extracts Dublin Core metadata using both DC. and dcterms. prefixes.\n * Fields that can have multiple values (creator, subject, contributor)\n * are extracted as arrays.\n *\n * @param input - Parsed HTML document or raw HTML string\n * @returns Dublin Core metadata object\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const dc = extractDublinCore(doc);\n *\n * // Or directly with HTML string\n * const dc = extractDublinCore(htmlString);\n * ```\n */\nexport function extractDublinCore(input: DocumentInput): DublinCoreMetadata {\n  const doc = ensureDocument(input);\n  const metadata: DublinCoreMetadata = {};\n\n  // Extract single-value fields (try DC. first, then dcterms.)\n  metadata.title = getMetaContent(doc, 'DC.title') || getMetaContent(doc, 'dcterms.title');\n  metadata.description =\n    getMetaContent(doc, 'DC.description') || getMetaContent(doc, 'dcterms.description');\n  metadata.publisher =\n    getMetaContent(doc, 'DC.publisher') || getMetaContent(doc, 'dcterms.publisher');\n  metadata.date = getMetaContent(doc, 'DC.date') || getMetaContent(doc, 'dcterms.date');\n  metadata.type = getMetaContent(doc, 'DC.type') || getMetaContent(doc, 'dcterms.type');\n  metadata.format = getMetaContent(doc, 'DC.format') || getMetaContent(doc, 'dcterms.format');\n  metadata.identifier =\n    getMetaContent(doc, 'DC.identifier') || getMetaContent(doc, 'dcterms.identifier');\n  metadata.source = getMetaContent(doc, 'DC.source') || getMetaContent(doc, 'dcterms.source');\n  metadata.language = getMetaContent(doc, 'DC.language') || getMetaContent(doc, 'dcterms.language');\n  metadata.relation = getMetaContent(doc, 'DC.relation') || getMetaContent(doc, 'dcterms.relation');\n  metadata.coverage = getMetaContent(doc, 'DC.coverage') || getMetaContent(doc, 'dcterms.coverage');\n  metadata.rights = getMetaContent(doc, 'DC.rights') || getMetaContent(doc, 'dcterms.rights');\n\n  // Extract multi-value fields as arrays\n  metadata.creator = extractMultiValue(doc, 'creator');\n  metadata.subject = extractMultiValue(doc, 'subject');\n  metadata.contributor = extractMultiValue(doc, 'contributor');\n\n  // Remove undefined values\n  return Object.fromEntries(\n    Object.entries(metadata).filter(([_, value]) => value !== undefined),\n  ) as DublinCoreMetadata;\n}\n\n/**\n * Extract multiple values for a Dublin Core field.\n *\n * @remarks\n * Dublin Core fields can appear multiple times. This function collects all values.\n * Tries both DC. and dcterms. prefixes.\n */\nfunction extractMultiValue(doc: Document, field: string): string[] | undefined {\n  const values: string[] = [];\n\n  // Try DC. prefix\n  const dcElements = doc.querySelectorAll(`meta[name=\"DC.${field}\"]`);\n  for (const element of Array.from(dcElements)) {\n    const content = element.getAttribute('content');\n    if (content) {\n      values.push(content);\n    }\n  }\n\n  // Try dcterms. prefix\n  const dctermsElements = doc.querySelectorAll(`meta[name=\"dcterms.${field}\"]`);\n  for (const element of Array.from(dctermsElements)) {\n    const content = element.getAttribute('content');\n    if (content) {\n      values.push(content);\n    }\n  }\n\n  return values.length > 0 ? values : undefined;\n}\n","/**\n * Geographic location extraction.\n *\n * @remarks\n * Extracts geographic location metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport { type DocumentInput, ensureDocument } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { GeoMetadata, GeoPosition } from './types.js';\n\n/**\n * Extract geographic metadata from HTML.\n *\n * @remarks\n * Extracts geographic location information including coordinates,\n * place names, and region codes from meta tags.\n *\n * @param input - Parsed HTML document or raw HTML string\n * @returns Geographic metadata\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const geo = extractGeo(doc);\n *\n * // Or directly with HTML string\n * const geo = extractGeo(htmlString);\n * ```\n */\nexport function extractGeo(input: DocumentInput): GeoMetadata {\n  const doc = ensureDocument(input);\n  const metadata: GeoMetadata = {};\n\n  // Extract position from geo.position (semicolon-separated lat;long)\n  const geoPosition = getMetaContent(doc, 'geo.position');\n  if (geoPosition) {\n    const position = parseGeoPosition(geoPosition);\n    if (position) {\n      metadata.position = position;\n    }\n  }\n\n  // Extract from ICBM (legacy format, comma-separated lat,long)\n  if (!metadata.position) {\n    const icbm = getMetaContent(doc, 'ICBM') || getMetaContent(doc, 'icbm');\n    if (icbm) {\n      const position = parseICBM(icbm);\n      if (position) {\n        metadata.position = position;\n      }\n    }\n  }\n\n  // Extract place name\n  metadata.placename = getMetaContent(doc, 'geo.placename');\n\n  // Extract region\n  metadata.region = getMetaContent(doc, 'geo.region');\n\n  // Extract country\n  metadata.country = getMetaContent(doc, 'geo.country');\n\n  // Remove undefined values\n  return Object.fromEntries(\n    Object.entries(metadata).filter(([_, value]) => value !== undefined),\n  ) as GeoMetadata;\n}\n\n/**\n * Parse geo.position format (lat;long).\n *\n * @param position - Position string in \"lat;long\" format\n * @returns Parsed position or undefined if invalid\n */\nfunction parseGeoPosition(position: string): GeoPosition | undefined {\n  const parts = position.split(';').map((p) => p.trim());\n  if (parts.length !== 2) {\n    return undefined;\n  }\n\n  const latitude = Number.parseFloat(parts[0]);\n  const longitude = Number.parseFloat(parts[1]);\n\n  if (Number.isNaN(latitude) || Number.isNaN(longitude)) {\n    return undefined;\n  }\n\n  if (latitude < -90 || latitude > 90 || longitude < -180 || longitude > 180) {\n    return undefined;\n  }\n\n  return { latitude, longitude };\n}\n\n/**\n * Parse ICBM format (lat,long or lat, long).\n *\n * @param icbm - Position string in \"lat,long\" format\n * @returns Parsed position or undefined if invalid\n */\nfunction parseICBM(icbm: string): GeoPosition | undefined {\n  const parts = icbm.split(',').map((p) => p.trim());\n  if (parts.length !== 2) {\n    return undefined;\n  }\n\n  const latitude = Number.parseFloat(parts[0]);\n  const longitude = Number.parseFloat(parts[1]);\n\n  if (Number.isNaN(latitude) || Number.isNaN(longitude)) {\n    return undefined;\n  }\n\n  if (latitude < -90 || latitude > 90 || longitude < -180 || longitude > 180) {\n    return undefined;\n  }\n\n  return { latitude, longitude };\n}\n","/**\n * Monetization and payment extraction.\n *\n * @remarks\n * Extracts web monetization and payment metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport { type DocumentInput, ensureDocument } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { MonetizationMetadata } from './types.js';\n\n/**\n * Extract monetization metadata from HTML.\n *\n * @remarks\n * Extracts web monetization, payment verification, and cryptocurrency\n * addresses from meta tags and link tags.\n *\n * @param input - Parsed HTML document or raw HTML string\n * @returns Monetization metadata\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const monetization = extractMonetization(doc);\n *\n * // Or directly with HTML string\n * const monetization = extractMonetization(htmlString);\n * ```\n */\nexport function extractMonetization(input: DocumentInput): MonetizationMetadata {\n  const doc = ensureDocument(input);\n  const metadata: MonetizationMetadata = {};\n\n  // Web Monetization API (payment pointer)\n  metadata.webMonetization = getMetaContent(doc, 'monetization');\n\n  // PayPal site verification\n  metadata.paypalVerification = getMetaContent(doc, 'paypal-site-verification');\n\n  // Brave Creator verification\n  metadata.braveCreator =\n    getMetaContent(doc, 'brave-rewards-verification') ||\n    getMetaContent(doc, 'brave-creator-verification');\n\n  // Coil payment pointer (legacy)\n  metadata.coil = getMetaContent(doc, 'coil:payment_pointer');\n\n  // Bitcoin address\n  metadata.bitcoin = getMetaContent(doc, 'bitcoin') || getMetaContent(doc, 'btc:address');\n\n  // Ethereum address\n  metadata.ethereum = getMetaContent(doc, 'ethereum') || getMetaContent(doc, 'eth:address');\n\n  // Remove undefined values\n  return Object.fromEntries(\n    Object.entries(metadata).filter(([_, value]) => value !== undefined),\n  ) as MonetizationMetadata;\n}\n","/**\n * News and press extraction.\n *\n * @remarks\n * Extracts news-specific metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport { type DocumentInput, ensureDocument } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { NewsMetadata } from './types.js';\n\n/**\n * Extract news metadata from HTML.\n *\n * @remarks\n * Extracts news-specific metadata including keywords, standout tags,\n * and syndication information.\n *\n * @param input - Parsed HTML document or raw HTML string\n * @returns News metadata\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const news = extractNews(doc);\n *\n * // Or directly with HTML string\n * const news = extractNews(htmlString);\n * ```\n */\nexport function extractNews(input: DocumentInput): NewsMetadata {\n  const doc = ensureDocument(input);\n  const metadata: NewsMetadata = {};\n\n  // News keywords (distinct from regular keywords)\n  const newsKeywords = getMetaContent(doc, 'news_keywords');\n  if (newsKeywords) {\n    const keywords = newsKeywords\n      .split(',')\n      .map((k) => k.trim())\n      .filter(Boolean);\n    if (keywords.length > 0) {\n      metadata.keywords = keywords;\n    }\n  }\n\n  // Google News standout tag\n  metadata.standout = getMetaContent(doc, 'standout');\n\n  // Syndication source\n  metadata.syndicationSource = getMetaContent(doc, 'syndication-source');\n\n  // Original source\n  metadata.originalSource = getMetaContent(doc, 'original-source');\n\n  // Remove undefined values\n  return Object.fromEntries(\n    Object.entries(metadata).filter(([_, value]) => value !== undefined),\n  ) as NewsMetadata;\n}\n","/**\n * Pagination metadata extraction.\n *\n * @remarks\n * Extracts pagination navigation links from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport { type DocumentInput, ensureDocument } from '../../utils/html-parser.js';\nimport { getLinkHref } from '../../utils/link-helpers.js';\nimport type { PaginationMetadata } from './types.js';\n\n/**\n * Extract pagination metadata from HTML.\n *\n * @remarks\n * Extracts pagination navigation links including prev, next, first, last,\n * up (parent), and index links.\n *\n * @param input - Parsed HTML document or raw HTML string\n * @returns Pagination metadata\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const pagination = extractPagination(doc);\n *\n * // Or directly with HTML string\n * const pagination = extractPagination(htmlString);\n * ```\n */\nexport function extractPagination(input: DocumentInput): PaginationMetadata {\n  const doc = ensureDocument(input);\n  const metadata: PaginationMetadata = {};\n\n  // Extract prev/previous (both rel values are valid)\n  metadata.prev = getLinkHref(doc, 'prev') || getLinkHref(doc, 'previous');\n\n  // Extract next\n  metadata.next = getLinkHref(doc, 'next');\n\n  // Extract first\n  metadata.first = getLinkHref(doc, 'first');\n\n  // Extract last\n  metadata.last = getLinkHref(doc, 'last');\n\n  // Extract up (parent level)\n  metadata.up = getLinkHref(doc, 'up');\n\n  // Extract index\n  metadata.index = getLinkHref(doc, 'index');\n\n  // Remove undefined values\n  return Object.fromEntries(\n    Object.entries(metadata).filter(([_, value]) => value !== undefined),\n  ) as PaginationMetadata;\n}\n","/**\n * Robot directives parsing utilities.\n *\n * @remarks\n * Utilities for parsing robot meta tag content into structured directives.\n *\n * @packageDocumentation\n */\n\nimport type { RobotDirectives } from './types.js';\n\n/**\n * Parse robot directives from meta content string.\n *\n * @remarks\n * Parses comma-separated directives like \"noindex, nofollow\" or \"max-snippet:20\".\n * Handles both simple flags and key:value pairs.\n *\n * @param content - Meta tag content string\n * @returns Parsed directives object\n *\n * @example\n * ```typescript\n * parseDirectives('noindex, nofollow');\n * // { index: false, follow: false }\n *\n * parseDirectives('max-snippet:150, noarchive');\n * // { maxSnippet: 150, noarchive: true }\n * ```\n */\nexport function parseDirectives(content?: string): RobotDirectives {\n  if (!content) {\n    return {};\n  }\n\n  const directives: RobotDirectives = {};\n\n  // Split by comma and process each directive\n  const parts = content.split(',').map((p) => p.trim().toLowerCase());\n\n  for (const part of parts) {\n    if (!part) continue;\n\n    // Check for key:value format\n    if (part.includes(':')) {\n      const [key, value] = part.split(':').map((s) => s.trim());\n      parseKeyValueDirective(key, value, directives);\n    } else {\n      // Simple flag directive\n      parseFlagDirective(part, directives);\n    }\n  }\n\n  return directives;\n}\n\n/**\n * Parse flag-based directive (e.g., \"noindex\", \"nofollow\").\n */\nfunction parseFlagDirective(directive: string, result: RobotDirectives): void {\n  switch (directive) {\n    case 'index':\n      result.index = true;\n      break;\n    case 'noindex':\n      result.index = false;\n      break;\n    case 'follow':\n      result.follow = true;\n      break;\n    case 'nofollow':\n      result.follow = false;\n      break;\n    case 'noarchive':\n      result.noarchive = true;\n      break;\n    case 'nosnippet':\n      result.nosnippet = true;\n      break;\n    case 'noimageindex':\n      result.noimageindex = true;\n      break;\n    case 'notranslate':\n      result.notranslate = true;\n      break;\n    case 'all':\n      // \"all\" means index and follow\n      result.index = true;\n      result.follow = true;\n      break;\n    case 'none':\n      // \"none\" means noindex and nofollow\n      result.index = false;\n      result.follow = false;\n      break;\n  }\n}\n\n/**\n * Parse key:value directive (e.g., \"max-snippet:150\").\n */\nfunction parseKeyValueDirective(key: string, value: string, result: RobotDirectives): void {\n  switch (key) {\n    case 'max-snippet':\n      // Parse as number, or -1 for unlimited\n      if (value === '-1') {\n        result.maxSnippet = -1;\n      } else {\n        const num = Number.parseInt(value, 10);\n        if (!Number.isNaN(num)) {\n          result.maxSnippet = num;\n        }\n      }\n      break;\n\n    case 'max-image-preview':\n      // Values: none, standard, large\n      result.maxImagePreview = value;\n      break;\n\n    case 'max-video-preview':\n      // Parse as number (seconds), or -1 for unlimited\n      if (value === '-1') {\n        result.maxVideoPreview = -1;\n      } else {\n        const num = Number.parseInt(value, 10);\n        if (!Number.isNaN(num)) {\n          result.maxVideoPreview = num;\n        }\n      }\n      break;\n\n    case 'unavailable_after':\n      // Date string (RFC 850 format typically)\n      result.unavailableAfter = value;\n      break;\n  }\n}\n","/**\n * Robots and crawling directives extraction.\n *\n * @remarks\n * Extracts robot crawling and indexing directives from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport { type DocumentInput, ensureDocument } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport { parseDirectives } from './parse-directives.js';\nimport type { RobotsMetadata } from './types.js';\n\n/**\n * Extract robots metadata from HTML.\n *\n * @remarks\n * Extracts robot directives from meta tags for general robots,\n * Googlebot, Bingbot, and Google News bot.\n *\n * @param input - Parsed HTML document or raw HTML string\n * @returns Robots metadata\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const robots = extractRobots(doc);\n *\n * // Or directly with HTML string\n * const robots = extractRobots(htmlString);\n * ```\n */\nexport function extractRobots(input: DocumentInput): RobotsMetadata {\n  const doc = ensureDocument(input);\n  const metadata: RobotsMetadata = {};\n\n  // Extract general robots directives\n  const robotsContent = getMetaContent(doc, 'robots');\n  if (robotsContent) {\n    const directives = parseDirectives(robotsContent);\n    if (Object.keys(directives).length > 0) {\n      metadata.robots = directives;\n    }\n  }\n\n  // Extract Googlebot directives\n  const googlebotContent = getMetaContent(doc, 'googlebot');\n  if (googlebotContent) {\n    const directives = parseDirectives(googlebotContent);\n    if (Object.keys(directives).length > 0) {\n      metadata.googlebot = directives;\n    }\n  }\n\n  // Extract Bingbot directives\n  const bingbotContent = getMetaContent(doc, 'bingbot');\n  if (bingbotContent) {\n    const directives = parseDirectives(bingbotContent);\n    if (Object.keys(directives).length > 0) {\n      metadata.bingbot = directives;\n    }\n  }\n\n  // Extract Google News bot directives\n  const googlebotNewsContent = getMetaContent(doc, 'googlebot-news');\n  if (googlebotNewsContent) {\n    const directives = parseDirectives(googlebotNewsContent);\n    if (Object.keys(directives).length > 0) {\n      metadata.googlebotNews = directives;\n    }\n  }\n\n  return metadata;\n}\n","/**\n * Security and privacy extraction.\n *\n * @remarks\n * Extracts security and privacy-related metadata from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport { type DocumentInput, ensureDocument } from '../../utils/html-parser.js';\nimport { getMetaContent, getMetaHttpEquiv } from '../../utils/meta-helpers.js';\nimport type { SecurityMetadata } from './types.js';\n\n/**\n * Extract security metadata from HTML.\n *\n * @remarks\n * Extracts security and privacy-related meta tags including referrer policy,\n * content security policy, and browser compatibility directives.\n *\n * @param input - Parsed HTML document or raw HTML string\n * @returns Security metadata\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const security = extractSecurity(doc);\n *\n * // Or directly with HTML string\n * const security = extractSecurity(htmlString);\n * ```\n */\nexport function extractSecurity(input: DocumentInput): SecurityMetadata {\n  const doc = ensureDocument(input);\n  const metadata: SecurityMetadata = {};\n\n  // Referrer policy\n  metadata.referrerPolicy = getMetaContent(doc, 'referrer');\n\n  // Content Security Policy\n  metadata.contentSecurityPolicy = getMetaHttpEquiv(doc, 'Content-Security-Policy');\n\n  // X-UA-Compatible (IE compatibility mode)\n  metadata.xUaCompatible = getMetaHttpEquiv(doc, 'X-UA-Compatible');\n\n  // Format detection (iOS Safari)\n  metadata.formatDetection = getMetaContent(doc, 'format-detection');\n\n  // Remove undefined values\n  return Object.fromEntries(\n    Object.entries(metadata).filter(([_, value]) => value !== undefined),\n  ) as SecurityMetadata;\n}\n","/**\n * Sitemap discovery heuristics.\n *\n * @remarks\n * Common sitemap URL patterns and heuristics.\n *\n * @packageDocumentation\n */\n\n/**\n * Common sitemap URL patterns to check.\n *\n * @remarks\n * These are standard locations where sitemaps are typically found.\n * Should be checked relative to the site's base URL.\n */\nexport const COMMON_SITEMAP_PATHS = [\n  '/sitemap.xml',\n  '/sitemap_index.xml',\n  '/sitemap-index.xml',\n  '/sitemapindex.xml',\n  '/sitemap1.xml',\n  '/sitemap.xml.gz',\n  '/sitemap_index.xml.gz',\n  '/sitemap.php',\n  '/sitemap/',\n  '/sitemaps.xml',\n  '/sitemaps/sitemap.xml',\n  '/sitemap/sitemap.xml',\n  '/wp-sitemap.xml', // WordPress\n  '/page-sitemap.xml', // WordPress\n  '/post-sitemap.xml', // WordPress\n];\n\n/**\n * Generate sitemap URL suggestions based on the document URL.\n *\n * @remarks\n * Returns common sitemap URLs that might exist, relative to the document URL.\n * These are just suggestions - not verified to actually exist.\n *\n * Also includes robots.txt location which typically references sitemaps.\n *\n * @param documentUrl - The URL of the current document\n * @returns Array of suggested sitemap URLs\n */\nexport function generateSitemapSuggestions(documentUrl?: string | URL): string[] {\n  if (!documentUrl) {\n    // Return paths with robots.txt included\n    return ['/robots.txt', ...COMMON_SITEMAP_PATHS];\n  }\n\n  try {\n    const url = typeof documentUrl === 'string' ? new URL(documentUrl) : documentUrl;\n    const origin = url.origin;\n\n    // Generate full URLs by combining origin with common paths\n    const suggestions = [\n      `${origin}/robots.txt`, // robots.txt often references sitemaps\n      ...COMMON_SITEMAP_PATHS.map((path) => `${origin}${path}`),\n    ];\n\n    return suggestions;\n  } catch {\n    // If URL parsing fails, return relative paths\n    return ['/robots.txt', ...COMMON_SITEMAP_PATHS];\n  }\n}\n","/**\n * Sitemap discovery extraction.\n *\n * @remarks\n * Discovers XML sitemaps in HTML documents.\n *\n * @packageDocumentation\n */\n\nimport { type DocumentInput, ensureDocument } from '../../utils/html-parser.js';\nimport { getAllLinks } from '../../utils/link-helpers.js';\nimport { generateSitemapSuggestions } from './heuristics.js';\nimport type { SitemapDiscoveryMetadata } from './types.js';\n\n/**\n * Extract sitemap discovery metadata from HTML.\n *\n * @remarks\n * Finds all sitemaps declared in <link rel=\"sitemap\"> tags and generates\n * suggestions for common sitemap URL patterns.\n *\n * @param input - Parsed HTML document or raw HTML string\n * @param documentUrl - Optional document URL for generating absolute sitemap suggestions\n * @returns Sitemap discovery metadata\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const sitemaps = extractSitemapDiscovery(doc, 'https://example.com');\n *\n * // Or directly with HTML string\n * const sitemaps = extractSitemapDiscovery(htmlString, 'https://example.com');\n * ```\n */\nexport function extractSitemapDiscovery(\n  input: DocumentInput,\n  documentUrl?: string | URL,\n): SitemapDiscoveryMetadata {\n  const doc = ensureDocument(input);\n  const metadata: SitemapDiscoveryMetadata = {\n    sitemaps: [],\n  };\n\n  // Find all sitemap links\n  const sitemapLinks = getAllLinks(doc, 'sitemap');\n\n  // Extract URLs\n  metadata.sitemaps = sitemapLinks.map((link) => link.href);\n\n  // Generate suggestions if document URL provided\n  if (documentUrl) {\n    metadata.suggestions = generateSitemapSuggestions(documentUrl);\n  }\n\n  return metadata;\n}\n","/**\n * Social profiles extraction.\n *\n * @remarks\n * Extracts social media profile links from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport {\n  type HTMLDocument as Document,\n  type DocumentInput,\n  ensureDocument,\n} from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { SocialProfilesMetadata } from './types.js';\n\n/**\n * Extract social profiles metadata from HTML.\n *\n * @remarks\n * Extracts social media profile URLs and handles from meta tags and structured data.\n *\n * @param input - Parsed HTML document or raw HTML string\n * @returns Social profiles metadata\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const profiles = extractSocialProfiles(doc);\n *\n * // Or directly with HTML string\n * const profiles = extractSocialProfiles(htmlString);\n * ```\n */\nexport function extractSocialProfiles(input: DocumentInput): SocialProfilesMetadata {\n  const doc = ensureDocument(input);\n  const metadata: SocialProfilesMetadata = {};\n\n  // Twitter - extract from multiple sources\n  metadata.twitter =\n    getMetaContent(doc, 'twitter:site') ||\n    getMetaContent(doc, 'twitter:creator') ||\n    extractFromProperty(doc, 'twitter:site') ||\n    extractFromProperty(doc, 'twitter:creator');\n\n  // Clean Twitter handle (remove @ if present)\n  if (metadata.twitter) {\n    metadata.twitter = metadata.twitter.replace(/^@/, '');\n  }\n\n  // Facebook - from OpenGraph\n  metadata.facebook =\n    extractFromProperty(doc, 'og:url', 'facebook.com') ||\n    extractFromProperty(doc, 'fb:profile_id') ||\n    extractFromProperty(doc, 'fb:page_id');\n\n  // Instagram\n  metadata.instagram =\n    getMetaContent(doc, 'instagram:site') || extractFromProperty(doc, 'instagram:site');\n\n  // LinkedIn\n  metadata.linkedin = extractFromProperty(doc, 'linkedin:owner');\n\n  // YouTube\n  metadata.youtube =\n    getMetaContent(doc, 'youtube:channel') || extractFromProperty(doc, 'youtube:channel');\n\n  // GitHub\n  metadata.github = getMetaContent(doc, 'github:user');\n\n  // TikTok\n  metadata.tiktok = getMetaContent(doc, 'tiktok:site');\n\n  // Pinterest\n  metadata.pinterest = getMetaContent(doc, 'pinterest:profile');\n\n  // Mastodon\n  metadata.mastodon = extractFromProperty(doc, 'fediverse:creator');\n\n  // Reddit\n  metadata.reddit = getMetaContent(doc, 'reddit:user');\n\n  // Look for Schema.org sameAs links (common for social profiles)\n  const schemaProfiles = extractSchemaOrgSameAs(doc);\n  if (schemaProfiles.length > 0) {\n    for (const url of schemaProfiles) {\n      categorizeSchemaProfile(url, metadata);\n    }\n  }\n\n  // Collect other social profiles\n  const otherProfiles: Record<string, string> = {};\n\n  // Look for other common social meta tags\n  const socialPatterns = [\n    'vk:site', // VKontakte\n    'telegram:site', // Telegram\n    'snapchat:site', // Snapchat\n    'whatsapp:number', // WhatsApp\n    'discord:server', // Discord\n  ];\n\n  for (const pattern of socialPatterns) {\n    const value = getMetaContent(doc, pattern);\n    if (value) {\n      otherProfiles[pattern] = value;\n    }\n  }\n\n  // Add other profiles if any found\n  if (Object.keys(otherProfiles).length > 0) {\n    metadata.other = otherProfiles;\n  }\n\n  // Remove undefined values\n  return Object.fromEntries(\n    Object.entries(metadata).filter(([_, value]) => value !== undefined),\n  ) as SocialProfilesMetadata;\n}\n\n/**\n * Extract content from meta tag with property attribute.\n *\n * @param doc - Parsed HTML document\n * @param property - Property name to search for\n * @param mustContain - Optional string that the content must contain\n * @returns Meta content or undefined\n */\nfunction extractFromProperty(\n  doc: Document,\n  property: string,\n  mustContain?: string,\n): string | undefined {\n  const meta = doc.querySelector(`meta[property=\"${property}\"]`);\n  if (!meta) {\n    return undefined;\n  }\n\n  const content = meta.getAttribute('content');\n  if (!content) {\n    return undefined;\n  }\n\n  if (mustContain && !content.includes(mustContain)) {\n    return undefined;\n  }\n\n  return content;\n}\n\n/**\n * Extract Schema.org sameAs links.\n *\n * @remarks\n * Schema.org often uses sameAs property to list social media profiles.\n *\n * @param doc - Parsed HTML document\n * @returns Array of profile URLs\n */\nfunction extractSchemaOrgSameAs(doc: Document): string[] {\n  const profiles: string[] = [];\n\n  // Look for JSON-LD scripts\n  const scripts = doc.querySelectorAll('script[type=\"application/ld+json\"]');\n\n  for (const script of Array.from(scripts)) {\n    try {\n      const data = JSON.parse(script.textContent || '{}');\n\n      // Handle array or single object\n      const items = Array.isArray(data) ? data : [data];\n\n      for (const item of items) {\n        // Check for sameAs property\n        if (item.sameAs) {\n          if (Array.isArray(item.sameAs)) {\n            profiles.push(...item.sameAs);\n          } else if (typeof item.sameAs === 'string') {\n            profiles.push(item.sameAs);\n          }\n        }\n\n        // Check @graph\n        if (item['@graph']) {\n          for (const node of item['@graph']) {\n            if (node.sameAs) {\n              if (Array.isArray(node.sameAs)) {\n                profiles.push(...node.sameAs);\n              } else if (typeof node.sameAs === 'string') {\n                profiles.push(node.sameAs);\n              }\n            }\n          }\n        }\n      }\n    } catch {\n      // Ignore invalid JSON\n    }\n  }\n\n  return profiles;\n}\n\n/**\n * Categorize Schema.org profile URL into appropriate social platform.\n *\n * @param url - Profile URL\n * @param metadata - Metadata object to update\n */\nfunction categorizeSchemaProfile(url: string, metadata: SocialProfilesMetadata): void {\n  const lowerUrl = url.toLowerCase();\n\n  if (lowerUrl.includes('twitter.com') || lowerUrl.includes('x.com')) {\n    if (!metadata.twitter) {\n      // Extract username from URL\n      const match = url.match(/(?:twitter\\.com|x\\.com)\\/([^/?]+)/i);\n      if (match) {\n        metadata.twitter = match[1];\n      }\n    }\n  } else if (lowerUrl.includes('facebook.com')) {\n    if (!metadata.facebook) {\n      metadata.facebook = url;\n    }\n  } else if (lowerUrl.includes('instagram.com')) {\n    if (!metadata.instagram) {\n      const match = url.match(/instagram\\.com\\/([^/?]+)/i);\n      if (match) {\n        metadata.instagram = match[1];\n      }\n    }\n  } else if (lowerUrl.includes('linkedin.com')) {\n    if (!metadata.linkedin) {\n      metadata.linkedin = url;\n    }\n  } else if (lowerUrl.includes('youtube.com')) {\n    if (!metadata.youtube) {\n      metadata.youtube = url;\n    }\n  } else if (lowerUrl.includes('github.com')) {\n    if (!metadata.github) {\n      const match = url.match(/github\\.com\\/([^/?]+)/i);\n      if (match) {\n        metadata.github = match[1];\n      }\n    }\n  } else if (lowerUrl.includes('tiktok.com')) {\n    if (!metadata.tiktok) {\n      const match = url.match(/tiktok\\.com\\/@?([^/?]+)/i);\n      if (match) {\n        metadata.tiktok = match[1];\n      }\n    }\n  } else if (lowerUrl.includes('pinterest.com')) {\n    if (!metadata.pinterest) {\n      const match = url.match(/pinterest\\.com\\/([^/?]+)/i);\n      if (match) {\n        metadata.pinterest = match[1];\n      }\n    }\n  } else if (lowerUrl.includes('reddit.com')) {\n    if (!metadata.reddit) {\n      const match = url.match(/reddit\\.com\\/(?:u|user)\\/([^/?]+)/i);\n      if (match) {\n        metadata.reddit = match[1];\n      }\n    }\n  }\n}\n","/**\n * Verification tags extraction.\n *\n * @remarks\n * Extracts domain and ownership verification tags from HTML documents.\n *\n * @packageDocumentation\n */\n\nimport { type DocumentInput, ensureDocument } from '../../utils/html-parser.js';\nimport { getMetaContent } from '../../utils/meta-helpers.js';\nimport type { VerificationMetadata } from './types.js';\n\n/**\n * Extract verification metadata from HTML.\n *\n * @remarks\n * Extracts verification tags used by various platforms for domain and ownership verification.\n *\n * @param input - Parsed HTML document or raw HTML string\n * @returns Verification metadata\n *\n * @example\n * ```typescript\n * // With parsed document (recommended for multiple extractions)\n * const doc = parseHTML(htmlString);\n * const verification = extractVerification(doc);\n *\n * // Or directly with HTML string\n * const verification = extractVerification(htmlString);\n * ```\n */\nexport function extractVerification(input: DocumentInput): VerificationMetadata {\n  const doc = ensureDocument(input);\n  const metadata: VerificationMetadata = {};\n\n  // Google Site Verification\n  metadata.googleSiteVerification = getMetaContent(doc, 'google-site-verification');\n\n  // Microsoft/Bing validation\n  metadata.msvalidate = getMetaContent(doc, 'msvalidate.01');\n\n  // Yandex verification\n  metadata.yandexVerification = getMetaContent(doc, 'yandex-verification');\n\n  // Facebook domain verification\n  metadata.facebookDomainVerification = getMetaContent(doc, 'facebook-domain-verification');\n\n  // Pinterest verification\n  metadata.pinterestVerification = getMetaContent(doc, 'p:domain_verify');\n\n  // Alexa verification\n  metadata.alexaVerification = getMetaContent(doc, 'alexaVerifyID');\n\n  // Norton Safe Web\n  metadata.nortonSafeWeb = getMetaContent(doc, 'norton-safeweb-site-verification');\n\n  // Collect other verification tags\n  const otherVerifications: Record<string, string> = {};\n\n  // Look for other common verification patterns\n  const verificationPatterns = [\n    'verify-v1', // Google legacy\n    'verify-a', // Google legacy\n    'verify', // Generic\n    'verification', // Generic\n    'domain-verification', // Generic\n    'site-verification', // Generic\n  ];\n\n  for (const pattern of verificationPatterns) {\n    const value = getMetaContent(doc, pattern);\n    if (value) {\n      otherVerifications[pattern] = value;\n    }\n  }\n\n  // Add other verifications if any found\n  if (Object.keys(otherVerifications).length > 0) {\n    metadata.other = otherVerifications;\n  }\n\n  // Remove undefined values\n  return Object.fromEntries(\n    Object.entries(metadata).filter(([_, value]) => value !== undefined),\n  ) as VerificationMetadata;\n}\n","/**\n * Base error type for `swoop()`.\n */\nexport class SwoopError extends Error {\n  override name = 'SwoopError';\n}\n\n/**\n * Thrown when the current runtime cannot execute `swoop()`.\n */\nexport class SwoopEnvironmentError extends SwoopError {\n  override name = 'SwoopEnvironmentError';\n}\n\n/**\n * Thrown when `swoop()` exceeds its configured timeout.\n */\nexport class SwoopTimeoutError extends SwoopError {\n  override name = 'SwoopTimeoutError';\n}\n\n/**\n * Thrown when script execution fails in a non-recoverable way.\n */\nexport class SwoopExecutionError extends SwoopError {\n  override name = 'SwoopExecutionError';\n}\n\n/**\n * Thrown when `swoop()` is asked to execute potentially unsafe scripts\n * in a context where the caller should explicitly acknowledge the risk.\n */\nexport class SwoopSecurityError extends SwoopError {\n  override name = 'SwoopSecurityError';\n}\n","import type { SwoopConsoleEntry } from './types.js';\n\nexport interface ConsoleCapture {\n  entries: SwoopConsoleEntry[];\n  record: (level: SwoopConsoleEntry['level'], args: unknown[]) => void;\n}\n\nexport function createConsoleCapture(now: () => number = () => Date.now()): ConsoleCapture {\n  const entries: SwoopConsoleEntry[] = [];\n\n  const formatError = (err: Error) => {\n    const parts: string[] = [];\n    parts.push(`${err.name}: ${err.message}${err.stack ? `\\n${err.stack}` : ''}`.trim());\n    try {\n      const props: Record<string, unknown> = {};\n      for (const key of Object.getOwnPropertyNames(err)) {\n        if (key === 'name' || key === 'message' || key === 'stack') continue;\n        props[key] = (err as any)[key];\n      }\n      if (Object.keys(props).length > 0) {\n        parts.push(`props: ${JSON.stringify(props)}`);\n      }\n    } catch {\n      // ignore\n    }\n    return parts.join('\\n');\n  };\n\n  const record: ConsoleCapture['record'] = (level, args) => {\n    const msg = args\n      .map((a) => {\n        try {\n          if (a instanceof Error) return formatError(a);\n          if (typeof a === 'string') return a;\n          return String(a);\n        } catch {\n          return '[unstringifiable]';\n        }\n      })\n      .join(' ');\n\n    const argStrings = args.map((a) => {\n      try {\n        if (a instanceof Error) return formatError(a);\n        if (typeof a === 'string') return a;\n        return String(a);\n      } catch {\n        return '[unstringifiable]';\n      }\n    });\n\n    entries.push({ level, message: msg, args: argStrings, time: now() });\n  };\n\n  return { entries, record };\n}\n","import {\n  clearImmediate as nodeClearImmediate,\n  clearInterval as nodeClearInterval,\n  clearTimeout as nodeClearTimeout,\n  setImmediate as nodeSetImmediate,\n  setInterval as nodeSetInterval,\n  setTimeout as nodeSetTimeout,\n} from 'node:timers';\n\nexport interface AsyncEnvInit {\n  globalObj: any;\n  debugProbes: boolean;\n}\n\nexport interface AsyncEnv {\n  hostSetTimeout: typeof nodeSetTimeout;\n  hostClearTimeout: typeof nodeClearTimeout;\n  hostSetInterval: typeof nodeSetInterval;\n  hostClearInterval: typeof nodeClearInterval;\n  hostSetImmediate: typeof nodeSetImmediate;\n  hostClearImmediate: typeof nodeClearImmediate;\n  noteAsyncActivity: () => void;\n  getLastAsyncActivityAt: () => number;\n  cleanup: () => void;\n}\n\nexport function installAsyncEnv(init: AsyncEnvInit): AsyncEnv {\n  const { globalObj } = init;\n\n  const hostSetTimeout = nodeSetTimeout;\n  const hostClearTimeout = nodeClearTimeout;\n  const hostSetInterval = nodeSetInterval;\n  const hostClearInterval = nodeClearInterval;\n  const hostSetImmediate = nodeSetImmediate;\n  const hostClearImmediate = nodeClearImmediate;\n\n  const activeTimeouts = new Set<ReturnType<typeof nodeSetTimeout>>();\n  const activeIntervals = new Set<ReturnType<typeof nodeSetInterval>>();\n  const activeImmediates = new Set<ReturnType<typeof nodeSetImmediate>>();\n\n  let lastAsyncActivityAt = Date.now();\n  const noteAsyncActivity = () => {\n    lastAsyncActivityAt = Date.now();\n    if (init.debugProbes) {\n      try {\n        globalObj.__swoopStats.lastAsyncActivityAt = lastAsyncActivityAt;\n      } catch {\n        // ignore\n      }\n    }\n  };\n\n  globalObj.__swoop_requestIdleCallback = (cb: any, _opts?: any) => {\n    return hostSetTimeout(() => {\n      try {\n        noteAsyncActivity();\n        cb({\n          didTimeout: false,\n          timeRemaining: () => 0,\n        });\n      } catch {\n        // ignore\n      }\n    }, 0) as any;\n  };\n  globalObj.__swoop_cancelIdleCallback = (handle: any) => hostClearTimeout(handle);\n\n  globalObj.__swoop_setTimeout = (...args: Parameters<typeof setTimeout>) => {\n    const handle = hostSetTimeout(() => {\n      activeTimeouts.delete(handle);\n      noteAsyncActivity();\n      if (init.debugProbes) {\n        try {\n          globalObj.__swoopStats.timers.timeoutFired++;\n        } catch {}\n      }\n      (args[0] as any)?.call?.(globalObj);\n    }, args[1] as number);\n    activeTimeouts.add(handle);\n    if (init.debugProbes) {\n      try {\n        globalObj.__swoopStats.timers.timeoutScheduled++;\n      } catch {}\n    }\n    return handle;\n  };\n  globalObj.__swoop_clearTimeout = (handle: ReturnType<typeof setTimeout>) => {\n    activeTimeouts.delete(handle as any);\n    hostClearTimeout(handle as any);\n  };\n\n  globalObj.__swoop_setInterval = (...args: Parameters<typeof setInterval>) => {\n    const handle = hostSetInterval(() => {\n      noteAsyncActivity();\n      if (init.debugProbes) {\n        try {\n          globalObj.__swoopStats.timers.intervalFired++;\n        } catch {}\n      }\n      (args[0] as any)?.call?.(globalObj);\n    }, args[1] as number);\n    activeIntervals.add(handle);\n    if (init.debugProbes) {\n      try {\n        globalObj.__swoopStats.timers.intervalScheduled++;\n      } catch {}\n    }\n    return handle;\n  };\n  globalObj.__swoop_clearInterval = (handle: ReturnType<typeof setInterval>) => {\n    activeIntervals.delete(handle as any);\n    hostClearInterval(handle as any);\n  };\n\n  globalObj.__swoop_queueMicrotask = (cb: () => void) => {\n    try {\n      process.nextTick(() => {\n        noteAsyncActivity();\n        cb.call(globalObj);\n      });\n    } catch {\n      hostSetTimeout(() => {\n        noteAsyncActivity();\n        cb.call(globalObj);\n      }, 0);\n    }\n  };\n\n  globalObj.__swoop_setImmediate = (cb: (...a: any[]) => void, ...args: any[]) => {\n    const handle = hostSetImmediate(() => {\n      activeImmediates.delete(handle);\n      try {\n        noteAsyncActivity();\n        cb.call(globalObj, ...args);\n      } catch {\n        // ignore\n      }\n    });\n    activeImmediates.add(handle);\n    return handle;\n  };\n  globalObj.__swoop_clearImmediate = (handle: ReturnType<typeof nodeSetImmediate>) => {\n    activeImmediates.delete(handle);\n    hostClearImmediate(handle);\n  };\n\n  globalObj.__swoop_requestAnimationFrame = (cb: FrameRequestCallback) => {\n    if (init.debugProbes) {\n      try {\n        globalObj.__swoopStats.timers.rafScheduled++;\n      } catch {}\n    }\n    const id = hostSetTimeout(() => {\n      if (init.debugProbes) {\n        try {\n          globalObj.__swoopStats.timers.rafFired++;\n        } catch {}\n      }\n      noteAsyncActivity();\n      cb.call(globalObj, Date.now());\n    }, 16) as any;\n    return id;\n  };\n  globalObj.__swoop_cancelAnimationFrame = (id: number) => hostClearTimeout(id as any);\n\n  const cleanup = () => {\n    for (const h of activeTimeouts) hostClearTimeout(h);\n    for (const h of activeIntervals) hostClearInterval(h as any);\n    for (const h of activeImmediates) hostClearImmediate(h);\n  };\n\n  return {\n    hostSetTimeout,\n    hostClearTimeout,\n    hostSetInterval,\n    hostClearInterval,\n    hostSetImmediate,\n    hostClearImmediate,\n    noteAsyncActivity,\n    getLastAsyncActivityAt: () => lastAsyncActivityAt,\n    cleanup,\n  };\n}\n","export interface BaseResolve {\n  baseForResolve: URL;\n  baseTagHref: string | null;\n  baseEl: any | null;\n}\n\n/**\n * Computes the base URL used for resolving relative resources.\n *\n * @remarks\n * Uses `<base href=\"...\">` if present; otherwise falls back to the page URL.\n */\nexport function computeBaseForResolve(finalUrl: string, document: any): BaseResolve {\n  const pageUrl = new URL(finalUrl);\n  const baseEl = (document as any)?.querySelector?.('base') ?? null;\n  const baseTagHref: string | null = baseEl?.getAttribute?.('href') ?? null;\n\n  const baseForResolve = (() => {\n    try {\n      return baseTagHref ? new URL(String(baseTagHref), finalUrl) : pageUrl;\n    } catch {\n      return pageUrl;\n    }\n  })();\n\n  return { baseForResolve, baseTagHref, baseEl };\n}\n\n/**\n * Enforces the browser invariant that `document.baseURI` is an absolute URL.\n */\nexport function patchDocumentBaseURI(document: any, baseForResolve: URL): void {\n  try {\n    Object.defineProperty(document as any, 'baseURI', {\n      configurable: true,\n      get: () => baseForResolve.href,\n    });\n  } catch {\n    // ignore\n  }\n}\n\n/**\n * Enforces the browser invariant that `<base>.href` is an absolute URL.\n */\nexport function patchBaseElementHref(baseEl: any | null, baseForResolve: URL): void {\n  try {\n    if (baseEl) {\n      Object.defineProperty(baseEl, 'href', {\n        configurable: true,\n        get: () => baseForResolve.href,\n        set: (_v: string) => {},\n      });\n    }\n  } catch {\n    // ignore\n  }\n}\n","export interface BrowserShimsInit {\n  globalObj: any;\n  domWindow: any;\n  document: any;\n  documentBaseUriForDom: string;\n}\n\nexport function installBrowserShims(init: BrowserShimsInit): void {\n  const { globalObj, domWindow, documentBaseUriForDom } = init;\n  const doc = init.document ?? (globalObj as any).document;\n\n  // Ensure DOM APIs that rely on defaultView behave consistently.\n  try {\n    if (doc && (doc as any).defaultView == null) (doc as any).defaultView = globalObj;\n  } catch {\n    // ignore\n  }\n  // Some frameworks read document.baseURI for router/baseHref resolution.\n  try {\n    if (doc && (doc as any).baseURI == null) (doc as any).baseURI = documentBaseUriForDom;\n  } catch {\n    // ignore\n  }\n\n  // Prefer a minimally-faked navigator; avoid hard-coding vendor/UA brands.\n  globalObj.navigator ??= {};\n  globalObj.navigator.language ??= 'en';\n  globalObj.navigator.languages ??= [globalObj.navigator.language];\n  globalObj.navigator.onLine ??= true;\n\n  // Basic viewport defaults (avoid baking in a specific browser fingerprint).\n  globalObj.screen ??= {\n    width: 1280,\n    height: 720,\n    availWidth: 1280,\n    availHeight: 720,\n    colorDepth: 24,\n  };\n  globalObj.devicePixelRatio ??= 1;\n  globalObj.innerWidth ??= globalObj.screen.width ?? 1280;\n  globalObj.innerHeight ??= globalObj.screen.height ?? 720;\n\n  // Node (>=18+) usually has these web globals; expose them into the sandbox.\n  globalObj.MessageChannel ??= (globalThis as any).MessageChannel;\n  globalObj.MessagePort ??= (globalThis as any).MessagePort;\n  globalObj.MessageEvent ??= (globalThis as any).MessageEvent;\n  globalObj.BroadcastChannel ??= (globalThis as any).BroadcastChannel;\n\n  // Minimal getComputedStyle: enough to keep frameworks from bailing.\n  globalObj.getComputedStyle ??= (el: any) => {\n    const style = el?.style ?? {};\n    return new Proxy(style, {\n      get(target, prop) {\n        if (prop === 'getPropertyValue') return (name: string) => target?.[name] ?? '';\n        return (target as any)[prop as any] ?? '';\n      },\n    });\n  };\n\n  // Navigation-related events.\n  globalObj.PopStateEvent ??= class PopStateEvent extends (globalObj.Event ?? Event) {\n    state: unknown;\n    constructor(type: string, init?: any) {\n      super(type, init);\n      this.state = init?.state;\n    }\n  };\n  globalObj.HashChangeEvent ??= class HashChangeEvent extends (globalObj.Event ?? Event) {\n    oldURL: string;\n    newURL: string;\n    constructor(type: string, init?: any) {\n      super(type, init);\n      this.oldURL = init?.oldURL ?? '';\n      this.newURL = init?.newURL ?? '';\n    }\n  };\n\n  // Media queries are often used for breakpoint selection. Return a stable default.\n  globalObj.matchMedia ??= (query: string) => {\n    const listeners = new Set<any>();\n    const mql: any = {\n      matches: false,\n      media: String(query ?? ''),\n      onchange: null,\n      addListener: (cb: any) => {\n        if (typeof cb === 'function') listeners.add(cb);\n      },\n      removeListener: (cb: any) => {\n        listeners.delete(cb);\n      },\n      addEventListener: (type: string, cb: any) => {\n        if (String(type) === 'change' && typeof cb === 'function') listeners.add(cb);\n      },\n      removeEventListener: (type: string, cb: any) => {\n        if (String(type) === 'change') listeners.delete(cb);\n      },\n      dispatchEvent: (evt: any) => {\n        try {\n          for (const cb of listeners) cb.call(mql, evt);\n          if (typeof mql.onchange === 'function') mql.onchange.call(mql, evt);\n        } catch {\n          // ignore\n        }\n        return true;\n      },\n    };\n    return mql;\n  };\n\n  // Observers are frequently used for lazy rendering; provide no-op implementations.\n  globalObj.IntersectionObserver ??= class IntersectionObserver {\n    observe(_el: any) {}\n    unobserve(_el: any) {}\n    disconnect() {}\n    takeRecords() {\n      return [];\n    }\n  };\n  globalObj.ResizeObserver ??= class ResizeObserver {\n    observe(_el: any) {}\n    unobserve(_el: any) {}\n    disconnect() {}\n  };\n  globalObj.MutationObserver ??= class MutationObserver {\n    observe(_target: any, _options?: any) {}\n    disconnect() {}\n    takeRecords() {\n      return [];\n    }\n  };\n\n  globalObj.URL ??= URL;\n  globalObj.URLSearchParams ??= URLSearchParams;\n  globalObj.WebAssembly ??= WebAssembly;\n  globalObj.TextEncoder ??= TextEncoder;\n  globalObj.TextDecoder ??= TextDecoder;\n  globalObj.Headers ??= globalThis.Headers;\n  globalObj.Request ??= globalThis.Request;\n  globalObj.Response ??= globalThis.Response;\n  globalObj.crypto ??= globalThis.crypto;\n  globalObj.performance ??= globalThis.performance;\n  globalObj.structuredClone ??= globalThis.structuredClone;\n  globalObj.Blob ??= globalThis.Blob;\n  globalObj.FormData ??= globalThis.FormData;\n  globalObj.File ??= (globalThis as any).File;\n  globalObj.ReadableStream ??= (globalThis as any).ReadableStream;\n  globalObj.atob ??= (data: string) => Buffer.from(data, 'base64').toString('binary');\n  globalObj.btoa ??= (data: string) => Buffer.from(data, 'binary').toString('base64');\n\n  // Big-ticket web platform APIs not yet implemented in `swoop`.\n  globalObj.WebSocket ??= class WebSocket {\n    constructor() {\n      throw new Error('swoop: WebSocket is not implemented');\n    }\n  };\n  globalObj.EventSource ??= class EventSource {\n    constructor() {\n      throw new Error('swoop: EventSource is not implemented');\n    }\n  };\n  globalObj.Worker ??= class Worker {\n    constructor() {\n      throw new Error('swoop: Worker is not implemented');\n    }\n  };\n  globalObj.SharedWorker ??= class SharedWorker {\n    constructor() {\n      throw new Error('swoop: SharedWorker is not implemented');\n    }\n  };\n  globalObj.indexedDB ??= undefined;\n  globalObj.caches ??= undefined;\n  globalObj.Notification ??= undefined;\n\n  // Common DOM globals frequently used as runtime tokens (and sometimes as DI tokens).\n  globalObj.Document ??= domWindow.Document;\n  globalObj.HTMLDocument ??= domWindow.HTMLDocument ?? init.document?.constructor;\n  globalObj.Element ??= domWindow.Element;\n  globalObj.HTMLElement ??= domWindow.HTMLElement;\n  globalObj.Node ??= domWindow.Node;\n\n  // TreeWalker / NodeIterator constants.\n  globalObj.NodeFilter ??= domWindow.NodeFilter ?? {\n    FILTER_ACCEPT: 1,\n    FILTER_REJECT: 2,\n    FILTER_SKIP: 3,\n    SHOW_ALL: 0xffffffff,\n    SHOW_ELEMENT: 0x1,\n    SHOW_ATTRIBUTE: 0x2,\n    SHOW_TEXT: 0x4,\n    SHOW_CDATA_SECTION: 0x8,\n    SHOW_ENTITY_REFERENCE: 0x10,\n    SHOW_ENTITY: 0x20,\n    SHOW_PROCESSING_INSTRUCTION: 0x40,\n    SHOW_COMMENT: 0x80,\n    SHOW_DOCUMENT: 0x100,\n    SHOW_DOCUMENT_TYPE: 0x200,\n    SHOW_DOCUMENT_FRAGMENT: 0x400,\n    SHOW_NOTATION: 0x800,\n  };\n}\n","export function installCookieJar(document: any): void {\n  let cookieJar = '';\n  try {\n    Object.defineProperty(document, 'cookie', {\n      configurable: true,\n      get() {\n        return cookieJar;\n      },\n      set(value: string) {\n        // Best-effort: append; do not implement full RFC.\n        if (typeof value === 'string' && value.length > 0) {\n          cookieJar = cookieJar ? `${cookieJar}; ${value}` : value;\n        }\n      },\n    });\n  } catch {\n    // ignore\n  }\n}\n","export interface FetchShimInit {\n  globalObj: any;\n  hostFetch: typeof fetch | undefined;\n  baseForResolveHref: string;\n  remainingMs: () => number;\n  hostSetTimeout: (cb: () => void, ms: number) => any;\n  hostClearTimeout: (h: any) => void;\n  noteAsyncActivity: () => void;\n  debugFetch: boolean;\n  recordDebug: (args: unknown[]) => void;\n  queueMicrotask: (cb: () => void) => void;\n}\n\nexport interface FetchShim {\n  getPendingFetches: () => number;\n}\n\nexport function installFetchShim(init: FetchShimInit): FetchShim {\n  let pendingFetches = 0;\n\n  init.globalObj.__swoop_fetch =\n    typeof init.hostFetch === 'function'\n      ? (...args: Parameters<typeof fetch>) => {\n          init.noteAsyncActivity();\n          pendingFetches++;\n          try {\n            const input = args[0];\n            const initReq = args[1];\n\n            // Browser fetch resolves relative URLs against document/base URL.\n            // Node fetch rejects them. Emulate browser resolution here.\n            let resolvedInput: typeof input = input;\n            if (typeof input === 'string') {\n              resolvedInput = new URL(input, init.baseForResolveHref).href;\n            } else if (input instanceof URL) {\n              resolvedInput = input.href;\n            } else if (typeof (input as Request).url === 'string') {\n              try {\n                resolvedInput = new URL((input as Request).url, init.baseForResolveHref).href;\n              } catch {\n                // keep as-is\n              }\n            }\n\n            if (init.debugFetch) {\n              init.recordDebug(['[fetch]', resolvedInput]);\n            }\n\n            const controller = new AbortController();\n            const timeoutHandle = init.hostSetTimeout(() => controller.abort(), init.remainingMs());\n            const mergedInit = { ...(initReq as any), signal: controller.signal };\n\n            const p = init.hostFetch!(resolvedInput as any, mergedInit as any).finally(() => {\n              init.hostClearTimeout(timeoutHandle);\n            });\n\n            return p.finally(() => {\n              try {\n                init.queueMicrotask(() => {\n                  pendingFetches--;\n                  init.noteAsyncActivity();\n                });\n              } catch {\n                pendingFetches--;\n                init.noteAsyncActivity();\n              }\n            });\n          } catch (err) {\n            pendingFetches--;\n            init.noteAsyncActivity();\n            throw err;\n          }\n        }\n      : undefined;\n\n  return {\n    getPendingFetches: () => pendingFetches,\n  };\n}\n","export interface CreateNavigationInit {\n  pageUrl: URL;\n  onNavigate?: (href: string) => void;\n  onPopState?: (state: unknown) => void;\n}\n\nexport interface NavigationShims {\n  location: any;\n  history: any;\n}\n\nexport function createNavigationShims(init: CreateNavigationInit): NavigationShims {\n  const { pageUrl } = init;\n\n  const resolveAndSetHref = (href: string) => {\n    try {\n      const next = new URL(href, pageUrl.href);\n      pageUrl.href = next.href;\n      init.onNavigate?.(pageUrl.href);\n    } catch {\n      // ignore\n    }\n  };\n\n  const location: any = {};\n  try {\n    Object.defineProperties(location, {\n      href: { get: () => pageUrl.href, set: (v: string) => resolveAndSetHref(String(v)) },\n      origin: { get: () => pageUrl.origin },\n      protocol: {\n        get: () => pageUrl.protocol,\n        set: (v: string) => {\n          pageUrl.protocol = String(v);\n        },\n      },\n      host: {\n        get: () => pageUrl.host,\n        set: (v: string) => {\n          pageUrl.host = String(v);\n        },\n      },\n      hostname: {\n        get: () => pageUrl.hostname,\n        set: (v: string) => {\n          pageUrl.hostname = String(v);\n        },\n      },\n      port: {\n        get: () => pageUrl.port,\n        set: (v: string) => {\n          pageUrl.port = String(v);\n        },\n      },\n      pathname: { get: () => pageUrl.pathname, set: (v: string) => resolveAndSetHref(String(v)) },\n      search: {\n        get: () => pageUrl.search,\n        set: (v: string) => {\n          pageUrl.search = String(v);\n        },\n      },\n      hash: {\n        get: () => pageUrl.hash,\n        set: (v: string) => {\n          pageUrl.hash = String(v);\n        },\n      },\n    });\n  } catch {\n    // ignore\n  }\n  location.toString = () => pageUrl.href;\n  location.assign = (href: string) => resolveAndSetHref(href);\n  location.replace = (href: string) => resolveAndSetHref(href);\n  location.reload = () => {};\n\n  let historyState: unknown = null;\n  const history: any = {\n    get state() {\n      return historyState;\n    },\n    pushState: (state: unknown, _title: string, url?: string | URL | null) => {\n      historyState = state;\n      if (url != null) resolveAndSetHref(String(url));\n      try {\n        init.onPopState?.(state);\n      } catch {\n        // ignore\n      }\n    },\n    replaceState: (state: unknown, _title: string, url?: string | URL | null) => {\n      historyState = state;\n      if (url != null) resolveAndSetHref(String(url));\n    },\n    back: () => {},\n    forward: () => {},\n    go: (_delta?: number) => {},\n  };\n\n  return { location, history };\n}\n","export function installPermissiveShims(globalObj: any): void {\n  const makeStorage = () => {\n    const store = new Map<string, string>();\n    return {\n      get length() {\n        return store.size;\n      },\n      clear() {\n        store.clear();\n      },\n      getItem(key: string) {\n        return store.has(String(key)) ? store.get(String(key))! : null;\n      },\n      key(index: number) {\n        return Array.from(store.keys())[index] ?? null;\n      },\n      removeItem(key: string) {\n        store.delete(String(key));\n      },\n      setItem(key: string, value: string) {\n        store.set(String(key), String(value));\n      },\n    };\n  };\n\n  globalObj.localStorage ??= makeStorage();\n  globalObj.sessionStorage ??= makeStorage();\n\n  // Do NOT downgrade shims here. `permissiveShims` is meant to *fill gaps*,\n  // not replace richer implementations installed earlier.\n  globalObj.scrollTo ??= () => {};\n\n  try {\n    if (\n      globalObj.HTMLElement?.prototype &&\n      !globalObj.HTMLElement.prototype.getBoundingClientRect\n    ) {\n      globalObj.HTMLElement.prototype.getBoundingClientRect = () => ({\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0,\n        top: 0,\n        left: 0,\n        right: 0,\n        bottom: 0,\n        toJSON() {},\n      });\n    }\n  } catch {\n    // ignore\n  }\n\n  globalObj.process ??= { env: { NODE_ENV: 'production' } };\n}\n","export interface InstallXhrInit {\n  globalObj: any;\n  resolveUrl: (u: string) => string;\n  remainingMs: () => number;\n  hostSetTimeout: (cb: () => void, ms: number) => any;\n  hostClearTimeout: (handle: any) => void;\n  fetch: typeof globalThis.fetch | undefined;\n}\n\ntype Listener = (ev: any) => void;\n\n/**\n * Minimal XMLHttpRequest shim over fetch (best-effort).\n *\n * @remarks\n * - Always async (sync XHR is emulated as async)\n * - Time-budgeted via `remainingMs()`\n */\nexport function installXMLHttpRequest(init: InstallXhrInit): void {\n  const g = init.globalObj;\n  if (g.XMLHttpRequest) return;\n\n  class Xhr {\n    // readyState constants\n    static UNSENT = 0;\n    static OPENED = 1;\n    static HEADERS_RECEIVED = 2;\n    static LOADING = 3;\n    static DONE = 4;\n    UNSENT = 0;\n    OPENED = 1;\n    HEADERS_RECEIVED = 2;\n    LOADING = 3;\n    DONE = 4;\n\n    readyState = 0;\n    status = 0;\n    statusText = '';\n    responseType: '' | 'text' | 'json' | 'arraybuffer' | 'blob' = '';\n    response: any = null;\n    responseText = '';\n    timeout = 0;\n    withCredentials = false;\n\n    onreadystatechange: null | (() => void) = null;\n    onload: null | (() => void) = null;\n    onerror: null | (() => void) = null;\n    ontimeout: null | (() => void) = null;\n    onabort: null | (() => void) = null;\n\n    private _method = 'GET';\n    private _url = '';\n    private _headers = new Map<string, string>();\n    private _respHeaders: Headers | null = null;\n    private _listeners = new Map<string, Set<Listener>>();\n    private _controller: AbortController | null = null;\n\n    addEventListener(type: string, cb: Listener) {\n      const t = String(type);\n      const set = this._listeners.get(t) ?? new Set<Listener>();\n      set.add(cb);\n      this._listeners.set(t, set);\n    }\n    removeEventListener(type: string, cb: Listener) {\n      const t = String(type);\n      this._listeners.get(t)?.delete(cb);\n    }\n    private _dispatch(type: string) {\n      const ev = { type, target: this, currentTarget: this };\n      this._listeners.get(type)?.forEach((cb) => {\n        try {\n          cb(ev);\n        } catch {\n          // ignore\n        }\n      });\n    }\n    private _setReadyState(n: number) {\n      this.readyState = n;\n      try {\n        this.onreadystatechange?.();\n      } catch {\n        // ignore\n      }\n      this._dispatch('readystatechange');\n    }\n\n    open(method: string, url: string, async: boolean = true) {\n      this._method = String(method ?? 'GET').toUpperCase();\n      this._url = String(url ?? '');\n      void async; // sync XHR is not supported; treat as async.\n      this._headers.clear();\n      this._respHeaders = null;\n      this._controller = null;\n      this._setReadyState(1);\n    }\n\n    setRequestHeader(name: string, value: string) {\n      this._headers.set(String(name), String(value));\n    }\n\n    getResponseHeader(name: string) {\n      try {\n        return this._respHeaders?.get(String(name)) ?? null;\n      } catch {\n        return null;\n      }\n    }\n\n    getAllResponseHeaders() {\n      try {\n        if (!this._respHeaders) return '';\n        let out = '';\n        this._respHeaders.forEach((v, k) => {\n          out += `${k}: ${v}\\r\\n`;\n        });\n        return out;\n      } catch {\n        return '';\n      }\n    }\n\n    overrideMimeType(_mime: string) {}\n\n    abort() {\n      try {\n        this._controller?.abort();\n      } catch {\n        // ignore\n      }\n      try {\n        this.onabort?.();\n      } catch {\n        // ignore\n      }\n      this._dispatch('abort');\n    }\n\n    send(body?: any) {\n      const doFetch = async () => {\n        const url = init.resolveUrl(this._url);\n        const controller = new AbortController();\n        this._controller = controller;\n\n        let timeoutHandle: any;\n        const ms = Math.min(this.timeout || 0, init.remainingMs());\n        if (ms > 0) {\n          timeoutHandle = init.hostSetTimeout(() => controller.abort(), ms);\n        }\n\n        try {\n          const headers: Record<string, string> = {};\n          for (const [k, v] of this._headers.entries()) headers[k] = v;\n\n          if (!init.fetch) throw new Error('swoop: host fetch is unavailable in this Node runtime');\n\n          const resp = await init.fetch(url, {\n            method: this._method,\n            headers,\n            body: body as any,\n            signal: controller.signal,\n            // credentials/withCredentials ignored (Node fetch differs); best-effort.\n          } as any);\n\n          this._respHeaders = resp.headers;\n          this.status = resp.status;\n          this.statusText = (resp as any).statusText ?? '';\n          this._setReadyState(2);\n\n          // load body\n          this._setReadyState(3);\n          if (this.responseType === 'arraybuffer') {\n            this.response = await resp.arrayBuffer();\n            this.responseText = '';\n          } else if (this.responseType === 'blob') {\n            this.response = (resp as any).blob\n              ? await (resp as any).blob()\n              : await resp.arrayBuffer();\n            this.responseText = '';\n          } else {\n            const text = await resp.text();\n            this.responseText = text;\n            if (this.responseType === 'json') {\n              try {\n                this.response = JSON.parse(text);\n              } catch {\n                this.response = null;\n              }\n            } else {\n              this.response = text;\n            }\n          }\n\n          this._setReadyState(4);\n          try {\n            this.onload?.();\n          } catch {\n            // ignore\n          }\n          this._dispatch('load');\n          this._dispatch('loadend');\n        } catch {\n          this._setReadyState(4);\n          const aborted = this._controller?.signal?.aborted;\n          if (aborted) {\n            try {\n              this.ontimeout?.();\n            } catch {}\n            this._dispatch('timeout');\n          } else {\n            try {\n              this.onerror?.();\n            } catch {}\n            this._dispatch('error');\n          }\n          this._dispatch('loadend');\n        } finally {\n          if (timeoutHandle) init.hostClearTimeout(timeoutHandle);\n        }\n      };\n\n      // Always async.\n      void doFetch();\n    }\n  }\n\n  g.XMLHttpRequest = Xhr;\n}\n","import vm from 'node:vm';\n\n/**\n * Synthesize a browser-ish document lifecycle after scripts executed.\n *\n * @remarks\n * Best-effort. No layout/paint; this is only to unblock CSR bundles that wait\n * for DOMContentLoaded/load and related lifecycle events.\n */\nexport function synthesizeLifecycle(context: vm.Context, timeoutMs: number = 50): void {\n  vm.runInContext(\n    `\n      try {\n        const EventCtor = (globalThis.Event || (globalThis.window && globalThis.window.Event));\n        const dispatchDoc = (type) => { try { document.dispatchEvent(new EventCtor(type)); } catch {} };\n        const dispatchWin = (type) => { try { window.dispatchEvent(new EventCtor(type)); } catch {} };\n\n        if (typeof document.readyState !== \"string\") {\n          try { document.readyState = \"loading\"; } catch {}\n        }\n\n        dispatchDoc(\"readystatechange\");\n        try { document.readyState = \"interactive\"; } catch {}\n        dispatchDoc(\"readystatechange\");\n        dispatchDoc(\"DOMContentLoaded\");\n        try { document.readyState = \"complete\"; } catch {}\n        dispatchDoc(\"readystatechange\");\n\n        try {\n          if (typeof document.visibilityState !== \"string\") document.visibilityState = \"visible\";\n          if (typeof document.hidden !== \"boolean\") document.hidden = false;\n          if (typeof document.hasFocus !== \"function\") document.hasFocus = () => true;\n        } catch {}\n        dispatchDoc(\"visibilitychange\");\n\n        dispatchWin(\"pageshow\");\n        dispatchWin(\"load\");\n\n        try { window.dispatchEvent(new PopStateEvent(\"popstate\", { state: (history && history.state) })); } catch {}\n        try {\n          const href = String((location && location.href) || \"\");\n          window.dispatchEvent(new HashChangeEvent(\"hashchange\", { oldURL: href, newURL: href }));\n        } catch {}\n      } catch {}\n    `,\n    context,\n    { timeout: timeoutMs },\n  );\n}\n","export interface DebugProbesInit {\n  globalObj: any;\n  hostSetTimeout: (cb: () => void, ms: number) => any;\n}\n\nexport function installDebugProbes(init: DebugProbesInit): void {\n  const { globalObj, hostSetTimeout } = init;\n\n  globalObj.__swoopStats = {\n    startedAt: Date.now(),\n    domOps: Object.create(null) as Record<string, number>,\n    mutations: 0,\n    lastDomActivityAt: 0,\n    listeners: Object.create(null) as Record<string, number>,\n    timers: {\n      timeoutScheduled: 0,\n      timeoutFired: 0,\n      intervalScheduled: 0,\n      intervalFired: 0,\n      rafScheduled: 0,\n      rafFired: 0,\n    },\n    nav: {\n      pushState: 0,\n      replaceState: 0,\n      lastHref: null as string | null,\n    },\n    appRootSamples: [] as Array<{ t: number; len: number; opacity: string | null }>,\n  };\n\n  const bump = (name: string) => {\n    const s = globalObj.__swoopStats;\n    s.domOps[name] = (s.domOps[name] ?? 0) + 1;\n    s.lastDomActivityAt = Date.now();\n  };\n\n  const bumpListener = (type: string) => {\n    const s = globalObj.__swoopStats;\n    s.listeners[type] = (s.listeners[type] ?? 0) + 1;\n  };\n\n  const wrapProto = (proto: any, fn: string) => {\n    const orig = proto?.[fn];\n    if (typeof orig !== 'function') return;\n    proto[fn] = function (...args: any[]) {\n      bump(fn);\n      return orig.apply(this, args);\n    };\n  };\n\n  // best-effort: cover the most common DOM mutation surfaces\n  wrapProto(globalObj.Node?.prototype, 'appendChild');\n  wrapProto(globalObj.Node?.prototype, 'insertBefore');\n  wrapProto(globalObj.Node?.prototype, 'removeChild');\n  wrapProto(globalObj.Element?.prototype, 'setAttribute');\n  wrapProto(globalObj.Element?.prototype, 'removeAttribute');\n  wrapProto(globalObj.Element?.prototype, 'append');\n  wrapProto(globalObj.Element?.prototype, 'prepend');\n\n  // Track event listener registrations (router, visibility, etc.)\n  const wrapAddListener = (target: any, label: string) => {\n    const orig = target?.addEventListener;\n    if (typeof orig !== 'function') return;\n    target.addEventListener = function (type: any, listener: any, options: any) {\n      try {\n        bumpListener(`${label}:${String(type)}`);\n      } catch {\n        // ignore\n      }\n      return orig.call(this, type, listener, options);\n    };\n  };\n  wrapAddListener(globalObj, 'window');\n  wrapAddListener(globalObj.document, 'document');\n\n  const MO = globalObj.MutationObserver;\n  if (typeof MO === 'function') {\n    const mo = new MO(() => {\n      globalObj.__swoopStats.mutations++;\n      globalObj.__swoopStats.lastDomActivityAt = Date.now();\n    });\n    try {\n      mo.observe(globalObj.document?.documentElement, {\n        subtree: true,\n        childList: true,\n        attributes: true,\n        characterData: true,\n      });\n    } catch {\n      // ignore\n    }\n  }\n\n  // sample app-root size over time\n  const sample = () => {\n    try {\n      const el = globalObj.document?.querySelector?.('app-root');\n      const len = el?.innerHTML?.length ?? 0;\n      const opacity = el?.getAttribute?.('style')?.includes('opacity')\n        ? String(el.getAttribute('style'))\n        : null;\n      globalObj.__swoopStats.appRootSamples.push({ t: Date.now(), len, opacity });\n    } catch {\n      // ignore\n    }\n  };\n  sample();\n  hostSetTimeout(sample, 250);\n  hostSetTimeout(sample, 1000);\n  hostSetTimeout(sample, 2500);\n  hostSetTimeout(sample, 4500);\n}\n\nexport function emitDebugProbes(\n  globalObj: any,\n  recordDebug: (args: unknown[]) => void,\n  now: () => number = () => Date.now(),\n): void {\n  const stats = globalObj.__swoopStats;\n  if (!stats) return;\n\n  const appRootHtml = (() => {\n    try {\n      const el = globalObj.document?.querySelector?.('app-root');\n      const raw = el?.innerHTML ?? '';\n      return String(raw).slice(0, 400);\n    } catch {\n      return null;\n    }\n  })();\n\n  recordDebug([\n    '[swoop probes]',\n    JSON.stringify({\n      mutations: stats.mutations ?? 0,\n      lastDomActivityMsAgo:\n        stats.lastDomActivityAt && typeof stats.lastDomActivityAt === 'number'\n          ? now() - stats.lastDomActivityAt\n          : null,\n      topDomOps: Object.entries(stats.domOps ?? {})\n        .sort((a, b) => (b[1] as number) - (a[1] as number))\n        .slice(0, 15),\n      topListeners: Object.entries(stats.listeners ?? {})\n        .sort((a, b) => (b[1] as number) - (a[1] as number))\n        .slice(0, 20),\n      timers: stats.timers ?? null,\n      lastAsyncActivityMsAgo:\n        stats.lastAsyncActivityAt && typeof stats.lastAsyncActivityAt === 'number'\n          ? now() - stats.lastAsyncActivityAt\n          : null,\n      nav: stats.nav ?? null,\n      location: (() => {\n        try {\n          return {\n            href: String(globalObj.location?.href ?? ''),\n            pathname: String(globalObj.location?.pathname ?? ''),\n            search: String(globalObj.location?.search ?? ''),\n            hash: String(globalObj.location?.hash ?? ''),\n            baseURI: String(globalObj.document?.baseURI ?? ''),\n          };\n        } catch {\n          return null;\n        }\n      })(),\n      appRootSamples: stats.appRootSamples ?? [],\n      appRootHtmlHead: appRootHtml,\n    }),\n  ]);\n}\n","export interface ScriptLoaderInit {\n  globalObj: any;\n  pageUrlHref: string;\n  baseForResolveHref: string;\n  remainingMs: () => number;\n  hostSetTimeout: (cb: () => void, ms: number) => any;\n  totalBudgetMs: number;\n  maxDebugEvents: number;\n  debug: (args: unknown[]) => void;\n  onError?: (resolvedSrc: string, err: unknown) => void;\n  noteAsyncActivity: () => void;\n\n  fetchText: (url: string) => Promise<string>;\n  runClassicScript: (code: string, filename: string) => void;\n  runModuleScript: (resolvedSrc: string, parentUrlForResolve: string) => Promise<void>;\n}\n\nexport interface ScriptLoader {\n  getPendingScriptLoads: () => number;\n  install: () => void;\n}\n\nfunction isScriptEl(node: any): boolean {\n  return node?.tagName?.toLowerCase?.() === 'script';\n}\n\nexport function createScriptLoader(init: ScriptLoaderInit): ScriptLoader {\n  const loadedScriptSrcs = new Set<string>();\n  let pendingScriptLoads = 0;\n  let debugScriptEvents = 0;\n\n  const debugScript = (...args: unknown[]) => {\n    if (debugScriptEvents++ > init.maxDebugEvents) return;\n    init.debug(args);\n  };\n\n  const loadScriptElement = async (scriptEl: any, parentUrlForResolve: string): Promise<void> => {\n    const rawSrc = scriptEl?.src || scriptEl?.getAttribute?.('src');\n    if (!rawSrc) return;\n\n    let resolvedSrc: string;\n    try {\n      resolvedSrc = new URL(String(rawSrc), init.baseForResolveHref).href;\n    } catch {\n      return;\n    }\n    if (loadedScriptSrcs.has(resolvedSrc)) return;\n    loadedScriptSrcs.add(resolvedSrc);\n    init.noteAsyncActivity();\n    pendingScriptLoads++;\n\n    const type = (scriptEl?.type || scriptEl?.getAttribute?.('type') || '')\n      .toString()\n      .trim()\n      .toLowerCase();\n    const isModule = type === 'module';\n    debugScript('[swoop] load <script>', resolvedSrc, isModule ? 'module' : 'classic');\n\n    try {\n      if (isModule) {\n        await init.runModuleScript(resolvedSrc, parentUrlForResolve);\n      } else {\n        const code = await init.fetchText(resolvedSrc);\n        init.runClassicScript(code, resolvedSrc);\n      }\n\n      // Fire load events/callbacks (webpack waits for these).\n      try {\n        if (typeof scriptEl?.onload === 'function')\n          scriptEl.onload(new (init.globalObj.Event ?? Event)('load'));\n      } catch {\n        try {\n          scriptEl.onload?.();\n        } catch {}\n      }\n      try {\n        scriptEl?.dispatchEvent?.(new (init.globalObj.Event ?? Event)('load'));\n      } catch {}\n    } catch (e) {\n      try {\n        init.onError?.(resolvedSrc, e);\n      } catch {\n        // ignore\n      }\n      try {\n        if (typeof scriptEl?.onerror === 'function') scriptEl.onerror(e);\n      } catch {\n        try {\n          scriptEl.onerror?.();\n        } catch {}\n      }\n      try {\n        scriptEl?.dispatchEvent?.(new (init.globalObj.Event ?? Event)('error'));\n      } catch {}\n    } finally {\n      pendingScriptLoads--;\n      init.noteAsyncActivity();\n    }\n  };\n\n  const scheduleScriptLoad = (node: any, label: string) => {\n    // Give page code a chance to set `src`, `type`, and event handlers after insertion.\n    init.hostSetTimeout(() => {\n      void loadScriptElement(node, `${init.pageUrlHref}#${label}`);\n    }, 0);\n  };\n\n  const patchScriptInsertion = (container: any, label: string) => {\n    if (!container) return;\n    const origAppendChild = container.appendChild?.bind(container);\n    const origInsertBefore = container.insertBefore?.bind(container);\n    const origAppend = container.append?.bind(container);\n    const origPrepend = container.prepend?.bind(container);\n    if (typeof origAppendChild === 'function') {\n      container.appendChild = (node: any) => {\n        const ret = origAppendChild(node);\n        if (isScriptEl(node)) scheduleScriptLoad(node, `${label}.appendChild`);\n        return ret;\n      };\n    }\n    if (typeof origInsertBefore === 'function') {\n      container.insertBefore = (node: any, ref: any) => {\n        const ret = origInsertBefore(node, ref);\n        if (isScriptEl(node)) scheduleScriptLoad(node, `${label}.insertBefore`);\n        return ret;\n      };\n    }\n    if (typeof origAppend === 'function') {\n      container.append = (...nodes: any[]) => {\n        const ret = origAppend(...nodes);\n        for (const n of nodes) if (isScriptEl(n)) scheduleScriptLoad(n, `${label}.append`);\n        return ret;\n      };\n    }\n    if (typeof origPrepend === 'function') {\n      container.prepend = (...nodes: any[]) => {\n        const ret = origPrepend(...nodes);\n        for (const n of nodes) if (isScriptEl(n)) scheduleScriptLoad(n, `${label}.prepend`);\n        return ret;\n      };\n    }\n  };\n\n  const install = () => {\n    patchScriptInsertion(init.globalObj.document?.head, 'head');\n    patchScriptInsertion(init.globalObj.document?.body, 'body');\n\n    // If a script is inserted without `src` and `src` is set later, we still want to load it.\n    // Hook setAttribute for script elements.\n    try {\n      const elProto = init.globalObj.Element?.prototype;\n      const origSetAttr = elProto?.setAttribute;\n      if (typeof origSetAttr === 'function') {\n        elProto.setAttribute = function (name: string, value: string) {\n          const ret = origSetAttr.call(this, name, value);\n          try {\n            if (\n              this?.tagName?.toLowerCase?.() === 'script' &&\n              typeof name === 'string' &&\n              name.toLowerCase() === 'src'\n            ) {\n              scheduleScriptLoad(this, 'script.setAttribute(src)');\n            }\n          } catch {\n            // ignore\n          }\n          return ret;\n        };\n      }\n    } catch {\n      // ignore\n    }\n\n    // Also patch document.createElement('script') to attempt hooking a `src` setter.\n    try {\n      const doc = init.globalObj.document;\n      const origCreateElement = doc?.createElement?.bind(doc);\n      if (typeof origCreateElement === 'function') {\n        doc.createElement = (tagName: string, ...rest: any[]) => {\n          const el = origCreateElement(tagName, ...rest);\n          try {\n            if (typeof tagName === 'string' && tagName.toLowerCase() === 'script') {\n              const desc = Object.getOwnPropertyDescriptor(el, 'src');\n              // If it's configurable, wrap it; otherwise setAttribute hook will still cover most cases.\n              if (!desc || desc.configurable) {\n                let _src = el.getAttribute?.('src') ?? '';\n                Object.defineProperty(el, 'src', {\n                  configurable: true,\n                  enumerable: true,\n                  get: () => _src,\n                  set: (v: string) => {\n                    _src = String(v);\n                    try {\n                      el.setAttribute?.('src', _src);\n                    } catch {\n                      // ignore\n                    }\n                    scheduleScriptLoad(el, 'script.src=');\n                  },\n                });\n              }\n            }\n          } catch {\n            // ignore\n          }\n          return el;\n        };\n      }\n    } catch {\n      // ignore\n    }\n  };\n\n  return {\n    getPendingScriptLoads: () => pendingScriptLoads,\n    install,\n  };\n}\n","import { setTimeout as nodeSetTimeout } from 'node:timers';\n\nimport type { SwoopInit } from './types.js';\n\nexport function isNodeRuntime(): boolean {\n  return (\n    typeof process !== 'undefined' &&\n    typeof process.versions === 'object' &&\n    typeof process.versions.node === 'string'\n  );\n}\n\nexport function sleep(ms: number): Promise<void> {\n  return new Promise((resolve) => nodeSetTimeout(resolve, ms));\n}\n\nexport function normalizeInit(init?: SwoopInit): Required<SwoopInit> {\n  return {\n    engine: init?.engine ?? 'vm',\n    pluck: init?.pluck ?? {},\n    executeScripts: init?.executeScripts ?? true,\n    timeout: init?.timeout ?? 3000,\n    waitStrategy: init?.waitStrategy ?? 'networkidle',\n    idleTime: init?.idleTime ?? 250,\n    pollInterval: init?.pollInterval ?? 25,\n    maxScripts: init?.maxScripts ?? 64,\n    forwardConsole: init?.forwardConsole ?? false,\n    permissiveShims: init?.permissiveShims ?? true,\n    debugFetch: init?.debugFetch ?? false,\n    debugProbes: init?.debugProbes ?? false,\n  };\n}\n","import vm from 'node:vm';\n\nexport function defineWindowInContext(context: vm.Context, timeoutMs: number = 50): void {\n  vm.runInContext(\n    `\n      globalThis.Window ??= function Window() {};\n      try { globalThis.Window.prototype = Object.getPrototypeOf(globalThis); } catch {}\n    `,\n    context,\n    { timeout: timeoutMs },\n  );\n}\n\nexport function ensureRealmFunctionIntrinsic(context: vm.Context, timeoutMs: number = 50): void {\n  vm.runInContext(\n    `\n      try { globalThis.Function = (function(){}).constructor; } catch {}\n    `,\n    context,\n    { timeout: timeoutMs },\n  );\n}\n\nexport function installRealmWrappers(context: vm.Context, timeoutMs: number = 50): void {\n  vm.runInContext(\n    `\n      // timers\n      if (typeof globalThis.__swoop_setTimeout === \"function\") {\n        globalThis.setTimeout = (...args) => globalThis.__swoop_setTimeout(...args);\n      }\n      if (typeof globalThis.__swoop_clearTimeout === \"function\") {\n        globalThis.clearTimeout = (...args) => globalThis.__swoop_clearTimeout(...args);\n      }\n      if (typeof globalThis.__swoop_setInterval === \"function\") {\n        globalThis.setInterval = (...args) => globalThis.__swoop_setInterval(...args);\n      }\n      if (typeof globalThis.__swoop_clearInterval === \"function\") {\n        globalThis.clearInterval = (...args) => globalThis.__swoop_clearInterval(...args);\n      }\n      if (typeof globalThis.__swoop_setImmediate === \"function\") {\n        globalThis.setImmediate = (...args) => globalThis.__swoop_setImmediate(...args);\n      }\n      if (typeof globalThis.__swoop_clearImmediate === \"function\") {\n        globalThis.clearImmediate = (...args) => globalThis.__swoop_clearImmediate(...args);\n      }\n\n      // microtasks / raf / idle\n      if (typeof globalThis.__swoop_queueMicrotask === \"function\") {\n        globalThis.queueMicrotask = (...args) => globalThis.__swoop_queueMicrotask(...args);\n      }\n      if (typeof globalThis.__swoop_requestAnimationFrame === \"function\") {\n        globalThis.requestAnimationFrame = (...args) => globalThis.__swoop_requestAnimationFrame(...args);\n      }\n      if (typeof globalThis.__swoop_cancelAnimationFrame === \"function\") {\n        globalThis.cancelAnimationFrame = (...args) => globalThis.__swoop_cancelAnimationFrame(...args);\n      }\n      if (typeof globalThis.__swoop_requestIdleCallback === \"function\") {\n        globalThis.requestIdleCallback = (...args) => globalThis.__swoop_requestIdleCallback(...args);\n      }\n      if (typeof globalThis.__swoop_cancelIdleCallback === \"function\") {\n        globalThis.cancelIdleCallback = (...args) => globalThis.__swoop_cancelIdleCallback(...args);\n      }\n\n      // fetch\n      if (typeof globalThis.__swoop_fetch === \"function\") {\n        globalThis.fetch = (...args) => globalThis.__swoop_fetch(...args);\n      }\n    `,\n    context,\n    { timeout: timeoutMs },\n  );\n}\n","import vm from 'node:vm';\nimport type { PluckInit } from '../../pluck/index.js';\nimport { pluck } from '../../pluck/index.js';\n\ntype PluckLike = typeof pluck;\n\nexport interface ModuleLoaderInit {\n  context: vm.Context;\n  remainingMs: () => number;\n  pluckInit: PluckInit;\n  pluckFn?: PluckLike;\n}\n\nexport interface ModuleLoader {\n  loadModule: (specifier: string, referencingUrl: string) => Promise<vm.Module>;\n  linkerFor: (referencingUrl: string) => (specifier: string) => Promise<vm.Module>;\n}\n\nexport function createModuleLoader(init: ModuleLoaderInit): ModuleLoader {\n  const SourceTextModule = (vm as any).SourceTextModule as\n    | (new (\n        code: string,\n        options: any,\n      ) => vm.Module)\n    | undefined;\n\n  const moduleCache = new Map<string, vm.Module>();\n  const pluckFn = init.pluckFn ?? pluck;\n\n  const loadModule = async (specifier: string, referencingUrl: string): Promise<vm.Module> => {\n    if (init.remainingMs() <= 0)\n      throw new Error('swoop() time budget exhausted while loading modules');\n    const resolved = new URL(specifier, referencingUrl).href;\n    const cached = moduleCache.get(resolved);\n    if (cached) return cached;\n\n    if (!SourceTextModule) {\n      throw new Error(\n        'Module scripts require Node `--experimental-vm-modules` (vm.SourceTextModule is unavailable).',\n      );\n    }\n\n    const modRes = await pluckFn(resolved, {\n      ...init.pluckInit,\n      timeout: Math.min(init.pluckInit.timeout ?? 30000, init.remainingMs()),\n      strictContentType: false,\n      throwOnHttpError: true,\n    });\n    const rawSource = await modRes.textUtf8();\n\n    const mod = new SourceTextModule(rawSource, {\n      context: init.context,\n      identifier: resolved,\n      initializeImportMeta: (meta: any) => {\n        meta.url = resolved;\n      },\n      importModuleDynamically: async (spec: string) => {\n        const child = await loadModule(spec, resolved);\n        await child.link(linkerFor(resolved));\n        await child.evaluate();\n        return child;\n      },\n    });\n\n    moduleCache.set(resolved, mod);\n    return mod;\n  };\n\n  const linkerFor =\n    (referencingUrl: string) =>\n    async (specifier: string): Promise<vm.Module> => {\n      return await loadModule(specifier, referencingUrl);\n    };\n\n  return { loadModule, linkerFor };\n}\n","export type WaitStrategy = 'timeout' | 'networkidle';\n\nexport interface WaitForSettleInit {\n  strategy: WaitStrategy;\n  deadlineMs: number;\n  idleTimeMs: number;\n  pollIntervalMs: number;\n  sleep: (ms: number) => Promise<void>;\n  now: () => number;\n  getPendingFetches: () => number;\n  getPendingScriptLoads: () => number;\n  getLastAsyncActivityAt: () => number;\n}\n\nexport async function waitForSettle(init: WaitForSettleInit): Promise<{ timedOut: boolean }> {\n  if (init.strategy === 'timeout') {\n    await init.sleep(Math.max(0, init.deadlineMs - init.now()));\n    return { timedOut: init.now() >= init.deadlineMs };\n  }\n\n  while (init.now() < init.deadlineMs) {\n    if (\n      init.getPendingFetches() === 0 &&\n      init.getPendingScriptLoads() === 0 &&\n      init.now() - init.getLastAsyncActivityAt() >= init.idleTimeMs\n    ) {\n      return { timedOut: false };\n    }\n    await init.sleep(init.pollIntervalMs);\n  }\n\n  return { timedOut: true };\n}\n","import vm from 'node:vm';\nimport { parseHTML as linkedomParseHTML } from 'linkedom';\n\nimport { pluck } from '../../pluck/index.js';\nimport { createConsoleCapture } from '../console.js';\nimport { installAsyncEnv } from '../env/async.js';\nimport { computeBaseForResolve, patchBaseElementHref, patchDocumentBaseURI } from '../env/base.js';\nimport { installBrowserShims } from '../env/browser.js';\nimport { installCookieJar } from '../env/cookie.js';\nimport { installFetchShim } from '../env/fetch.js';\nimport { createNavigationShims } from '../env/navigation.js';\nimport { installPermissiveShims } from '../env/permissive.js';\nimport { installXMLHttpRequest } from '../env/xhr.js';\nimport { synthesizeLifecycle } from '../lifecycle.js';\nimport { emitDebugProbes, installDebugProbes } from '../probes.js';\nimport type { DiscoveredScript } from '../scripts/discover.js';\nimport { createScriptLoader } from '../scripts/loader.js';\nimport type { SwoopInit, SwoopScriptError } from '../types.js';\nimport { sleep } from '../utils.js';\nimport {\n  defineWindowInContext,\n  ensureRealmFunctionIntrinsic,\n  installRealmWrappers,\n} from '../vm/bootstrap.js';\nimport { createModuleLoader } from '../vm/modules.js';\nimport { waitForSettle } from '../wait.js';\nimport type { EngineRunResult } from './types.js';\n\nexport async function runVmEngine(args: {\n  finalUrl: string;\n  html: string;\n  scripts: DiscoveredScript[];\n  options: Required<SwoopInit>;\n  totalBudgetMs: number;\n  deadline: number;\n  hostFetch: typeof fetch | undefined;\n}): Promise<EngineRunResult> {\n  const { entries: realmConsole, record } = createConsoleCapture();\n\n  const remainingMs = () => Math.max(0, args.deadline - Date.now());\n\n  const { window, document } = linkedomParseHTML(args.html, { url: args.finalUrl });\n\n  const pageUrl = new URL(args.finalUrl);\n\n  // For resolving relative URLs, respect the document's <base href=\"...\"> if present.\n  // Also enforce browser invariants for `document.baseURI` / `<base>.href` to be absolute.\n  const { baseForResolve, baseEl } = computeBaseForResolve(args.finalUrl, document);\n  patchDocumentBaseURI(document, baseForResolve);\n  patchBaseElementHref(baseEl, baseForResolve);\n\n  const documentBaseUriForDom = baseForResolve.href;\n\n  // Start with a browser-ish initial document lifecycle state.\n  try {\n    (document as any).readyState ??= 'loading';\n  } catch {\n    // ignore\n  }\n\n  // Use a dedicated sandbox global object whose prototype is the DOM window.\n  const domWindow = window as any;\n  const globalObj: any = Object.create(domWindow);\n\n  // Browser-ish globals\n  globalObj.window = globalObj;\n  globalObj.self = globalObj;\n  globalObj.globalThis = globalObj;\n  globalObj.document = document;\n  try {\n    Object.defineProperty(document, 'defaultView', { value: globalObj, configurable: true });\n  } catch {\n    // ignore\n  }\n\n  const { location: locationShim, history: historyShim } = createNavigationShims({\n    pageUrl,\n    onNavigate: (href) => {\n      if (!args.options.debugProbes) return;\n      try {\n        globalObj.__swoopStats.nav.lastHref = String(href);\n      } catch {}\n    },\n    onPopState: (state) => {\n      if (args.options.debugProbes) {\n        try {\n          globalObj.__swoopStats.nav.pushState++;\n        } catch {}\n      }\n      try {\n        globalObj.dispatchEvent?.(new (globalObj.PopStateEvent ?? Event)('popstate', { state }));\n      } catch {}\n    },\n  });\n\n  try {\n    Object.defineProperty(document, 'location', {\n      configurable: true,\n      get: () => locationShim,\n      set: (v: string) => {\n        try {\n          locationShim.href = String(v);\n        } catch {}\n      },\n    });\n  } catch {\n    // ignore\n  }\n\n  globalObj.location = locationShim;\n  globalObj.history = historyShim;\n\n  installBrowserShims({ globalObj, domWindow, document, documentBaseUriForDom });\n  installCookieJar(document);\n\n  const asyncEnv = installAsyncEnv({ globalObj, debugProbes: args.options.debugProbes });\n  const noteAsyncActivity = asyncEnv.noteAsyncActivity;\n  const hostSetTimeout = asyncEnv.hostSetTimeout;\n  const hostClearTimeout = asyncEnv.hostClearTimeout;\n\n  if (args.options.debugProbes) {\n    try {\n      installDebugProbes({ globalObj, hostSetTimeout });\n    } catch {\n      // ignore\n    }\n  }\n\n  const fetchShim = installFetchShim({\n    globalObj,\n    hostFetch: args.hostFetch,\n    baseForResolveHref: baseForResolve.href,\n    remainingMs,\n    hostSetTimeout,\n    hostClearTimeout,\n    noteAsyncActivity,\n    debugFetch: args.options.debugFetch,\n    recordDebug: (a) => record('debug', a),\n    queueMicrotask: (cb) => globalObj.__swoop_queueMicrotask(cb),\n  });\n\n  // Browser-style event helpers on globalThis.\n  const addEventListener = domWindow.addEventListener?.bind(domWindow);\n  const removeEventListener = domWindow.removeEventListener?.bind(domWindow);\n  const dispatchEvent = domWindow.dispatchEvent?.bind(domWindow);\n  if (typeof addEventListener === 'function') globalObj.addEventListener = addEventListener;\n  if (typeof removeEventListener === 'function')\n    globalObj.removeEventListener = removeEventListener;\n  if (typeof dispatchEvent === 'function') globalObj.dispatchEvent = dispatchEvent;\n\n  // Console capture\n  globalObj.console = {\n    debug: (...a: unknown[]) => record('debug', a),\n    info: (...a: unknown[]) => record('info', a),\n    warn: (...a: unknown[]) => record('warn', a),\n    error: (...a: unknown[]) => record('error', a),\n    log: (...a: unknown[]) => record('log', a),\n  };\n  if (args.options.forwardConsole) {\n    for (const level of ['debug', 'info', 'warn', 'error', 'log'] as const) {\n      const original = (console as any)[level]?.bind(console);\n      if (typeof original === 'function') {\n        const wrapped = globalObj.console[level];\n        globalObj.console[level] = (...a: unknown[]) => {\n          wrapped(...a);\n          original(...a);\n        };\n      }\n    }\n  }\n\n  // Capture global error hooks used by browsers/frameworks.\n  try {\n    globalObj.onerror = (\n      message: unknown,\n      source?: unknown,\n      line?: unknown,\n      col?: unknown,\n      error?: unknown,\n    ) => {\n      record('error', ['[window.onerror]', message, source, line, col, error]);\n    };\n  } catch {}\n  try {\n    globalObj.onunhandledrejection = (event: any) => {\n      record('error', ['[unhandledrejection]', event?.reason]);\n    };\n  } catch {}\n  try {\n    globalObj.addEventListener?.('error', (event: any) => {\n      record('error', [\n        '[error event]',\n        event?.message,\n        event?.filename,\n        event?.lineno,\n        event?.colno,\n        event?.error instanceof Error\n          ? `${event.error.name}: ${event.error.message}\\n${event.error.stack ?? ''}`.trim()\n          : event?.error,\n      ]);\n    });\n  } catch {}\n\n  if (args.options.permissiveShims) {\n    installPermissiveShims(globalObj);\n    if (!globalObj.XMLHttpRequest) {\n      installXMLHttpRequest({\n        globalObj,\n        resolveUrl: (u: string) => {\n          try {\n            return new URL(u, baseForResolve.href).href;\n          } catch {\n            return u;\n          }\n        },\n        remainingMs,\n        hostSetTimeout,\n        hostClearTimeout,\n        fetch: args.hostFetch,\n      });\n    }\n  }\n\n  const context = vm.createContext(globalObj, { name: 'magpie-html/swoop' });\n  defineWindowInContext(context);\n  ensureRealmFunctionIntrinsic(context);\n  installRealmWrappers(context);\n\n  const { loadModule, linkerFor } = createModuleLoader({\n    context,\n    remainingMs,\n    pluckInit: args.options.pluck,\n  });\n\n  const scriptLoader = createScriptLoader({\n    globalObj,\n    pageUrlHref: pageUrl.href,\n    baseForResolveHref: baseForResolve.href,\n    remainingMs,\n    hostSetTimeout,\n    totalBudgetMs: args.totalBudgetMs,\n    maxDebugEvents: args.options.debugProbes ? 80 : 0,\n    debug: (a) => {\n      if (!args.options.debugProbes) return;\n      record('debug', a);\n    },\n    onError: (resolvedSrc, err) => {\n      const e = err as Error;\n      record('error', ['[swoop] script load failed', resolvedSrc, e?.message || String(e)]);\n    },\n    noteAsyncActivity,\n    fetchText: async (url: string) => {\n      const sres = await pluck(url, {\n        ...args.options.pluck,\n        timeout: Math.min(args.options.pluck.timeout ?? 30000, remainingMs()),\n        strictContentType: false,\n        throwOnHttpError: true,\n      });\n      return await sres.textUtf8();\n    },\n    runClassicScript: (code: string, filename: string) => {\n      const script = new vm.Script(code, { filename });\n      script.runInContext(context, { timeout: args.totalBudgetMs });\n    },\n    runModuleScript: async (resolvedSrc: string, parentUrlForResolve: string) => {\n      const mod = await loadModule(resolvedSrc, parentUrlForResolve);\n      await mod.link(linkerFor(resolvedSrc));\n      await mod.evaluate();\n    },\n  });\n  scriptLoader.install();\n  const getPendingScriptLoads = () => scriptLoader.getPendingScriptLoads();\n\n  const engineErrors: SwoopScriptError[] = [];\n\n  // Execute discovered scripts\n  const classicScripts = args.scripts.filter((s) => !s.isModule);\n  const moduleScriptsInOrder = args.scripts.filter((s) => s.isModule);\n\n  for (const s of [...classicScripts, ...moduleScriptsInOrder]) {\n    if (remainingMs() <= 0) {\n      engineErrors.push({\n        stage: 'wait',\n        message: `Hard time budget (${args.totalBudgetMs}ms) exceeded while executing scripts; returning snapshot.`,\n      });\n      break;\n    }\n\n    const scriptUrl = s.kind === 'external' ? s.url : `${args.finalUrl}#inline`;\n    try {\n      if (s.isModule) {\n        const modCode = s.code;\n        const SourceTextModule = (vm as any).SourceTextModule as any;\n        if (!SourceTextModule) {\n          throw new Error(\n            'Module scripts require Node `--experimental-vm-modules` (vm.SourceTextModule is unavailable).',\n          );\n        }\n        const mod = new SourceTextModule(modCode, {\n          context,\n          identifier: scriptUrl,\n          initializeImportMeta: (meta: any) => {\n            meta.url = scriptUrl;\n          },\n          importModuleDynamically: async (spec: string) => {\n            const child = await loadModule(spec, scriptUrl);\n            await child.link(linkerFor(scriptUrl));\n            await child.evaluate();\n            return child;\n          },\n        });\n\n        const timeoutP = (label: string) =>\n          sleep(remainingMs()).then(() => {\n            throw new Error(`swoop() time budget exhausted during ${label}`);\n          });\n\n        const linkP = mod.link(linkerFor(scriptUrl));\n        try {\n          await Promise.race([linkP, timeoutP('module link')]);\n        } catch (e) {\n          void (linkP as any).catch?.(() => {});\n          throw e;\n        }\n\n        const evalP = mod.evaluate();\n        try {\n          await Promise.race([evalP as any, timeoutP('module evaluate')]);\n        } catch (e) {\n          void (evalP as any).catch?.(() => {});\n          throw e;\n        }\n      } else {\n        const script = new vm.Script(s.code, { filename: scriptUrl });\n        script.runInContext(context, { timeout: args.totalBudgetMs });\n      }\n    } catch (err) {\n      const e = err as Error;\n      engineErrors.push({\n        stage: 'script',\n        scriptUrl: s.kind === 'external' ? s.url : undefined,\n        message: e.message || String(e),\n        stack: e.stack,\n      });\n    }\n  }\n\n  // Fire DOM lifecycle events\n  try {\n    synthesizeLifecycle(context, Math.min(50, remainingMs()));\n  } catch {\n    // ignore\n  }\n\n  const settle = await waitForSettle({\n    strategy:\n      args.options.waitStrategy === 'timeout' || typeof globalObj.fetch !== 'function'\n        ? 'timeout'\n        : 'networkidle',\n    deadlineMs: args.deadline,\n    idleTimeMs: args.options.idleTime,\n    pollIntervalMs: args.options.pollInterval,\n    sleep,\n    now: () => Date.now(),\n    getPendingFetches: () => fetchShim.getPendingFetches(),\n    getPendingScriptLoads,\n    getLastAsyncActivityAt: () => asyncEnv.getLastAsyncActivityAt(),\n  });\n\n  if (\n    settle.timedOut &&\n    args.options.waitStrategy === 'networkidle' &&\n    typeof globalObj.fetch === 'function'\n  ) {\n    engineErrors.push({\n      stage: 'wait',\n      message: `Hard time budget (${args.totalBudgetMs}ms) exceeded waiting for network idle; returning snapshot.`,\n    });\n  }\n\n  const snapshot = document.documentElement?.outerHTML ?? '';\n\n  if (args.options.debugProbes) {\n    try {\n      emitDebugProbes(globalObj, (a) => record('debug', a));\n    } catch {}\n  }\n\n  asyncEnv.cleanup();\n\n  return { snapshot, consoleEntries: realmConsole, engineErrors };\n}\n","import { pluck } from '../../pluck/index.js';\nimport { parseHTML } from '../../utils/html-parser.js';\nimport type { SwoopInit, SwoopScriptError } from '../types.js';\n\nexport type DiscoveredScript =\n  | { kind: 'inline'; code: string; isModule: boolean }\n  | { kind: 'external'; url: string; code: string; isModule: boolean };\n\nfunction isExecutableScriptType(type: string | null): boolean {\n  if (!type) return true; // default JS\n  const t = type.trim().toLowerCase();\n  if (t === '') return true;\n  if (t === 'text/javascript') return true;\n  if (t === 'application/javascript') return true;\n  if (t === 'application/ecmascript') return true;\n  if (t === 'text/ecmascript') return true;\n  return false;\n}\n\nfunction isModuleScript(type: string | null): boolean {\n  return (type ?? '').trim().toLowerCase() === 'module';\n}\n\ntype PluckLike = typeof pluck;\n\nexport async function discoverAndFetchScripts(\n  html: string,\n  finalUrl: string,\n  init: Required<SwoopInit>,\n  pluckFn: PluckLike = pluck,\n): Promise<{ scripts: DiscoveredScript[]; errors: SwoopScriptError[] }> {\n  const errors: SwoopScriptError[] = [];\n  const scripts: DiscoveredScript[] = [];\n\n  if (!init.executeScripts) return { scripts, errors };\n\n  const doc = parseHTML(html, finalUrl);\n  const baseHref = doc.querySelector('base[href]')?.getAttribute('href') ?? null;\n  const baseUrl = baseHref ? new URL(baseHref, finalUrl).href : finalUrl;\n\n  const scriptEls = Array.from(doc.querySelectorAll('script'));\n  for (const el of scriptEls.slice(0, init.maxScripts)) {\n    const type = el.getAttribute('type');\n    const isModule = isModuleScript(type);\n    if (!isModule && !isExecutableScriptType(type)) continue;\n\n    const src = el.getAttribute('src');\n    if (src) {\n      const scriptUrl = new URL(src, baseUrl).href;\n      try {\n        const res = await pluckFn(scriptUrl, {\n          ...init.pluck,\n          strictContentType: false,\n          throwOnHttpError: true,\n        });\n        const code = await res.textUtf8();\n        scripts.push({ kind: 'external', url: scriptUrl, code, isModule });\n      } catch (err) {\n        const e = err as Error;\n        errors.push({\n          stage: 'script',\n          scriptUrl,\n          message: `Failed to fetch external script: ${e.message || String(e)}`,\n          stack: e.stack,\n        });\n      }\n      continue;\n    }\n\n    const code = el.textContent ?? '';\n    if (code.trim().length === 0) continue;\n    scripts.push({ kind: 'inline', code, isModule });\n  }\n\n  return { scripts, errors };\n}\n","import { pluck } from '../pluck/index.js';\nimport { runVmEngine } from './engines/vm.js';\nimport { SwoopEnvironmentError } from './errors.js';\nimport { discoverAndFetchScripts } from './scripts/discover.js';\nimport type { SwoopConsoleEntry, SwoopInit, SwoopResult, SwoopScriptError } from './types.js';\nimport { isNodeRuntime, normalizeInit } from './utils.js';\n\n// Capture host web primordials once, so sandbox/window proxies can't accidentally\n// overwrite them and cause recursion (especially in tests).\nconst HOST_FETCH: typeof fetch | undefined =\n  typeof globalThis.fetch === 'function' ? globalThis.fetch.bind(globalThis) : undefined;\n\n/**\n * Execute client-side JavaScript against a DOM-only environment and snapshot the resulting HTML.\n *\n * @remarks\n * **Experimental feature**.\n *\n * @remarks\n * - Default engine (`vm`) works on regular Node.js.\n *\n * This is *not* a real browser engine:\n * - No layout/paint/CSS correctness\n * - No true navigation lifecycle\n * - Best-effort shims for browser APIs\n *\n * ⚠️ **Security**: This executes third-party JavaScript. Only use on trusted sources or in an OS sandbox.\n */\nexport async function swoop(url: string | URL, init?: SwoopInit): Promise<SwoopResult> {\n  const start = Date.now();\n  const options = normalizeInit(init);\n  const totalBudgetMs = Math.min(options.timeout, 5000);\n  const deadline = start + totalBudgetMs;\n\n  if (!isNodeRuntime()) {\n    throw new SwoopEnvironmentError('swoop() is currently Node.js-only.');\n  }\n\n  // Fetch initial HTML (use pluck for robust encoding + redirects)\n  const res = await pluck(String(url), {\n    ...options.pluck,\n    timeout: Math.min(options.pluck.timeout ?? 30000, totalBudgetMs),\n    strictContentType: false,\n    throwOnHttpError: true,\n  });\n  const html = await res.textUtf8();\n  const finalUrl = res.finalUrl;\n\n  const { scripts, errors: preErrors } = await discoverAndFetchScripts(html, finalUrl, options);\n\n  // Engine: vm\n  let snapshot = '';\n  let consoleEntries: SwoopConsoleEntry[] = [];\n  let engineErrors: SwoopScriptError[] = [];\n\n  const r = await runVmEngine({\n    finalUrl,\n    html,\n    scripts,\n    options,\n    totalBudgetMs,\n    deadline,\n    hostFetch: HOST_FETCH,\n  });\n  snapshot = r.snapshot;\n  consoleEntries = r.consoleEntries;\n  engineErrors = r.engineErrors;\n\n  const end = Date.now();\n  return {\n    url: finalUrl,\n    html: snapshot,\n    console: consoleEntries,\n    errors: [...preErrors, ...engineErrors],\n    timing: {\n      start,\n      end,\n      duration: end - start,\n    },\n  };\n}\n"]}