{"version":3,"file":"validate-CHO2fJgh.mjs","names":["rolldownBuild","generateSitemap","generateSitemapXml","collectContentAssets","createLogger","createCoreLogger","createNetServer","createLogger"],"sources":["../src/navigation.ts","../src/render.ts","../src/build.ts","../src/server/shared.ts","../src/server.ts","../src/validate.ts"],"sourcesContent":["import type { Heading } from \"@pagesmith/core/schemas\";\nimport { basename } from \"path\";\nimport {\n  toTitleCase,\n  type FooterLink,\n  type FooterLinkGroup,\n  type FooterLinks,\n  type ResolvedDocsConfig,\n} from \"./config.js\";\nimport type {\n  DocsPage,\n  DocsSectionMeta,\n  DocsRootMeta,\n  NavItem,\n  PrevNextLink,\n  SidebarItem,\n  SidebarSection,\n  SiteModel,\n} from \"./content.js\";\n\ntype SectionPageLookup = {\n  byContentSlug: Map<string, DocsPage>;\n  byRelativeSlug: Map<string, DocsPage>;\n  byLeafSlug: Map<string, DocsPage | null>;\n};\n\nfunction getOrder(page: DocsPage): number {\n  return typeof page.frontmatter.order === \"number\"\n    ? page.frontmatter.order\n    : Number.MAX_SAFE_INTEGER;\n}\n\nfunction comparePages(left: DocsPage, right: DocsPage): number {\n  const orderDelta = getOrder(left) - getOrder(right);\n  if (orderDelta !== 0) return orderDelta;\n  return left.routePath.localeCompare(right.routePath);\n}\n\nfunction sortPages(pages: DocsPage[]): DocsPage[] {\n  return [...pages].sort(comparePages);\n}\n\nfunction getSectionRelativeSlug(page: DocsPage, sectionSlug: string): string {\n  if (page.contentSlug === sectionSlug) return sectionSlug;\n  return page.contentSlug.startsWith(`${sectionSlug}/`)\n    ? page.contentSlug.slice(sectionSlug.length + 1)\n    : page.contentSlug;\n}\n\nfunction getLeafSlug(page: DocsPage): string {\n  return page.contentSlug.split(\"/\").at(-1) ?? page.contentSlug;\n}\n\nfunction buildSectionPageLookup(sectionSlug: string, sectionPages: DocsPage[]): SectionPageLookup {\n  const byContentSlug = new Map<string, DocsPage>();\n  const byRelativeSlug = new Map<string, DocsPage>();\n  const byLeafSlug = new Map<string, DocsPage | null>();\n\n  for (const page of sectionPages) {\n    byContentSlug.set(page.contentSlug, page);\n    byRelativeSlug.set(getSectionRelativeSlug(page, sectionSlug), page);\n\n    const leafSlug = getLeafSlug(page);\n    if (!byLeafSlug.has(leafSlug)) {\n      byLeafSlug.set(leafSlug, page);\n    } else {\n      byLeafSlug.set(leafSlug, null);\n    }\n  }\n\n  return { byContentSlug, byRelativeSlug, byLeafSlug };\n}\n\nfunction findSectionPageBySlug(\n  lookup: SectionPageLookup,\n  rawSlug: string,\n): { page?: DocsPage; ambiguous?: boolean } {\n  const slug = rawSlug.replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n  if (!slug) return {};\n\n  const direct = lookup.byRelativeSlug.get(slug) ?? lookup.byContentSlug.get(slug);\n  if (direct) return { page: direct };\n\n  const byLeaf = lookup.byLeafSlug.get(slug);\n  if (byLeaf === null) return { ambiguous: true };\n  if (byLeaf) return { page: byLeaf };\n\n  return {};\n}\n\nfunction toSidebarItem(page: DocsPage, basePath: string): SidebarItem {\n  return {\n    title: page.frontmatter.sidebarLabel ?? page.title,\n    path: `${basePath}${page.routePath}`,\n  };\n}\n\nfunction sortSectionPages(pages: DocsPage[], meta?: DocsSectionMeta): DocsPage[] {\n  if (!meta?.orderBy) return sortPages(pages);\n\n  if (meta.orderBy === \"publishedDate\") {\n    const getPublishedTime = (value: unknown): number => {\n      if (!value) return 0;\n      if (value instanceof Date) {\n        const t = value.getTime();\n        return Number.isNaN(t) ? 0 : t;\n      }\n      if (typeof value === \"string\" || typeof value === \"number\") {\n        const t = new Date(value).getTime();\n        return Number.isNaN(t) ? 0 : t;\n      }\n      return 0;\n    };\n\n    return [...pages].sort((a, b) => {\n      const dateA = getPublishedTime(a.frontmatter.publishedDate);\n      const dateB = getPublishedTime(b.frontmatter.publishedDate);\n      return dateB - dateA;\n    });\n  }\n\n  if (meta.orderBy === \"manual\" && meta.items) {\n    const order = new Map(meta.items.map((slug, i) => [slug, i]));\n    const getPosition = (page: DocsPage): number | undefined => {\n      const candidates = [\n        page.contentSlug,\n        page.section ? getSectionRelativeSlug(page, page.section) : undefined,\n        getLeafSlug(page),\n      ];\n\n      for (const candidate of candidates) {\n        if (!candidate) continue;\n        const position = order.get(candidate);\n        if (position != null) return position;\n      }\n\n      return undefined;\n    };\n\n    return [...pages].sort((a, b) => {\n      const posA = getPosition(a);\n      const posB = getPosition(b);\n\n      if (posA != null && posB != null) return posA - posB;\n      if (posA != null) return -1;\n      if (posB != null) return 1;\n\n      return comparePages(a, b);\n    });\n  }\n\n  return sortPages(pages);\n}\n\nfunction warnSeriesReference(\n  sectionSlug: string,\n  seriesName: string,\n  slug: string,\n  reason: \"ambiguous\" | \"missing\",\n): void {\n  if (reason === \"ambiguous\") {\n    console.warn(\n      `\\x1b[33m⚠ [${sectionSlug}]\\x1b[0m Series \"${seriesName}\" references article slug \"${slug}\" which matches multiple loaded pages. Use the full section-relative slug to disambiguate.`,\n    );\n    return;\n  }\n\n  console.warn(\n    `\\x1b[33m⚠ [${sectionSlug}]\\x1b[0m Series \"${seriesName}\" references article slug \"${slug}\" which does not match any loaded page.`,\n  );\n}\n\nfunction buildSidebarWithSeries(\n  sectionSlug: string,\n  sectionPages: DocsPage[],\n  meta: DocsSectionMeta,\n  basePath: string,\n): SidebarSection[] {\n  const sections: SidebarSection[] = [];\n  const lookup = buildSectionPageLookup(sectionSlug, sectionPages);\n  const includedPages = new Set<DocsPage>();\n\n  for (const series of meta.series!) {\n    const items: SidebarItem[] = [];\n\n    for (const slug of series.articles) {\n      const { page, ambiguous } = findSectionPageBySlug(lookup, slug);\n      if (ambiguous) {\n        warnSeriesReference(sectionSlug, series.displayName, slug, \"ambiguous\");\n        continue;\n      }\n\n      if (!page) {\n        warnSeriesReference(sectionSlug, series.displayName, slug, \"missing\");\n        continue;\n      }\n\n      if (includedPages.has(page)) continue;\n      includedPages.add(page);\n      items.push(toSidebarItem(page, basePath));\n    }\n\n    if (items.length > 0) {\n      sections.push({\n        title: series.displayName,\n        slug: series.slug,\n        collapsed: meta.collapsed,\n        items,\n      });\n    }\n  }\n\n  const miscItems = sortSectionPages(\n    sectionPages.filter((page) => !includedPages.has(page)),\n    meta,\n  ).map((page) => toSidebarItem(page, basePath));\n\n  if (miscItems.length > 0) {\n    sections.push({\n      title: \"Miscellaneous\",\n      slug: `${sectionSlug}-misc`,\n      collapsed: meta.collapsed,\n      items: miscItems,\n    });\n  }\n\n  return sections;\n}\n\nfunction buildSidebarItems(\n  sectionPages: DocsPage[],\n  basePath: string,\n  sectionMeta?: DocsSectionMeta,\n): SidebarItem[] {\n  return sortSectionPages(sectionPages, sectionMeta).map((page) => toSidebarItem(page, basePath));\n}\n\n/**\n * Find the first content page in a section, respecting meta ordering.\n * Excludes the landing page (README.md) itself — returns the first \"child\" page.\n */\nfunction findFirstSectionPage(\n  sectionSlug: string,\n  sectionPages: DocsPage[],\n  meta?: DocsSectionMeta,\n): DocsPage | undefined {\n  const nonLanding = sectionPages.filter((p) => p.contentSlug !== sectionSlug);\n  if (nonLanding.length === 0) return undefined;\n  const lookup = buildSectionPageLookup(sectionSlug, nonLanding);\n\n  // When series exist, the first referenced article of the first series wins.\n  if (meta?.series && meta.series.length > 0) {\n    for (const series of meta.series) {\n      for (const slug of series.articles) {\n        const { page } = findSectionPageBySlug(lookup, slug);\n        if (page) return page;\n      }\n    }\n  }\n\n  // For manual ordering with items array\n  if (meta?.orderBy === \"manual\" && meta.items && meta.items.length > 0) {\n    for (const slug of meta.items) {\n      const { page } = findSectionPageBySlug(lookup, slug);\n      if (page) return page;\n    }\n  }\n\n  // Default: use sortSectionPages\n  return sortSectionPages(nonLanding, meta)[0];\n}\n\nexport function buildSiteModel(\n  config: ResolvedDocsConfig,\n  pages: DocsPage[],\n  rootMeta?: DocsRootMeta,\n  sectionMetas?: Map<string, DocsSectionMeta>,\n): SiteModel {\n  const pageByPath = new Map(pages.map((page) => [page.routePath, page]));\n  const sidebarBySection = new Map<string, SidebarSection[]>();\n  const navItems: NavItem[] = [];\n  const pagesBySection = new Map<string, DocsPage[]>();\n  const folderPaths = new Map<string, string>();\n\n  for (const page of pages) {\n    if (!page.section) continue;\n    if (page.frontmatter.draft) continue;\n    if (!pagesBySection.has(page.section)) {\n      pagesBySection.set(page.section, []);\n    }\n    pagesBySection.get(page.section)!.push(page);\n  }\n\n  for (const [sectionSlug, sectionPages] of Array.from(pagesBySection.entries()).sort((a, b) =>\n    a[0].localeCompare(b[0]),\n  )) {\n    const sectionMeta = sectionMetas?.get(sectionSlug);\n    const landingPage = sectionPages.find((page) => page.contentSlug === sectionSlug);\n    const firstPage = findFirstSectionPage(sectionSlug, sectionPages, sectionMeta);\n    const label =\n      sectionMeta?.displayName ??\n      config.packages?.[sectionSlug]?.label ??\n      landingPage?.frontmatter.navLabel ??\n      landingPage?.title ??\n      firstPage?.frontmatter.navLabel ??\n      toTitleCase(sectionSlug);\n    const sectionPath = landingPage?.routePath ?? firstPage?.routePath ?? `/${sectionSlug}`;\n\n    // Only auto-generate nav items if root meta didn't provide explicit headerLinks\n    if (!rootMeta?.headerLinks || rootMeta.headerLinks.length === 0) {\n      navItems.push({ label, path: `${config.basePath}${sectionPath}` });\n    }\n\n    // Build sidebar: use series grouping if defined, otherwise flat list\n    if (sectionMeta?.series && sectionMeta.series.length > 0) {\n      sidebarBySection.set(\n        sectionSlug,\n        buildSidebarWithSeries(sectionSlug, sectionPages, sectionMeta, config.basePath),\n      );\n    } else {\n      sidebarBySection.set(sectionSlug, [\n        {\n          title: label,\n          slug: sectionSlug,\n          collapsed: sectionMeta?.collapsed,\n          items: buildSidebarItems(sectionPages, config.basePath, sectionMeta),\n        },\n      ]);\n    }\n  }\n\n  // If root meta provides explicit header links, resolve section paths to actual pages\n  if (rootMeta?.headerLinks && rootMeta.headerLinks.length > 0) {\n    for (const link of rootMeta.headerLinks) {\n      const rawPath = link.path.startsWith(\"/\") ? link.path : `/${link.path}`;\n      const sectionSlug = rawPath.replace(/^\\//, \"\").replace(/\\/.*$/, \"\");\n      const sectionPages = pagesBySection.get(sectionSlug);\n      let resolvedPath = rawPath;\n\n      if (sectionPages) {\n        const landing = sectionPages.find((p) => p.contentSlug === sectionSlug);\n        if (landing) {\n          resolvedPath = landing.routePath;\n        } else {\n          const first = findFirstSectionPage(\n            sectionSlug,\n            sectionPages,\n            sectionMetas?.get(sectionSlug),\n          );\n          if (first) resolvedPath = first.routePath;\n        }\n      }\n\n      navItems.push({\n        label: link.label,\n        path: `${config.basePath}${resolvedPath}`,\n      });\n    }\n  }\n\n  // Build folderPaths: map every ancestor folder slug to a resolved URL.\n  // Folders with an index page point to that page; folders without one\n  // point to their first child page so breadcrumbs never produce 404s.\n  const pageBySlug = new Map(pages.map((p) => [p.contentSlug, p]));\n  const folderSlugs = new Set<string>();\n  for (const page of pages) {\n    if (page.isHome) continue;\n    const segments = page.contentSlug.split(\"/\");\n    for (let i = 1; i < segments.length; i++) {\n      folderSlugs.add(segments.slice(0, i).join(\"/\"));\n    }\n  }\n  for (const folder of folderSlugs) {\n    const indexPage = pageBySlug.get(folder);\n    if (indexPage) {\n      folderPaths.set(folder, `${config.basePath}${indexPage.routePath}`);\n      continue;\n    }\n    const children = sortPages(\n      pages.filter(\n        (p) => !p.isHome && p.contentSlug.startsWith(folder + \"/\") && p.contentSlug !== folder,\n      ),\n    );\n    if (children.length > 0) {\n      folderPaths.set(folder, `${config.basePath}${children[0].routePath}`);\n    }\n  }\n\n  return {\n    navItems,\n    sidebarBySection,\n    pageByPath,\n    folderPaths,\n    rootMeta,\n    sectionMetas: sectionMetas ?? new Map(),\n  };\n}\n\nfunction flattenSidebarItems(items: SidebarItem[]): SidebarItem[] {\n  const flattened: SidebarItem[] = [];\n\n  for (const item of items) {\n    flattened.push(item);\n    if (item.children) {\n      flattened.push(...flattenSidebarItems(item.children));\n    }\n  }\n\n  return flattened;\n}\n\nexport function getPrevNext(\n  sidebarSections: SidebarSection[] | undefined,\n  routePath: string,\n): { prev?: PrevNextLink; next?: PrevNextLink } {\n  if (!sidebarSections?.length) return {};\n  const flat = flattenSidebarItems(sidebarSections.flatMap((section) => section.items));\n  const index = flat.findIndex((item) => item.path === routePath);\n  if (index < 0) return {};\n\n  const prev = index > 0 ? flat[index - 1] : undefined;\n  const next = index < flat.length - 1 ? flat[index + 1] : undefined;\n\n  return {\n    prev: prev ? { title: prev.title, path: prev.path } : undefined,\n    next: next ? { title: next.title, path: next.path } : undefined,\n  };\n}\n\nfunction isFooterLinkGroup(link: FooterLink | FooterLinkGroup): link is FooterLinkGroup {\n  return \"links\" in link;\n}\n\nfunction isGroupedFooterLinks(footerLinks: FooterLinks): footerLinks is FooterLinkGroup[] {\n  return footerLinks.length > 0 && isFooterLinkGroup(footerLinks[0]!);\n}\n\nfunction prefixFooterLinkPath(path: string, basePath: string): string {\n  return path.startsWith(\"/\") && !path.startsWith(\"//\") && !path.startsWith(basePath)\n    ? `${basePath}${path}`\n    : path;\n}\n\nfunction withResolvedFooterLinks(\n  footerLinks: FooterLinks,\n  basePath: string,\n  needsBasePrefix: boolean,\n): FooterLinks {\n  if (!needsBasePrefix || !basePath || footerLinks.length === 0) {\n    return footerLinks;\n  }\n\n  if (isGroupedFooterLinks(footerLinks)) {\n    return footerLinks.map((group) => ({\n      ...group,\n      links: group.links.map((link) => ({\n        ...link,\n        path: prefixFooterLinkPath(link.path, basePath),\n      })),\n    }));\n  }\n\n  return footerLinks.map((link) => ({\n    ...link,\n    path: prefixFooterLinkPath(link.path, basePath),\n  }));\n}\n\nexport type DocsListingCard = {\n  title: string;\n  path: string;\n  description?: string;\n  publishedDate?: string;\n};\n\nexport type DocsListingGroup = {\n  slug: string;\n  title: string;\n  description?: string;\n  cards: DocsListingCard[];\n};\n\nexport type DocsListingData = {\n  cards: DocsListingCard[];\n  groups: DocsListingGroup[];\n  headings: Heading[];\n  totalItems: number;\n};\n\nfunction toListingDate(value: unknown): string | undefined {\n  if (!value) return undefined;\n  if (value instanceof Date) {\n    return Number.isNaN(value.getTime()) ? undefined : value.toISOString();\n  }\n  if (typeof value === \"string\" || typeof value === \"number\") {\n    const parsed = new Date(value);\n    return Number.isNaN(parsed.getTime()) ? undefined : parsed.toISOString();\n  }\n  return undefined;\n}\n\nfunction toListingCard(page: DocsPage, basePath: string): DocsListingCard {\n  return {\n    title: page.title,\n    path: `${basePath}${page.routePath}`,\n    description:\n      typeof page.frontmatter.description === \"string\" ? page.frontmatter.description : undefined,\n    publishedDate: toListingDate(page.frontmatter.publishedDate),\n  };\n}\n\nexport function getDocsListingData(\n  section: string,\n  pages: DocsPage[],\n  basePath: string,\n  sectionMeta?: DocsSectionMeta,\n): DocsListingData {\n  const sectionPages = pages.filter(\n    (page) => page.section === section && page.contentSlug !== section && !page.isHome,\n  );\n  const sortedPages = sortSectionPages(sectionPages, sectionMeta);\n  const flatCards = sortedPages.map((page) => toListingCard(page, basePath));\n\n  if (!sectionMeta?.series || sectionMeta.series.length === 0) {\n    return {\n      cards: flatCards,\n      groups: [],\n      headings: [],\n      totalItems: flatCards.length,\n    };\n  }\n\n  const lookup = buildSectionPageLookup(section, sortedPages);\n  const includedPages = new Set<DocsPage>();\n  const groups: DocsListingGroup[] = [];\n\n  for (const series of sectionMeta.series) {\n    const cards: DocsListingCard[] = [];\n\n    for (const slug of series.articles) {\n      const { page, ambiguous } = findSectionPageBySlug(lookup, slug);\n      if (ambiguous) {\n        warnSeriesReference(section, series.displayName, slug, \"ambiguous\");\n        continue;\n      }\n      if (!page) {\n        warnSeriesReference(section, series.displayName, slug, \"missing\");\n        continue;\n      }\n      if (includedPages.has(page)) continue;\n\n      includedPages.add(page);\n      cards.push(toListingCard(page, basePath));\n    }\n\n    if (cards.length > 0) {\n      groups.push({\n        slug: series.slug,\n        title: series.displayName,\n        description: series.description,\n        cards,\n      });\n    }\n  }\n\n  if (groups.length === 0) {\n    return {\n      cards: flatCards,\n      groups: [],\n      headings: [],\n      totalItems: flatCards.length,\n    };\n  }\n\n  const otherPages = sortedPages.filter((page) => !includedPages.has(page));\n  if (otherPages.length > 0) {\n    groups.push({\n      slug: \"other\",\n      title: \"Other\",\n      cards: otherPages.map((page) => toListingCard(page, basePath)),\n    });\n  }\n\n  return {\n    cards: groups.flatMap((group) => group.cards),\n    groups,\n    headings: groups.map((group) => ({\n      depth: 2,\n      text: group.title,\n      slug: group.slug,\n    })),\n    totalItems: flatCards.length,\n  };\n}\n\n/**\n * Child pages under a section folder for listing layouts (excludes the section\n * index / landing page). Order matches sidebar ordering rules.\n */\nexport function getDocsListingCards(\n  section: string,\n  pages: DocsPage[],\n  basePath: string,\n  sectionMeta?: DocsSectionMeta,\n): DocsListingCard[] {\n  return getDocsListingData(section, pages, basePath, sectionMeta).cards;\n}\n\nexport function getSitePayload(config: ResolvedDocsConfig, model: SiteModel) {\n  const base = config.basePath;\n\n  // Root meta wins, explicit config is next, otherwise reuse the primary nav\n  // so the footer always exposes the site's major destinations by default.\n  const footerLinkSource =\n    model.rootMeta?.footerLinks !== undefined\n      ? { links: model.rootMeta.footerLinks, needsBasePrefix: true }\n      : config._userConfig?.footerLinks !== undefined || config.footerLinks.length > 0\n        ? { links: config.footerLinks, needsBasePrefix: true }\n        : { links: model.navItems, needsBasePrefix: false };\n\n  const footerLinks = withResolvedFooterLinks(\n    footerLinkSource.links,\n    base,\n    footerLinkSource.needsBasePrefix,\n  );\n  const withBasePath = (value: string): string => {\n    const cleaned = value.replace(/^\\//, \"\");\n    return base ? `${base}/${cleaned}` : `/${cleaned}`;\n  };\n\n  return {\n    origin: config.origin,\n    basePath: config.basePath,\n    homeLink: config.homeLink,\n    trailingSlash: config.trailingSlash,\n    maintainer: config.maintainer,\n    copyright: config.copyright,\n    name: config.name,\n    title: config.title,\n    description: config.description,\n    language: config.language,\n    navItems: model.navItems,\n    footerLinks,\n    footerText: config.footerText,\n    search: config.search,\n    sidebar: config.sidebar,\n    analytics: config.analytics,\n    theme: config.theme,\n    socialImage: config.socialImage\n      ? config.socialImage.startsWith(\"http\")\n        ? config.socialImage\n        : withBasePath(config.socialImage)\n      : undefined,\n    icon: config.icon,\n    favicon: config.favicon !== false ? withBasePath(basename(config.favicon)) : false,\n    faviconFallback: config.faviconFallback\n      ? withBasePath(basename(config.faviconFallback))\n      : false,\n    appleTouchIcon: config.appleTouchIcon ? withBasePath(\"apple-touch-icon.png\") : false,\n  };\n}\n","import { createHash } from \"crypto\";\nimport { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from \"fs\";\nimport { basename, dirname, join, relative, resolve } from \"path\";\nimport type { Heading } from \"@pagesmith/core/schemas\";\nimport type { ResolvedDocsConfig } from \"./config.js\";\nimport type { DocsPage, DocsSectionMeta, SiteModel } from \"./content.js\";\nimport { buildBreadcrumbs, loadDocsPages, loadRootMeta, loadSectionMetas } from \"./content.js\";\nimport { buildSiteModel, getDocsListingData, getPrevNext, getSitePayload } from \"./navigation.js\";\nimport DocHome from \"../theme/layouts/DocHome\";\nimport DocListing from \"../theme/layouts/DocListing\";\nimport DocNotFound from \"../theme/layouts/DocNotFound\";\nimport DocPage from \"../theme/layouts/DocPage\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- layout registry stores heterogeneous prop types\ntype DocsRenderable = (props: any) => unknown;\n\ntype DocsLayoutRegistry = Record<string, DocsRenderable>;\n\nfunction mergeHeadings(primary: Heading[], secondary: Heading[]): Heading[] {\n  if (secondary.length === 0) return primary;\n  const merged: Heading[] = [];\n  const seen = new Set<string>();\n\n  for (const heading of [...primary, ...secondary]) {\n    if (!heading.slug || seen.has(heading.slug)) continue;\n    seen.add(heading.slug);\n    merged.push(heading);\n  }\n\n  return merged;\n}\n\nasync function loadUserThemeModule(\n  entryPath: string,\n  rootDir: string,\n): Promise<Record<string, unknown>> {\n  const { build } = await import(\"rolldown\");\n  const { pathToFileURL } = await import(\"url\");\n\n  const cacheDir = join(rootDir, \"node_modules\", \".cache\", \"pagesmith-docs-layouts\");\n  mkdirSync(cacheDir, { recursive: true });\n\n  // Use content-hash-based filename for stability\n  const entryContent = readFileSync(entryPath, \"utf-8\");\n  const contentHash = createHash(\"md5\").update(entryContent).digest(\"hex\").slice(0, 12);\n  const safeBase = basename(entryPath)\n    .replace(/[^a-z0-9]+/gi, \"-\")\n    .toLowerCase();\n  const outFile = join(cacheDir, `${safeBase}-${contentHash}.mjs`);\n\n  // Skip rebuild if cached output already exists\n  if (!existsSync(outFile)) {\n    const rolldownBuild = build as any;\n\n    await rolldownBuild({\n      input: entryPath,\n      output: {\n        file: outFile,\n        format: \"esm\",\n      },\n      platform: \"node\",\n      logLevel: \"warn\",\n      external: [/^node:/, /^@pagesmith\\//],\n      moduleTypes: {\n        \".ts\": \"ts\",\n        \".tsx\": \"tsx\",\n      },\n    });\n  }\n\n  // Drop stale builds for the same logical layout entry without invalidating\n  // cached siblings that are still in active use.\n  for (const file of readdirSync(cacheDir)) {\n    if (file === basename(outFile) || !file.startsWith(`${safeBase}-`) || !file.endsWith(\".mjs\")) {\n      continue;\n    }\n    try {\n      rmSync(join(cacheDir, file));\n    } catch {\n      // Ignore errors from concurrent cleanup\n    }\n  }\n\n  return import(`${pathToFileURL(outFile).href}?t=${Date.now()}`) as Promise<\n    Record<string, unknown>\n  >;\n}\n\nasync function resolveDocsLayout(\n  name: string,\n  config: ResolvedDocsConfig,\n  fallback?: DocsRenderable,\n): Promise<DocsRenderable> {\n  const overridePath = config.theme?.layouts?.[name];\n  if (!overridePath) {\n    if (fallback) return fallback;\n    throw new Error(\n      `Theme layout \"${name}\" is referenced in meta.json5 but not registered in theme.layouts config`,\n    );\n  }\n\n  const absolutePath = resolve(config.rootDir, overridePath);\n  const module = await loadUserThemeModule(absolutePath, config.rootDir);\n\n  const knownExports: Record<string, string[]> = {\n    home: [\"default\", \"DocHome\", \"Home\"],\n    page: [\"default\", \"DocPage\", \"Page\"],\n    notFound: [\"default\", \"DocNotFound\", \"NotFound\"],\n    listing: [\"default\", \"DocListing\", \"Listing\"],\n  };\n  const exportNames = knownExports[name] ?? [\"default\", name];\n\n  for (const exportName of exportNames) {\n    const candidate = module[exportName];\n    if (typeof candidate === \"function\") {\n      return candidate as DocsRenderable;\n    }\n  }\n\n  throw new Error(\n    `Theme layout \"${name}\" at ${absolutePath} must export a component as default or one of: ${exportNames.join(\", \")}`,\n  );\n}\n\nasync function resolveDocsLayouts(\n  config: ResolvedDocsConfig,\n  sectionMetas?: Map<string, DocsSectionMeta>,\n  pages?: DocsPage[],\n): Promise<DocsLayoutRegistry> {\n  const registry: DocsLayoutRegistry = {\n    home: await resolveDocsLayout(\"home\", config, DocHome),\n    page: await resolveDocsLayout(\"page\", config, DocPage),\n    notFound: await resolveDocsLayout(\"notFound\", config, DocNotFound),\n    listing: await resolveDocsLayout(\"listing\", config, DocListing),\n  };\n\n  // Collect unique layout names from section metas and per-page frontmatter\n  const extraNames = new Set<string>();\n  if (sectionMetas) {\n    for (const meta of sectionMetas.values()) {\n      if (meta.layout && !registry[meta.layout]) extraNames.add(meta.layout);\n      if (meta.itemLayout && !registry[meta.itemLayout]) extraNames.add(meta.itemLayout);\n    }\n  }\n  if (pages) {\n    for (const page of pages) {\n      const name = page.layoutName;\n      if (name && !registry[name]) extraNames.add(name);\n    }\n  }\n  for (const name of extraNames) {\n    registry[name] = await resolveDocsLayout(name, config);\n  }\n\n  return registry;\n}\n\nfunction writeHtml(outDir: string, routePath: string, html: string, trailingSlash: boolean): void {\n  const content = `<!DOCTYPE html>\\n${html}`;\n  const outputPath =\n    routePath === \"/\" || trailingSlash\n      ? join(outDir, routePath === \"/\" ? \"\" : routePath.slice(1), \"index.html\")\n      : join(outDir, `${routePath.slice(1)}.html`);\n  mkdirSync(dirname(outputPath), { recursive: true });\n  writeFileSync(outputPath, content);\n}\n\nexport async function renderDocs(\n  config: ResolvedDocsConfig,\n): Promise<{ pages: DocsPage[]; model: SiteModel }> {\n  const rootMeta = loadRootMeta(config.contentDir);\n  const sectionMetas = loadSectionMetas(config.contentDir);\n  const pages = await loadDocsPages(config, sectionMetas);\n  const model = buildSiteModel(config, pages, rootMeta, sectionMetas);\n  const site = getSitePayload(config, model);\n  const layouts = await resolveDocsLayouts(config, sectionMetas, pages);\n\n  const base = config.basePath;\n\n  console.info(`  Rendering ${pages.length} pages...`);\n\n  const buildEditUrl = config.editLink\n    ? (sourcePath: string) => {\n        const relPath = relative(config.rootDir, sourcePath);\n        return `${config.editLink!.editPattern}/${relPath}`;\n      }\n    : undefined;\n\n  function renderPage(page: DocsPage): void {\n    const urlPath = `${base}${page.routePath}`;\n    const listingData =\n      page.layoutName === \"listing\" && page.section\n        ? getDocsListingData(page.section, pages, base, sectionMetas?.get(page.section))\n        : undefined;\n    const headings = listingData\n      ? mergeHeadings(page.headings, listingData.headings)\n      : page.headings;\n\n    if (page.isHome) {\n      const frontmatter = { ...page.frontmatter };\n      if (frontmatter.hero?.actions) {\n        frontmatter.hero = {\n          ...frontmatter.hero,\n          actions: frontmatter.hero.actions.map((action) => ({\n            ...action,\n            link: action.link.startsWith(\"/\") ? `${base}${action.link}` : action.link,\n          })),\n        };\n      }\n      const homeActions = Array.isArray(frontmatter.actions) ? frontmatter.actions : undefined;\n      if (homeActions) {\n        frontmatter.actions = homeActions.map((action) => ({\n          ...action,\n          link: action.link.startsWith(\"/\") ? `${base}${action.link}` : action.link,\n        }));\n      }\n\n      const layout = layouts[page.layoutName] ?? layouts.home;\n      const output = layout({\n        content: page.html,\n        frontmatter,\n        headings,\n        slug: urlPath,\n        site,\n        listingCards: listingData?.cards,\n        listingGroups: listingData?.groups,\n        listingTotal: listingData?.totalItems,\n      });\n      writeHtml(config.outDir, page.routePath, String(output), config.trailingSlash);\n      return;\n    }\n\n    const sidebarSections = page.section ? model.sidebarBySection.get(page.section) : undefined;\n    const { prev, next } = getPrevNext(sidebarSections, urlPath);\n    const breadcrumbs = buildBreadcrumbs(page.contentSlug, page.title, base, model.folderPaths);\n    const editUrl = buildEditUrl ? buildEditUrl(page.sourcePath) : undefined;\n    const layout = layouts[page.layoutName] ?? layouts.page;\n    const output = layout({\n      content: page.html,\n      frontmatter: page.frontmatter,\n      headings,\n      slug: urlPath,\n      site,\n      sidebarSections,\n      prev,\n      next,\n      breadcrumbs,\n      editUrl,\n      editLabel: config.editLink?.label,\n      lastUpdated: page.lastUpdated,\n      listingCards: listingData?.cards,\n      listingGroups: listingData?.groups,\n      listingTotal: listingData?.totalItems,\n    });\n    writeHtml(config.outDir, page.routePath, String(output), config.trailingSlash);\n  }\n\n  for (const page of pages) {\n    renderPage(page);\n  }\n\n  const notFound = layouts.notFound({\n    content: \"\",\n    frontmatter: {\n      title: \"Page not found\",\n      description: \"The page you requested could not be found.\",\n    },\n    headings: [],\n    slug: `${base}/404`,\n    site,\n  });\n  const notFoundHtml = `<!DOCTYPE html>\\n${String(notFound)}`;\n  writeHtml(config.outDir, \"/404\", String(notFound), config.trailingSlash);\n  // Also write 404.html at root for GitHub Pages\n  writeFileSync(join(config.outDir, \"404.html\"), notFoundHtml);\n\n  return { pages, model };\n}\n","import { copyPublicFiles, emitGeneratedImageVariants, hashAssets } from \"@pagesmith/core/assets\";\nimport { buildCss } from \"@pagesmith/site/css\";\nimport {\n  generateSitemap as generateSitemapXml,\n  runPagefindIndexing,\n} from \"@pagesmith/site/ssg-utils\";\nimport {\n  copyFileSync,\n  existsSync,\n  mkdirSync,\n  mkdtempSync,\n  readdirSync,\n  rmSync,\n  statSync,\n  writeFileSync,\n} from \"fs\";\nimport { tmpdir } from \"os\";\nimport { basename, dirname, join, relative } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport {\n  getThemeRuntimeEntry,\n  getThemeStylesEntry,\n  reportConfigIssues,\n  resolveDocsConfigAsync,\n  validateConfig,\n  type DocsBuildOptions,\n  type ResolvedDocsConfig,\n} from \"./config.js\";\nimport { collectContentAssets, type DocsPage } from \"./content.js\";\nimport { renderDocs } from \"./render.js\";\n\nasync function bundleThemeAssets(config: ResolvedDocsConfig): Promise<void> {\n  const assetsDir = join(config.outDir, \"assets\");\n  mkdirSync(assetsDir, { recursive: true });\n\n  const css = buildCss(getThemeStylesEntry(), { minify: true });\n  writeFileSync(join(assetsDir, \"style.css\"), css);\n\n  const { build } = await import(\"rolldown\");\n\n  await build({\n    input: getThemeRuntimeEntry(),\n    output: {\n      dir: assetsDir,\n      entryFileNames: \"main.js\",\n      format: \"esm\",\n      minify: true,\n    },\n    platform: \"browser\",\n    logLevel: \"warn\",\n  });\n\n  // Copy bundled font files to assets/fonts/\n  const sitePkgDir = dirname(fileURLToPath(import.meta.resolve(\"@pagesmith/site/package.json\")));\n  const siteFontsDir = join(sitePkgDir, \"assets\", \"fonts\");\n  const outFontsDir = join(assetsDir, \"fonts\");\n  mkdirSync(outFontsDir, { recursive: true });\n  for (const file of readdirSync(siteFontsDir)) {\n    if (file.endsWith(\".woff2\")) {\n      copyFileSync(join(siteFontsDir, file), join(outFontsDir, file));\n    }\n  }\n}\n\nfunction copyPublicAssets(config: ResolvedDocsConfig): void {\n  copyPublicFiles(config.publicDir, config.outDir);\n}\n\nfunction copyDirRecursive(srcDir: string, destDir: string): void {\n  mkdirSync(destDir, { recursive: true });\n  for (const entry of readdirSync(srcDir, { withFileTypes: true })) {\n    const srcPath = join(srcDir, entry.name);\n    const destPath = join(destDir, entry.name);\n    if (entry.isDirectory()) {\n      copyDirRecursive(srcPath, destPath);\n    } else {\n      copyFileSync(srcPath, destPath);\n    }\n  }\n}\n\nconst PRESERVED_OUT_DIR_ENTRIES = new Set([\"examples\"]);\n\nfunction assertValidDocsConfig(\n  config: ResolvedDocsConfig,\n  options: { surroundWithBlankLines?: boolean } = {},\n) {\n  const issues = validateConfig(config);\n  if (issues.length === 0) return;\n\n  if (options.surroundWithBlankLines) console.info(\"\");\n  const hasErrors = reportConfigIssues(issues);\n  if (options.surroundWithBlankLines) console.info(\"\");\n\n  if (hasErrors) {\n    throw new Error(\"Config validation failed — fix the errors above before building.\");\n  }\n}\n\nfunction clearDocsOutputDir(outDir: string): void {\n  mkdirSync(outDir, { recursive: true });\n\n  for (const entry of readdirSync(outDir, { withFileTypes: true })) {\n    if (PRESERVED_OUT_DIR_ENTRIES.has(entry.name)) continue;\n    rmSync(join(outDir, entry.name), { recursive: true, force: true });\n  }\n}\n\nfunction syncDocsOutput(stagingDir: string, outDir: string): void {\n  clearDocsOutputDir(outDir);\n  copyDirRecursive(stagingDir, outDir);\n}\n\nfunction copyMappedAssets(config: ResolvedDocsConfig): void {\n  for (const [outputPath, sources] of config.assets) {\n    // Normalize output path: \"/\" → outDir root, \"/api\" → outDir/api\n    const destDir = outputPath === \"/\" ? config.outDir : join(config.outDir, outputPath);\n    mkdirSync(destDir, { recursive: true });\n\n    for (const sourcePath of sources) {\n      if (!existsSync(sourcePath)) continue;\n\n      const stat = statSync(sourcePath);\n      if (stat.isDirectory()) {\n        copyDirRecursive(sourcePath, join(destDir, basename(sourcePath)));\n      } else {\n        copyFileSync(sourcePath, join(destDir, basename(sourcePath)));\n      }\n    }\n  }\n}\n\nasync function copyContentAssetsToOutput(\n  outDir: string,\n  assets: ReturnType<typeof collectContentAssets>,\n): Promise<void> {\n  if (assets.byPath.size === 0) return;\n\n  const assetsDir = join(outDir, \"assets\");\n  mkdirSync(assetsDir, { recursive: true });\n\n  for (const [relPath, sourcePath] of assets.byPath) {\n    const destPath = join(assetsDir, relPath);\n    mkdirSync(dirname(destPath), { recursive: true });\n    copyFileSync(sourcePath, destPath);\n  }\n\n  await emitGeneratedImageVariants(assetsDir, assets);\n}\n\n/**\n * Build the docs sitemap by delegating to the shared `@pagesmith/site`\n * serializer. Draft pages are excluded; the home page is expressed as the\n * empty route so it maps to the base URL.\n *\n * Output matches the previous in-package implementation byte-for-byte for a\n * well-formed `origin` (no trailing slash — the common case). The one\n * behavioral delta: the shared serializer runs `normalizeOrigin`, so an\n * `origin` that ends in `/` now yields clean `<loc>`s instead of the doubled\n * slash the old string concatenation produced (`https://x.com//docs/…`). Docs\n * config does not normalize `origin`, so this is an improvement, not a\n * regression.\n */\nfunction generateSitemap(pages: DocsPage[], config: ResolvedDocsConfig): string {\n  const routes = pages\n    .filter((p) => !p.frontmatter.draft)\n    .map((p) => (p.isHome ? \"\" : p.routePath));\n  return generateSitemapXml(routes, { origin: config.origin, basePath: config.basePath });\n}\n\nconst LLMS_FILES = [\"llms.txt\", \"llms-full.txt\"];\n\nfunction copyLlmsFiles(config: ResolvedDocsConfig): void {\n  for (const fileName of LLMS_FILES) {\n    const sourcePath = join(config.rootDir, fileName);\n    const destPath = join(config.outDir, fileName);\n    if (existsSync(sourcePath) && !existsSync(destPath)) {\n      copyFileSync(sourcePath, destPath);\n    }\n  }\n}\n\nexport async function build(options: DocsBuildOptions = {}): Promise<void> {\n  const startTime = performance.now();\n  const config = await resolveDocsConfigAsync(options.configPath, {\n    outDir: options.outDir,\n    basePath: options.basePath,\n  });\n\n  // Validate config and report issues\n  assertValidDocsConfig(config, { surroundWithBlankLines: true });\n\n  const stagingDir = mkdtempSync(join(tmpdir(), \"pagesmith-docs-build-\"));\n  const buildConfig: ResolvedDocsConfig = { ...config, outDir: stagingDir };\n\n  try {\n    const contentAssets = collectContentAssets(buildConfig.contentDir);\n\n    await bundleThemeAssets(buildConfig);\n    const renderStart = performance.now();\n    const { pages } = await renderDocs(buildConfig);\n    const renderElapsed = Math.round(performance.now() - renderStart);\n    console.info(`  Rendered ${pages.length} pages in ${renderElapsed}ms`);\n    copyPublicAssets(buildConfig);\n    copyMappedAssets(buildConfig);\n    await copyContentAssetsToOutput(buildConfig.outDir, contentAssets);\n\n    // Copy favicon to output if not already present (e.g. bundled default not in public/)\n    if (buildConfig.favicon) {\n      const faviconDest = join(buildConfig.outDir, basename(buildConfig.favicon));\n      if (!existsSync(faviconDest)) {\n        copyFileSync(buildConfig.favicon, faviconDest);\n      }\n    }\n\n    // Auto-copy llms.txt convention files from project root\n    copyLlmsFiles(buildConfig);\n\n    // Auto-generate .nojekyll for GitHub Pages compatibility\n    writeFileSync(join(buildConfig.outDir, \".nojekyll\"), \"\");\n\n    // Auto-generate sitemap.xml when origin is configured\n    if (buildConfig.sitemap && buildConfig.origin !== \"https://example.com\") {\n      writeFileSync(join(buildConfig.outDir, \"sitemap.xml\"), generateSitemap(pages, buildConfig));\n    }\n\n    // Auto-generate robots.txt if not already present (from publicDir or assets)\n    const robotsPath = join(buildConfig.outDir, \"robots.txt\");\n    if (!existsSync(robotsPath)) {\n      const hasSitemap = buildConfig.sitemap && buildConfig.origin !== \"https://example.com\";\n      const sitemapLine = hasSitemap\n        ? `\\nSitemap: ${buildConfig.origin}${buildConfig.basePath}/sitemap.xml`\n        : \"\";\n      writeFileSync(robotsPath, `User-agent: *\\nAllow: /${sitemapLine}\\n`);\n    }\n\n    if (buildConfig.search.enabled) {\n      console.info(\"\");\n      try {\n        runPagefindIndexing(buildConfig.outDir, {\n          extraFlags: buildConfig.search.pagefindFlags,\n        });\n      } catch (error) {\n        throw new Error(\n          `Pagefind indexing failed: ${error instanceof Error ? error.message : String(error)}`,\n          { cause: error },\n        );\n      }\n    }\n\n    hashAssets(buildConfig.outDir, buildConfig.contentDir);\n\n    syncDocsOutput(buildConfig.outDir, config.outDir);\n\n    // Build summary\n    const duration = ((performance.now() - startTime) / 1000).toFixed(1);\n    const sectionCount = new Set(pages.map((p) => p.section).filter(Boolean)).size;\n    console.info(\"\");\n    console.info(`  Built ${pages.length} pages in ${sectionCount} sections (${duration}s)`);\n  } finally {\n    rmSync(stagingDir, { recursive: true, force: true });\n  }\n}\n\n/**\n * Rebuild content only — skips theme bundling and Pagefind indexing.\n * Used by the dev server for fast content-only rebuilds.\n */\nexport async function rebuildContent(options: DocsBuildOptions = {}): Promise<void> {\n  const config = await resolveDocsConfigAsync(options.configPath, {\n    outDir: options.outDir,\n    basePath: options.basePath,\n  });\n\n  assertValidDocsConfig(config);\n\n  const contentAssets = collectContentAssets(config.contentDir);\n\n  const { pages } = await renderDocs(config);\n  copyPublicAssets(config);\n  copyMappedAssets(config);\n  await copyContentAssetsToOutput(config.outDir, contentAssets);\n  copyLlmsFiles(config);\n\n  if (config.favicon) {\n    const faviconDest = join(config.outDir, basename(config.favicon));\n    if (!existsSync(faviconDest)) {\n      copyFileSync(config.favicon, faviconDest);\n    }\n  }\n\n  // Regenerate sitemap/robots/nojekyll for content-only rebuilds\n  writeFileSync(join(config.outDir, \".nojekyll\"), \"\");\n  if (config.sitemap && config.origin !== \"https://example.com\") {\n    writeFileSync(join(config.outDir, \"sitemap.xml\"), generateSitemap(pages, config));\n  }\n  const robotsPath = join(config.outDir, \"robots.txt\");\n  if (!existsSync(robotsPath)) {\n    const hasSitemap = config.sitemap && config.origin !== \"https://example.com\";\n    const sitemapLine = hasSitemap\n      ? `\\nSitemap: ${config.origin}${config.basePath}/sitemap.xml`\n      : \"\";\n    writeFileSync(robotsPath, `User-agent: *\\nAllow: /${sitemapLine}\\n`);\n  }\n\n  hashAssets(config.outDir, config.contentDir);\n}\n","import { exec, execFile } from \"child_process\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { createServer as createNetServer } from \"net\";\nimport { extname, join, resolve, sep } from \"path\";\nimport type { ServerResponse } from \"http\";\nimport { createLogger as createCoreLogger, type Logger } from \"@pagesmith/core/log\";\nimport type { SiteModel } from \"../content\";\nimport type { DocsLogLevel, DocsServerPort, ResolvedDocsConfig } from \"../config\";\n\n/**\n * Lower bound for `port: \"auto\"` resolution. Both the dev and preview servers\n * scan upward from this number for the first available port.\n */\nexport const AUTO_PORT_BASE = 4000;\nconst AUTO_PORT_MAX_ATTEMPTS = 100;\nconst STRICT_FALLBACK_MAX_ATTEMPTS = 20;\n\nconst MIME: Record<string, string> = {\n  \".html\": \"text/html; charset=utf-8\",\n  \".css\": \"text/css; charset=utf-8\",\n  \".js\": \"text/javascript; charset=utf-8\",\n  \".json\": \"application/json\",\n  \".png\": \"image/png\",\n  \".jpg\": \"image/jpeg\",\n  \".jpeg\": \"image/jpeg\",\n  \".gif\": \"image/gif\",\n  \".svg\": \"image/svg+xml\",\n  \".webp\": \"image/webp\",\n  \".avif\": \"image/avif\",\n  \".ico\": \"image/x-icon\",\n  \".woff\": \"font/woff\",\n  \".woff2\": \"font/woff2\",\n  \".xml\": \"application/xml\",\n  \".txt\": \"text/plain; charset=utf-8\",\n};\n\nconst WS_CLIENT_SCRIPT = `<script>\n(function() {\n  var retries = 0;\n  var ws = new WebSocket('ws://' + location.host + '/__ws');\n  ws.onmessage = function(e) {\n    var msg = JSON.parse(e.data);\n    if (msg.type === 'reload') location.reload();\n  };\n  ws.onclose = function() {\n    if (retries++ < 5) {\n      setTimeout(function() { location.reload(); }, 1000 * retries);\n    }\n  };\n})();\n</script>`;\n\n/**\n * Build a docs-aware server logger backed by `@pagesmith/core/log`.\n *\n * `DocsLogLevel` is a strict subset of the core `LogLevel` (it adds no levels),\n * so the values pass through unchanged. The `prefix` is fixed to\n * `[pagesmith:docs]` for visibility in CI logs.\n */\nexport function createLogger(level: DocsLogLevel = \"warn\"): Logger {\n  return createCoreLogger({ level, prefix: \"[pagesmith:docs]\" });\n}\n\nexport function serveFile(\n  filePath: string,\n  res: ServerResponse,\n  injectReload = false,\n  statusCode = 200,\n): void {\n  const ext = extname(filePath);\n  const contentType = MIME[ext] || \"application/octet-stream\";\n  const body = readFileSync(filePath);\n\n  if (ext === \".html\" && injectReload) {\n    const html = body.toString().replace(\"</body>\", `${WS_CLIENT_SCRIPT}</body>`);\n    res.writeHead(statusCode, { \"Content-Type\": contentType });\n    res.end(html);\n    return;\n  }\n\n  res.writeHead(statusCode, { \"Content-Type\": contentType });\n  res.end(body);\n}\n\nexport function logStartupSummary(\n  config: ResolvedDocsConfig,\n  model: SiteModel,\n  baseUrl: string,\n  logger: Logger = createLogger(\"info\"),\n): void {\n  const pageCount = model.pageByPath.size;\n  const sectionCount = model.sidebarBySection.size;\n\n  logger.info(`  ${pageCount} pages in ${sectionCount} sections`);\n  logger.info(\"\");\n\n  for (const [, sections] of model.sidebarBySection) {\n    const itemCount = sections.reduce((sum, s) => sum + s.items.length, 0);\n    const title = sections[0]?.title ?? \"(unknown)\";\n    const firstPath = sections[0]?.items[0]?.path ?? \"\";\n    const origin = new URL(baseUrl).origin;\n    const url = firstPath ? `${origin}${firstPath}` : baseUrl;\n    logger.info(`  ${title} (${itemCount} pages)  ${url}`);\n  }\n\n  logger.info(\"\");\n}\n\nexport function openBrowser(url: string): void {\n  const cmd =\n    process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n  if (process.platform === \"win32\") {\n    exec(`${cmd} ${JSON.stringify(url)}`);\n  } else {\n    execFile(cmd, [url], () => {});\n  }\n}\n\nexport type StaticRequestResult =\n  | { type: \"redirect\"; location: string }\n  | { type: \"file\"; filePath: string; statusCode: number }\n  | { type: \"not-found\" };\n\nfunction resolvePathWithinRoot(rootDir: string, requestPath: string): string | undefined {\n  const resolvedRoot = resolve(rootDir);\n  const resolvedPath = resolve(resolvedRoot, `.${requestPath}`);\n  return resolvedPath === resolvedRoot || resolvedPath.startsWith(`${resolvedRoot}${sep}`)\n    ? resolvedPath\n    : undefined;\n}\n\n/**\n * Resolve an incoming request pathname to a static file, handling basePath\n * stripping, directory index resolution, and 404 fallback. Shared between\n * dev and preview servers.\n */\nexport function resolveStaticRequest(\n  pathname: string,\n  basePath: string,\n  outDir: string,\n): StaticRequestResult {\n  if (basePath && (pathname === \"/\" || pathname === \"\")) {\n    return { type: \"redirect\", location: basePath };\n  }\n  if (basePath && pathname === `${basePath}/`) {\n    return { type: \"redirect\", location: basePath };\n  }\n\n  if (basePath && pathname !== basePath && pathname !== `${basePath}/`) {\n    if (!pathname.startsWith(`${basePath}/`)) {\n      return { type: \"not-found\" };\n    }\n  }\n\n  let stripped = pathname;\n  if (basePath && (pathname === basePath || pathname.startsWith(`${basePath}/`))) {\n    stripped = pathname.slice(basePath.length) || \"/\";\n  }\n\n  if (stripped.length > 1 && stripped.endsWith(\"/\")) {\n    const trimmed = stripped.replace(/\\/+$/, \"\");\n    return {\n      type: \"redirect\",\n      location: basePath ? `${basePath}${trimmed}` : trimmed,\n    };\n  }\n\n  const resolvedPath = resolvePathWithinRoot(outDir, stripped);\n  if (!resolvedPath) {\n    return { type: \"not-found\" };\n  }\n\n  let filePath = resolvedPath;\n\n  // GitHub Pages-compatible resolution: for paths without a file extension,\n  // try path.html first (trailingSlash: false), then path/index.html (trailingSlash: true).\n  if (!existsSync(filePath) || !extname(filePath)) {\n    const flatHtml = `${resolvedPath}.html`;\n    const dirIndex = join(resolvedPath, \"index.html\");\n    if (existsSync(flatHtml)) filePath = flatHtml;\n    else if (existsSync(dirIndex)) filePath = dirIndex;\n  }\n\n  if (!existsSync(filePath)) {\n    const notFoundDir = join(outDir, \"404\", \"index.html\");\n    const notFoundFile = join(outDir, \"404.html\");\n    if (existsSync(notFoundDir)) return { type: \"file\", filePath: notFoundDir, statusCode: 404 };\n    if (existsSync(notFoundFile)) return { type: \"file\", filePath: notFoundFile, statusCode: 404 };\n    return { type: \"not-found\" };\n  }\n\n  return { type: \"file\", filePath, statusCode: 200 };\n}\n\nexport function isPortAvailable(port: number): Promise<boolean> {\n  return new Promise((resolve) => {\n    const server = createNetServer();\n    server.once(\"error\", () => resolve(false));\n    server.once(\"listening\", () => {\n      server.close(() => resolve(true));\n    });\n    server.listen(port);\n  });\n}\n\nexport async function findAvailablePort(\n  startPort: number,\n  strictPort: boolean,\n  label: string,\n  logger: ReturnType<typeof createLogger> = createLogger(\"warn\"),\n): Promise<number> {\n  if (await isPortAvailable(startPort)) return startPort;\n  if (strictPort) {\n    throw new Error(\n      `Port ${startPort} is already in use (${label}). Disable strictPort to auto-find an available port.`,\n    );\n  }\n  for (\n    let port = startPort + 1;\n    port < startPort + STRICT_FALLBACK_MAX_ATTEMPTS && port <= 65535;\n    port++\n  ) {\n    if (await isPortAvailable(port)) {\n      logger.info(`  Port ${startPort} in use, using ${port} (${label})`);\n      return port;\n    }\n  }\n  throw new Error(\n    `No available port found in range ${startPort}–${startPort + STRICT_FALLBACK_MAX_ATTEMPTS - 1} for ${label}`,\n  );\n}\n\n/**\n * Scan upward from `startPort` and return the first port whose bind succeeds.\n * Used when `port: \"auto\"` is in effect — `strictPort` does not apply.\n */\nexport async function findFirstAvailablePort(\n  startPort: number,\n  label: string,\n  logger: ReturnType<typeof createLogger> = createLogger(\"warn\"),\n): Promise<number> {\n  for (let port = startPort; port < startPort + AUTO_PORT_MAX_ATTEMPTS && port <= 65535; port++) {\n    if (await isPortAvailable(port)) {\n      logger.info(`  Auto-selected port ${port} for ${label}`);\n      return port;\n    }\n  }\n  throw new Error(\n    `No available port found in range ${startPort}–${startPort + AUTO_PORT_MAX_ATTEMPTS - 1} for ${label}`,\n  );\n}\n\n/**\n * Resolve a `DocsServerPort` (number or `\"auto\"`) to a concrete bindable port.\n * `\"auto\"` always scans upward from {@link AUTO_PORT_BASE}; numeric ports honor\n * `strictPort` (throw vs scan upward).\n */\nexport async function resolveServerPort(\n  port: DocsServerPort,\n  strictPort: boolean,\n  label: string,\n  logger: ReturnType<typeof createLogger> = createLogger(\"warn\"),\n): Promise<number> {\n  if (port === \"auto\") {\n    return findFirstAvailablePort(AUTO_PORT_BASE, label, logger);\n  }\n  return findAvailablePort(port, strictPort, label, logger);\n}\n","import { existsSync, readFileSync } from \"fs\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"http\";\nimport { dirname, join, resolve } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { watch } from \"chokidar\";\nimport { type WebSocket, WebSocketServer } from \"ws\";\nimport {\n  getThemeRoot,\n  resolveDocsConfigAsync,\n  type DocsDevOptions,\n  type ResolvedDocsConfig,\n} from \"./config.js\";\nimport { loadDocsPages, loadRootMeta, loadSectionMetas, type SiteModel } from \"./content.js\";\nimport { buildSiteModel } from \"./navigation.js\";\nimport { build, rebuildContent } from \"./build.js\";\nimport {\n  createLogger,\n  logStartupSummary,\n  openBrowser,\n  resolveServerPort,\n  resolveStaticRequest,\n  serveFile,\n} from \"./server/shared\";\n\nfunction getDisplayHost(host: string): string {\n  return host === \"0.0.0.0\" || host === \"::\" ? \"localhost\" : host;\n}\n\nasync function loadSiteModel(config: ResolvedDocsConfig): Promise<SiteModel> {\n  const rootMeta = loadRootMeta(config.contentDir);\n  const sectionMetas = loadSectionMetas(config.contentDir);\n  const pages = await loadDocsPages(config, sectionMetas);\n  return buildSiteModel(config, pages, rootMeta, sectionMetas);\n}\n\nexport async function startDev(options: DocsDevOptions = {}): Promise<void> {\n  const configPath = resolve(options.configPath ?? join(process.cwd(), \"pagesmith.config.json5\"));\n  const buildOverrides: { configPath: string; outDir?: string; basePath?: string } = {\n    configPath,\n    outDir: options.outDir,\n    basePath: options.basePath,\n  };\n\n  await build(buildOverrides);\n  const config = await resolveDocsConfigAsync(configPath, {\n    outDir: options.outDir,\n    basePath: options.basePath,\n  });\n  const serverConfig = config.server;\n  const logger = createLogger(options.logLevel ?? serverConfig.logLevel);\n  // CLI port wins. A numeric CLI port forces strictPort so the user gets a\n  // clear failure if their requested port is busy; \"auto\" never throws.\n  const requestedPort = options.port ?? serverConfig.devPort;\n  const strictPort = options.port === undefined ? serverConfig.strictPort : options.port !== \"auto\";\n  const port = await resolveServerPort(requestedPort, strictPort, \"dev\", logger);\n  const themeRoot = getThemeRoot();\n  const watchTargets = [config.contentDir, configPath, themeRoot];\n  if (existsSync(config.publicDir)) {\n    watchTargets.push(config.publicDir);\n  }\n\n  let rebuilding = false;\n  let pending: \"full\" | \"content\" | false = false;\n  const clients = new Set<WebSocket>();\n\n  const base = config.basePath.replace(/\\/+$/, \"\");\n\n  function logRequest(status: number, method: string, pathname: string): void {\n    if (!logger.shouldLog(\"info\")) return;\n    const color = status < 300 ? \"\\x1b[32m\" : status < 400 ? \"\\x1b[36m\" : \"\\x1b[33m\";\n    logger.info(`  ${color}${status}\\x1b[0m ${method} ${pathname}`);\n  }\n\n  function notifyClients(): void {\n    const payload = JSON.stringify({ type: \"reload\" });\n    for (const client of clients) {\n      try {\n        client.send(payload);\n      } catch (error) {\n        logger.warn(\n          `  WS notify failed: ${error instanceof Error ? error.message : String(error)}`,\n        );\n      }\n    }\n  }\n\n  /**\n   * Determine rebuild type based on changed file path.\n   * Config/theme changes require full rebuild; content changes only need content rebuild.\n   */\n  function getChangeType(changedPath: string): \"full\" | \"content\" {\n    const resolved = resolve(changedPath);\n    if (resolved === resolve(configPath)) return \"full\";\n    if (resolved.startsWith(resolve(themeRoot))) return \"full\";\n    return \"content\";\n  }\n\n  async function doRebuild(type: \"full\" | \"content\", changedPath?: string): Promise<void> {\n    if (type === \"full\" && changedPath && resolve(changedPath) === resolve(configPath)) {\n      logger.info(\"  \\x1b[36mConfig changed, rebuilding...\\x1b[0m\");\n    }\n    const start = performance.now();\n    if (type === \"full\") {\n      await build(buildOverrides);\n    } else {\n      await rebuildContent(buildOverrides);\n    }\n    const elapsed = Math.round(performance.now() - start);\n    logger.info(\n      `  \\x1b[36m${type === \"full\" ? \"Full rebuild\" : \"Content rebuild\"} in ${elapsed}ms\\x1b[0m`,\n    );\n  }\n\n  const server = createServer((req: IncomingMessage, res: ServerResponse) => {\n    try {\n      const url = new URL(req.url || \"/\", `http://localhost:${port}`);\n      const method = req.method || \"GET\";\n      const pathname = url.pathname;\n\n      // Serve font files from site assets during dev (before static resolution)\n      if (\n        base ? pathname.startsWith(`${base}/assets/fonts/`) : pathname.startsWith(\"/assets/fonts/\")\n      ) {\n        const fontFile = pathname.replace(/.*\\/assets\\/fonts\\//, \"\");\n        if (fontFile && !fontFile.includes(\"..\") && !fontFile.includes(\"/\")) {\n          const sitePkgDir = dirname(\n            fileURLToPath(import.meta.resolve(\"@pagesmith/site/package.json\")),\n          );\n          const fontPath = join(sitePkgDir, \"assets\", \"fonts\", fontFile);\n          if (existsSync(fontPath)) {\n            logRequest(200, method, url.pathname);\n            res.writeHead(200, {\n              \"Content-Type\": \"font/woff2\",\n              \"Cache-Control\": \"public, max-age=31536000\",\n            });\n            res.end(readFileSync(fontPath));\n            return;\n          }\n        }\n      }\n\n      const result = resolveStaticRequest(pathname, base, config.outDir);\n\n      if (result.type === \"redirect\") {\n        logRequest(302, method, pathname);\n        res.writeHead(302, { Location: result.location });\n        res.end();\n        return;\n      }\n\n      if (result.type === \"not-found\") {\n        logRequest(404, method, url.pathname);\n        res.writeHead(404, { \"Content-Type\": \"text/html; charset=utf-8\" });\n        res.end(\"<h1>404</h1>\");\n        return;\n      }\n\n      logRequest(result.statusCode, method, url.pathname);\n      serveFile(result.filePath, res, true, result.statusCode);\n    } catch (error) {\n      logger.error(\n        `  Dev request failed: ${error instanceof Error ? error.message : String(error)}`,\n      );\n      if (!res.headersSent) {\n        res.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n      }\n      res.end(\"Internal server error\");\n    }\n  });\n\n  const wss = new WebSocketServer({ server, path: \"/__ws\" });\n  wss.on(\"connection\", (socket) => {\n    clients.add(socket);\n    socket.on(\"close\", () => clients.delete(socket));\n    socket.on(\"error\", (error) =>\n      logger.warn(`  WS socket error: ${error instanceof Error ? error.message : String(error)}`),\n    );\n  });\n  wss.on(\"error\", (error) =>\n    logger.warn(`  WS server error: ${error instanceof Error ? error.message : String(error)}`),\n  );\n\n  const devUrl = `http://${getDisplayHost(serverConfig.host)}:${port}${base || \"\"}`;\n\n  // Load site model for startup summary\n  const model = await loadSiteModel(config);\n\n  const shouldOpen = options.open ?? false;\n  server.listen(port, serverConfig.host, () => {\n    logger.info(\"\");\n    logger.info(`  Docs dev: ${devUrl}`);\n    logger.info(\"\");\n    logStartupSummary(config, model, devUrl, logger);\n    if (shouldOpen) openBrowser(devUrl);\n  });\n  server.on(\"error\", (error) =>\n    logger.error(`  Dev server error: ${error instanceof Error ? error.message : String(error)}`),\n  );\n\n  const watcher = watch(watchTargets, { ignoreInitial: true });\n  watcher.on(\"error\", (error) =>\n    logger.warn(`  Watcher error: ${error instanceof Error ? error.message : String(error)}`),\n  );\n  watcher.on(\"all\", async (_event, changedPath) => {\n    const changeType = getChangeType(changedPath);\n\n    if (rebuilding) {\n      // Escalate to full if any pending change requires it\n      pending = pending === \"full\" || changeType === \"full\" ? \"full\" : \"content\";\n      return;\n    }\n\n    rebuilding = true;\n    try {\n      await doRebuild(changeType, changedPath);\n      notifyClients();\n    } catch (err) {\n      logger.error(`  Rebuild failed: ${err instanceof Error ? err.message : String(err)}`);\n    } finally {\n      rebuilding = false;\n      while (pending) {\n        const nextType = pending;\n        pending = false;\n        rebuilding = true;\n        try {\n          await doRebuild(nextType);\n          notifyClients();\n        } catch (err) {\n          logger.error(`  Rebuild failed: ${err instanceof Error ? err.message : String(err)}`);\n        } finally {\n          rebuilding = false;\n        }\n      }\n    }\n  });\n}\n\nexport async function preview(options: DocsDevOptions = {}): Promise<void> {\n  const config = await resolveDocsConfigAsync(options.configPath, {\n    outDir: options.outDir,\n    basePath: options.basePath,\n  });\n  const serverConfig = config.server;\n  const logger = createLogger(options.logLevel ?? serverConfig.logLevel);\n\n  const { validateConfig: validate, reportConfigIssues: report } = await import(\"./config.js\");\n  const issues = validate(config);\n  if (issues.length > 0) {\n    const hasErrors = report(issues);\n    if (hasErrors) {\n      throw new Error(\"Config validation failed — fix the errors above.\");\n    }\n  }\n\n  const requestedPort = options.port ?? serverConfig.previewPort;\n  const strictPort = options.port === undefined ? serverConfig.strictPort : options.port !== \"auto\";\n  const port = await resolveServerPort(requestedPort, strictPort, \"preview\", logger);\n  const previewBase = config.basePath.replace(/\\/+$/, \"\");\n\n  function logRequest(status: number, method: string, pathname: string): void {\n    if (!logger.shouldLog(\"info\")) return;\n    const color = status < 300 ? \"\\x1b[32m\" : status < 400 ? \"\\x1b[36m\" : \"\\x1b[33m\";\n    logger.info(`  ${color}${status}\\x1b[0m ${method} ${pathname}`);\n  }\n\n  const server = createServer((req: IncomingMessage, res: ServerResponse) => {\n    try {\n      const url = new URL(req.url || \"/\", `http://localhost:${port}`);\n      const method = req.method || \"GET\";\n      const pathname = url.pathname;\n\n      const result = resolveStaticRequest(pathname, previewBase, config.outDir);\n\n      if (result.type === \"redirect\") {\n        logRequest(302, method, pathname);\n        res.writeHead(302, { Location: result.location });\n        res.end();\n        return;\n      }\n\n      if (result.type === \"not-found\") {\n        logRequest(404, method, url.pathname);\n        res.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n        res.end(\"Not found\");\n        return;\n      }\n\n      logRequest(result.statusCode, method, url.pathname);\n      serveFile(result.filePath, res, false, result.statusCode);\n    } catch (error) {\n      logger.error(\n        `  Preview request failed: ${error instanceof Error ? error.message : String(error)}`,\n      );\n      if (!res.headersSent) {\n        res.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n      }\n      res.end(\"Internal server error\");\n    }\n  });\n\n  const previewUrl = `http://${getDisplayHost(serverConfig.host)}:${port}${previewBase || \"\"}`;\n\n  // Load site model for startup summary\n  const model = await loadSiteModel(config);\n\n  const shouldOpen = options.open ?? false;\n  server.listen(port, serverConfig.host, () => {\n    logger.info(\"\");\n    logger.info(`  Docs preview: ${previewUrl}`);\n    logger.info(\"\");\n    logStartupSummary(config, model, previewUrl, logger);\n    if (shouldOpen) openBrowser(previewUrl);\n  });\n  server.on(\"error\", (error) =>\n    logger.error(\n      `  Preview server error: ${error instanceof Error ? error.message : String(error)}`,\n    ),\n  );\n}\n","/**\n * `@pagesmith/docs` high-level validator.\n *\n * Reads the resolved docs configuration and runs:\n *  - Markdown content validation via `@pagesmith/core` (frontmatter links,\n *    image presence, hosted-image reachability when requested).\n *  - Build-output validation via `@pagesmith/site/build-validator` using the\n *    configured `basePath` and `trailingSlash`.\n *\n * The docs preset supports `<picture>`-based light/dark diagrams, so the\n * build-output checks for theme variants and sidebar/TOC in-page anchors are\n * enabled by default.\n *\n * This API exists so CLI callers, the MCP server, and the in-repo docs\n * pipeline all share the same logic.\n */\n\nimport { existsSync, statSync } from \"fs\";\nimport { dirname, resolve } from \"path\";\nimport {\n  formatContentValidationReport,\n  loadContentSchemaMap,\n  validateContent,\n  type FileSchemaEntry,\n  type ValidateContentSummary,\n} from \"@pagesmith/core\";\nimport {\n  runBuildValidation,\n  validateBuildOutput,\n  type BuildValidationResult,\n} from \"@pagesmith/site/build-validator\";\nimport { resolveDocsConfigAsync, type ResolvedDocsConfig } from \"./config\";\n\nexport type DocsValidateOptions = {\n  /** Explicit config path (defaults to pagesmith.config.json5 in cwd). */\n  configPath?: string;\n  /** Content dir override. */\n  contentDir?: string;\n  /** Build output dir override. */\n  outDir?: string;\n  /** Base path override. */\n  basePath?: string;\n  /** Trailing-slash override. */\n  trailingSlash?: boolean;\n  /** Skip content validation entirely. */\n  skipContent?: boolean;\n  /** Skip build-output validation entirely. */\n  skipBuild?: boolean;\n  /** Fetch external URLs to verify reachability. */\n  checkExternal?: boolean;\n  /** Fetch timeout (ms). Default 10000. */\n  timeoutMs?: number;\n  /** Fetch concurrency. Default 8. */\n  concurrency?: number;\n  /** Print files with no issues to the content report. */\n  showClean?: boolean;\n  /**\n   * Whether to enforce that themed `<picture>` elements expose both a light\n   * and a dark variant. Default: true (the docs preset renders themed\n   * diagrams this way).\n   */\n  requireThemeVariants?: boolean;\n  /**\n   * Whether to enforce raster `<picture>` fallbacks have webp+avif siblings.\n   * Default: false (the docs content site largely uses SVG diagrams).\n   */\n  requireRasterModernFormats?: boolean;\n  /**\n   * Directory names to exclude from build-output validation. Useful when the\n   * docs output bundles sub-sites (e.g. `examples/`) with their own build\n   * configuration. Default: `['examples']`.\n   */\n  excludeBuildDirs?: string[];\n  /**\n   * Filenames the build output must contain. Defaults to the standard docs\n   * deliverables (`favicon.svg|favicon.ico`, `sitemap.xml`, `robots.txt`,\n   * `llms.txt`, `llms-full.txt`). Pass `[]` to skip the check entirely.\n   */\n  requiredOutputFiles?: Array<string | string[]>;\n  /**\n   * When true, enforce that every page is reachable both at `path.html` and\n   * `path/index.html` so links survive either trailing-slash routing mode.\n   * Default: false.\n   */\n  requireBothTrailingSlashForms?: boolean;\n  /**\n   * When true, non-image internal markdown links must resolve to another\n   * markdown file (rather than an arbitrary asset). Default: false — most\n   * docs sites intentionally link into passthrough assets.\n   */\n  internalLinksMustBeMarkdown?: boolean;\n  /**\n   * When true, every internal page link must be authored as a relative\n   * path ending in `.md` / `.mdx` (for example `./relative/README.md`).\n   * Site-absolute URLs like `/guide/foo` and bare relative forms like\n   * `./foo` / `./foo/` become errors. Default: true under the docs preset\n   * so the source form is always a real, grep-able file path.\n   */\n  requireCanonicalInternalLinks?: boolean;\n  /**\n   * When true, every image must carry non-empty alt text. Default: true.\n   */\n  requireAltText?: boolean;\n  /**\n   * When true, fail if the markdown contains a raw `<img>` HTML tag.\n   * Default: true.\n   */\n  forbidHtmlImgTag?: boolean;\n  /**\n   * When true, `-light`/`-dark` image references must appear as an adjacent\n   * pair. Default: true.\n   */\n  requireThemeVariantPairs?: boolean;\n  /**\n   * Path to a `content.config.{ts,mts,mjs,js}` file declaring typed\n   * collections. When omitted, `validateDocs` looks for one in the project\n   * root (the directory of the resolved pagesmith config) and then in the\n   * current working directory. Pass `false` to disable auto-loading.\n   */\n  contentConfig?: string | false;\n  /** Stream console output while validating. Default true. */\n  verbose?: boolean;\n};\n\nexport type DocsValidateResult = {\n  config: ResolvedDocsConfig;\n  content?: ValidateContentSummary;\n  build?: BuildValidationResult;\n  errors: number;\n  warnings: number;\n  passed: boolean;\n};\n\n/**\n * Run docs validation against a `pagesmith.config.json5`.\n *\n * Callers get back the merged summaries plus total counts so they can either\n * render a custom report or exit-code on `errors > 0`.\n */\n/**\n * Convert the resolved config's asset mappings into `additionalRoots`\n * entries that the link validator can use to resolve site-absolute URLs.\n *\n * Each docs `assets[<prefix>]` array can contain file paths (which expose a\n * single URL) or directories (which expose every file inside). File-only\n * entries are folded into a synthetic directory root on their parent\n * directory so that the prefix still maps to a filesystem root.\n */\nfunction buildAssetRoots(assets: Map<string, string[]>): Array<{ prefix: string; dir: string }> {\n  const roots: Array<{ prefix: string; dir: string }> = [];\n  for (const [prefix, sources] of assets) {\n    // Group entries by their filesystem parent so we do not add duplicate\n    // roots for the same directory.\n    const dirs = new Set<string>();\n    for (const source of sources) {\n      try {\n        const stat = statSync(source);\n        if (stat.isDirectory()) {\n          dirs.add(source);\n        } else {\n          dirs.add(dirname(source));\n        }\n      } catch {\n        // Missing asset source; skip it.\n      }\n    }\n    for (const dir of dirs) {\n      roots.push({ prefix, dir });\n    }\n  }\n  return roots;\n}\n\nexport async function validateDocs(options: DocsValidateOptions = {}): Promise<DocsValidateResult> {\n  const config = await resolveDocsConfigAsync(options.configPath, {\n    outDir: options.outDir,\n    basePath: options.basePath,\n  });\n\n  const contentDir = options.contentDir ? resolve(options.contentDir) : config.contentDir;\n  const outDir = options.outDir ? resolve(options.outDir) : config.outDir;\n  const basePath = options.basePath ?? config.basePath;\n  const trailingSlash = options.trailingSlash ?? config.trailingSlash;\n  const excludeBuildDirs = options.excludeBuildDirs ?? [\"examples\"];\n\n  const verbose = options.verbose ?? true;\n\n  let errors = 0;\n  let warnings = 0;\n  let content: ValidateContentSummary | undefined;\n  let build: BuildValidationResult | undefined;\n\n  if (!options.skipContent) {\n    if (!existsSync(contentDir)) {\n      throw new Error(`Content directory not found: ${contentDir}`);\n    }\n    if (verbose) console.info(`Validating content: ${contentDir}`);\n    // Build additional resolution roots so links like /favicon.svg resolve\n    // against publicDir, `/prompts/setup-core.md` resolves against the\n    // configured assets mapping source dirs, and any link referring to a\n    // docs-generated asset (sitemap.xml, favicon, etc.) resolves against\n    // the existing build output when it is available.\n    const additionalRoots: Array<{ prefix: string; dir: string }> = [];\n    if (existsSync(config.publicDir)) {\n      additionalRoots.push({ prefix: \"/\", dir: config.publicDir });\n    }\n    additionalRoots.push(...buildAssetRoots(config.assets));\n    if (existsSync(outDir)) {\n      // Content URLs are authored without the site base path (e.g.\n      // `/favicon.svg`) but get prefixed with `basePath` at build time, so\n      // their resolved location is `<outDir>/favicon.svg`. Add outDir both\n      // with the bare prefix and the `basePath` prefix so either form in\n      // source markdown resolves correctly.\n      additionalRoots.push({ prefix: \"/\", dir: outDir });\n      if (basePath) {\n        additionalRoots.push({ prefix: basePath, dir: outDir });\n      }\n    }\n\n    // Auto-load content.config.* when the user hasn't opted out, so each\n    // collection's Zod schema applies to the markdown files it owns.\n    let schemaByFile: Map<string, FileSchemaEntry> | undefined;\n    if (options.contentConfig !== false) {\n      const searchDirs: string[] = [];\n      if (typeof options.contentConfig === \"string\") {\n        // Caller-provided path: treat its directory as the project root.\n        const explicit = resolve(options.contentConfig);\n        searchDirs.push(dirname(explicit));\n      } else {\n        // Default: look next to the resolved pagesmith config, then in cwd.\n        searchDirs.push(config.rootDir, process.cwd());\n      }\n      try {\n        const loaded = await loadContentSchemaMap(searchDirs);\n        if (loaded) {\n          schemaByFile = loaded.schemaByFile;\n          if (verbose) {\n            const collectionCount = Object.keys(loaded.collections).length;\n            console.info(\n              `Loaded content.config from ${loaded.configPath} (${loaded.schemaByFile.size} markdown files mapped across ${collectionCount} collection${collectionCount === 1 ? \"\" : \"s\"})`,\n            );\n          }\n        }\n      } catch (err) {\n        if (verbose) {\n          const message = err instanceof Error ? err.message : String(err);\n          console.warn(\n            `Failed to load content.config — continuing without per-file schemas: ${message}`,\n          );\n        }\n      }\n    }\n\n    content = await validateContent({\n      contentDir,\n      collectionName: \"docs\",\n      resolveFrontmatterSchema: schemaByFile\n        ? (filePath: string) => schemaByFile.get(filePath)?.schema\n        : undefined,\n      linkValidator: {\n        rootDir: contentDir,\n        basePath,\n        additionalRoots,\n        internalLinksMustBeMarkdown: options.internalLinksMustBeMarkdown,\n        requireCanonicalInternalLinks: options.requireCanonicalInternalLinks ?? true,\n        requireAltText: options.requireAltText,\n        forbidHtmlImgTag: options.forbidHtmlImgTag,\n        requireThemeVariantPairs: options.requireThemeVariantPairs,\n        checkExternalReachability: options.checkExternal,\n        fetchTimeoutMs: options.timeoutMs,\n        fetchConcurrency: options.concurrency,\n      },\n    });\n    if (verbose) {\n      console.info(formatContentValidationReport(content, { showClean: options.showClean }));\n    }\n    errors += content.errors;\n    warnings += content.warnings;\n  }\n\n  if (!options.skipBuild) {\n    if (!existsSync(outDir)) {\n      if (verbose) {\n        console.info(\n          `Skipping build validation — output directory does not exist: ${outDir}\\n` +\n            `  Run 'pagesmith-docs build' first or pass --skip-build.`,\n        );\n      }\n    } else {\n      const requiredOutputFiles =\n        options.requiredOutputFiles ??\n        ([\n          [\"favicon.svg\", \"favicon.ico\"],\n          \"sitemap.xml\",\n          \"robots.txt\",\n          \"llms.txt\",\n          \"llms-full.txt\",\n        ] satisfies Array<string | string[]>);\n\n      const buildOpts = {\n        outDir,\n        basePath,\n        trailingSlash,\n        exclude: excludeBuildDirs,\n        requireRasterModernFormats: options.requireRasterModernFormats ?? false,\n        requireThemeVariants: options.requireThemeVariants ?? true,\n        checkInPageAnchors: true,\n        requiredFiles: requiredOutputFiles,\n        requireBothTrailingSlashForms: options.requireBothTrailingSlashForms ?? false,\n      };\n      if (verbose) {\n        runBuildValidation(buildOpts);\n      }\n      build = validateBuildOutput(buildOpts);\n      errors += build.errors.length;\n      warnings += build.warnings.length;\n    }\n  }\n\n  return {\n    config,\n    content,\n    build,\n    errors,\n    warnings,\n    passed: errors === 0,\n  };\n}\n"],"mappings":"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"}