@tenphi/docs 0.17.1 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-CW0iIYp8.js","names":[],"sources":["../src/types.ts","../src/config/index.ts"],"sourcesContent":["import type { Styles, StylesWithoutSelectors } from \"@tenphi/tasty/core\";\nimport type {\n GlazeColorInput,\n GlazeColorValue,\n RegularColorDef,\n} from \"@tenphi/glaze\";\nimport type { Root } from \"mdast\";\n\nexport type DiagnosticSeverity = \"warning\" | \"error\";\n\nexport interface DocsDiagnostic {\n code: string;\n severity: DiagnosticSeverity;\n message: string;\n file?: string;\n line?: number;\n column?: number;\n hint?: string;\n related?: Array<{ file: string; line?: number; message: string }>;\n}\n\nexport interface SiteConfig {\n title?: string;\n /** Version of the documented package, rendered beside the site title. */\n version?: string;\n /** Selectable documentation versions and their route roots. */\n versions?: SiteVersion[];\n description?: string;\n url?: string;\n repository?: string;\n /** Header buttons, collapsed into a More menu on mobile. */\n headerLinks?: HeaderLink[];\n /** Source artwork used to generate browser, touch, and installable-app icons. */\n favicon?: string | SiteIconConfig;\n}\n\nexport interface SiteVersion {\n label: string;\n routeBase: string;\n}\n\nexport interface HeaderLink {\n label: string;\n /** HTTP(S) URL, root-relative route (prefixed with the site base), or fragment. */\n link: string;\n /** Desktop button variant; mobile More menus use uniform navigation links. */\n variant?: \"default\" | \"primary\";\n newTab?: boolean;\n}\n\nexport interface SiteIconConfig {\n /** Local SVG, PNG, JPEG, WebP, AVIF, or GIF path, relative to the project root. */\n source: string;\n /** Opaque background for touch and maskable icons. */\n background?: string;\n}\n\n/** A language exposed by Starlight's locale picker and routing. */\nexport interface LocaleConfig {\n label: string;\n /** BCP-47 language tag. Defaults to the locale key. */\n lang?: string;\n dir?: \"ltr\" | \"rtl\";\n}\n\nexport interface EditLinkConfig {\n /** Base URL joined with each page's repository-relative source path. */\n baseUrl: string;\n}\n\n/** A custom HTML element rendered in the document head. */\nexport interface HeadConfig {\n tag: string;\n attrs?: Record<string, string | boolean | undefined>;\n content?: string;\n}\n\nexport interface NavigationPlacement {\n label?: string;\n order?: number;\n group?: string;\n}\n\nexport type DocsSource = {\n /** Stable name for cross-source links and repeated mounts. */\n id?: string;\n routeBase?: string;\n} & (\n | {\n file: string;\n root?: string;\n route?: string;\n title?: string;\n description?: string;\n navigation?: false | NavigationPlacement;\n }\n | {\n glob: string | string[];\n root?: string;\n base?: string;\n routeBase?: string;\n exclude?: string[];\n navigation?: \"auto\" | false;\n }\n | {\n package: string;\n registry?: string;\n include?: string[];\n exclude?: string[];\n index?: string;\n routeBase?: string;\n trust?: \"markdown\" | \"mdx\";\n }\n | {\n /** Local OpenAPI 3.x JSON or YAML document. */\n openapi: string;\n root?: string;\n routeBase?: string;\n }\n);\n\nexport interface ContentConfig {\n sources?: DocsSource[];\n allowOutsideRoot?: boolean;\n /** Rewrite absolute links into the current repository to matching Cookbook routes. */\n localizeRepositoryLinks?: boolean;\n /** Keep unrelated metadata without exposing it as renderer frontmatter. */\n frontmatter?: \"preserve\" | \"reject\";\n}\n\nexport type NavigationItem =\n | string\n | { label: string; link?: string; items: NavigationItem[] }\n | { label: string; link?: string; autogenerate: { directory: string } }\n | { label: string; link: string };\n\nexport interface NavigationTab {\n label: string;\n link: string;\n /** Sidebar tree shown while this tab is active. */\n items?: NavigationItem[];\n}\n\nexport interface NavigationConfig {\n items?: NavigationItem[];\n /** Optional primary navigation rendered as a compact row below the header. */\n tabs?: NavigationTab[];\n}\n\nexport type BrandDeclaration = Pick<GlazeColorInput, \"hue\" | \"saturation\"> & {\n /** Single tone for the brand seed; contrast targets adapt it per mode. */\n tone: number;\n contrast?: { apca: number | [number, number] };\n unsafeContrast?: boolean;\n};\n\nexport type BrandConfig =\n | GlazeColorValue\n | {\n from: GlazeColorValue;\n contrast?: { apca: number | [number, number] };\n unsafeContrast?: boolean;\n }\n | BrandDeclaration;\n\nexport type ThemeTokenValue = string | number;\n\n/**\n * Tasty design tokens. `$name` is emitted as `--name`; existing `--name`\n * custom-property keys remain supported for compatibility.\n */\nexport interface ThemeTokens {\n $gap?: ThemeTokenValue;\n $radius?: ThemeTokenValue;\n \"$card-radius\"?: ThemeTokenValue;\n \"$border-width\"?: ThemeTokenValue;\n \"$outline-width\"?: ThemeTokenValue;\n \"$outline-offset\"?: ThemeTokenValue;\n \"$layout-width\"?: ThemeTokenValue;\n \"$content-width\"?: ThemeTokenValue;\n \"$sidebar-width\"?: ThemeTokenValue;\n \"$control-height\"?: ThemeTokenValue;\n [name: `$${string}`]: ThemeTokenValue | undefined;\n [customProperty: `--${string}`]: ThemeTokenValue | undefined;\n}\n\nexport interface TypographyPreset {\n fontFamily?: string;\n fontSize?: ThemeTokenValue;\n lineHeight?: ThemeTokenValue;\n letterSpacing?: ThemeTokenValue;\n fontWeight?: ThemeTokenValue;\n boldFontWeight?: ThemeTokenValue;\n iconSize?: ThemeTokenValue;\n textTransform?: ThemeTokenValue;\n fontStyle?: ThemeTokenValue;\n}\n\n/** Built-in presets can be overridden and additional Tasty presets may be added. */\nexport interface TypographyPresets {\n body?: TypographyPreset;\n heading?: TypographyPreset;\n h1?: TypographyPreset;\n h2?: TypographyPreset;\n h3?: TypographyPreset;\n h4?: TypographyPreset;\n h5?: TypographyPreset;\n h6?: TypographyPreset;\n navigation?: TypographyPreset;\n small?: TypographyPreset;\n code?: TypographyPreset;\n [name: string]: TypographyPreset | undefined;\n}\n\n/** A font file served from the site's `public/` directory. */\nexport interface ThemeFontFile {\n /** Root-relative public URL, for example `/fonts/brand.woff2`. */\n src: string;\n /** A single weight or a variable-font range such as `\"100 900\"`. */\n weight?: number | `${number} ${number}`;\n style?: \"normal\" | \"italic\";\n}\n\n/** A Google Fonts family or a set of files hosted by the site. */\nexport type ThemeFont =\n | string\n | { google: string; weights?: number[] }\n | { family: string; files: ThemeFontFile[] };\n\nexport interface ThemeFonts {\n body?: ThemeFont;\n heading?: ThemeFont;\n code?: ThemeFont;\n}\n\n/** A Glaze declaration, or a literal color retained as a convenient seed shorthand. */\nexport type ThemePaletteColor = GlazeColorValue | RegularColorDef;\n\n/** Semantic palette declarations resolved for every appearance mode. */\nexport interface ThemePaletteConfig {\n info?: ThemePaletteColor;\n success?: ThemePaletteColor;\n warning?: ThemePaletteColor;\n danger?: ThemePaletteColor;\n /** Light-scheme page surface; dark and high-contrast values adapt. */\n surface?: ThemePaletteColor;\n /** Translucent header surface; defaults to the page surface declaration. */\n header?: ThemePaletteColor;\n /** Fixed underlay; defaults to black at 50% opacity in every scheme. */\n overlay?: ThemePaletteColor;\n /** Primary reading text, resolved against `surface`. */\n text?: ThemePaletteColor;\n /** Heading text; follows an explicit `text` declaration unless configured. */\n heading?: ThemePaletteColor;\n /** Secondary reading text, resolved against `surface`. */\n textSoft?: ThemePaletteColor;\n}\n\n/** Cookbook UI surfaces whose default Tasty styles can be customized. */\nexport const COOKBOOK_COMPONENT_NAMES = [\n \"Card\",\n \"Callout\",\n \"CodeGroup\",\n \"Tab\",\n \"Footer\",\n \"Hero\",\n \"PageFrame\",\n \"HeaderFrame\",\n \"HeaderLinks\",\n \"Heading\",\n \"Layout\",\n \"SearchButton\",\n \"TableOfContentsLayout\",\n \"LanguageSelect\",\n \"Logo\",\n \"MarkdownCodeBlock\",\n \"MarkdownHeading\",\n \"MarkdownInlineCode\",\n \"MarkdownTable\",\n \"Mermaid\",\n \"MobileMenuFooter\",\n \"MobileMenuToggle\",\n \"MobileNavigationTabs\",\n \"MobileTableOfContents\",\n \"PackageVersion\",\n \"VersionSwitcher\",\n \"Preview\",\n \"Sidebar\",\n \"SocialIcons\",\n \"Steps\",\n \"Tabs\",\n \"TableOfContents\",\n \"ThemeSelect\",\n \"TopNavigation\",\n \"StarlightHeader\",\n] as const;\n\nexport type CookbookComponentName = (typeof COOKBOOK_COMPONENT_NAMES)[number];\n\n/** Named Tasty sub-elements available on each configurable Cookbook surface. */\nexport const COOKBOOK_COMPONENT_SUB_ELEMENTS = {\n PageFrame: [\"MainFrame\", \"SidebarFrame\", \"Columns\"],\n HeaderFrame: [],\n Heading: [\n \"Level1\",\n \"Level2\",\n \"Level3\",\n \"Level4\",\n \"Level5\",\n \"Level6\",\n \"PageTitle\",\n ],\n HeaderLinks: [\n \"Desktop\",\n \"Link\",\n \"HoverLink\",\n \"PrimaryLink\",\n \"HoverPrimaryLink\",\n \"Trigger\",\n \"HoverTrigger\",\n \"Panel\",\n \"PanelNavigation\",\n \"PanelLink\",\n \"FirstPanelLink\",\n \"Close\",\n \"HoverClose\",\n ],\n Layout: [\"LockedPage\"],\n SearchButton: [\"Label\", \"Shortcut\", \"Hover\", \"Active\", \"NativeIcon\", \"Icon\"],\n TableOfContentsLayout: [\"Content\"],\n Card: [\"Heading2\", \"Heading3\", \"Paragraph\"],\n Callout: [\"Title\", \"Body\", \"Tip\", \"Caution\", \"Danger\"],\n CodeGroup: [\"Caption\", \"Pre\", \"Code\"],\n Tab: [\"Heading\", \"Hidden\", \"HiddenHeading\"],\n Footer: [\n \"Meta\",\n \"LoneMetaItem\",\n \"MetaLink\",\n \"HoverMetaLink\",\n \"Credit\",\n \"CreditLink\",\n \"HoverCreditLink\",\n ],\n Hero: [\n \"Visual\",\n \"Stack\",\n \"Copy\",\n \"Title\",\n \"Tagline\",\n \"Actions\",\n \"Action\",\n \"HoverAction\",\n \"PrimaryAction\",\n \"SecondaryAction\",\n \"MinimalAction\",\n \"ActionIcon\",\n ],\n LanguageSelect: [\n \"Label\",\n \"HoverLabel\",\n \"LabelIcon\",\n \"Select\",\n \"Caret\",\n \"Option\",\n ],\n Logo: [\"Svg\", \"Mark\"],\n MarkdownCodeBlock: [\n \"Pre\",\n \"CopyButton\",\n \"HoverCopyButton\",\n \"CopiedButton\",\n \"CopyIcon\",\n \"CopiedIcon\",\n ],\n MarkdownHeading: [\n \"Heading\",\n \"Heading1\",\n \"Heading2\",\n \"Heading3\",\n \"Heading4\",\n \"Heading5\",\n \"Heading6\",\n \"Link\",\n \"RevealedLink\",\n \"HoverLink\",\n \"LinkIcon\",\n \"CopiedLink\",\n \"CopiedLinkIcon\",\n \"CopiedIcon\",\n ],\n MarkdownTable: [\"Table\", \"Cell\", \"LastBodyRowCell\", \"HeaderCell\"],\n MarkdownInlineCode: [],\n Mermaid: [\"Diagram\", \"Text\", \"MonoText\"],\n MobileMenuFooter: [\"Social\"],\n MobileMenuToggle: [\n \"Control\",\n \"Icon\",\n \"Section\",\n \"Page\",\n \"HoverControl\",\n \"ActiveControl\",\n ],\n MobileNavigationTabs: [\n \"Trigger\",\n \"Marker\",\n \"Caret\",\n \"ExpandedCaret\",\n \"Label\",\n \"List\",\n \"Item\",\n \"Link\",\n \"HoverLink\",\n \"CurrentLink\",\n ],\n MobileTableOfContents: [\n \"Item\",\n \"Link\",\n \"LinkLabel\",\n \"HoverLink\",\n \"CurrentLink\",\n \"CurrentIndicator\",\n ],\n PackageVersion: [],\n VersionSwitcher: [\"Trigger\", \"Panel\", \"OpenPanel\", \"Link\", \"CurrentLink\"],\n Preview: [\"Caption\", \"Stage\", \"Frame\", \"Code\", \"Summary\", \"Pre\"],\n Sidebar: [\n \"Backdrop\",\n \"OpenBackdrop\",\n \"MobileHeading\",\n \"HomeLink\",\n \"HomeLogo\",\n \"HomeLabel\",\n \"Close\",\n \"HoverClose\",\n \"CloseIcon\",\n \"CurrentLink\",\n \"OpenPane\",\n \"Content\",\n \"Tree\",\n \"List\",\n \"Item\",\n \"TopLevelSpacing\",\n \"GroupSpacing\",\n \"NestedItem\",\n \"SectionHeading\",\n \"Control\",\n \"Summary\",\n \"GroupLabel\",\n \"GroupLabelText\",\n \"Link\",\n \"LinkLabel\",\n \"InteractiveControl\",\n \"SummaryMarker\",\n \"Caret\",\n \"ExpandedCaret\",\n \"LinkedSummary\",\n \"GroupLink\",\n \"LinkedSectionHeading\",\n \"SectionLink\",\n \"Badge\",\n \"TopLevelLink\",\n ],\n Steps: [\"Item\", \"Marker\"],\n SocialIcons: [\"Link\", \"HoverLink\", \"Icon\"],\n Tabs: [\"List\", \"Button\", \"SelectedButton\", \"FocusedButton\"],\n TableOfContents: [\n \"Heading\",\n \"List\",\n \"Item\",\n \"Link\",\n \"LinkLabel\",\n \"HoverLink\",\n \"CurrentLink\",\n ],\n ThemeSelect: [\n \"Trigger\",\n \"HoverTrigger\",\n \"ActiveTrigger\",\n \"Icon\",\n \"Panel\",\n \"OpenPanel\",\n \"Section\",\n \"SectionSpacing\",\n \"SectionLabel\",\n \"Option\",\n \"HoverOption\",\n \"CheckedOption\",\n \"FocusedOption\",\n \"Input\",\n \"OptionIcon\",\n \"Checkmark\",\n \"SelectedCheckmark\",\n ],\n TopNavigation: [\n \"Scrollbar\",\n \"Link\",\n \"HoverLink\",\n \"CurrentLink\",\n \"ActiveIndicator\",\n ],\n StarlightHeader: [\n \"Primary\",\n \"TitleAndSearch\",\n \"Title\",\n \"LogoLink\",\n \"Logo\",\n \"SiteTitle\",\n \"Search\",\n \"SearchElement\",\n \"Tools\",\n \"ToolItem\",\n \"Social\",\n \"MobileTheme\",\n ],\n} as const satisfies Record<CookbookComponentName, readonly string[]>;\n\nexport type CookbookComponentSubElementName<\n Name extends CookbookComponentName,\n> = (typeof COOKBOOK_COMPONENT_SUB_ELEMENTS)[Name][number];\n\n/** A serializable partial Tasty style object, merged into the base internally. */\nexport type ComponentStyles = StylesWithoutSelectors & {\n $?: string;\n mode?: never;\n recipe?: string;\n [token: `$${string}`]: Styles[string];\n [color: `#${string}`]: Styles[string];\n [state: `@${string}`]: Styles[string];\n};\n\n/** Style properties supplied by the user to override Cookbook defaults. */\nexport type ComponentStyleConfig = ComponentStyles;\n\n/** A component override with typed suggestions for its named sub-elements. */\nexport type CookbookComponentStyles<Name extends CookbookComponentName> =\n ComponentStyles &\n Partial<Record<CookbookComponentSubElementName<Name>, ComponentStyles>>;\n\nexport type ComponentStylesConfig = {\n [Name in CookbookComponentName]?: CookbookComponentStyles<Name>;\n};\n\nexport interface ThemeConfig {\n brand?: BrandConfig;\n palette?: ThemePaletteConfig;\n fonts?: ThemeFonts;\n states?: Record<string, string>;\n tokens?: ThemeTokens;\n presets?: TypographyPresets;\n /** Tasty UI styles, keyed by Cookbook component or bridge name. */\n styles?: ComponentStylesConfig;\n /** Explicit registration and overrides for user-authored components. */\n customStyles?: Record<string, Styles>;\n contrastLevel?: number | \"auto\";\n}\n\nexport interface MarkdownConfig {\n stripLeadingBadges?: boolean;\n /** Raw HTML policy for trusted Markdown. Untrusted package Markdown is always sanitized. */\n rawHtml?: \"allow\" | \"sanitize\" | \"strip\" | \"reject\";\n}\n\nexport interface SearchConfig {\n enabled?: boolean;\n}\n\nexport interface ComponentsConfig {\n /** Astro component paths keyed by Starlight component name. `Footer` also accepts `false`. */\n overrides?: Record<string, string | false>;\n}\n\nexport interface BuildConfig {\n strict?: boolean;\n ci?: boolean;\n cacheDir?: string;\n maxArtifactBytes?: number;\n maxUnpackedBytes?: number;\n maxFiles?: number;\n maxPathDepth?: number;\n maxAssetBytes?: number;\n}\n\nexport interface DocsConfig {\n /** Content and lock directory, relative to docs.config.ts (or the inline root). */\n root?: string;\n /** Old public routes mapped to current document routes. */\n redirects?: Record<string, string>;\n site?: SiteConfig;\n head?: HeadConfig[];\n /** Enable source-aware “Edit page” links. */\n editLink?: EditLinkConfig;\n /** Show the most recent Git commit date for each local page. */\n lastUpdated?: boolean;\n /** Languages keyed by their URL segment, or `root` for `/`. */\n locales?: Record<string, LocaleConfig>;\n /** Locale key used for fallback content. */\n defaultLocale?: string;\n content?: ContentConfig;\n navigation?: NavigationConfig | NavigationItem[];\n theme?: ThemeConfig;\n markdown?: MarkdownConfig;\n search?: SearchConfig;\n components?: ComponentsConfig;\n build?: BuildConfig;\n}\n\nexport interface NormalizedDocsConfig {\n redirects: Record<string, string>;\n site: SiteConfig;\n head: HeadConfig[];\n editLink?: EditLinkConfig;\n lastUpdated: boolean;\n locales?: Record<string, LocaleConfig>;\n defaultLocale?: string;\n content: Required<\n Pick<ContentConfig, \"allowOutsideRoot\" | \"localizeRepositoryLinks\">\n > &\n ContentConfig;\n navigation: NavigationConfig;\n theme: ThemeConfig & { brand: BrandConfig };\n markdown: Required<Pick<MarkdownConfig, \"stripLeadingBadges\" | \"rawHtml\">> &\n MarkdownConfig;\n search: Required<SearchConfig>;\n components: ComponentsConfig;\n build: Required<BuildConfig> & { base: string };\n}\n\nexport interface DocsFrontmatter {\n aliases?: string[];\n title?: string;\n description?: string;\n slug?: string;\n draft?: boolean;\n sidebar?: false | { label?: string; order?: number; group?: string };\n tableOfContents?:\n false | { minHeadingLevel?: number; maxHeadingLevel?: number };\n editUrl?: false | string;\n /** Starlight page layout. */\n template?: \"doc\" | \"splash\";\n hero?: {\n title?: string;\n tagline?: string;\n image?:\n | { html: string }\n | { file: string; alt?: string }\n | { dark: string; light: string; alt?: string };\n actions?: Array<{\n text: string;\n link: string;\n variant?: \"primary\" | \"secondary\" | \"minimal\";\n }>;\n };\n lastUpdated?: boolean | Date;\n prev?: false | string | { link?: string; label?: string };\n next?: false | string | { link?: string; label?: string };\n banner?: { content: string };\n pagefind?: boolean;\n head?: Array<Record<string, unknown>>;\n}\n\nexport interface DocsHeading {\n depth: number;\n text: string;\n slug: string;\n line?: number;\n}\n\nexport interface DocsReference {\n original: string;\n resolved?: string;\n targetSource?: string;\n fragment?: string;\n line?: number;\n}\n\nexport interface DocsAsset extends DocsReference {\n sourcePath?: string;\n publicPath?: string;\n hash?: string;\n bytes?: number;\n}\n\nexport interface DocsEntry {\n id: string;\n sourceId: string;\n routeBase: string;\n metadata: Record<string, unknown>;\n sourcePath: string;\n absolutePath: string;\n sourceRoot: string;\n route: string;\n title: string;\n description?: string;\n frontmatter: DocsFrontmatter;\n headings: DocsHeading[];\n body: string;\n transformedBody: string;\n ast: Root;\n links: DocsReference[];\n assets: DocsAsset[];\n trust: \"markdown\" | \"mdx\";\n package?: { requested: string; resolved: string };\n}\n\nexport interface DocsRoute {\n route: string;\n entryId: string;\n sourcePath: string;\n title: string;\n sidebar?: false | NavigationPlacement;\n}\n\nexport interface DocsGraph {\n redirects: Record<string, string>;\n root: string;\n config: NormalizedDocsConfig;\n entries: DocsEntry[];\n routes: DocsRoute[];\n assets: DocsAsset[];\n diagnostics: DocsDiagnostic[];\n entryByRoute(route: string): DocsEntry | undefined;\n entryBySource(sourcePath: string, sourceId?: string): DocsEntry | undefined;\n}\n\nexport interface PackageLockSource {\n requested: string;\n resolved: string;\n registry: string;\n integrity: string;\n vendored?: string;\n}\n\nexport interface CookbookLock {\n schemaVersion: 1;\n sources: PackageLockSource[];\n}\n\nexport interface PackageManifest {\n name: string;\n version: string;\n description?: string;\n homepage?: string;\n repository?: string | { type?: string; url?: string; directory?: string };\n cookbook?: {\n index?: string;\n include?: string[];\n exclude?: string[];\n theme?: { brand?: BrandConfig };\n };\n _integrity?: string;\n _resolved?: string;\n}\n\nexport interface PackageDiscovery {\n root: string;\n manifest: PackageManifest;\n home?: string;\n pages: string[];\n assets: string[];\n}\n\nexport interface CreateDocsGraphOptions {\n root?: string;\n config?: DocsConfig;\n lock?: CookbookLock;\n /** Public URL base used when rewriting routes and assets. */\n base?: string;\n}\n","import { glaze, type RegularColorDef } from \"@tenphi/glaze\";\nimport { mergeStyles, type Styles } from \"@tenphi/tasty/core\";\nimport {\n COOKBOOK_COMPONENT_NAMES,\n COOKBOOK_COMPONENT_SUB_ELEMENTS,\n} from \"../types.js\";\nimport type {\n BrandDeclaration,\n DocsConfig,\n DocsDiagnostic,\n NormalizedDocsConfig,\n ThemePaletteColor,\n} from \"../types.js\";\n\nconst DEFAULT_BRAND = \"okhsl(266 68% 48%)\";\nconst HEAD_KEYS = new Set([\"tag\", \"attrs\", \"content\"]);\nconst SITE_ICON_KEYS = new Set([\"source\", \"background\"]);\nconst COLOR_DECLARATION_KEYS = new Set([\n \"from\",\n \"tone\",\n \"saturation\",\n \"hue\",\n \"darkHue\",\n \"darkSaturation\",\n \"base\",\n \"contrast\",\n \"mode\",\n \"autoFlip\",\n \"opacity\",\n \"pastel\",\n \"role\",\n \"inherit\",\n]);\nconst ROOT_KEYS = new Set([\n \"root\",\n \"redirects\",\n \"site\",\n \"head\",\n \"editLink\",\n \"lastUpdated\",\n \"locales\",\n \"defaultLocale\",\n \"content\",\n \"navigation\",\n \"theme\",\n \"markdown\",\n \"search\",\n \"components\",\n \"build\",\n]);\n\nconst OBJECT_KEYS: Record<string, Set<string>> = {\n site: new Set([\n \"title\",\n \"version\",\n \"versions\",\n \"description\",\n \"url\",\n \"repository\",\n \"favicon\",\n \"headerLinks\",\n ]),\n content: new Set([\n \"sources\",\n \"allowOutsideRoot\",\n \"localizeRepositoryLinks\",\n \"frontmatter\",\n ]),\n markdown: new Set([\"stripLeadingBadges\", \"rawHtml\"]),\n search: new Set([\"enabled\"]),\n components: new Set([\"overrides\"]),\n theme: new Set([\n \"brand\",\n \"palette\",\n \"fonts\",\n \"states\",\n \"tokens\",\n \"presets\",\n \"styles\",\n \"customStyles\",\n \"contrastLevel\",\n ]),\n build: new Set([\n \"strict\",\n \"ci\",\n \"cacheDir\",\n \"maxArtifactBytes\",\n \"maxUnpackedBytes\",\n \"maxFiles\",\n \"maxPathDepth\",\n \"maxAssetBytes\",\n ]),\n};\n\nexport class DocsConfigError extends Error {\n readonly diagnostics: DocsDiagnostic[];\n\n constructor(diagnostics: DocsDiagnostic[]) {\n super(diagnostics.map((diagnostic) => diagnostic.message).join(\"\\n\"));\n this.name = \"DocsConfigError\";\n this.diagnostics = diagnostics;\n }\n}\n\nexport function validateConfig(config: DocsConfig): DocsDiagnostic[] {\n const diagnostics: DocsDiagnostic[] = [];\n if (config === null || typeof config !== \"object\" || Array.isArray(config)) {\n invalid(diagnostics, \"Documentation configuration must be an object.\");\n return diagnostics;\n }\n if (config.root !== undefined && typeof config.root !== \"string\") {\n invalid(diagnostics, \"root must be a directory path.\");\n }\n for (const key of Object.keys(config)) {\n if (!ROOT_KEYS.has(key)) unknown(diagnostics, key);\n }\n for (const [section, keys] of Object.entries(OBJECT_KEYS)) {\n const value = config[section as keyof DocsConfig];\n if (value === undefined) continue;\n if (!isRecord(value)) {\n invalid(diagnostics, `${section} must be an object.`);\n continue;\n }\n for (const key of Object.keys(value)) {\n if (!keys.has(key)) unknown(diagnostics, `${section}.${key}`);\n }\n }\n\n if (isRecord(config.site) && config.site.versions !== undefined) {\n if (\n !Array.isArray(config.site.versions) ||\n config.site.versions.length < 2\n ) {\n invalid(diagnostics, \"site.versions must contain at least two versions.\");\n } else {\n const bases = new Set<string>();\n for (const [index, version] of config.site.versions.entries()) {\n const path = `site.versions[${index}]`;\n if (!isRecord(version)) {\n invalid(diagnostics, `${path} must be an object.`);\n continue;\n }\n for (const key of Object.keys(version)) {\n if (key !== \"label\" && key !== \"routeBase\")\n unknown(diagnostics, `${path}.${key}`);\n }\n if (typeof version.label !== \"string\" || !version.label.trim())\n invalid(diagnostics, `${path}.label must be a non-empty string.`);\n const base = version.routeBase;\n if (\n typeof base !== \"string\" ||\n !base.startsWith(\"/\") ||\n (base !== \"/\" && base.endsWith(\"/\")) ||\n base.includes(\"//\") ||\n /[?#\\\\\\s]/.test(base) ||\n base.split(\"/\").some((segment) => segment === \".\" || segment === \"..\")\n ) {\n invalid(\n diagnostics,\n `${path}.routeBase must be a root-relative route without a trailing slash.`,\n );\n } else if (bases.has(base)) {\n invalid(diagnostics, `${path}.routeBase duplicates ${base}.`);\n } else {\n bases.add(base);\n }\n }\n }\n }\n\n if (isRecord(config.site) && config.site.headerLinks !== undefined) {\n if (!Array.isArray(config.site.headerLinks)) {\n invalid(diagnostics, \"site.headerLinks must be an array.\");\n } else {\n config.site.headerLinks.forEach((item, index) => {\n const path = `site.headerLinks[${index}]`;\n if (!isRecord(item)) {\n invalid(diagnostics, `${path} must be an object.`);\n return;\n }\n for (const key of Object.keys(item)) {\n if (![\"label\", \"link\", \"variant\", \"newTab\"].includes(key))\n unknown(diagnostics, `${path}.${key}`);\n }\n if (typeof item.label !== \"string\" || !item.label.trim())\n invalid(diagnostics, `${path}.label must be a non-empty string.`);\n if (\n typeof item.link !== \"string\" ||\n /[\\\\\\s]/.test(item.link) ||\n !(/^(?:\\/(?!\\/)|#)/.test(item.link) || isHttpUrl(item.link))\n )\n invalid(\n diagnostics,\n `${path}.link must be an HTTP(S) URL, root-relative route, or fragment.`,\n );\n if (\n item.variant !== undefined &&\n ![\"default\", \"primary\"].includes(item.variant as string)\n )\n invalid(\n diagnostics,\n `${path}.variant must be \"default\" or \"primary\".`,\n );\n if (item.newTab !== undefined && typeof item.newTab !== \"boolean\")\n invalid(diagnostics, `${path}.newTab must be a boolean.`);\n });\n }\n }\n\n if (config.navigation !== undefined && !Array.isArray(config.navigation)) {\n if (!isRecord(config.navigation)) {\n invalid(diagnostics, \"navigation must be an array or object.\");\n } else {\n for (const key of Object.keys(config.navigation)) {\n if (!new Set([\"items\", \"tabs\"]).has(key)) {\n unknown(diagnostics, `navigation.${key}`);\n }\n }\n if (\n config.navigation.items !== undefined &&\n !Array.isArray(config.navigation.items)\n ) {\n invalid(diagnostics, \"navigation.items must be an array.\");\n }\n if (\n config.navigation.tabs !== undefined &&\n !Array.isArray(config.navigation.tabs)\n ) {\n invalid(diagnostics, \"navigation.tabs must be an array.\");\n }\n }\n }\n if (Array.isArray(config.navigation)) {\n validateNavigationItems(config.navigation, \"navigation\", diagnostics);\n } else if (isRecord(config.navigation)) {\n if (Array.isArray(config.navigation.items)) {\n validateNavigationItems(\n config.navigation.items,\n \"navigation.items\",\n diagnostics,\n );\n }\n if (Array.isArray(config.navigation.tabs)) {\n for (const [index, tab] of config.navigation.tabs.entries()) {\n const path = `navigation.tabs[${index}]`;\n if (\n !isRecord(tab) ||\n typeof tab.label !== \"string\" ||\n typeof tab.link !== \"string\"\n ) {\n invalid(diagnostics, `${path} must have a label and link.`);\n } else if (tab.items !== undefined) {\n validateNavigationItems(tab.items, `${path}.items`, diagnostics);\n }\n }\n }\n }\n\n if (\n config.redirects !== undefined &&\n (!isRecord(config.redirects) ||\n Object.values(config.redirects).some(\n (value) => typeof value !== \"string\",\n ))\n )\n invalid(diagnostics, \"redirects must map old routes to document routes.\");\n const head = config.head;\n if (head !== undefined && !Array.isArray(head)) {\n invalid(diagnostics, \"head must be an array.\");\n } else {\n for (const [index, entry] of (head ?? []).entries()) {\n if (!isRecord(entry)) {\n invalid(diagnostics, `head[${index}] must be an object.`);\n continue;\n }\n for (const key of Object.keys(entry)) {\n if (!HEAD_KEYS.has(key)) {\n unknown(diagnostics, `head[${index}].${key}`);\n }\n }\n if (typeof entry.tag !== \"string\") {\n invalid(diagnostics, `head[${index}].tag must be a string.`);\n }\n if (entry.attrs !== undefined && !isRecord(entry.attrs)) {\n invalid(diagnostics, `head[${index}].attrs must be an object.`);\n } else {\n for (const [name, value] of Object.entries(entry.attrs ?? {})) {\n if (\n value !== undefined &&\n typeof value !== \"string\" &&\n typeof value !== \"boolean\"\n ) {\n invalid(\n diagnostics,\n `head[${index}].attrs.${name} must be a string or boolean.`,\n );\n }\n }\n }\n if (entry.content !== undefined && typeof entry.content !== \"string\") {\n invalid(diagnostics, `head[${index}].content must be a string.`);\n }\n }\n }\n\n const favicon = config.site?.favicon;\n if (favicon !== undefined) {\n if (typeof favicon === \"string\") {\n if (favicon.trim() === \"\") {\n invalid(diagnostics, \"site.favicon must be a non-empty local path.\");\n }\n } else if (!isRecord(favicon)) {\n invalid(\n diagnostics,\n \"site.favicon must be a local path or an object with a source path.\",\n );\n } else {\n for (const key of Object.keys(favicon)) {\n if (!SITE_ICON_KEYS.has(key)) {\n unknown(diagnostics, `site.favicon.${key}`);\n }\n }\n if (typeof favicon.source !== \"string\" || favicon.source.trim() === \"\") {\n invalid(diagnostics, \"site.favicon.source must be a non-empty string.\");\n }\n if (\n favicon.background !== undefined &&\n (typeof favicon.background !== \"string\" ||\n favicon.background.trim() === \"\")\n ) {\n invalid(\n diagnostics,\n \"site.favicon.background must be a non-empty color string.\",\n );\n }\n }\n }\n for (const field of [\"url\", \"repository\"] as const) {\n const value = config.site?.[field];\n if (value === undefined) continue;\n if (typeof value !== \"string\" || !isHttpUrl(value)) {\n invalid(diagnostics, `site.${field} must be an absolute HTTP(S) URL.`);\n }\n }\n\n if (\n config.editLink !== undefined &&\n (!isRecord(config.editLink) || typeof config.editLink.baseUrl !== \"string\")\n ) {\n invalid(diagnostics, \"editLink must contain a string baseUrl.\");\n } else if (config.editLink !== undefined) {\n for (const key of Object.keys(config.editLink)) {\n if (key !== \"baseUrl\") unknown(diagnostics, `editLink.${key}`);\n }\n try {\n new URL(config.editLink.baseUrl);\n } catch {\n invalid(diagnostics, \"editLink.baseUrl must be an absolute URL.\");\n }\n }\n if (\n config.lastUpdated !== undefined &&\n typeof config.lastUpdated !== \"boolean\"\n ) {\n invalid(diagnostics, \"lastUpdated must be a boolean.\");\n }\n if (config.locales !== undefined && !isRecord(config.locales)) {\n invalid(diagnostics, \"locales must be an object.\");\n } else {\n for (const [key, locale] of Object.entries(config.locales ?? {})) {\n if (!isRecord(locale) || typeof locale.label !== \"string\") {\n invalid(diagnostics, `locales.${key} must contain a string label.`);\n continue;\n }\n for (const property of Object.keys(locale)) {\n if (![\"label\", \"lang\", \"dir\"].includes(property)) {\n unknown(diagnostics, `locales.${key}.${property}`);\n }\n }\n if (locale.lang !== undefined && typeof locale.lang !== \"string\") {\n invalid(diagnostics, `locales.${key}.lang must be a string.`);\n }\n if (\n locale.dir !== undefined &&\n locale.dir !== \"ltr\" &&\n locale.dir !== \"rtl\"\n ) {\n invalid(diagnostics, `locales.${key}.dir must be \"ltr\" or \"rtl\".`);\n }\n }\n }\n if (\n config.defaultLocale !== undefined &&\n typeof config.defaultLocale !== \"string\"\n ) {\n invalid(diagnostics, \"defaultLocale must be a string.\");\n } else if (\n config.defaultLocale !== undefined &&\n (config.locales === undefined || !(config.defaultLocale in config.locales))\n ) {\n invalid(\n diagnostics,\n `defaultLocale must match a key in locales; received \"${config.defaultLocale}\".`,\n );\n }\n\n if (\n config.content?.allowOutsideRoot !== undefined &&\n typeof config.content.allowOutsideRoot !== \"boolean\"\n ) {\n invalid(diagnostics, \"content.allowOutsideRoot must be a boolean.\");\n }\n if (\n config.content?.localizeRepositoryLinks !== undefined &&\n typeof config.content.localizeRepositoryLinks !== \"boolean\"\n ) {\n invalid(diagnostics, \"content.localizeRepositoryLinks must be a boolean.\");\n }\n const configuredSources = config.content?.sources;\n if (configuredSources !== undefined && !Array.isArray(configuredSources)) {\n invalid(diagnostics, \"content.sources must be an array.\");\n }\n const sources = Array.isArray(configuredSources) ? configuredSources : [];\n for (const [index, source] of sources.entries()) {\n if (!isRecord(source)) {\n invalid(diagnostics, `content.sources[${index}] must be an object.`);\n continue;\n }\n const sourceRecord = source as unknown as Record<string, unknown>;\n const variants = [\"file\", \"glob\", \"package\", \"openapi\"].filter(\n (key) => key in source,\n );\n if (variants.length !== 1) {\n diagnostics.push({\n code: \"DOCS_CONFIG_INVALID\",\n severity: \"error\",\n message: `content.sources[${index}] must select exactly one of file, glob, package, or openapi.`,\n });\n continue;\n }\n const variant = variants[0] as \"file\" | \"glob\" | \"package\" | \"openapi\";\n const allowed = {\n file: new Set([\n \"id\",\n \"root\",\n \"routeBase\",\n \"file\",\n \"route\",\n \"title\",\n \"description\",\n \"navigation\",\n ]),\n glob: new Set([\n \"id\",\n \"root\",\n \"glob\",\n \"base\",\n \"routeBase\",\n \"exclude\",\n \"navigation\",\n ]),\n package: new Set([\n \"id\",\n \"package\",\n \"registry\",\n \"include\",\n \"exclude\",\n \"index\",\n \"routeBase\",\n \"trust\",\n ]),\n openapi: new Set([\"id\", \"root\", \"routeBase\", \"openapi\"]),\n }[variant];\n for (const key of Object.keys(source)) {\n if (!allowed.has(key))\n unknown(diagnostics, `content.sources[${index}].${key}`);\n }\n for (const field of [\n \"id\",\n \"root\",\n \"route\",\n \"routeBase\",\n \"base\",\n \"index\",\n \"title\",\n \"description\",\n \"registry\",\n ]) {\n if (\n sourceRecord[field] !== undefined &&\n typeof sourceRecord[field] !== \"string\"\n )\n invalid(\n diagnostics,\n `content.sources[${index}].${field} must be a string.`,\n );\n }\n if (\n typeof sourceRecord.id === \"string\" &&\n !/^[a-zA-Z0-9_-]+$/.test(sourceRecord.id)\n )\n invalid(\n diagnostics,\n `content.sources[${index}].id must contain only letters, numbers, underscores, and hyphens.`,\n );\n if (\n sourceRecord.trust !== undefined &&\n ![\"markdown\", \"mdx\"].includes(String(sourceRecord.trust))\n )\n invalid(\n diagnostics,\n `content.sources[${index}].trust must be \"markdown\" or \"mdx\".`,\n );\n if (\n typeof sourceRecord.registry === \"string\" &&\n !isHttpUrl(sourceRecord.registry)\n )\n invalid(\n diagnostics,\n `content.sources[${index}].registry must be an absolute HTTP(S) URL.`,\n );\n const selector = sourceRecord[variant];\n if (\n variant === \"glob\"\n ? typeof selector !== \"string\" &&\n (!Array.isArray(selector) ||\n selector.some((value) => typeof value !== \"string\"))\n : typeof selector !== \"string\" || selector.trim() === \"\"\n ) {\n invalid(\n diagnostics,\n `content.sources[${index}].${variant} must be ${variant === \"glob\" ? \"a string or string array\" : \"a non-empty string\"}.`,\n );\n }\n for (const list of [\"include\", \"exclude\"] as const) {\n const value = sourceRecord[list];\n if (\n value !== undefined &&\n (!Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\"))\n ) {\n invalid(\n diagnostics,\n `content.sources[${index}].${list} must be a string array.`,\n );\n }\n }\n }\n\n if (\n config.markdown?.stripLeadingBadges !== undefined &&\n typeof config.markdown.stripLeadingBadges !== \"boolean\"\n ) {\n invalid(diagnostics, \"markdown.stripLeadingBadges must be a boolean.\");\n }\n if (\n config.markdown?.rawHtml !== undefined &&\n ![\"allow\", \"sanitize\", \"strip\", \"reject\"].includes(config.markdown.rawHtml)\n ) {\n invalid(\n diagnostics,\n 'markdown.rawHtml must be \"allow\", \"sanitize\", \"strip\", or \"reject\".',\n );\n }\n if (\n config.search?.enabled !== undefined &&\n typeof config.search.enabled !== \"boolean\"\n ) {\n invalid(diagnostics, \"search.enabled must be a boolean.\");\n }\n for (const key of [\"strict\", \"ci\"] as const) {\n const value = config.build?.[key];\n if (value !== undefined && typeof value !== \"boolean\") {\n invalid(diagnostics, `build.${key} must be a boolean.`);\n }\n }\n for (const key of [\n \"maxArtifactBytes\",\n \"maxUnpackedBytes\",\n \"maxFiles\",\n \"maxPathDepth\",\n \"maxAssetBytes\",\n ] as const) {\n const value = config.build?.[key];\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n invalid(diagnostics, `build.${key} must be a positive integer.`);\n }\n }\n\n const brand = config.theme?.brand;\n if (\n typeof brand === \"object\" &&\n brand !== null &&\n \"contrast\" in brand &&\n !brand.unsafeContrast\n ) {\n const target = brand.contrast?.apca;\n const normal = Array.isArray(target) ? target[0] : target;\n if (typeof normal === \"number\" && normal < 45) {\n diagnostics.push({\n code: \"DOCS_CONFIG_INVALID\",\n severity: \"error\",\n message:\n \"theme.brand.contrast.apca cannot be below 45 without unsafeContrast.\",\n hint: \"Remove the override, use 45 or higher, or explicitly set unsafeContrast: true.\",\n });\n }\n }\n\n if (\n config.content?.frontmatter !== undefined &&\n ![\"preserve\", \"reject\"].includes(config.content.frontmatter)\n )\n invalid(diagnostics, 'content.frontmatter must be \"preserve\" or \"reject\".');\n for (const field of [\n \"styles\",\n \"customStyles\",\n \"palette\",\n \"fonts\",\n \"tokens\",\n \"states\",\n \"presets\",\n ] as const) {\n if (config.theme?.[field] !== undefined && !isRecord(config.theme[field]))\n invalid(diagnostics, `theme.${field} must be an object.`);\n }\n if (isRecord(config.theme?.fonts)) {\n for (const [role, font] of Object.entries(config.theme.fonts)) {\n const path = `theme.fonts.${role}`;\n if (![\"body\", \"heading\", \"code\"].includes(role)) {\n unknown(diagnostics, path);\n continue;\n }\n if (font === undefined) continue;\n if (typeof font === \"string\") {\n if (!validFontFamily(font))\n invalid(diagnostics, `${path} must name a Google Fonts family.`);\n continue;\n }\n if (!isRecord(font)) {\n invalid(\n diagnostics,\n `${path} must be a Google Fonts name or font definition.`,\n );\n continue;\n }\n if (\"google\" in font) {\n for (const key of Object.keys(font))\n if (![\"google\", \"weights\"].includes(key))\n unknown(diagnostics, `${path}.${key}`);\n if (!validFontFamily(font.google))\n invalid(\n diagnostics,\n `${path}.google must name a Google Fonts family.`,\n );\n if (\n font.weights !== undefined &&\n (!Array.isArray(font.weights) ||\n font.weights.length === 0 ||\n font.weights.some(\n (weight) =>\n !Number.isInteger(weight) || weight < 1 || weight > 1000,\n ))\n )\n invalid(\n diagnostics,\n `${path}.weights must be a non-empty array of font weights from 1 to 1000.`,\n );\n } else {\n for (const key of Object.keys(font))\n if (![\"family\", \"files\"].includes(key))\n unknown(diagnostics, `${path}.${key}`);\n if (!validFontFamily(font.family))\n invalid(diagnostics, `${path}.family must be a font family name.`);\n if (!Array.isArray(font.files) || font.files.length === 0) {\n invalid(\n diagnostics,\n `${path}.files must contain at least one font file.`,\n );\n continue;\n }\n font.files.forEach((file, index) => {\n const filePath = `${path}.files[${index}]`;\n if (!isRecord(file)) {\n invalid(diagnostics, `${filePath} must be an object.`);\n return;\n }\n for (const key of Object.keys(file))\n if (![\"src\", \"weight\", \"style\"].includes(key))\n unknown(diagnostics, `${filePath}.${key}`);\n if (\n typeof file.src !== \"string\" ||\n !/^\\/(?!\\/)[^\\s\"'()\\\\?#]+\\.(?:woff2?|ttf|otf)$/.test(file.src) ||\n file.src\n .split(\"/\")\n .some((segment) => segment === \".\" || segment === \"..\")\n )\n invalid(\n diagnostics,\n `${filePath}.src must be a root-relative .woff2, .woff, .ttf, or .otf public path.`,\n );\n if (\n file.weight !== undefined &&\n !(\n typeof file.weight === \"number\" &&\n Number.isInteger(file.weight) &&\n file.weight >= 1 &&\n file.weight <= 1000\n ) &&\n !(\n typeof file.weight === \"string\" &&\n /^(?:[1-9]\\d{0,2}|1000) (?:[1-9]\\d{0,2}|1000)$/.test(\n file.weight,\n ) &&\n Number(file.weight.split(\" \")[0]) <\n Number(file.weight.split(\" \")[1])\n )\n )\n invalid(\n diagnostics,\n `${filePath}.weight must be a weight from 1 to 1000 or an ascending range.`,\n );\n if (\n file.style !== undefined &&\n ![\"normal\", \"italic\"].includes(file.style as string)\n )\n invalid(diagnostics, `${filePath}.style must be normal or italic.`);\n });\n }\n }\n }\n for (const [name, entry] of Object.entries(config.theme?.styles ?? {})) {\n if (!(COOKBOOK_COMPONENT_NAMES as readonly string[]).includes(name)) {\n unknown(\n diagnostics,\n `theme.styles.${name}; register custom components under theme.customStyles`,\n );\n continue;\n }\n if (!isRecord(entry))\n invalid(\n diagnostics,\n `theme.styles.${name} must be a Tasty style object.`,\n );\n else {\n if (\"mode\" in entry)\n invalid(\n diagnostics,\n `theme.styles.${name} must contain only Tasty properties, without a mode wrapper.`,\n );\n const elements: readonly string[] =\n COOKBOOK_COMPONENT_SUB_ELEMENTS[\n name as keyof typeof COOKBOOK_COMPONENT_SUB_ELEMENTS\n ];\n for (const key of Object.keys(entry)) {\n if (/^[A-Z]/.test(key) && !elements.includes(key))\n unknown(diagnostics, `theme.styles.${name}.${key}`);\n }\n }\n }\n for (const [name, entry] of Object.entries(\n config.theme?.customStyles ?? {},\n )) {\n if ((COOKBOOK_COMPONENT_NAMES as readonly string[]).includes(name))\n invalid(\n diagnostics,\n `Use theme.styles.${name} for a built-in component.`,\n );\n if (\n !/^[A-Za-z][A-Za-z0-9_-]*$/.test(name) ||\n !isRecord(entry) ||\n \"mode\" in entry\n )\n invalid(\n diagnostics,\n `theme.customStyles.${name} must be a named partial Tasty style object.`,\n );\n }\n for (const [name, value] of Object.entries(config.theme?.palette ?? {})) {\n if (\n ![\n \"surface\",\n \"header\",\n \"overlay\",\n \"text\",\n \"heading\",\n \"textSoft\",\n \"info\",\n \"success\",\n \"warning\",\n \"danger\",\n ].includes(name)\n )\n unknown(diagnostics, `theme.palette.${name}`);\n validatePaletteColor(name, value, diagnostics);\n }\n if (brand !== undefined) {\n try {\n if (isBrandDeclaration(brand)) {\n glaze\n .color({\n hue: brand.hue,\n saturation: brand.saturation,\n tone: brand.tone,\n })\n .resolve();\n } else {\n glaze\n .color({\n from:\n typeof brand === \"object\" && brand !== null && \"from\" in brand\n ? brand.from\n : brand,\n })\n .resolve();\n }\n } catch (error) {\n invalid(\n diagnostics,\n `theme.brand: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n const contrast = config.theme?.contrastLevel;\n if (\n contrast !== undefined &&\n contrast !== \"auto\" &&\n (typeof contrast !== \"number\" ||\n !Number.isFinite(contrast) ||\n contrast < 0 ||\n contrast > 100)\n )\n invalid(\n diagnostics,\n 'theme.contrastLevel must be \"auto\" or a number from 0 to 100.',\n );\n\n const componentOverrides = config.components?.overrides;\n if (componentOverrides !== undefined && !isRecord(componentOverrides)) {\n invalid(diagnostics, \"components.overrides must be an object.\");\n } else {\n for (const [name, override] of Object.entries(componentOverrides ?? {})) {\n if (typeof override === \"string\") continue;\n if (name === \"Footer\" && override === false) continue;\n invalid(\n diagnostics,\n `components.overrides.${name} must be an Astro component path${name === \"Footer\" ? \" or false\" : \"\"}.`,\n );\n }\n }\n return diagnostics;\n}\n\nfunction validatePaletteColor(\n name: string,\n value: ThemePaletteColor,\n diagnostics: DocsDiagnostic[],\n): void {\n try {\n if (!isPaletteDeclaration(value)) {\n glaze.color({ from: value }).resolve();\n return;\n }\n for (const key of Object.keys(value)) {\n if (!COLOR_DECLARATION_KEYS.has(key))\n unknown(diagnostics, `theme.palette.${name}.${key}`);\n }\n const colorName = name === \"textSoft\" ? \"text-soft\" : name;\n const theme = glaze(266, 68);\n theme.colors({\n surface: { tone: 98 },\n \"surface-2\": { base: \"surface\", tone: \"-2\" },\n \"accent-surface\": { tone: 48 },\n text: { base: \"surface\", contrast: { apca: 75 } },\n heading: { base: \"surface\", tone: 4 },\n \"text-soft\": { base: \"surface\", contrast: { apca: 60 } },\n [colorName]: { tone: colorName === \"surface\" ? 98 : 50, ...value },\n });\n theme.resolve();\n } catch (error) {\n invalid(\n diagnostics,\n `theme.palette.${name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nfunction isPaletteDeclaration(\n value: ThemePaletteColor,\n): value is RegularColorDef {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !(\"h\" in value || \"r\" in value || \"c\" in value)\n );\n}\n\nfunction isBrandDeclaration(value: unknown): value is BrandDeclaration {\n return (\n isRecord(value) &&\n \"hue\" in value &&\n \"saturation\" in value &&\n \"tone\" in value\n );\n}\n\nfunction unknown(diagnostics: DocsDiagnostic[], path: string): void {\n diagnostics.push({\n code: \"DOCS_CONFIG_UNKNOWN_KEY\",\n severity: \"error\",\n message: `Unknown configuration key \"${path}\".`,\n });\n}\n\nfunction invalid(diagnostics: DocsDiagnostic[], message: string): void {\n diagnostics.push({\n code: \"DOCS_CONFIG_INVALID\",\n severity: \"error\",\n message,\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction validFontFamily(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n value.length <= 100 &&\n /^[\\p{L}\\p{N} ._-]+$/u.test(value) &&\n value.trim() === value &&\n value.length > 0\n );\n}\n\nfunction isHttpUrl(value: string): boolean {\n try {\n return [\"http:\", \"https:\"].includes(new URL(value).protocol);\n } catch {\n return false;\n }\n}\n\nfunction validateNavigationItems(\n items: unknown,\n path: string,\n diagnostics: DocsDiagnostic[],\n): void {\n if (!Array.isArray(items)) {\n invalid(diagnostics, `${path} must be an array.`);\n return;\n }\n for (const [index, item] of items.entries()) {\n const itemPath = `${path}[${index}]`;\n if (typeof item === \"string\") continue;\n if (!isRecord(item) || typeof item.label !== \"string\") {\n invalid(\n diagnostics,\n `${itemPath} must be a route or a labeled navigation item.`,\n );\n continue;\n }\n const group = \"items\" in item || \"autogenerate\" in item;\n if (\n group &&\n item.link !== undefined &&\n (typeof item.link !== \"string\" ||\n !/^\\/(?!\\/)[^?#\\\\\\s]*$/.test(item.link) ||\n item.link.includes(\"//\") ||\n item.link\n .split(\"/\")\n .some((segment) => segment === \".\" || segment === \"..\"))\n ) {\n invalid(\n diagnostics,\n `${itemPath}.link must be a root-relative page route without a query or fragment.`,\n );\n }\n if (\"items\" in item) {\n validateNavigationItems(item.items, `${itemPath}.items`, diagnostics);\n } else if (\"autogenerate\" in item) {\n if (\n !isRecord(item.autogenerate) ||\n typeof item.autogenerate.directory !== \"string\"\n ) {\n invalid(\n diagnostics,\n `${itemPath}.autogenerate.directory must be a directory path.`,\n );\n }\n } else if (typeof item.link !== \"string\") {\n invalid(diagnostics, `${itemPath}.link must be a URL or route.`);\n }\n }\n}\n\nexport function normalizeDocsConfig(\n config: DocsConfig = {},\n): NormalizedDocsConfig {\n const diagnostics = validateConfig(config);\n if (diagnostics.length > 0) throw new DocsConfigError(diagnostics);\n const navigation = Array.isArray(config.navigation)\n ? { items: config.navigation }\n : (config.navigation ?? {});\n\n return {\n redirects: { ...config.redirects },\n site: { ...config.site },\n head: [...(config.head ?? [])],\n ...(config.editLink ? { editLink: { ...config.editLink } } : {}),\n lastUpdated: config.lastUpdated ?? false,\n ...(config.locales ? { locales: { ...config.locales } } : {}),\n ...(config.defaultLocale ? { defaultLocale: config.defaultLocale } : {}),\n content: {\n allowOutsideRoot: false,\n localizeRepositoryLinks: false,\n ...config.content,\n },\n navigation,\n theme: { ...config.theme, brand: config.theme?.brand ?? DEFAULT_BRAND },\n markdown: {\n stripLeadingBadges: true,\n rawHtml: \"sanitize\",\n ...config.markdown,\n },\n search: { enabled: true, ...config.search },\n components: { ...config.components },\n build: {\n strict: true,\n ci: process.env.CI === \"true\",\n base: \"/\",\n cacheDir: \"\",\n maxArtifactBytes: 25 * 1024 * 1024,\n maxUnpackedBytes: 100 * 1024 * 1024,\n maxFiles: 10_000,\n maxPathDepth: 24,\n maxAssetBytes: 20 * 1024 * 1024,\n ...config.build,\n },\n };\n}\n\nexport function defineDocsConfig(config: DocsConfig): DocsConfig {\n const diagnostics = validateConfig(config);\n if (diagnostics.length > 0) throw new DocsConfigError(diagnostics);\n return config;\n}\n\n/** Compose presets. Color roles and fonts replace, other objects merge, and styles use Tasty semantics. */\nexport function mergeDocsConfig(...configs: DocsConfig[]): DocsConfig {\n const merge = (\n base: Record<string, unknown>,\n next: Record<string, unknown>,\n ) => {\n const result = { ...base };\n for (const [key, value] of Object.entries(next)) {\n if (value === undefined) continue;\n result[key] = isRecord(value)\n ? merge(isRecord(result[key]) ? result[key] : {}, value)\n : Array.isArray(value)\n ? [...value]\n : value;\n }\n return result;\n };\n return defineDocsConfig(\n configs.reduce<DocsConfig>((base, next) => {\n const diagnostics = validateConfig(next);\n if (diagnostics.length) throw new DocsConfigError(diagnostics);\n const result = merge(\n base as Record<string, unknown>,\n next as Record<string, unknown>,\n ) as DocsConfig;\n // A color declaration is one value. Merging its fields could retain an\n // obsolete `from` seed when a consumer switches to tone relationships.\n if (next.theme?.brand !== undefined)\n result.theme!.brand = next.theme.brand;\n if (next.theme?.palette)\n result.theme!.palette = {\n ...base.theme?.palette,\n ...Object.fromEntries(\n Object.entries(next.theme.palette).filter(\n ([, color]) => color !== undefined,\n ),\n ),\n };\n // Font definitions are alternatives, so a consumer can switch from a\n // Google family to local files (or back) in a layered configuration.\n if (next.theme?.fonts)\n result.theme!.fonts = {\n ...base.theme?.fonts,\n ...Object.fromEntries(\n Object.entries(next.theme.fonts).filter(\n ([, font]) => font !== undefined,\n ),\n ),\n };\n for (const field of [\"styles\", \"customStyles\"] as const) {\n if (!next.theme?.[field]) continue;\n const styles = { ...base.theme?.[field] } as Record<string, Styles>;\n for (const [name, configured] of Object.entries(next.theme[field])) {\n styles[name] = mergeStyles(styles[name] ?? {}, configured);\n }\n result.theme![field] = styles;\n }\n return result;\n }, {}),\n );\n}\n\nexport { COOKBOOK_COMPONENT_NAMES, COOKBOOK_COMPONENT_SUB_ELEMENTS };\n\nexport type {\n BrandConfig,\n BrandDeclaration,\n BuildConfig,\n ComponentStyleConfig,\n ComponentStyles,\n ComponentStylesConfig,\n CookbookComponentName,\n ComponentsConfig,\n ContentConfig,\n DocsConfig,\n DocsSource,\n EditLinkConfig,\n HeadConfig,\n LocaleConfig,\n MarkdownConfig,\n NavigationConfig,\n NavigationItem,\n NavigationPlacement,\n NavigationTab,\n NormalizedDocsConfig,\n SearchConfig,\n SiteConfig,\n HeaderLink,\n SiteIconConfig,\n ThemeConfig,\n ThemeFont,\n ThemeFontFile,\n ThemeFonts,\n ThemePaletteColor,\n ThemePaletteConfig,\n ThemeTokens,\n ThemeTokenValue,\n TypographyPreset,\n TypographyPresets,\n} from \"../types.js\";\n"],"mappings":";;;;AAmQA,MAAa,2BAA2B;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAKA,MAAa,kCAAkC;CAC7C,WAAW;EAAC;EAAa;EAAgB;CAAS;CAClD,aAAa,CAAC;CACd,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,aAAa;EACX;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,QAAQ,CAAC,YAAY;CACrB,cAAc;EAAC;EAAS;EAAY;EAAS;EAAU;EAAc;CAAM;CAC3E,uBAAuB,CAAC,SAAS;CACjC,MAAM;EAAC;EAAY;EAAY;CAAW;CAC1C,SAAS;EAAC;EAAS;EAAQ;EAAO;EAAW;CAAQ;CACrD,WAAW;EAAC;EAAW;EAAO;CAAM;CACpC,KAAK;EAAC;EAAW;EAAU;CAAe;CAC1C,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,gBAAgB;EACd;EACA;EACA;EACA;EACA;EACA;CACF;CACA,MAAM,CAAC,OAAO,MAAM;CACpB,mBAAmB;EACjB;EACA;EACA;EACA;EACA;EACA;CACF;CACA,iBAAiB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,eAAe;EAAC;EAAS;EAAQ;EAAmB;CAAY;CAChE,oBAAoB,CAAC;CACrB,SAAS;EAAC;EAAW;EAAQ;CAAU;CACvC,kBAAkB,CAAC,QAAQ;CAC3B,kBAAkB;EAChB;EACA;EACA;EACA;EACA;EACA;CACF;CACA,sBAAsB;EACpB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,uBAAuB;EACrB;EACA;EACA;EACA;EACA;EACA;CACF;CACA,gBAAgB,CAAC;CACjB,iBAAiB;EAAC;EAAW;EAAS;EAAa;EAAQ;CAAa;CACxE,SAAS;EAAC;EAAW;EAAS;EAAS;EAAQ;EAAW;CAAK;CAC/D,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,OAAO,CAAC,QAAQ,QAAQ;CACxB,aAAa;EAAC;EAAQ;EAAa;CAAM;CACzC,MAAM;EAAC;EAAQ;EAAU;EAAkB;CAAe;CAC1D,iBAAiB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,aAAa;EACX;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,eAAe;EACb;EACA;EACA;EACA;EACA;CACF;CACA,iBAAiB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;;;ACpfA,MAAM,gBAAgB;AACtB,MAAM,4BAAY,IAAI,IAAI;CAAC;CAAO;CAAS;AAAS,CAAC;AACrD,MAAM,iCAAiB,IAAI,IAAI,CAAC,UAAU,YAAY,CAAC;AACvD,MAAM,yCAAyB,IAAI,IAAI;CACrC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AACD,MAAM,4BAAY,IAAI,IAAI;CACxB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,cAA2C;CAC/C,sBAAM,IAAI,IAAI;EACZ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CACD,yBAAS,IAAI,IAAI;EACf;EACA;EACA;EACA;CACF,CAAC;CACD,0BAAU,IAAI,IAAI,CAAC,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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"content-CrWnRfN7.js","names":["parseYaml","inside","parseYaml"],"sources":["../src/html/index.ts","../src/graph/openapi.ts","../src/npm/index.ts","../src/graph/index.ts","../src/validation/index.ts","../src/content/index.ts"],"sourcesContent":["import type { Root } from \"hast\";\nimport { fromHtml } from \"hast-util-from-html\";\nimport { defaultSchema, sanitize } from \"hast-util-sanitize\";\nimport { toHtml } from \"hast-util-to-html\";\nimport { visit } from \"unist-util-visit\";\n\nconst schema = {\n ...defaultSchema,\n strip: [\"script\", \"style\", \"iframe\", \"object\", \"embed\", \"template\"],\n protocols: {\n ...defaultSchema.protocols,\n href: [...(defaultSchema.protocols?.href ?? []), \"source\"],\n },\n attributes: {\n ...defaultSchema.attributes,\n \"*\":\n defaultSchema.attributes?.[\"*\"]?.filter(\n (attribute) =>\n typeof attribute !== \"string\" ||\n ![\n \"color\",\n \"bgColor\",\n \"align\",\n \"border\",\n \"cellPadding\",\n \"cellSpacing\",\n ].includes(attribute),\n ) ?? [],\n },\n};\n\n/** Sanitize raw Markdown HTML while preserving separate inline opening/closing tags. */\nexport async function sanitizeMarkup(\n html: string,\n rewrite: (url: string, kind: \"link\" | \"image\") => Promise<string>,\n): Promise<string> {\n const closing = /^<\\/([a-z][a-z\\d-]*)\\s*>$/i.exec(html.trim());\n if (closing) {\n const tag = closing[1]?.toLowerCase() ?? \"\";\n return schema.tagNames?.includes(tag) ? `</${tag}>` : \"\";\n }\n const tree = sanitize(fromHtml(html, { fragment: true }), schema) as Root;\n const tasks: Promise<void>[] = [];\n visit(tree, \"element\", (element) => {\n for (const [property, kind] of [\n [\"href\", \"link\"],\n [\"src\", \"image\"],\n ] as const) {\n const value = element.properties[property];\n if (typeof value !== \"string\") continue;\n tasks.push(\n rewrite(value, kind).then((resolved) => {\n element.properties[property] = resolved;\n }),\n );\n }\n });\n await Promise.all(tasks);\n let result = toHtml(tree);\n // mdast represents inline <strong>text</strong> as three distinct nodes.\n const opening =\n /^<([a-z][a-z\\d-]*)(?:\\s+(?:[^<>\"']|\"[^\"]*\"|'[^']*')*)?\\s*>$/i.exec(\n html.trim(),\n );\n const first = tree.children[0];\n if (\n opening &&\n tree.children.length === 1 &&\n first?.type === \"element\" &&\n first.tagName === opening[1]?.toLowerCase() &&\n first.children.length === 0\n ) {\n result = result.replace(new RegExp(`</${first.tagName}>$`), \"\");\n }\n return result;\n}\n","import { parse as parseYaml } from \"yaml\";\n\nexport interface OpenApiPage {\n route: string;\n sourcePath: string;\n title: string;\n description?: string;\n body: string;\n}\n\ntype Data = Record<string, unknown>;\n\nconst METHODS = [\n \"get\",\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n \"head\",\n \"options\",\n \"trace\",\n];\n\n/** Turn a local OpenAPI 3 document into static, searchable Markdown pages. */\nexport function openApiPages(\n source: string,\n routeBase: string,\n text: string,\n): OpenApiPage[] {\n let document: unknown;\n try {\n document = source.endsWith(\".json\")\n ? JSON.parse(text)\n : parseYaml(text, { uniqueKeys: true });\n } catch (error) {\n throw new Error(`Invalid OpenAPI document ${source}: ${String(error)}`);\n }\n if (\n !record(document) ||\n typeof document.openapi !== \"string\" ||\n !document.openapi.startsWith(\"3.\")\n ) {\n throw new Error(`OpenAPI source ${source} must use OpenAPI 3.x.`);\n }\n if (\n !record(document.info) ||\n typeof document.info.title !== \"string\" ||\n !record(document.paths)\n ) {\n throw new Error(`OpenAPI source ${source} needs info.title and paths.`);\n }\n assertLocalReferences(document, document, source);\n\n const title = document.info.title;\n const description = string(document.info.description);\n const operations: Array<{\n method: string;\n path: string;\n operation: Data;\n route: string;\n title: string;\n }> = [];\n const routes = new Set<string>([routeBase]);\n for (const [path, rawItem] of Object.entries(document.paths)) {\n const item = resolveReference(rawItem, document);\n if (!path.startsWith(\"/\") || !record(item))\n throw new Error(`Invalid OpenAPI path ${path} in ${source}.`);\n for (const method of METHODS) {\n const operation = item[method];\n if (operation === undefined) continue;\n if (!record(operation))\n throw new Error(\n `Invalid ${method.toUpperCase()} ${path} in ${source}.`,\n );\n const name = string(operation.operationId) ?? `${method}-${path}`;\n const slug = slugify(name);\n if (!slug)\n throw new Error(\n `Cannot generate a route for ${method.toUpperCase()} ${path} in ${source}.`,\n );\n const route = `${routeBase === \"/\" ? \"\" : routeBase}/${slug}`;\n if (routes.has(route))\n throw new Error(\n `Duplicate OpenAPI operation route ${route} in ${source}. Give operations distinct operationId values.`,\n );\n routes.add(route);\n operations.push({\n method,\n path,\n operation,\n route,\n title: string(operation.summary) ?? `${method.toUpperCase()} ${path}`,\n });\n }\n }\n\n const overview: string[] = [`# ${escapeText(title)}`, \"\"];\n if (description) overview.push(description, \"\");\n if (typeof document.info.version === \"string\")\n overview.push(`**API version:** ${escapeText(document.info.version)}`, \"\");\n if (Array.isArray(document.servers) && document.servers.length) {\n overview.push(\"## Servers\", \"\");\n for (const server of document.servers) {\n if (record(server) && typeof server.url === \"string\")\n overview.push(\n `- \\`${escapeCode(server.url)}\\`${string(server.description) ? ` — ${escapeText(server.description as string)}` : \"\"}`,\n );\n }\n overview.push(\"\");\n }\n overview.push(\"## Operations\", \"\");\n for (const operation of operations)\n overview.push(\n `- [${escapeText(operation.method.toUpperCase())} ${escapeText(operation.path)} — ${escapeText(operation.title)}](${operation.route})`,\n );\n if (!operations.length) overview.push(\"No operations are defined.\");\n overview.push(\"\");\n\n const schemas =\n record(document.components) && record(document.components.schemas)\n ? document.components.schemas\n : undefined;\n if (schemas && Object.keys(schemas).length) {\n overview.push(\"## Schemas\", \"\");\n for (const [name, schema] of Object.entries(schemas)) {\n overview.push(`### ${escapeText(name)}`, \"\", jsonBlock(schema), \"\");\n }\n }\n const pages: OpenApiPage[] = [\n {\n route: routeBase,\n sourcePath: `${source}#overview.md`,\n title,\n ...(description ? { description } : {}),\n body: overview.join(\"\\n\"),\n },\n ];\n for (const {\n method,\n path,\n operation,\n route,\n title: operationTitle,\n } of operations) {\n const body: string[] = [\n `# ${escapeText(operationTitle)}`,\n \"\",\n `**${method.toUpperCase()}** \\`${escapeCode(path)}\\``,\n \"\",\n `[All operations](${routeBase})`,\n \"\",\n ];\n if (string(operation.description))\n body.push(operation.description as string, \"\");\n if (Array.isArray(operation.tags) && operation.tags.length)\n body.push(\n `**Tags:** ${operation.tags\n .filter((tag): tag is string => typeof tag === \"string\")\n .map(escapeText)\n .join(\", \")}`,\n \"\",\n );\n const pathItem = resolveReference(document.paths[path], document) as Data;\n const parameters = [\n ...(Array.isArray(pathItem.parameters) ? pathItem.parameters : []),\n ...(Array.isArray(operation.parameters) ? operation.parameters : []),\n ];\n if (parameters.length) {\n body.push(\n \"## Parameters\",\n \"\",\n \"| Name | In | Required | Description |\",\n \"| --- | --- | --- | --- |\",\n );\n for (const parameter of parameters) {\n const item = resolveReference(parameter, document);\n if (!record(item)) continue;\n const schema = record(item.schema)\n ? ` (${schemaLabel(item.schema)})`\n : \"\";\n body.push(\n `| ${tableCell(string(item.name) ?? \"—\")} | ${tableCell(string(item.in) ?? \"—\")} | ${item.required === true ? \"Yes\" : \"No\"} | ${tableCell(`${string(item.description) ?? \"\"}${schema}`)} |`,\n );\n }\n body.push(\"\");\n }\n if (operation.requestBody !== undefined) {\n const request = resolveReference(operation.requestBody, document);\n if (record(request)) {\n body.push(\"## Request body\", \"\");\n if (string(request.description))\n body.push(request.description as string, \"\");\n body.push(\n `**Required:** ${request.required === true ? \"Yes\" : \"No\"}`,\n \"\",\n );\n renderContent(body, request.content);\n }\n }\n if (record(operation.responses)) {\n body.push(\"## Responses\", \"\");\n for (const [status, value] of Object.entries(operation.responses)) {\n const response = resolveReference(value, document);\n if (!record(response)) continue;\n body.push(\n `### ${escapeText(status)}${string(response.description) ? ` — ${escapeText(response.description as string)}` : \"\"}`,\n \"\",\n );\n renderContent(body, response.content);\n }\n }\n pages.push({\n route,\n sourcePath: `${source}#${route.slice(routeBase.length + 1)}.md`,\n title: operationTitle,\n ...(string(operation.description)\n ? { description: operation.description as string }\n : {}),\n body: body.join(\"\\n\"),\n });\n }\n return pages;\n}\n\nfunction renderContent(lines: string[], content: unknown): void {\n if (!record(content)) return;\n for (const [mediaType, media] of Object.entries(content)) {\n lines.push(`#### ${escapeText(mediaType)}`, \"\");\n if (record(media) && media.schema !== undefined)\n lines.push(jsonBlock(media.schema), \"\");\n if (record(media) && record(media.examples)) {\n for (const [name, example] of Object.entries(media.examples)) {\n const value =\n record(example) && \"value\" in example ? example.value : example;\n lines.push(\n `**Example: ${escapeText(name)}**`,\n \"\",\n jsonBlock(value),\n \"\",\n );\n }\n }\n }\n}\n\nfunction assertLocalReferences(\n value: unknown,\n document: Data,\n source: string,\n seen = new Set<object>(),\n): void {\n if (typeof value !== \"object\" || value === null || seen.has(value)) return;\n seen.add(value);\n if (Array.isArray(value)) {\n for (const item of value)\n assertLocalReferences(item, document, source, seen);\n } else {\n for (const [key, item] of Object.entries(value)) {\n if (\n key === \"$ref\" &&\n (typeof item !== \"string\" || !item.startsWith(\"#/\"))\n )\n throw new Error(\n `OpenAPI source ${source} has an external or invalid $ref; bundle references into the document first.`,\n );\n if (\n key === \"$ref\" &&\n typeof item === \"string\" &&\n lookupReference(item, document) === undefined\n )\n throw new Error(\n `OpenAPI source ${source} has an unresolved reference: ${item}.`,\n );\n assertLocalReferences(item, document, source, seen);\n }\n }\n}\n\nfunction resolveReference(value: unknown, document: Data): unknown {\n const visited = new Set<string>();\n while (record(value) && typeof value.$ref === \"string\") {\n const ref = value.$ref;\n if (visited.has(ref))\n throw new Error(`Circular OpenAPI reference: ${ref}.`);\n visited.add(ref);\n value = lookupReference(ref, document);\n if (value === undefined)\n throw new Error(`Unresolved OpenAPI reference: ${ref}.`);\n }\n return value;\n}\n\nfunction lookupReference(ref: string, document: Data): unknown {\n return ref\n .slice(2)\n .split(\"/\")\n .reduce<unknown>(\n (current, part) =>\n record(current)\n ? current[part.replace(/~1/g, \"/\").replace(/~0/g, \"~\")]\n : undefined,\n document,\n );\n}\n\nfunction record(value: unknown): value is Data {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction string(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length ? value : undefined;\n}\n\nfunction slugify(value: string): string {\n return value\n .normalize(\"NFKD\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\nfunction escapeText(value: string): string {\n return value.replace(/[\\\\`*_\\[\\]<>|]/g, \"\\\\$&\").replace(/\\r?\\n/g, \" \");\n}\n\nfunction escapeCode(value: string): string {\n return value.replace(/`/g, \"\\\\`\").replace(/\\r?\\n/g, \" \");\n}\n\nfunction tableCell(value: string): string {\n return escapeText(value);\n}\n\nfunction schemaLabel(schema: Data): string {\n return typeof schema.$ref === \"string\"\n ? (schema.$ref.split(\"/\").at(-1) ?? \"schema\")\n : (string(schema.type) ?? \"schema\");\n}\n\nfunction jsonBlock(value: unknown): string {\n const body = JSON.stringify(value, null, 2);\n let longest = 0;\n for (const [run] of body.matchAll(/`+/g))\n longest = Math.max(longest, run.length);\n const fence = \"`\".repeat(Math.max(3, longest + 1));\n return `${fence}json\\n${body}\\n${fence}`;\n}\n","import { createHash } from \"node:crypto\";\nimport { homedir } from \"node:os\";\nimport {\n lstat,\n mkdir,\n mkdtemp,\n readFile,\n readdir,\n rename,\n rm,\n stat,\n writeFile,\n} from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport npa from \"npm-package-arg\";\nimport pacote from \"pacote\";\nimport { glob } from \"tinyglobby\";\nimport type {\n NormalizedDocsConfig,\n PackageDiscovery,\n PackageLockSource,\n PackageManifest,\n CookbookLock,\n DocsConfig,\n} from \"../types.js\";\n\nconst DEFAULT_REGISTRY = \"https://registry.npmjs.org/\";\nconst LOCK_FILE = \"cookbook.lock.json\";\n\nexport interface ResolvePackageOptions {\n registry?: string;\n cacheDir?: string;\n}\n\nexport async function resolvePackageLock(\n requested: string,\n options: ResolvePackageOptions = {},\n): Promise<PackageLockSource> {\n const parsed = npa(requested);\n if (![\"tag\", \"version\", \"range\"].includes(parsed.type)) {\n throw new Error(\n `Only npm registry package specifiers are supported (received ${parsed.type}).`,\n );\n }\n const registry = options.registry ?? DEFAULT_REGISTRY;\n const manifest = (await pacote.manifest(requested, {\n registry,\n ...(options.cacheDir ? { cache: options.cacheDir } : {}),\n fullMetadata: true,\n })) as PackageManifest;\n if (!manifest.name || !manifest.version || !manifest._integrity) {\n throw new Error(\n `Registry metadata for ${requested} did not include version and integrity.`,\n );\n }\n return {\n requested,\n resolved: `${manifest.name}@${manifest.version}`,\n registry,\n integrity: manifest._integrity,\n };\n}\n\nexport async function readDocsLock(\n root: string,\n): Promise<CookbookLock | undefined> {\n try {\n const value = JSON.parse(\n await readFile(join(root, LOCK_FILE), \"utf8\"),\n ) as CookbookLock;\n validateLock(value);\n return value;\n } catch (error) {\n if (isMissing(error)) return undefined;\n throw error;\n }\n}\n\nexport async function writeDocsLock(\n root: string,\n lock: CookbookLock,\n): Promise<void> {\n validateLock(lock);\n const temporary = await mkdtemp(join(root, \".cookbook-lock-\"));\n try {\n await writeFile(\n join(temporary, LOCK_FILE),\n `${JSON.stringify(lock, null, 2)}\\n`,\n \"utf8\",\n );\n await rename(join(temporary, LOCK_FILE), join(root, LOCK_FILE));\n } finally {\n await rm(temporary, { recursive: true, force: true });\n }\n}\n\n/** Reconcile declarations, including the first lock and removed sources. */\nexport async function reconcileDocsLock(\n config: DocsConfig,\n existing: CookbookLock | undefined,\n options: {\n packages?: string[];\n resolve?: typeof resolvePackageLock;\n } = {},\n): Promise<CookbookLock> {\n const configured = (config.content?.sources ?? []).filter(\n (source) => \"package\" in source,\n );\n const unique = new Map<string, (typeof configured)[number]>();\n for (const declaration of configured) {\n const previous = unique.get(declaration.package);\n if (\n previous?.registry &&\n declaration.registry &&\n previous.registry !== declaration.registry\n )\n throw new Error(\n `Package source ${declaration.package} declares conflicting registries.`,\n );\n unique.set(declaration.package, {\n ...declaration,\n ...(previous?.registry ? { registry: previous.registry } : {}),\n });\n }\n const declarations = [...unique.values()];\n const selectors = options.packages ?? [];\n for (const selector of selectors) {\n if (\n !declarations.some(\n (source) =>\n source.package === selector ||\n packageNameFromSpecifier(source.package) === selector,\n )\n ) {\n throw new Error(`No configured package source matches \"${selector}\".`);\n }\n }\n const sources: PackageLockSource[] = [];\n for (const declaration of declarations) {\n const current = existing?.sources.find(\n (source) => source.requested === declaration.package,\n );\n const selected =\n selectors.length === 0 ||\n selectors.some(\n (selector) =>\n selector === declaration.package ||\n selector === packageNameFromSpecifier(declaration.package),\n );\n if (\n !selected &&\n current &&\n (!declaration.registry || declaration.registry === current.registry)\n ) {\n sources.push(current);\n continue;\n }\n if (!selected)\n throw new Error(\n `Package source ${declaration.package} is not locked. Run \"cookbook update\" without a package selector.`,\n );\n const previous =\n current ??\n existing?.sources.find(\n (source) =>\n packageNameFromSpecifier(source.requested) ===\n packageNameFromSpecifier(declaration.package),\n );\n const registry = declaration.registry ?? previous?.registry;\n const next = await (options.resolve ?? resolvePackageLock)(\n declaration.package,\n registry ? { registry } : {},\n );\n if (previous?.vendored) {\n next.vendored =\n next.integrity === previous.integrity\n ? previous.vendored\n : `.cookbook/vendor/${createHash(\"sha256\").update(next.integrity).digest(\"hex\")}`;\n }\n sources.push(next);\n }\n return defaultLock(sources);\n}\n\nexport function validateLock(lock: CookbookLock): void {\n if (lock.schemaVersion !== 1 || !Array.isArray(lock.sources)) {\n throw new Error(\"Unsupported or invalid cookbook.lock.json.\");\n }\n for (const source of lock.sources) {\n if (\n !source.requested ||\n !source.resolved ||\n !source.registry ||\n !source.integrity\n ) {\n throw new Error(\n \"Every lock source requires requested, resolved, registry, and integrity.\",\n );\n }\n const parsed = npa(source.resolved);\n if (parsed.type !== \"version\") {\n throw new Error(\n `Locked source must use an exact version: ${source.resolved}.`,\n );\n }\n if (\n source.vendored &&\n (source.vendored.startsWith(\"/\") ||\n source.vendored.split(/[\\\\/]/).includes(\"..\"))\n ) {\n throw new Error(\n `Vendored package path must stay within the project: ${source.vendored}.`,\n );\n }\n }\n}\n\nexport async function materializePackage(\n source: PackageLockSource,\n config: NormalizedDocsConfig[\"build\"],\n projectRoot?: string,\n): Promise<string> {\n if (source.vendored) {\n if (!projectRoot) {\n throw new Error(\n `Vendored source ${source.resolved} requires a project root.`,\n );\n }\n const vendored = resolve(projectRoot, source.vendored);\n if (!inside(projectRoot, vendored)) {\n throw new Error(\n `Vendored package path escapes the project root: ${source.vendored}.`,\n );\n }\n const marker = (\n await readFile(join(vendored, \".cookbook-integrity\"), \"utf8\")\n ).trim();\n if (marker !== source.integrity) {\n throw new Error(\n `Vendored package integrity marker does not match ${source.resolved}.`,\n );\n }\n await validateExtractedTree(vendored, config);\n return vendored;\n }\n const cacheRoot = resolve(\n config.cacheDir || join(homedir(), \".cache\", \"cookbook\"),\n \"artifacts\",\n );\n const key = createHash(\"sha256\").update(source.integrity).digest(\"hex\");\n const destination = join(cacheRoot, key);\n const marker = join(destination, \".cookbook-integrity\");\n try {\n if ((await readFile(marker, \"utf8\")).trim() === source.integrity) {\n await validateExtractedTree(destination, config);\n return destination;\n }\n } catch (error) {\n if (!isMissing(error)) throw error;\n }\n\n await mkdir(cacheRoot, { recursive: true });\n const temporary = await mkdtemp(join(cacheRoot, \".extract-\"));\n try {\n const tarball = await pacote.tarball(source.resolved, {\n registry: source.registry,\n integrity: source.integrity,\n cache: join(cacheRoot, \"_cacache\"),\n });\n if (tarball.byteLength > config.maxArtifactBytes) {\n throw new Error(\n `Package artifact is ${tarball.byteLength} bytes; limit is ${config.maxArtifactBytes}.`,\n );\n }\n await pacote.extract(source.resolved, temporary, {\n registry: source.registry,\n integrity: source.integrity,\n cache: join(cacheRoot, \"_cacache\"),\n });\n await validateExtractedTree(temporary, config);\n await writeFile(\n join(temporary, \".cookbook-integrity\"),\n `${source.integrity}\\n`,\n );\n await rm(destination, { recursive: true, force: true });\n await rename(temporary, destination);\n return destination;\n } catch (error) {\n await rm(temporary, { recursive: true, force: true });\n throw error;\n }\n}\n\nasync function validateExtractedTree(\n root: string,\n config: NormalizedDocsConfig[\"build\"],\n): Promise<void> {\n let files = 0;\n let bytes = 0;\n const pending = [root];\n while (pending.length > 0) {\n const directory = pending.pop();\n if (!directory) break;\n for (const name of await readdir(directory)) {\n if (name === \".cookbook-integrity\") continue;\n const path = join(directory, name);\n const info = await lstat(path);\n const rel = relative(root, path);\n if (rel.startsWith(`..${sep}`) || rel === \"..\") {\n throw new Error(`Package path escapes artifact root: ${rel}.`);\n }\n if (rel.split(sep).length > config.maxPathDepth) {\n throw new Error(`Package path exceeds maximum depth: ${rel}.`);\n }\n if (info.isSymbolicLink()) {\n throw new Error(`Package symlinks are not allowed: ${rel}.`);\n }\n if (info.isDirectory()) {\n pending.push(path);\n } else if (info.isFile()) {\n files += 1;\n bytes += info.size;\n if (info.size > config.maxAssetBytes) {\n throw new Error(`Package file exceeds maximum size: ${rel}.`);\n }\n if (files > config.maxFiles || bytes > config.maxUnpackedBytes) {\n throw new Error(\n \"Package exceeds configured file-count or unpacked-size limit.\",\n );\n }\n } else {\n throw new Error(`Unsupported package entry type: ${rel}.`);\n }\n }\n }\n}\n\nexport async function discoverPackage(root: string): Promise<PackageDiscovery> {\n const manifest = JSON.parse(\n await readFile(join(root, \"package.json\"), \"utf8\"),\n ) as PackageManifest;\n const hints = manifest.cookbook;\n const homeCandidates = [hints?.index, \"README.md\", \"readme.md\"].filter(\n (candidate): candidate is string => Boolean(candidate),\n );\n let home: string | undefined;\n for (const candidate of homeCandidates) {\n assertSafePackagePath(candidate, \"cookbook.index\");\n try {\n const path = resolve(root, candidate);\n if (!inside(root, path)) {\n throw new Error(\n `cookbook.index escapes the package root: ${candidate}.`,\n );\n }\n if ((await stat(path)).isFile()) {\n home = candidate;\n break;\n }\n } catch (error) {\n if (!isMissing(error)) throw error;\n }\n }\n\n const patterns = hints?.include?.length\n ? hints.include\n : [\n \"docs/**/*.{md,mdx}\",\n \"docs/**/*.{png,jpg,jpeg,gif,webp,avif,svg,pdf,txt,zip}\",\n ];\n for (const pattern of patterns) {\n assertSafePackagePath(pattern, \"cookbook.include\");\n }\n for (const pattern of hints?.exclude ?? []) {\n assertSafePackagePath(pattern, \"cookbook.exclude\");\n }\n const discovered = await glob(patterns, {\n cwd: root,\n onlyFiles: true,\n dot: false,\n ignore: hints?.exclude ?? [],\n });\n for (const path of discovered) {\n assertSafePackagePath(path, \"discovered package path\");\n if (!inside(root, resolve(root, path))) {\n throw new Error(`Discovered path escapes the package root: ${path}.`);\n }\n }\n const pages = discovered.filter((path) => /\\.mdx?$/i.test(path));\n if (home && !pages.includes(home)) pages.unshift(home);\n const assets = discovered.filter((path) => !/\\.mdx?$/i.test(path));\n return { root, manifest, ...(home ? { home } : {}), pages, assets };\n}\n\nexport function packageNameFromSpecifier(specifier: string): string {\n const parsed = npa(specifier);\n if (!parsed.name)\n throw new Error(`Invalid npm package specifier: ${specifier}.`);\n return parsed.name;\n}\n\nexport function lockForSource(\n lock: CookbookLock | undefined,\n requested: string,\n): PackageLockSource {\n const exact = lock?.sources.find((source) => source.requested === requested);\n if (exact) return exact;\n throw new Error(\n `Package source ${requested} is not locked. Run \"cookbook update\" to reconcile ${LOCK_FILE} with docs.config.ts.`,\n );\n}\n\n/** Reject paths and glob patterns that could address files outside a package. */\nexport function assertSafePackagePath(path: string, field: string): void {\n const normalized = path.replaceAll(\"\\\\\", \"/\");\n if (\n path.trim() === \"\" ||\n path.includes(\"\\0\") ||\n isAbsolute(path) ||\n normalized.startsWith(\"/\") ||\n /^[a-z]:\\//i.test(normalized) ||\n normalized.includes(\"..\")\n ) {\n throw new Error(`${field} must stay within the package root: ${path}.`);\n }\n}\n\nexport function defaultLock(sources: PackageLockSource[]): CookbookLock {\n return { schemaVersion: 1, sources };\n}\n\nfunction isMissing(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n\nfunction inside(root: string, path: string): boolean {\n const rel = relative(resolve(root), resolve(path));\n return (\n rel === \"\" ||\n (!rel.startsWith(`..${sep}`) && rel !== \"..\" && !isAbsolute(rel))\n );\n}\n","import { createHash } from \"node:crypto\";\nimport { execFile } from \"node:child_process\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport {\n basename,\n dirname,\n extname,\n isAbsolute,\n relative,\n resolve,\n sep,\n} from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { Definition, Image, Link, Root } from \"mdast\";\nimport { glob } from \"tinyglobby\";\nimport { visit } from \"unist-util-visit\";\nimport { parse as parseYaml } from \"yaml\";\nimport { sanitizeMarkup } from \"../html/index.js\";\nimport { openApiPages } from \"./openapi.js\";\nimport { normalizeDocsConfig } from \"../config/index.js\";\nimport {\n cloneAst,\n parseMarkdown,\n removeRenderedTitle,\n serializeMarkdown,\n stripLeadingBadgeBlock,\n} from \"../markdown/index.js\";\nimport {\n assertSafePackagePath,\n discoverPackage,\n lockForSource,\n materializePackage,\n readDocsLock,\n} from \"../npm/index.js\";\nimport type {\n CreateDocsGraphOptions,\n DocsAsset,\n DocsDiagnostic,\n DocsEntry,\n DocsFrontmatter,\n DocsGraph,\n DocsRoute,\n DocsSource,\n NavigationItem,\n NormalizedDocsConfig,\n NavigationPlacement,\n PackageLockSource,\n} from \"../types.js\";\n\ninterface RepositoryMetadata {\n url: string;\n directory?: string;\n}\n\ninterface CollectedSource {\n sourceId: string;\n routeBase?: string;\n absolutePath: string;\n sourcePath: string;\n sourceRoot: string;\n generatedBody?: string;\n editPath?: string;\n route?: string;\n title?: string;\n description?: string;\n navigation?: false | NavigationPlacement;\n trust: \"markdown\" | \"mdx\";\n packageLock?: PackageLockSource;\n repository?: RepositoryMetadata;\n}\n\nconst MARKDOWN_EXTENSIONS = [\".md\", \".mdx\"];\nconst execFileAsync = promisify(execFile);\nconst FRONTMATTER_KEYS = new Set([\n \"aliases\",\n \"title\",\n \"description\",\n \"slug\",\n \"draft\",\n \"sidebar\",\n \"tableOfContents\",\n \"editUrl\",\n \"template\",\n \"hero\",\n \"lastUpdated\",\n \"prev\",\n \"next\",\n \"banner\",\n \"pagefind\",\n \"head\",\n]);\n\nexport async function createDocsGraph(\n options: CreateDocsGraphOptions = {},\n): Promise<DocsGraph> {\n const root = resolve(options.root ?? process.cwd());\n const normalized = normalizeDocsConfig(options.config);\n const config: NormalizedDocsConfig = options.base\n ? { ...normalized, build: { ...normalized.build, base: options.base } }\n : normalized;\n const diagnostics: DocsDiagnostic[] = [];\n const lock = options.lock ?? (await readDocsLock(root));\n const collected = await collectSources(root, config, lock, diagnostics);\n const entries: DocsEntry[] = [];\n const routeMap = new Map<string, DocsEntry>();\n const absoluteMap = new Map<string, DocsEntry[]>();\n const sourceMap = new Map<string, DocsEntry[]>();\n const repositoryMap = new Map<string, RepositoryMetadata>();\n\n for (const source of collected) {\n const entry = await readEntry(source, config, diagnostics);\n if (!entry) continue;\n const existing = routeMap.get(entry.route);\n if (existing) {\n diagnostics.push({\n code: \"DOCS_DUPLICATE_ROUTE\",\n severity: \"error\",\n message: `Route ${entry.route} is owned by both ${existing.sourcePath} and ${entry.sourcePath}.`,\n file: entry.sourcePath,\n related: [{ file: existing.sourcePath, message: \"First route owner.\" }],\n });\n continue;\n }\n routeMap.set(entry.route, entry);\n if (source.generatedBody === undefined) {\n const absolute = normalizeFs(entry.absolutePath);\n absoluteMap.set(absolute, [...(absoluteMap.get(absolute) ?? []), entry]);\n }\n sourceMap.set(entry.sourcePath, [\n ...(sourceMap.get(entry.sourcePath) ?? []),\n entry,\n ]);\n sourceMap.set(entry.id, [entry]);\n if (source.repository) repositoryMap.set(entry.id, source.repository);\n entries.push(entry);\n }\n\n if (entries.length === 0) {\n diagnostics.push({\n code: \"DOCS_NO_PAGES\",\n severity: \"error\",\n message:\n \"No documentation pages were found. Add README.md, docs/**/*.md, or configure content.sources.\",\n });\n }\n\n const redirects = resolveRedirects(\n config.redirects,\n entries,\n routeMap,\n diagnostics,\n );\n for (const [alias, target] of Object.entries(redirects)) {\n const entry = routeMap.get(target);\n if (entry) routeMap.set(alias, entry);\n }\n for (const entry of entries) {\n await transformEntry(\n entry,\n absoluteMap,\n routeMap,\n repositoryMap,\n config,\n diagnostics,\n );\n }\n validateNavigation(config.navigation.items ?? [], routeMap, diagnostics);\n for (const tab of config.navigation.tabs ?? []) {\n validateNavigation(\n [{ label: tab.label, link: tab.link }],\n routeMap,\n diagnostics,\n );\n validateNavigation(tab.items ?? [], routeMap, diagnostics);\n }\n for (const version of config.site.versions ?? []) {\n if (!routeMap.has(version.routeBase)) {\n diagnostics.push({\n code: \"DOCS_VERSION_ROOT_MISSING\",\n severity: \"error\",\n message: `Version ${version.label} needs a page at ${version.routeBase}.`,\n });\n }\n }\n\n entries.sort((left, right) => left.route.localeCompare(right.route));\n const routes: DocsRoute[] = entries.map((entry) => ({\n route: entry.route,\n entryId: entry.id,\n sourcePath: entry.sourcePath,\n title: entry.title,\n ...(entry.frontmatter.sidebar !== undefined\n ? { sidebar: entry.frontmatter.sidebar }\n : {}),\n }));\n const assets = Array.from(\n new Map(\n entries\n .flatMap((entry) => entry.assets)\n .map((asset) => [\n asset.publicPath ?? `${asset.original}:${asset.line ?? \"\"}`,\n asset,\n ]),\n ).values(),\n );\n return {\n redirects,\n root,\n config,\n entries,\n routes,\n assets,\n diagnostics,\n entryByRoute(route) {\n return routeMap.get(normalizeRoute(route));\n },\n entryBySource(sourcePath, sourceId) {\n const matches = sourceMap.get(sourcePath) ?? [];\n return sourceId\n ? matches.find((entry) => entry.sourceId === sourceId)\n : matches.length === 1\n ? matches[0]\n : undefined;\n },\n };\n}\n\nfunction resolveRedirects(\n configured: Record<string, string>,\n entries: DocsEntry[],\n routes: Map<string, DocsEntry>,\n diagnostics: DocsDiagnostic[],\n): Record<string, string> {\n const requested = new Map<string, string>();\n const error = (message: string) =>\n diagnostics.push({\n code: \"DOCS_REDIRECT_INVALID\",\n severity: \"error\",\n message,\n });\n const add = (from: string, to: string) => {\n try {\n const alias = normalizeRoute(from);\n const target = normalizeRoute(to);\n if (routes.has(alias) || requested.has(alias))\n error(`Redirect ${alias} conflicts with an existing page or redirect.`);\n else requested.set(alias, target);\n } catch (cause) {\n error(errorMessage(cause));\n }\n };\n for (const [from, to] of Object.entries(configured)) add(from, to);\n for (const entry of entries) {\n for (const alias of entry.frontmatter.aliases ?? [])\n add(`${entry.routeBase}/${alias}`, entry.route);\n }\n const result: Record<string, string> = {};\n for (const [alias, target] of requested) {\n const seen = new Set([alias]);\n let current = target;\n while (requested.has(current) && !seen.has(current)) {\n seen.add(current);\n current = requested.get(current)!;\n }\n if (seen.has(current)) error(`Redirect cycle includes ${alias}.`);\n else if (!routes.has(current))\n error(`Redirect ${alias} points to missing document ${current}.`);\n else result[alias] = current;\n }\n return result;\n}\n\nasync function collectSources(\n root: string,\n config: NormalizedDocsConfig,\n lock: CreateDocsGraphOptions[\"lock\"],\n diagnostics: DocsDiagnostic[],\n): Promise<CollectedSource[]> {\n const declarations =\n config.content.sources ?? (await conventionSources(root));\n const results: CollectedSource[] = [];\n const identities = new Set<string>();\n\n const sourceIds = new Set<string>();\n for (const [index, declaration] of declarations.entries()) {\n const sourceId = declaration.id ?? `source-${index + 1}`;\n if (sourceIds.has(sourceId)) {\n diagnostics.push({\n code: \"DOCS_DUPLICATE_SOURCE\",\n severity: \"error\",\n message: `Source id ${sourceId} is declared more than once.`,\n });\n continue;\n }\n sourceIds.add(sourceId);\n try {\n const found = await collectDeclaration(\n root,\n declaration,\n config,\n lock,\n sourceId,\n );\n if (found.length === 0) {\n diagnostics.push({\n code: \"DOCS_SOURCE_NOT_FOUND\",\n severity: \"error\",\n message: `Source did not match any files: ${sourceLabel(declaration)}.`,\n });\n }\n for (const source of found) {\n const identity = `${sourceId}:${normalizeFs(source.absolutePath)}:${source.generatedBody === undefined ? \"\" : source.route}`;\n if (identities.has(identity)) continue;\n identities.add(identity);\n results.push(source);\n }\n } catch (error) {\n diagnostics.push({\n code:\n error instanceof OutsideRootError\n ? \"DOCS_SOURCE_OUTSIDE_ROOT\"\n : \"openapi\" in declaration\n ? \"DOCS_OPENAPI_INVALID\"\n : \"DOCS_SOURCE_NOT_FOUND\",\n severity: \"error\",\n message: errorMessage(error),\n });\n }\n }\n return results;\n}\n\nasync function conventionSources(root: string): Promise<DocsSource[]> {\n const sources: DocsSource[] = [];\n if (await isFile(resolve(root, \"README.md\")))\n sources.push({ file: \"README.md\", route: \"/\" });\n const docs = resolve(root, \"docs\");\n if (await isDirectory(docs)) {\n sources.push({ glob: \"docs/**/*.{md,mdx}\", base: \"docs\" });\n }\n return sources;\n}\n\nasync function collectDeclaration(\n root: string,\n declaration: DocsSource,\n config: NormalizedDocsConfig,\n lock: CreateDocsGraphOptions[\"lock\"],\n sourceId: string,\n): Promise<CollectedSource[]> {\n if (\"openapi\" in declaration) {\n const sourceRoot = resolve(root, declaration.root ?? \".\");\n const absolutePath = resolveSourcePath(\n sourceRoot,\n declaration.openapi,\n config.content.allowOutsideRoot,\n );\n if (!(await isFile(absolutePath))) return [];\n const info = await stat(absolutePath);\n if (info.size > config.build.maxAssetBytes)\n throw new Error(\n `OpenAPI source ${declaration.openapi} exceeds ${config.build.maxAssetBytes} bytes.`,\n );\n const routeBase = normalizeRoute(declaration.routeBase ?? \"/api\");\n const sourcePath = toPosix(relative(sourceRoot, absolutePath));\n const pages = openApiPages(\n sourcePath,\n routeBase,\n await readFile(absolutePath, \"utf8\"),\n );\n return pages.map((page) => ({\n sourceId,\n routeBase,\n absolutePath,\n sourcePath: page.sourcePath,\n sourceRoot,\n editPath: toPosix(\n relative(inside(root, absolutePath) ? root : sourceRoot, absolutePath),\n ),\n route: page.route,\n title: page.title,\n ...(page.description ? { description: page.description } : {}),\n generatedBody: page.body,\n trust: \"markdown\" as const,\n }));\n }\n if (\"package\" in declaration) {\n const packageLock = lockForSource(lock, declaration.package);\n if (declaration.registry && packageLock.registry !== declaration.registry) {\n throw new Error(\n `Registry changed for ${declaration.package}. Run \"cookbook update\".`,\n );\n }\n const sourceRoot = await materializePackage(\n packageLock,\n config.build,\n root,\n );\n const discovery = await discoverPackage(sourceRoot);\n const repository = config.content.localizeRepositoryLinks\n ? repositoryMetadata(discovery.manifest.repository)\n : undefined;\n const patterns = declaration.include?.length\n ? declaration.include\n : discovery.pages;\n for (const pattern of patterns) {\n assertSafePackagePath(pattern, \"Package source include\");\n }\n for (const pattern of declaration.exclude ?? []) {\n assertSafePackagePath(pattern, \"Package source exclude\");\n }\n if (declaration.index) {\n assertSafePackagePath(declaration.index, \"Package source index\");\n }\n const files = await glob(patterns, {\n cwd: sourceRoot,\n onlyFiles: true,\n ignore: declaration.exclude ?? [],\n });\n const index = declaration.index ?? discovery.home;\n return files\n .filter((path) =>\n MARKDOWN_EXTENSIONS.includes(extname(path).toLowerCase()),\n )\n .map((path) => {\n assertSafePackagePath(path, \"Discovered package source\");\n const absolutePath = resolve(sourceRoot, path);\n if (!inside(sourceRoot, absolutePath)) throw new OutsideRootError(path);\n return {\n sourceId,\n ...(declaration.routeBase\n ? { routeBase: declaration.routeBase }\n : {}),\n absolutePath,\n sourcePath: path,\n sourceRoot,\n route:\n path === index\n ? normalizeRoute(declaration.routeBase ?? \"/\")\n : routeForPath(path, \"docs\", declaration.routeBase),\n trust: declaration.trust ?? \"markdown\",\n packageLock,\n ...(repository ? { repository } : {}),\n };\n });\n }\n\n const sourceRoot = resolve(root, declaration.root ?? \".\");\n const repository = config.content.localizeRepositoryLinks\n ? repositoryMetadata(config.site.repository)\n : undefined;\n\n if (\"file\" in declaration) {\n const absolutePath = resolveSourcePath(\n sourceRoot,\n declaration.file,\n config.content.allowOutsideRoot,\n );\n if (!(await isFile(absolutePath))) return [];\n return [\n {\n sourceId,\n ...(declaration.routeBase ? { routeBase: declaration.routeBase } : {}),\n absolutePath,\n sourcePath: toPosix(relative(sourceRoot, absolutePath)),\n editPath: toPosix(\n relative(\n inside(root, absolutePath) ? root : sourceRoot,\n absolutePath,\n ),\n ),\n sourceRoot,\n route: declaration.route\n ? normalizeRoute(\n `${declaration.routeBase ?? \"\"}/${declaration.route}`,\n )\n : routeForPath(declaration.file, undefined, declaration.routeBase),\n ...(declaration.title ? { title: declaration.title } : {}),\n ...(declaration.description\n ? { description: declaration.description }\n : {}),\n ...(declaration.navigation !== undefined\n ? { navigation: declaration.navigation }\n : {}),\n trust: \"mdx\",\n ...(repository ? { repository } : {}),\n },\n ];\n }\n\n const patterns = Array.isArray(declaration.glob)\n ? declaration.glob\n : [declaration.glob];\n const paths = await glob(patterns, {\n cwd: sourceRoot,\n onlyFiles: true,\n dot: false,\n ignore: [\"**/_*/**\", \"**/_*\", ...(declaration.exclude ?? [])],\n });\n return paths.map((path) => {\n const absolutePath = resolveSourcePath(\n sourceRoot,\n path,\n config.content.allowOutsideRoot,\n );\n return {\n sourceId,\n ...(declaration.routeBase ? { routeBase: declaration.routeBase } : {}),\n absolutePath,\n sourcePath: toPosix(relative(sourceRoot, absolutePath)),\n editPath: toPosix(\n relative(inside(root, absolutePath) ? root : sourceRoot, absolutePath),\n ),\n sourceRoot,\n route: routeForPath(path, declaration.base, declaration.routeBase),\n ...(declaration.navigation === false ? { navigation: false } : {}),\n trust: \"mdx\",\n ...(repository ? { repository } : {}),\n };\n });\n}\n\nasync function readEntry(\n source: CollectedSource,\n config: NormalizedDocsConfig,\n diagnostics: DocsDiagnostic[],\n): Promise<DocsEntry | undefined> {\n if (\n extname(source.sourcePath).toLowerCase() === \".mdx\" &&\n source.trust !== \"mdx\"\n ) {\n diagnostics.push({\n code: \"DOCS_UNTRUSTED_MDX\",\n severity: \"error\",\n message: `Package MDX requires trust: 'mdx': ${source.sourcePath}.`,\n file: source.sourcePath,\n hint: \"Keep package sources in Markdown-safe mode or explicitly trust this locked artifact.\",\n });\n return undefined;\n }\n const original =\n source.generatedBody ?? (await readFile(source.absolutePath, \"utf8\"));\n let parsedMatter: ReturnType<typeof parseFrontmatter>;\n try {\n parsedMatter = parseFrontmatter(original);\n } catch (error) {\n diagnostics.push({\n code: \"DOCS_FRONTMATTER_INVALID\",\n severity: \"error\",\n message: `Could not parse frontmatter: ${errorMessage(error)}.`,\n file: source.sourcePath,\n });\n return undefined;\n }\n const frontmatter = parsedMatter.data;\n if (frontmatter.sidebar === undefined && source.navigation !== undefined) {\n frontmatter.sidebar = source.navigation;\n }\n const diagnosticCount = diagnostics.length;\n const metadata: Record<string, unknown> = {};\n for (const key of Object.keys(frontmatter)) {\n if (!FRONTMATTER_KEYS.has(key)) {\n if (config.content.frontmatter !== \"reject\") {\n metadata[key] = (frontmatter as Record<string, unknown>)[key];\n delete (frontmatter as Record<string, unknown>)[key];\n continue;\n }\n diagnostics.push({\n code: \"DOCS_FRONTMATTER_INVALID\",\n severity: \"error\",\n message: `Unknown frontmatter key \"${key}\".`,\n file: source.sourcePath,\n });\n }\n }\n validateFrontmatter(frontmatter, source.sourcePath, diagnostics);\n if (diagnostics.length > diagnosticCount) return undefined;\n const mdx = extname(source.sourcePath).toLowerCase() === \".mdx\";\n const parsed = parseMarkdown(parsedMatter.content, { mdx });\n const route = normalizeRoute(\n frontmatter.slug !== undefined\n ? `${source.routeBase ?? \"\"}/${frontmatter.slug}`\n : (source.route ?? routeForPath(source.sourcePath)),\n );\n const title =\n frontmatter.title ??\n source.title ??\n parsed.firstHeading ??\n titleFromFile(source.sourcePath);\n const description =\n frontmatter.description ?? source.description ?? parsed.description;\n await resolvePageMetadata(frontmatter, source, config);\n const duplicateTitles = new Map<string, number>();\n for (const heading of parsed.headings) {\n const count = (duplicateTitles.get(heading.text) ?? 0) + 1;\n duplicateTitles.set(heading.text, count);\n if (count > 1) {\n diagnostics.push({\n code: \"DOCS_HEADING_DUPLICATE\",\n severity: \"warning\",\n message: `Repeated heading \"${heading.text}\" receives the generated ID \"${heading.slug}\".`,\n file: source.sourcePath,\n ...(heading.line ? { line: heading.line } : {}),\n });\n }\n }\n return {\n id: `${source.sourceId}:${source.sourcePath}`,\n sourceId: source.sourceId,\n routeBase: source.routeBase ?? \"/\",\n metadata,\n sourcePath: source.sourcePath,\n absolutePath: source.absolutePath,\n sourceRoot: source.sourceRoot,\n route,\n title,\n ...(description ? { description } : {}),\n frontmatter,\n headings: parsed.headings,\n body: parsedMatter.content,\n transformedBody: parsedMatter.content,\n ast: parsed.ast,\n links: [],\n assets: [],\n trust: source.trust,\n ...(source.packageLock\n ? {\n package: {\n requested: source.packageLock.requested,\n resolved: source.packageLock.resolved,\n },\n }\n : {}),\n };\n}\n\nasync function resolvePageMetadata(\n frontmatter: DocsFrontmatter,\n source: CollectedSource,\n config: NormalizedDocsConfig,\n): Promise<void> {\n if (frontmatter.editUrl === undefined && config.editLink) {\n const baseUrl = config.editLink.baseUrl.endsWith(\"/\")\n ? config.editLink.baseUrl\n : `${config.editLink.baseUrl}/`;\n frontmatter.editUrl = `${baseUrl}${(source.editPath ?? source.sourcePath).replace(/^\\/+/, \"\")}`;\n }\n\n if (frontmatter.lastUpdated === false) return;\n if (frontmatter.lastUpdated === undefined && config.lastUpdated === false) {\n return;\n }\n if (frontmatter.lastUpdated instanceof Date) return;\n\n try {\n const { stdout } = await execFileAsync(\n \"git\",\n [\"log\", \"-1\", \"--format=%ct\", \"--\", source.absolutePath],\n { cwd: source.sourceRoot },\n );\n const timestamp = Number(stdout.trim());\n if (Number.isFinite(timestamp) && timestamp > 0) {\n frontmatter.lastUpdated = new Date(timestamp * 1000);\n }\n } catch {\n // Sources can come from npm caches or directories without Git history.\n }\n}\n\nasync function transformEntry(\n entry: DocsEntry,\n absoluteMap: Map<string, DocsEntry[]>,\n routeMap: Map<string, DocsEntry>,\n repositoryMap: Map<string, RepositoryMetadata>,\n config: NormalizedDocsConfig,\n diagnostics: DocsDiagnostic[],\n): Promise<void> {\n sanitizeUntrustedFrontmatter(entry, config, diagnostics);\n const ast = cloneAst(entry.ast);\n if (config.markdown.stripLeadingBadges) stripLeadingBadgeBlock(ast);\n removeRenderedTitle(ast, entry.title);\n\n const htmlTasks: Promise<void>[] = [];\n visit(ast, \"html\", (node) => {\n const policy = rawHtmlPolicy(entry, config);\n if (policy === \"allow\") return;\n if (policy === \"sanitize\") {\n htmlTasks.push(\n sanitizeMarkup(node.value, async (url, kind) => {\n const reference: Link = {\n type: \"link\",\n url,\n children: [],\n ...(node.position ? { position: node.position } : {}),\n };\n if (kind === \"link\") {\n await rewriteLink(\n reference,\n entry,\n absoluteMap,\n routeMap,\n repositoryMap,\n config,\n diagnostics,\n );\n } else {\n const image: Image = {\n type: \"image\",\n url,\n alt: \"\",\n ...(node.position ? { position: node.position } : {}),\n };\n await rewriteAsset(image, entry, config, diagnostics);\n reference.url = image.url;\n }\n return reference.url;\n }).then((html) => {\n node.value = html;\n }),\n );\n return;\n }\n diagnostics.push({\n code:\n policy === \"reject\"\n ? \"DOCS_RAW_HTML_REJECTED\"\n : \"DOCS_RAW_HTML_STRIPPED\",\n severity: policy === \"reject\" ? \"error\" : \"warning\",\n message: `Raw HTML was ${policy === \"reject\" ? \"rejected\" : \"removed\"}: ${entry.sourcePath}.`,\n file: entry.sourcePath,\n ...lineData(node),\n });\n node.value = \"\";\n });\n await Promise.all(htmlTasks);\n\n const referenceKinds = new Map<string, \"link\" | \"image\" | \"mixed\">();\n visit(ast, (node) => {\n if (node.type !== \"linkReference\" && node.type !== \"imageReference\") {\n return;\n }\n const key = node.identifier.toLowerCase();\n const kind = node.type === \"imageReference\" ? \"image\" : \"link\";\n const previous = referenceKinds.get(key);\n referenceKinds.set(key, previous && previous !== kind ? \"mixed\" : kind);\n });\n\n const linkTasks: Promise<void>[] = [];\n visit(ast, (node) => {\n if (node.type === \"link\") {\n linkTasks.push(\n rewriteLink(\n node,\n entry,\n absoluteMap,\n routeMap,\n repositoryMap,\n config,\n diagnostics,\n ),\n );\n } else if (node.type === \"image\") {\n linkTasks.push(rewriteAsset(node, entry, config, diagnostics));\n } else if (node.type === \"definition\") {\n const kind = referenceKinds.get(node.identifier.toLowerCase());\n if (kind === \"image\") {\n linkTasks.push(rewriteAsset(node, entry, config, diagnostics));\n } else if (kind === \"link\") {\n linkTasks.push(\n rewriteLink(\n node,\n entry,\n absoluteMap,\n routeMap,\n repositoryMap,\n config,\n diagnostics,\n ),\n );\n } else if (kind === \"mixed\") {\n linkTasks.push(\n rewriteDefinition(\n node,\n entry,\n absoluteMap,\n routeMap,\n repositoryMap,\n config,\n diagnostics,\n ),\n );\n }\n }\n });\n await Promise.all(linkTasks);\n await rewriteFrontmatterReferences(\n entry,\n absoluteMap,\n routeMap,\n repositoryMap,\n config,\n diagnostics,\n );\n entry.ast = ast;\n entry.transformedBody = serializeMarkdown(ast, {\n mdx: extname(entry.sourcePath).toLowerCase() === \".mdx\",\n });\n}\n\nfunction sanitizeUntrustedFrontmatter(\n entry: DocsEntry,\n config: NormalizedDocsConfig,\n diagnostics: DocsDiagnostic[],\n): void {\n if (entry.trust !== \"markdown\") return;\n let removed = false;\n const plainText = (value: string): string => {\n const sanitized = value.replace(/<!--[\\s\\S]*?-->|<[^>]*>/g, \"\");\n if (sanitized !== value) removed = true;\n return sanitized;\n };\n\n entry.title = plainText(entry.title);\n if (entry.frontmatter.title !== undefined) {\n entry.frontmatter.title = plainText(entry.frontmatter.title);\n }\n const hero = entry.frontmatter.hero;\n if (hero?.title !== undefined) hero.title = plainText(hero.title);\n if (hero?.tagline !== undefined) hero.tagline = plainText(hero.tagline);\n if (hero?.image && \"html\" in hero.image) {\n delete hero.image;\n removed = true;\n }\n if (entry.frontmatter.banner) {\n entry.frontmatter.banner.content = plainText(\n entry.frontmatter.banner.content,\n );\n }\n if (entry.frontmatter.head) {\n delete entry.frontmatter.head;\n removed = true;\n }\n\n if (removed) {\n diagnostics.push({\n code:\n config.markdown.rawHtml === \"reject\"\n ? \"DOCS_RAW_HTML_REJECTED\"\n : \"DOCS_UNTRUSTED_HTML\",\n severity: config.markdown.rawHtml === \"reject\" ? \"error\" : \"warning\",\n message:\n config.markdown.rawHtml === \"reject\"\n ? `HTML-capable frontmatter is not allowed by markdown.rawHtml: ${entry.sourcePath}.`\n : \"HTML-capable frontmatter was sanitized in package Markdown. Use trust: 'mdx' only for packages you trust.\",\n file: entry.sourcePath,\n });\n }\n}\n\nfunction rawHtmlPolicy(\n entry: DocsEntry,\n config: NormalizedDocsConfig,\n): NormalizedDocsConfig[\"markdown\"][\"rawHtml\"] {\n if (config.markdown.rawHtml === \"reject\") return \"reject\";\n if (config.markdown.rawHtml === \"strip\") return \"strip\";\n return entry.trust === \"markdown\" ? \"sanitize\" : config.markdown.rawHtml;\n}\n\nasync function rewriteFrontmatterReferences(\n entry: DocsEntry,\n absoluteMap: Map<string, DocsEntry[]>,\n routeMap: Map<string, DocsEntry>,\n repositoryMap: Map<string, RepositoryMetadata>,\n config: NormalizedDocsConfig,\n diagnostics: DocsDiagnostic[],\n): Promise<void> {\n for (const action of entry.frontmatter.hero?.actions ?? []) {\n const node: Link = { type: \"link\", url: action.link, children: [] };\n await rewriteLink(\n node,\n entry,\n absoluteMap,\n routeMap,\n repositoryMap,\n config,\n diagnostics,\n );\n action.link = node.url;\n }\n\n const image = entry.frontmatter.hero?.image;\n if (!image || \"html\" in image) return;\n if (\"file\" in image) {\n image.file = await rewriteFrontmatterAsset(\n image.file,\n entry,\n config,\n diagnostics,\n );\n return;\n }\n const [dark, light] = await Promise.all([\n rewriteFrontmatterAsset(image.dark, entry, config, diagnostics),\n rewriteFrontmatterAsset(image.light, entry, config, diagnostics),\n ]);\n image.dark = dark;\n image.light = light;\n}\n\nasync function rewriteFrontmatterAsset(\n url: string,\n entry: DocsEntry,\n config: NormalizedDocsConfig,\n diagnostics: DocsDiagnostic[],\n): Promise<string> {\n const asset = await materializeAsset(url, entry, config, diagnostics, {});\n entry.assets.push(asset);\n return asset.resolved ?? url;\n}\n\nasync function rewriteLink(\n node: Link | Definition,\n entry: DocsEntry,\n absoluteMap: Map<string, DocsEntry[]>,\n routeMap: Map<string, DocsEntry>,\n repositoryMap: Map<string, RepositoryMetadata>,\n config: NormalizedDocsConfig,\n diagnostics: DocsDiagnostic[],\n): Promise<void> {\n const reference: import(\"../types.js\").DocsReference = {\n original: node.url,\n ...lineData(node),\n };\n entry.links.push(reference);\n if (node.url.startsWith(\"source:\")) {\n const { pathname, query, fragment } = splitReference(node.url.slice(7));\n const slash = pathname.indexOf(\"/\");\n const sourceId = slash < 0 ? pathname : pathname.slice(0, slash);\n const sourcePath = safeDecode(pathname.slice(slash + 1));\n const target = [...absoluteMap.values()]\n .flat()\n .find(\n (candidate) =>\n candidate.sourceId === sourceId &&\n candidate.sourcePath === sourcePath,\n );\n if (!target || slash < 0)\n missingLink(diagnostics, entry, node, node.url, config);\n else {\n node.url = `${withBase(target.route, config.build.base)}${query}${fragment ? `#${fragment}` : \"\"}`;\n reference.resolved = node.url;\n reference.targetSource = target.sourcePath;\n validateFragment(fragment, target, entry, node, diagnostics, config);\n }\n return;\n }\n if (unsafeProtocol(node.url)) {\n diagnostic(\n diagnostics,\n \"DOCS_LINK_UNSAFE\",\n `Unsafe URL protocol: ${node.url}.`,\n entry,\n node,\n );\n return;\n }\n if (isExternal(node.url)) {\n const target = config.content.localizeRepositoryLinks\n ? localizedRepositoryTarget(\n node.url,\n entry,\n absoluteMap,\n repositoryMap.get(entry.id),\n )\n : undefined;\n if (!target) return;\n const { query, fragment } = splitReference(node.url);\n node.url = `${withBase(target.route, config.build.base)}${query}${fragment ? `#${fragment}` : \"\"}`;\n reference.resolved = node.url;\n reference.targetSource = target.sourcePath;\n if (fragment) reference.fragment = fragment;\n validateFragment(fragment, target, entry, node, diagnostics, config);\n return;\n }\n if (node.url.startsWith(\"#\")) return;\n const { pathname, query, fragment } = splitReference(node.url);\n if (pathname.startsWith(\"/\")) {\n const target = routeMap.get(normalizeRoute(pathname));\n if (!target) missingLink(diagnostics, entry, node, node.url, config);\n else {\n node.url = `${withBase(target.route, config.build.base)}${query}${fragment ? `#${fragment}` : \"\"}`;\n reference.resolved = node.url;\n reference.targetSource = target.sourcePath;\n if (fragment) reference.fragment = fragment;\n validateFragment(fragment, target, entry, node, diagnostics, config);\n }\n return;\n }\n const decoded = safeDecode(pathname);\n const targetPath = resolve(dirname(entry.absolutePath), decoded);\n if (!inside(entry.sourceRoot, targetPath)) {\n diagnostic(\n diagnostics,\n \"DOCS_SOURCE_OUTSIDE_ROOT\",\n `Link escapes its allowed source root: ${node.url}.`,\n entry,\n node,\n );\n return;\n }\n const target = findDocument(targetPath, absoluteMap, entry.sourceId);\n if (!target) {\n if (documentMatches(targetPath, absoluteMap).length > 1) {\n diagnostic(\n diagnostics,\n \"DOCS_AMBIGUOUS_LINK\",\n `Link matches multiple source mounts: ${node.url}. Use source:<id>/<path> to choose a source.`,\n entry,\n node,\n );\n return;\n }\n if (await isFile(targetPath)) {\n const asset = await materializeAsset(\n node.url,\n entry,\n config,\n diagnostics,\n node,\n );\n if (asset.resolved) {\n node.url = asset.resolved;\n reference.resolved = asset.resolved;\n }\n entry.assets.push(asset);\n return;\n }\n missingLink(diagnostics, entry, node, node.url, config);\n return;\n }\n node.url = `${withBase(target.route, config.build.base)}${query}${fragment ? `#${fragment}` : \"\"}`;\n reference.resolved = node.url;\n reference.targetSource = target.sourcePath;\n if (fragment) reference.fragment = fragment;\n validateFragment(fragment, target, entry, node, diagnostics, config);\n}\n\nasync function rewriteAsset(\n node: Image | Definition,\n entry: DocsEntry,\n config: NormalizedDocsConfig,\n diagnostics: DocsDiagnostic[],\n): Promise<void> {\n const asset = await materializeAsset(\n node.url,\n entry,\n config,\n diagnostics,\n node,\n );\n entry.assets.push(asset);\n if (asset.resolved) node.url = asset.resolved;\n}\n\nasync function materializeAsset(\n url: string,\n entry: DocsEntry,\n config: NormalizedDocsConfig,\n diagnostics: DocsDiagnostic[],\n node: PositionedNode,\n): Promise<DocsAsset> {\n const asset: DocsAsset = { original: url, ...lineData(node) };\n if (unsafeProtocol(url)) {\n diagnostic(\n diagnostics,\n \"DOCS_ASSET_UNSAFE\",\n `Unsafe asset URL: ${url}.`,\n entry,\n node,\n );\n return asset;\n }\n if (isExternal(url) || url.startsWith(\"#\")) return asset;\n const { pathname, query, fragment } = splitReference(url);\n const absolute = resolve(dirname(entry.absolutePath), safeDecode(pathname));\n if (!inside(entry.sourceRoot, absolute)) {\n diagnostic(\n diagnostics,\n \"DOCS_SOURCE_OUTSIDE_ROOT\",\n `Asset escapes its allowed source root: ${url}.`,\n entry,\n node,\n );\n return asset;\n }\n try {\n const info = await stat(absolute);\n if (!info.isFile()) throw new Error(\"not a file\");\n if (info.size > config.build.maxAssetBytes) {\n throw new Error(`asset exceeds ${config.build.maxAssetBytes} bytes`);\n }\n const hash = createHash(\"sha256\")\n .update(await readFile(absolute))\n .digest(\"hex\")\n .slice(0, 12);\n const publicPath = withBase(\n `/_tasty-assets/${hash}-${basename(absolute)}`,\n config.build.base,\n );\n const resolved = `${publicPath}${query}${fragment ? `#${fragment}` : \"\"}`;\n Object.assign(asset, {\n resolved,\n sourcePath: absolute,\n publicPath,\n hash,\n bytes: info.size,\n });\n } catch (error) {\n diagnostic(\n diagnostics,\n \"DOCS_ASSET_NOT_FOUND\",\n `Asset not found or invalid: ${url} (${errorMessage(error)}).`,\n entry,\n node,\n );\n }\n return asset;\n}\n\nasync function rewriteDefinition(\n node: Definition,\n entry: DocsEntry,\n absoluteMap: Map<string, DocsEntry[]>,\n routeMap: Map<string, DocsEntry>,\n repositoryMap: Map<string, RepositoryMetadata>,\n config: NormalizedDocsConfig,\n diagnostics: DocsDiagnostic[],\n): Promise<void> {\n const { pathname } = splitReference(node.url);\n const targetPath = resolve(dirname(entry.absolutePath), safeDecode(pathname));\n if (\n documentMatches(targetPath, absoluteMap).length > 0 ||\n node.url.startsWith(\"source:\") ||\n pathname.startsWith(\"/\")\n ) {\n await rewriteLink(\n node,\n entry,\n absoluteMap,\n routeMap,\n repositoryMap,\n config,\n diagnostics,\n );\n } else {\n await rewriteAsset(node, entry, config, diagnostics);\n }\n}\n\nfunction findDocument(\n path: string,\n absoluteMap: Map<string, DocsEntry[]>,\n sourceId?: string,\n): DocsEntry | undefined {\n const matches = documentMatches(path, absoluteMap);\n return (\n matches.find((item) => item.sourceId === sourceId) ??\n (matches.length === 1 ? matches[0] : undefined)\n );\n}\n\nfunction documentMatches(\n path: string,\n absoluteMap: Map<string, DocsEntry[]>,\n): DocsEntry[] {\n const candidates = [\n path,\n ...MARKDOWN_EXTENSIONS.map((extension) => `${path}${extension}`),\n ...MARKDOWN_EXTENSIONS.map((extension) =>\n resolve(path, `README${extension}`),\n ),\n ...MARKDOWN_EXTENSIONS.map((extension) =>\n resolve(path, `index${extension}`),\n ),\n ];\n for (const candidate of candidates) {\n const matches = absoluteMap.get(normalizeFs(candidate)) ?? [];\n if (matches.length) return matches;\n }\n return [];\n}\n\nfunction validateFragment(\n fragment: string,\n target: DocsEntry,\n source: DocsEntry,\n node: Link | Definition,\n diagnostics: DocsDiagnostic[],\n config: NormalizedDocsConfig,\n): void {\n if (!fragment) return;\n const decoded = safeDecode(fragment);\n if (!target.headings.some((heading) => heading.slug === decoded)) {\n diagnostics.push({\n code: \"DOCS_FRAGMENT_NOT_FOUND\",\n severity: config.build.ci ? \"error\" : \"warning\",\n message: `Heading fragment #${fragment} does not exist on ${target.route}.`,\n file: source.sourcePath,\n ...lineData(node),\n hint: `Known headings: ${target.headings.map((heading) => `#${heading.slug}`).join(\", \") || \"(none)\"}.`,\n });\n }\n}\n\nfunction missingLink(\n diagnostics: DocsDiagnostic[],\n entry: DocsEntry,\n node: Link | Definition,\n url: string,\n config: NormalizedDocsConfig,\n): void {\n diagnostics.push({\n code: \"DOCS_LINK_NOT_FOUND\",\n severity: config.build.strict ? \"error\" : \"warning\",\n message: `Internal link target not found: ${url}.`,\n file: entry.sourcePath,\n ...lineData(node),\n });\n}\n\nfunction validateNavigation(\n items: NavigationItem[],\n routes: Map<string, DocsEntry>,\n diagnostics: DocsDiagnostic[],\n): void {\n for (const item of items) {\n if (typeof item === \"string\") {\n if (!routes.has(normalizeRoute(item))) {\n diagnostics.push({\n code: \"DOCS_NAV_TARGET_NOT_FOUND\",\n severity: \"error\",\n message: `Navigation target does not exist: ${item}.`,\n });\n }\n } else if (\n item.link?.startsWith(\"/\") &&\n !routes.has(normalizeRoute(item.link))\n ) {\n diagnostics.push({\n code: \"DOCS_NAV_TARGET_NOT_FOUND\",\n severity: \"error\",\n message: `Navigation target does not exist: ${item.link}.`,\n });\n }\n if (typeof item !== \"string\" && \"items\" in item) {\n validateNavigation(item.items, routes, diagnostics);\n }\n }\n}\n\nexport function normalizeRoute(route: string): string {\n const clean =\n route\n .split(/[?#]/, 1)[0]\n ?.replace(/\\\\/g, \"/\")\n .replace(/\\/{2,}/g, \"/\") ?? \"/\";\n const segments = clean.split(\"/\").filter(Boolean);\n if (segments.some((segment) => segment === \"..\"))\n throw new Error(`Route may not contain \"..\": ${route}.`);\n const normalized = `/${segments.join(\"/\")}`;\n return normalized === \"/\" ? \"/\" : normalized.replace(/\\/$/, \"\");\n}\n\nexport function routeForPath(\n path: string,\n base?: string,\n routeBase?: string,\n): string {\n let relativePath = toPosix(path);\n if (base) {\n const normalizedBase = toPosix(base)\n .replace(/^\\.\\//, \"\")\n .replace(/\\/$/, \"\");\n if (relativePath === normalizedBase) relativePath = \"\";\n else if (relativePath.startsWith(`${normalizedBase}/`))\n relativePath = relativePath.slice(normalizedBase.length + 1);\n }\n relativePath = relativePath.replace(/\\.(md|mdx)$/i, \"\");\n relativePath = relativePath\n .replace(/(^|\\/)README$/i, \"$1\")\n .replace(/(^|\\/)index$/i, \"$1\");\n return normalizeRoute(`${routeBase ?? \"\"}/${relativePath}`);\n}\n\nfunction resolveSourcePath(\n root: string,\n path: string,\n allowOutsideRoot: boolean,\n): string {\n const absolute = isAbsolute(path) ? resolve(path) : resolve(root, path);\n if (!allowOutsideRoot && !inside(root, absolute))\n throw new OutsideRootError(path);\n return absolute;\n}\n\nfunction inside(root: string, path: string): boolean {\n const rel = relative(resolve(root), resolve(path));\n return (\n rel === \"\" ||\n (!rel.startsWith(`..${sep}`) && rel !== \"..\" && !isAbsolute(rel))\n );\n}\n\nfunction splitReference(url: string): {\n pathname: string;\n query: string;\n fragment: string;\n} {\n const hashIndex = url.indexOf(\"#\");\n const fragment = hashIndex >= 0 ? url.slice(hashIndex + 1) : \"\";\n const withoutHash = hashIndex >= 0 ? url.slice(0, hashIndex) : url;\n const queryIndex = withoutHash.indexOf(\"?\");\n return {\n pathname: queryIndex >= 0 ? withoutHash.slice(0, queryIndex) : withoutHash,\n query: queryIndex >= 0 ? withoutHash.slice(queryIndex) : \"\",\n fragment,\n };\n}\n\nfunction isExternal(url: string): boolean {\n return /^(?:[a-z][a-z\\d+.-]*:|\\/\\/)/i.test(url);\n}\n\nfunction localizedRepositoryTarget(\n value: string,\n entry: DocsEntry,\n entries: Map<string, DocsEntry[]>,\n metadata: RepositoryMetadata | undefined,\n): DocsEntry | undefined {\n if (!metadata) return undefined;\n let link: URL;\n let repository: URL;\n try {\n link = new URL(value);\n repository = new URL(metadata.url);\n } catch {\n return undefined;\n }\n const repositoryPath = repository.pathname.replace(/\\/+$/, \"\");\n if (\n link.origin !== repository.origin ||\n !link.pathname.startsWith(`${repositoryPath}/`)\n ) {\n return undefined;\n }\n const repositoryRelative = safeDecode(\n link.pathname.slice(repositoryPath.length + 1),\n );\n if (\n !/^(?:-\\/(?:blob|tree|raw)|blob|tree|raw|src)\\//.test(repositoryRelative)\n ) {\n return undefined;\n }\n\n const directory = metadata.directory?.replace(/^\\/+|\\/+$/g, \"\");\n const matches = [...entries.values()]\n .flat()\n .filter((candidate) => candidate.sourceRoot === entry.sourceRoot)\n .flatMap((candidate) => {\n const sourcePath = candidate.sourcePath.replace(/^\\/+/, \"\");\n const paths = [sourcePath];\n if (/(?:^|\\/)(?:README|index)\\.mdx?$/i.test(sourcePath)) {\n paths.push(sourcePath.replace(/(?:^|\\/)(?:README|index)\\.mdx?$/i, \"\"));\n }\n const repositoryPaths = paths\n .flatMap((path) => [\n path,\n ...(directory ? [`${directory}/${path}`] : []),\n ])\n .map((path) => path.replace(/\\/+$/, \"\"))\n .filter(Boolean);\n const matched = repositoryPaths.find(\n (path) =>\n repositoryRelative === path ||\n repositoryRelative.endsWith(`/${path}`),\n );\n return matched ? [{ candidate, length: matched.length }] : [];\n })\n .sort(\n (left, right) =>\n Number(right.candidate.sourceId === entry.sourceId) -\n Number(left.candidate.sourceId === entry.sourceId) ||\n right.length - left.length,\n );\n return matches[0]?.candidate;\n}\n\nfunction repositoryMetadata(\n repository:\n string | { type?: string; url?: string; directory?: string } | undefined,\n): RepositoryMetadata | undefined {\n let raw = typeof repository === \"string\" ? repository : repository?.url;\n if (!raw) return undefined;\n raw = raw.replace(/^git\\+/, \"\");\n const scp = /^git@([^:]+):(.+)$/.exec(raw);\n if (scp) raw = `https://${scp[1]}/${scp[2]}`;\n try {\n let url = new URL(raw);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n if (!url.hostname || ![\"git:\", \"ssh:\"].includes(url.protocol)) {\n return undefined;\n }\n url = new URL(`https://${url.hostname}${url.pathname}`);\n }\n url.search = \"\";\n url.hash = \"\";\n url.pathname = url.pathname.replace(/\\.git\\/?$/, \"\").replace(/\\/+$/, \"\");\n const directory =\n typeof repository === \"object\"\n ? repository.directory?.replaceAll(\"\\\\\", \"/\").replace(/^\\/+|\\/+$/g, \"\")\n : undefined;\n return {\n url: url.href.replace(/\\/$/, \"\"),\n ...(directory ? { directory } : {}),\n };\n } catch {\n return undefined;\n }\n}\n\nfunction unsafeProtocol(url: string): boolean {\n return /^(?:javascript|vbscript|data):/i.test(url.trim());\n}\n\nfunction withBase(route: string, base: string): string {\n const normalizedBase =\n base === \"/\" ? \"\" : `/${base.replace(/^\\/+|\\/+$/g, \"\")}`;\n return `${normalizedBase}${normalizeRoute(route)}` || \"/\";\n}\n\nfunction titleFromFile(path: string): string {\n const raw = basename(path, extname(path)).replace(\n /^README$/i,\n basename(dirname(path)) || \"Documentation\",\n );\n return raw\n .replace(/[-_]+/g, \" \")\n .replace(/\\b\\w/g, (letter) => letter.toUpperCase());\n}\n\nfunction diagnostic(\n diagnostics: DocsDiagnostic[],\n code: string,\n message: string,\n entry: DocsEntry,\n node: PositionedNode,\n): void {\n diagnostics.push({\n code,\n severity: \"error\",\n message,\n file: entry.sourcePath,\n ...lineData(node),\n });\n}\n\ntype PositionedNode = { position?: { start: { line: number } } | undefined };\n\nfunction lineOf(node: PositionedNode): number | undefined {\n return node.position?.start.line;\n}\n\nfunction lineData(\n node: PositionedNode,\n): { line: number } | Record<string, never> {\n const line = lineOf(node);\n return line === undefined ? {} : { line };\n}\n\nfunction safeDecode(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nfunction sourceLabel(source: DocsSource): string {\n if (\"file\" in source) return source.file;\n if (\"glob\" in source)\n return Array.isArray(source.glob) ? source.glob.join(\", \") : source.glob;\n if (\"openapi\" in source) return source.openapi;\n return source.package;\n}\n\nfunction normalizeFs(path: string): string {\n return resolve(path);\n}\n\nfunction toPosix(path: string): string {\n return path.split(sep).join(\"/\");\n}\n\nasync function isFile(path: string): Promise<boolean> {\n try {\n return (await stat(path)).isFile();\n } catch {\n return false;\n }\n}\n\nasync function isDirectory(path: string): Promise<boolean> {\n try {\n return (await stat(path)).isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nclass OutsideRootError extends Error {\n constructor(path: string) {\n super(`Source path is outside the repository root: ${path}.`);\n this.name = \"OutsideRootError\";\n }\n}\n\nfunction parseFrontmatter(source: string): {\n data: DocsFrontmatter;\n content: string;\n} {\n const match =\n /^(?:\\uFEFF)?---[\\t ]*\\r?\\n([\\s\\S]*?)\\r?\\n(?:---|\\.\\.\\.)[\\t ]*(?:\\r?\\n|$)/.exec(\n source,\n );\n if (!match) return { data: {}, content: source };\n const value = parseYaml(match[1] ?? \"\");\n if (value !== null && !isPlainRecord(value)) {\n throw new Error(\"Markdown frontmatter must be a YAML object.\");\n }\n const data = (value ?? {}) as DocsFrontmatter;\n if (\n typeof data.lastUpdated === \"string\" &&\n !Number.isNaN(Date.parse(data.lastUpdated))\n ) {\n data.lastUpdated = new Date(data.lastUpdated);\n }\n return { data, content: source.slice(match[0].length) };\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction validateFrontmatter(\n value: DocsFrontmatter,\n file: string,\n diagnostics: DocsDiagnostic[],\n): void {\n const record = value as Record<string, unknown>;\n const error = (message: string) =>\n diagnostics.push({\n code: \"DOCS_FRONTMATTER_INVALID\",\n severity: \"error\",\n message,\n file,\n });\n if (\n value.aliases !== undefined &&\n (!Array.isArray(value.aliases) ||\n value.aliases.some((alias) => typeof alias !== \"string\"))\n )\n error(\"aliases must be an array of route strings.\");\n for (const key of [\"title\", \"description\", \"slug\"] as const) {\n if (record[key] !== undefined && typeof record[key] !== \"string\") {\n error(`${key} must be a string.`);\n }\n }\n for (const key of [\"draft\", \"pagefind\"] as const) {\n if (record[key] !== undefined && typeof record[key] !== \"boolean\") {\n error(`${key} must be a boolean.`);\n }\n }\n if (\n record.template !== undefined &&\n record.template !== \"doc\" &&\n record.template !== \"splash\"\n ) {\n error('template must be \"doc\" or \"splash\".');\n }\n for (const key of [\"sidebar\", \"tableOfContents\"] as const) {\n const entry = record[key];\n if (entry !== undefined && entry !== false && !isPlainRecord(entry)) {\n error(`${key} must be false or an object.`);\n }\n }\n if (isPlainRecord(record.sidebar)) {\n validateOptionalStrings(\n record.sidebar,\n [\"label\", \"group\"],\n \"sidebar\",\n error,\n );\n if (\n record.sidebar.order !== undefined &&\n typeof record.sidebar.order !== \"number\"\n ) {\n error(\"sidebar.order must be a number.\");\n }\n }\n if (isPlainRecord(record.tableOfContents)) {\n for (const key of [\"minHeadingLevel\", \"maxHeadingLevel\"] as const) {\n const level = record.tableOfContents[key];\n if (\n level !== undefined &&\n (!Number.isInteger(level) || Number(level) < 1 || Number(level) > 6)\n ) {\n error(`tableOfContents.${key} must be an integer from 1 to 6.`);\n }\n }\n }\n if (\n record.editUrl !== undefined &&\n record.editUrl !== false &&\n typeof record.editUrl !== \"string\"\n ) {\n error(\"editUrl must be false or a string.\");\n }\n if (\n record.lastUpdated !== undefined &&\n typeof record.lastUpdated !== \"boolean\" &&\n !(record.lastUpdated instanceof Date)\n ) {\n error(\"lastUpdated must be a date or boolean.\");\n }\n if (record.hero !== undefined) {\n if (!isPlainRecord(record.hero)) {\n error(\"hero must be an object.\");\n } else {\n validateHero(record.hero, error);\n }\n }\n if (record.banner !== undefined) {\n if (!isPlainRecord(record.banner)) {\n error(\"banner must be an object.\");\n } else if (typeof record.banner.content !== \"string\") {\n error(\"banner.content must be a string.\");\n }\n }\n for (const key of [\"prev\", \"next\"] as const) {\n const adjacent = record[key];\n if (\n adjacent !== undefined &&\n adjacent !== false &&\n typeof adjacent !== \"string\" &&\n !isPlainRecord(adjacent)\n ) {\n error(`${key} must be false, a string, or an object.`);\n } else if (isPlainRecord(adjacent)) {\n validateOptionalStrings(adjacent, [\"link\", \"label\"], key, error);\n }\n }\n if (\n record.head !== undefined &&\n (!Array.isArray(record.head) || !record.head.every(isPlainRecord))\n ) {\n error(\"head must be an array of objects.\");\n }\n}\n\nfunction validateHero(\n hero: Record<string, unknown>,\n error: (message: string) => void,\n): void {\n validateOptionalStrings(hero, [\"title\", \"tagline\"], \"hero\", error);\n if (hero.image !== undefined) {\n if (!isPlainRecord(hero.image)) {\n error(\"hero.image must be an object.\");\n } else {\n const image = hero.image;\n const shapes = [\"html\", \"file\", \"dark\"].filter(\n (key) => image[key] !== undefined,\n );\n if (shapes.length !== 1) {\n error(\n \"hero.image must define exactly one of html, file, or dark/light.\",\n );\n }\n for (const key of [\"html\", \"file\", \"dark\", \"light\", \"alt\"] as const) {\n if (image[key] !== undefined && typeof image[key] !== \"string\") {\n error(`hero.image.${key} must be a string.`);\n }\n }\n if (image.dark !== undefined && typeof image.light !== \"string\") {\n error(\"hero.image.light must accompany hero.image.dark.\");\n }\n if (image.light !== undefined && typeof image.dark !== \"string\") {\n error(\"hero.image.dark must accompany hero.image.light.\");\n }\n }\n }\n if (hero.actions !== undefined) {\n if (!Array.isArray(hero.actions)) {\n error(\"hero.actions must be an array.\");\n } else {\n for (const [index, action] of hero.actions.entries()) {\n if (!isPlainRecord(action)) {\n error(`hero.actions[${index}] must be an object.`);\n continue;\n }\n for (const key of [\"text\", \"link\"] as const) {\n if (typeof action[key] !== \"string\") {\n error(`hero.actions[${index}].${key} must be a string.`);\n }\n }\n if (\n action.variant !== undefined &&\n ![\"primary\", \"secondary\", \"minimal\"].includes(String(action.variant))\n ) {\n error(\n `hero.actions[${index}].variant must be primary, secondary, or minimal.`,\n );\n }\n }\n }\n }\n}\n\nfunction validateOptionalStrings(\n record: Record<string, unknown>,\n keys: readonly string[],\n prefix: string,\n error: (message: string) => void,\n): void {\n for (const key of keys) {\n if (record[key] !== undefined && typeof record[key] !== \"string\") {\n error(`${prefix}.${key} must be a string.`);\n }\n }\n}\n","import type { DocsDiagnostic, DocsGraph } from \"../types.js\";\n\nexport class DocsValidationError extends Error {\n readonly diagnostics: DocsDiagnostic[];\n\n constructor(diagnostics: DocsDiagnostic[]) {\n super(formatDiagnostics(diagnostics));\n this.name = \"DocsValidationError\";\n this.diagnostics = diagnostics;\n }\n}\n\nexport function validateDocs(graph: DocsGraph): DocsDiagnostic[] {\n return [...graph.diagnostics];\n}\n\nexport function assertValidDocs(graph: DocsGraph): void {\n const errors = graph.diagnostics.filter(\n (diagnostic) => diagnostic.severity === \"error\",\n );\n if (errors.length > 0) throw new DocsValidationError(errors);\n}\n\nexport function formatDiagnostics(\n diagnostics: DocsDiagnostic[],\n json = false,\n): string {\n if (json) return JSON.stringify(diagnostics, null, 2);\n return diagnostics\n .map((diagnostic) => {\n const location = diagnostic.file\n ? `${diagnostic.file}${diagnostic.line ? `:${diagnostic.line}` : \"\"}: `\n : \"\";\n const hint = diagnostic.hint ? `\\n hint: ${diagnostic.hint}` : \"\";\n return `${diagnostic.severity.toUpperCase()} ${diagnostic.code} ${location}${diagnostic.message}${hint}`;\n })\n .join(\"\\n\");\n}\n","import { extname, join, relative, sep } from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { createDocsGraph } from \"../graph/index.js\";\nimport { assertValidDocs } from \"../validation/index.js\";\nimport type {\n CreateDocsGraphOptions,\n DocsConfig,\n DocsEntry,\n} from \"../types.js\";\n\nexport interface DocsLoaderContext {\n store: {\n clear(): void;\n set(entry: {\n id: string;\n data: Record<string, unknown>;\n body: string;\n filePath?: string;\n digest?: string;\n rendered?: RenderedContent;\n assetImports?: string[];\n }): void;\n };\n logger?: { info(message: string): void };\n config?: { root: URL | string; srcDir: URL | string };\n parseData?: (input: {\n id: string;\n data: Record<string, unknown>;\n filePath?: string;\n }) => Promise<Record<string, unknown>>;\n renderMarkdown?: (\n content: string,\n options?: { fileURL?: URL },\n ) => Promise<RenderedContent>;\n generateDigest?: (data: Record<string, unknown> | string) => string;\n}\n\ninterface RenderedContent {\n html: string;\n metadata?: {\n imagePaths?: string[];\n headings?: Array<{ depth: number; slug: string; text: string }>;\n frontmatter?: Record<string, unknown>;\n [key: string]: unknown;\n };\n}\n\nexport function createDocsLoader(\n config?: DocsConfig,\n options: Omit<CreateDocsGraphOptions, \"config\"> = {},\n) {\n return {\n name: \"@tenphi/docs\",\n async load(context: DocsLoaderContext): Promise<void> {\n const graph = await createDocsGraph({\n ...options,\n ...(config ? { config } : {}),\n });\n assertValidDocs(graph);\n context.store.clear();\n for (const entry of graph.entries) {\n const loaderEntry = toLoaderEntry(entry);\n const filePath = starlightFilePath(entry, context.config);\n const data = context.parseData\n ? await context.parseData({\n id: loaderEntry.id,\n data: loaderEntry.data,\n filePath,\n })\n : loaderEntry.data;\n const rendered = await context.renderMarkdown?.(entry.transformedBody, {\n fileURL: pathToFileURL(entry.absolutePath),\n });\n context.store.set({\n ...loaderEntry,\n data,\n filePath,\n ...(context.generateDigest\n ? { digest: context.generateDigest(entry.transformedBody) }\n : {}),\n ...(rendered\n ? {\n rendered,\n assetImports: rendered.metadata?.imagePaths ?? [],\n }\n : {}),\n });\n }\n context.logger?.info(`Loaded ${graph.entries.length} Cookbook pages.`);\n },\n };\n}\n\nfunction starlightFilePath(\n entry: DocsEntry,\n config?: DocsLoaderContext[\"config\"],\n): string {\n const id = entry.route === \"/\" ? \"index\" : entry.route.slice(1);\n const extension =\n extname(entry.sourcePath).toLowerCase() === \".mdx\" ? \".mdx\" : \".md\";\n if (!config) return `src/content/docs/${id}${extension}`;\n\n const root = toPath(config.root);\n const srcDir = toPath(config.srcDir);\n return relative(root, join(srcDir, \"content\", \"docs\", `${id}${extension}`))\n .split(sep)\n .join(\"/\");\n}\n\nfunction toPath(value: URL | string): string {\n return typeof value === \"string\" ? value : fileURLToPath(value);\n}\n\nfunction toLoaderEntry(entry: DocsEntry): {\n id: string;\n data: Record<string, unknown>;\n body: string;\n} {\n return {\n id: entry.route === \"/\" ? \"index\" : entry.route.slice(1),\n data: {\n title: entry.title,\n draft: entry.frontmatter.draft ?? false,\n ...(entry.description ? { description: entry.description } : {}),\n ...entry.frontmatter,\n cookbook: {\n sourcePath: entry.sourcePath,\n route: entry.route,\n headings: entry.headings,\n },\n },\n body: entry.transformedBody,\n };\n}\n\nexport type { DocsEntry, DocsGraph, DocsRoute, DocsAsset } from \"../types.js\";\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-CY8WfBmM.d.ts","names":[],"sources":["../../../node_modules/.pnpm/@types+unist@3.0.3/node_modules/@types/unist/index.d.ts","../../../node_modules/.pnpm/@types+mdast@4.0.4/node_modules/@types/mdast/index.d.ts","../src/types.ts"],"x_google_ignoreList":[0,1],"mappings":"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"}