{"version":3,"file":"checks.cjs","names":["extractHtmlLang","extractHtmlDir","hasCanonical","extractHreflangs","ALL_LOCALES","analyzeBundleContent"],"sources":["../../../src/scan/checks.ts"],"sourcesContent":["import { ALL_LOCALES } from '@intlayer/types/allLocales';\nimport { analyzeBundleContent } from './analyzeBundleContent';\nimport {\n  type Anchor,\n  extractHreflangs,\n  extractHtmlDir,\n  extractHtmlLang,\n  hasCanonical,\n} from './parseHtml';\nimport type {\n  BundleChunkInput,\n  BundleContentAnalysis,\n  ScanEvent,\n} from './types';\n\n/** Format a byte count as a human-readable size. */\nexport const formatSize = (bytes: number): string => {\n  if (bytes >= 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\n  if (bytes >= 1024) return `${(bytes / 1024).toFixed(2)} KB`;\n  return `${bytes} B`;\n};\n\n/**\n * Check the `<html>` element attributes (`lang`, `dir`) and the resulting\n * current-locale signal. Returns the detected language tag.\n */\nexport const checkHtmlAttributes = (\n  html: string,\n  targetUrl: string,\n  events: ScanEvent[]\n): { langTag: string | undefined } => {\n  const langTag = extractHtmlLang(html);\n  const dirTag = extractHtmlDir(html);\n\n  events.push({\n    type: `url_htmlLang\\\\${targetUrl}`,\n    status: langTag ? 'success' : 'error',\n    details: {\n      success: langTag,\n      error: langTag ? undefined : 'Missing html lang attribute',\n    },\n  });\n\n  events.push({\n    type: `url_currentLocale\\\\${targetUrl}`,\n    status: langTag ? 'success' : 'warning',\n    details: {\n      success: langTag,\n      warning: langTag ? undefined : 'No locale detected',\n    },\n  });\n\n  events.push({\n    type: `url_htmlDir\\\\${targetUrl}`,\n    status: dirTag ? 'success' : 'warning',\n    details: {\n      success: dirTag,\n      warning: dirTag ? undefined : 'Missing html dir attribute',\n    },\n  });\n\n  return { langTag };\n};\n\n/** Check the presence of a canonical link. */\nexport const checkCanonical = (\n  html: string,\n  targetUrl: string,\n  events: ScanEvent[]\n): void => {\n  const present = hasCanonical(html);\n  events.push({\n    type: `url_hasCanonical\\\\${targetUrl}`,\n    status: present ? 'success' : 'warning',\n    details: { warning: present ? undefined : 'Missing canonical link' },\n  });\n};\n\n/**\n * Check the page's hreflang structure and collect discovered locales into\n * `localesSet`.\n */\nexport const checkLinguisticStructure = (\n  html: string,\n  targetUrl: string,\n  localesSet: Set<string>,\n  events: ScanEvent[]\n): void => {\n  const langTag = extractHtmlLang(html);\n  if (langTag) localesSet.add(langTag);\n\n  const hreflangs = extractHreflangs(html);\n  for (const { hreflang } of hreflangs) {\n    if (hreflang !== 'x-default') localesSet.add(hreflang);\n  }\n\n  const hasXDefault = hreflangs.some((h) => h.hreflang === 'x-default');\n\n  events.push({\n    type: `url_hreflang\\\\${targetUrl}`,\n    status: hreflangs.length > 0 ? 'success' : 'warning',\n    details: {\n      success: hreflangs.length > 0 ? hreflangs : undefined,\n      warning: hreflangs.length === 0 ? 'No hreflang tags found' : undefined,\n    },\n  });\n\n  events.push({\n    type: `url_hasXDefault\\\\${targetUrl}`,\n    status: hasXDefault ? 'success' : 'error',\n    details: {\n      error: hasXDefault ? undefined : 'Missing x-default hreflang link',\n    },\n  });\n};\n\nconst normalizeHost = (host: string): string =>\n  host.startsWith('www.') ? host.slice(4) : host;\n\nconst localeValues = Object.values(ALL_LOCALES) as string[];\n\n/**\n * Check whether internal links carry a locale segment, mirroring the hosted\n * audit's URL-structure analysis but operating on parsed anchors instead of a\n * live DOM.\n */\nexport const checkUrlStructure = (\n  anchors: Anchor[],\n  origin: string,\n  targetUrl: string,\n  events: ScanEvent[]\n): void => {\n  const targetHostname = normalizeHost(new URL(origin).hostname);\n\n  let localizedCount = 0;\n  let totalInternalCount = 0;\n  const nonLocalizedLinks: string[] = [];\n\n  for (const { href } of anchors) {\n    if (!href || href.startsWith('#') || href.startsWith('javascript:'))\n      continue;\n\n    try {\n      const url = new URL(href, origin);\n      if (normalizeHost(url.hostname) !== targetHostname) continue;\n\n      totalInternalCount++;\n      const path = url.pathname.toLowerCase();\n      const hostname = url.hostname.toLowerCase();\n\n      const hasLocaleInPath = localeValues.some((locale) => {\n        const l = locale.toLowerCase();\n        return path === `/${l}` || path.includes(`/${l}/`);\n      });\n      const hasLocaleInSubdomain = localeValues.some((locale) => {\n        const l = locale.toLowerCase();\n        return hostname.startsWith(`${l}.`) || hostname.includes(`.${l}.`);\n      });\n\n      if (hasLocaleInPath || hasLocaleInSubdomain) {\n        localizedCount++;\n      } else {\n        nonLocalizedLinks.push(href);\n      }\n    } catch {\n      /* ignore malformed URLs */\n    }\n  }\n\n  const hasLocalizedLinks = localizedCount > 0;\n  const allAnchorsLocalized =\n    totalInternalCount === 0 || localizedCount === totalInternalCount;\n\n  events.push({\n    type: `url_hasLocalizedLinks\\\\${targetUrl}`,\n    status: hasLocalizedLinks ? 'success' : 'warning',\n    details: {\n      success: hasLocalizedLinks\n        ? `${localizedCount} localized links found out of ${totalInternalCount} internal links`\n        : undefined,\n      warning: hasLocalizedLinks ? undefined : 'No localized links found',\n    },\n  });\n\n  events.push({\n    type: `url_allAnchorsLocalized\\\\${targetUrl}`,\n    status: allAnchorsLocalized ? 'success' : 'warning',\n    details: {\n      warning: allAnchorsLocalized\n        ? undefined\n        : {\n            message: 'Some internal links are not localized',\n            links: nonLocalizedLinks,\n          },\n    },\n  });\n};\n\n/**\n * Analyze the JavaScript bundles for unused locale content and emit the\n * corresponding event. Returns the analysis so callers can report on it.\n */\nexport const checkBundleContent = (\n  chunks: BundleChunkInput[],\n  html: string,\n  currentLocale: string | undefined,\n  targetUrl: string,\n  totalPageSize: number,\n  events: ScanEvent[]\n): BundleContentAnalysis | undefined => {\n  if (!currentLocale) {\n    events.push({\n      type: `url_unusedBundleContent\\\\${targetUrl}`,\n      status: 'warning',\n      details: {\n        warning: 'Cannot analyse bundle content: page locale not detected',\n      },\n    });\n    return undefined;\n  }\n\n  const analysis = analyzeBundleContent(\n    chunks,\n    html,\n    currentLocale,\n    totalPageSize\n  );\n\n  // Status is driven by the main bundle — lazy chunks with unused content are expected.\n  const mainBundleMaxUnused = analysis.mainBundleChunks.reduce(\n    (max, c) => Math.max(max, c.unusedPercent),\n    0\n  );\n\n  const status =\n    mainBundleMaxUnused === 0\n      ? 'success'\n      : mainBundleMaxUnused <= 30\n        ? 'warning'\n        : 'error';\n\n  events.push({\n    type: `url_unusedBundleContent\\\\${targetUrl}`,\n    status,\n    details: { [status]: analysis },\n  });\n\n  return analysis;\n};\n\n/** Fetch and check `robots.txt`, emitting robots-related events. */\nexport const checkRobots = async (\n  origin: string,\n  discoveredLocales: Set<string>,\n  userAgent: string,\n  events: ScanEvent[]\n): Promise<void> => {\n  let robotsPresent = false;\n  let noLocalizedUrlsForgotten = true;\n  const errors: string[] = [];\n\n  try {\n    const response = await fetch(`${origin}/robots.txt`, {\n      headers: { 'User-Agent': userAgent },\n    });\n\n    if (response.ok) {\n      robotsPresent = true;\n      const content = await response.text();\n\n      if (content && discoveredLocales.size > 0) {\n        const disallowedPaths = content\n          .split('\\n')\n          .map((line) => line.trim().toLowerCase())\n          .filter((line) => line.startsWith('disallow:'))\n          .map((line) => line.slice('disallow:'.length).trim());\n\n        for (const locale of discoveredLocales) {\n          for (const path of disallowedPaths) {\n            if (path === `/${locale}` || path === `/${locale}/`) {\n              noLocalizedUrlsForgotten = false;\n              errors.push(\n                `Locale path \"${locale}\" appears to be blocked in robots.txt: ${path}`\n              );\n            }\n          }\n        }\n      }\n    }\n  } catch (error) {\n    errors.push(\n      `Failed to fetch robots.txt: ${error instanceof Error ? error.message : 'Unknown error'}`\n    );\n  }\n\n  events.push({\n    type: 'robots_robotsPresent',\n    status: robotsPresent ? 'success' : 'warning',\n    details: {\n      warning: robotsPresent ? undefined : 'No robots.txt found',\n      error: errors.length > 0 ? errors : undefined,\n    },\n  });\n\n  if (robotsPresent) {\n    events.push({\n      type: 'robots_noLocalizedUrlsForgotten',\n      status: noLocalizedUrlsForgotten ? 'success' : 'error',\n      details: { error: noLocalizedUrlsForgotten ? undefined : errors },\n    });\n  }\n};\n\n/** Fetch and check `sitemap.xml`, emitting sitemap-related events. */\nexport const checkSitemap = async (\n  origin: string,\n  discoveredLocales: Set<string>,\n  userAgent: string,\n  events: ScanEvent[]\n): Promise<void> => {\n  let sitemapPresent = false;\n  let hasXDefault = false;\n  let hasAlternates = false;\n  let noLocalizedUrlsForgotten = true;\n  const errors: string[] = [];\n\n  try {\n    const response = await fetch(`${origin}/sitemap.xml`, {\n      headers: { 'User-Agent': userAgent },\n    });\n\n    if (response.ok) {\n      sitemapPresent = true;\n      const content = await response.text();\n\n      const hreflangMatches = content.match(/hreflang\\s*=\\s*\"([^\"]+)\"/gi) ?? [];\n      const hreflangs = hreflangMatches.map((m) =>\n        m.replace(/hreflang\\s*=\\s*\"/i, '').replace(/\"$/, '')\n      );\n      hasAlternates = hreflangs.length > 0;\n      hasXDefault = hreflangs.includes('x-default');\n\n      if (discoveredLocales.size > 0) {\n        const urlBlocks = content.match(/<url\\b[\\s\\S]*?<\\/url>/gi) ?? [];\n        const allFoundLocales = new Set<string>();\n        let anyUrlMissingLocale = false;\n\n        for (const block of urlBlocks) {\n          const localesInUrl = new Set<string>();\n\n          for (const hreflang of block.match(/hreflang\\s*=\\s*\"([^\"]+)\"/gi) ??\n            []) {\n            const value = hreflang\n              .replace(/hreflang\\s*=\\s*\"/i, '')\n              .replace(/\"$/, '');\n            if (value !== 'x-default') {\n              localesInUrl.add(value);\n              allFoundLocales.add(value);\n            }\n          }\n\n          const loc = block.match(/<loc>([\\s\\S]*?)<\\/loc>/i)?.[1]?.trim();\n          if (loc) {\n            try {\n              const firstSegment = new URL(loc).pathname\n                .split('/')\n                .filter(Boolean)[0];\n              if (firstSegment && discoveredLocales.has(firstSegment)) {\n                localesInUrl.add(firstSegment);\n                allFoundLocales.add(firstSegment);\n              }\n            } catch {\n              /* invalid loc URL, skip */\n            }\n          }\n\n          const missing = [...discoveredLocales].filter(\n            (locale) => !localesInUrl.has(locale)\n          );\n          if (missing.length > 0 && missing.length < discoveredLocales.size) {\n            anyUrlMissingLocale = true;\n          }\n        }\n\n        const completelyMissing = [...discoveredLocales].filter(\n          (locale) => !allFoundLocales.has(locale)\n        );\n        if (anyUrlMissingLocale || completelyMissing.length > 0) {\n          noLocalizedUrlsForgotten = false;\n          if (completelyMissing.length > 0) {\n            errors.push(\n              `The following locales are completely missing from the sitemap: ${completelyMissing.join(', ')}`\n            );\n          }\n        }\n      }\n    }\n  } catch (error) {\n    errors.push(\n      `Failed to fetch sitemap.xml: ${error instanceof Error ? error.message : 'Unknown error'}`\n    );\n  }\n\n  events.push({\n    type: 'sitemap_sitemapPresent',\n    status: sitemapPresent ? 'success' : 'warning',\n    details: {\n      warning: sitemapPresent ? undefined : 'No sitemap.xml found',\n      error: errors.length > 0 ? errors : undefined,\n    },\n  });\n\n  if (sitemapPresent) {\n    events.push({\n      type: 'sitemap_noLocalizedUrlsForgotten',\n      status: noLocalizedUrlsForgotten ? 'success' : 'warning',\n      details: { warning: noLocalizedUrlsForgotten ? undefined : errors },\n    });\n\n    events.push({\n      type: 'sitemap_hasXDefault',\n      status: hasXDefault ? 'success' : 'warning',\n      details: {\n        warning: hasXDefault ? undefined : 'No x-default hreflang in sitemap',\n      },\n    });\n\n    events.push({\n      type: 'sitemap_hasAlternates',\n      status: hasAlternates ? 'success' : 'warning',\n      details: {\n        warning: hasAlternates\n          ? undefined\n          : 'No alternate language links found in sitemap',\n      },\n    });\n  }\n};\n"],"mappings":"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"}