ovellum 0.2.0 → 0.2.1

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/build.ts","../../core/src/types/config.ts","../../core/src/errors.ts","../../core/src/config/define.ts","../../core/src/config/merge.ts","../../core/src/config/validate.ts","../../core/src/config/frontmatter.ts","../../core/src/config/load.ts","../src/dev/run-build.ts","../../parser/src/parse.ts","../../parser/src/anchor.ts","../../parser/src/jsdoc.ts","../../parser/src/extractors.ts","../../generator/src/frontmatter.ts","../../generator/src/path.ts","../../generator/src/templates.ts","../../generator/src/generate.ts","../../reader/src/read.ts","../../reader/src/zones.ts","../../merger/src/anchors.ts","../../merger/src/merge.ts","../../merger/src/orphans.ts","../../site/src/build.ts","../../site/src/markdown.ts","../../site/src/nav.ts","../../site/src/page-meta.ts","../../site/src/search.ts","../../site/src/sitemap.ts","../../site/src/icons.ts","../../site/src/url.ts","../../site/src/template.ts","../../site/src/links.ts","../src/commands/check.ts","../src/commands/check-utils.ts","../src/commands/dev.ts","../src/dev/server.ts","../src/dev/watcher.ts","../src/commands/init.ts","../src/commands/serve.ts","../src/commands/watch.ts"],"sourcesContent":["import { defineCommand, runMain } from 'citty';\nimport { buildCommand } from './commands/build.js';\nimport { checkCommand } from './commands/check.js';\nimport { devCommand } from './commands/dev.js';\nimport { initCommand } from './commands/init.js';\nimport { serveCommand } from './commands/serve.js';\nimport { watchCommand } from './commands/watch.js';\n\nconst main = defineCommand({\n meta: {\n name: 'ovellum',\n description: 'Ovellum - documentation tool for TypeScript and JavaScript projects.',\n },\n subCommands: {\n init: initCommand,\n build: buildCommand,\n dev: devCommand,\n watch: watchCommand,\n serve: serveCommand,\n check: checkCommand,\n },\n});\n\nvoid runMain(main);\n","import path from 'node:path';\nimport { defineCommand } from 'citty';\nimport { ConfigError, loadOvellumConfig } from '@ovellum/core';\nimport { runBuild, type BuildSummary } from '../dev/run-build.js';\n\nexport const buildCommand = defineCommand({\n meta: {\n name: 'build',\n description: 'Parse source and emit documentation files (or a static site in manual mode).',\n },\n args: {\n config: {\n type: 'string',\n description: 'Path to ovellum.config.{ts,js,json}',\n },\n cwd: {\n type: 'string',\n description: 'Project root (defaults to current directory)',\n },\n },\n async run({ args }) {\n const cwd = path.resolve(args.cwd ?? process.cwd());\n let loaded;\n try {\n loaded = await loadOvellumConfig({ cwd, configFile: args.config });\n } catch (err) {\n if (err instanceof ConfigError) {\n process.stderr.write(`config error: ${err.message}\\n`);\n if (err.hint) process.stderr.write(`hint: ${err.hint}\\n`);\n process.exit(3);\n }\n throw err;\n }\n\n const { config, configFile } = loaded;\n\n if (config.mode !== 'auto' && config.mode !== 'hybrid' && config.mode !== 'manual') {\n process.stderr.write(`'${config.mode}' mode is not recognized.\\n`);\n process.exit(1);\n }\n\n const summary = await runBuild({ config, cwd });\n process.stdout.write(formatBuildSummary(summary, configFile) + '\\n');\n for (const w of summary.warnings) process.stderr.write(`warning: ${w}\\n`);\n },\n});\n\n/**\n * Render a `BuildSummary` as the CLI's stdout block. Exported in case other\n * commands want the same shape (e.g. a future `ovellum status`).\n */\nexport function formatBuildSummary(\n summary: BuildSummary,\n configFile: string | undefined,\n): string {\n const lines = [\n `ovellum build complete in ${summary.elapsedMs}ms`,\n ` config: ${configFile ?? '(defaults)'}`,\n ` mode: ${summary.mode}`,\n ];\n\n if (summary.mode === 'manual') {\n lines.push(\n ` output: ${summary.outputDir}/`,\n ` pages: ${summary.pages?.length ?? 0}`,\n ` warnings: ${summary.warnings.length}`,\n ...(summary.pages ?? []).map((p) => ` → ${p.url} (${p.outputPath})`),\n );\n } else {\n lines.push(\n ` sources: ${summary.sources}`,\n ` written: ${summary.written?.length ?? 0} file(s)`,\n ` merged: ${summary.merged?.length ?? 0} file(s)`,\n ` orphans: ${summary.orphans ?? 0}`,\n ` warnings: ${summary.warnings.length}`,\n ...(summary.written ?? []).map((f) => ` → ${f}`),\n );\n if ((summary.quarantined ?? []).length > 0) {\n lines.push(' quarantined:');\n lines.push(...(summary.quarantined ?? []).map((p) => ` ↪ ${p}`));\n }\n }\n return lines.join('\\n');\n}\n","export type OvellumMode = 'hybrid' | 'manual' | 'auto';\n\nexport type OvellumFormat = 'md' | 'mdx';\n\nexport type OrphanStrategy = 'quarantine' | 'warn';\n\nexport interface ProtectConfig {\n /** Markdown block tag (without `:start`/`:end` suffix). Default: `@manual`. */\n blockTag: string;\n /** JSDoc inline tag. Default: `@preserve`. */\n inlineTag: string;\n orphanStrategy: OrphanStrategy;\n /** Relative path from project root where quarantined orphans are written. */\n orphanDir: string;\n /** Days before orphans are flagged stale by `ovellum orphans --stale`. */\n orphanRetention: number;\n}\n\nexport type OvellumDefaultTheme = 'auto' | 'light' | 'dark';\n\n/**\n * Code-block theme pair (passed to shiki). Each option resolves to a\n * `{ light, dark }` pair so a single build serves both colour schemes\n * via CSS variables. Defaults to `'github'`.\n */\nexport type OvellumCodeTheme = 'github' | 'nord' | 'solarized';\n\nexport type OvellumCtaStyle = 'primary' | 'secondary';\n\nexport interface OvellumLandingCta {\n label: string;\n href: string;\n /** Visual style. Defaults to `'primary'` for the first CTA, `'secondary'` thereafter. */\n style?: OvellumCtaStyle;\n}\n\nexport interface OvellumLandingHero {\n /** Defaults to `site.title`. */\n title?: string;\n /** Short tagline rendered under the title. */\n subtitle?: string;\n /** Hero call-to-action buttons. Render in order. */\n ctas: OvellumLandingCta[];\n}\n\nexport interface OvellumLandingFeature {\n /** Emoji, short string, or raw HTML (e.g. SVG). Rendered as-is. */\n icon?: string;\n title: string;\n description: string;\n}\n\nexport interface OvellumLandingTrustItem {\n name: string;\n /** Optional external link. */\n href?: string;\n /** Path (relative to `input/`) to an SVG/PNG passed through as a static asset. */\n image?: string;\n}\n\nexport interface OvellumLandingTrustStrip {\n /** Section label, e.g. `\"Trusted by\"`. */\n label?: string;\n items: OvellumLandingTrustItem[];\n}\n\nexport interface OvellumSiteSearchConfig {\n /** When `true`, Pagefind runs after `ovellum build` and the topbar gains a search box. */\n enabled: boolean;\n}\n\nexport interface OvellumTopbarNavItem {\n /** Visible label. */\n label: string;\n /** Site-relative or external href. */\n href: string;\n /**\n * When `true`, link opens in a new tab with `rel=\"noopener\"` and a small\n * external-link icon is appended. Defaults to `false` (or auto-detected\n * from `href` starting with `http://`/`https://` if you want).\n */\n external?: boolean;\n}\n\nexport interface OvellumSitePageMetaConfig {\n /** Show \"N min read\" above the article. Default `true`. ~200 wpm. */\n readingTime: boolean;\n /**\n * Show \"Updated YYYY-MM-DD\" above the article. Default `true`. Uses the\n * page's last git-commit time when available, otherwise the filesystem\n * mtime. Falls back to omitting the line if neither is readable.\n */\n lastModified: boolean;\n}\n\nexport interface OvellumLandingConfig {\n /** Render a landing page at `/` instead of the regular doc index. */\n enabled: boolean;\n /**\n * Destination of the top-bar \"Docs\" link. If unset, falls back to the first\n * page in the auto-generated sidebar nav.\n */\n docsHref?: string;\n hero: OvellumLandingHero;\n features: OvellumLandingFeature[];\n /** Trust strip rendered after the prose body, if any. */\n trustStrip?: OvellumLandingTrustStrip;\n}\n\nexport interface OvellumSiteConfig {\n /** Site title. Defaults to `OvellumConfig.name` or `'Ovellum site'`. */\n title?: string;\n /** Short description (used in `<meta>` and the footer). */\n description?: string;\n /** Base URL for absolute links / OG cards, e.g. `https://docs.example.com`. */\n baseUrl?: string;\n /**\n * Subpath the site is served from, Jekyll-style. Leading slash, no\n * trailing slash. Example: `\"/ovellum\"` makes the site available at\n * `https://<user>.github.io/ovellum/` — every internal link, asset URL,\n * canonical, and sitemap entry is prefixed with this value. Authors\n * keep writing root-relative links (`/getting-started/`) and the build\n * applies the prefix at render time.\n *\n * Defaults to `\"\"` (no prefix; site is served from the root).\n */\n basePath?: string;\n /** Initial theme before user preference loads. */\n defaultTheme: OvellumDefaultTheme;\n /** Footer text. Empty string disables the footer entirely. */\n footer: string;\n /**\n * Pattern for the \"Edit this page\" link in the page footer. The literal\n * `{path}` is replaced with each page's source path **relative to the\n * build cwd** (`--cwd <dir>`, defaults to `process.cwd()`). When unset\n * the link is not rendered.\n *\n * If you run `ovellum build --cwd website` from a repo root, `{path}`\n * will look like `content/getting-started.md`. Include any prefix you\n * need in the pattern itself:\n *\n * `'https://github.com/owner/repo/edit/main/website/{path}'`.\n */\n editUrlPattern?: string;\n /** Syntax-highlighting theme for fenced code blocks. Default `'github'`. */\n codeTheme: OvellumCodeTheme;\n /** Build-time search indexing via Pagefind. Disabled by default. */\n search: OvellumSiteSearchConfig;\n /** Per-page meta line (reading time + last-modified) above the article. */\n pageMeta: OvellumSitePageMetaConfig;\n /**\n * Right-aligned topbar nav items, rendered to the right of the brand on\n * every page (including the landing). Empty by default. Order is preserved.\n */\n topbarNav: OvellumTopbarNavItem[];\n /** Landing-page settings. Disabled by default. */\n landing: OvellumLandingConfig;\n}\n\nexport interface OvellumConfig {\n /** Defaults to `package.json#name`. */\n name?: string;\n /** `'auto'` reads from `package.json#version`; otherwise a literal version string. */\n version: 'auto' | string;\n mode: OvellumMode;\n /** Source / content directory (TS sources in `auto`/`hybrid`; `.md` content in `manual`). */\n input: string;\n include: string[];\n exclude: string[];\n includeInternal: boolean;\n includePrivate: boolean;\n /** Output directory for generated docs (Markdown for auto/hybrid; HTML for manual). */\n output: string;\n defaultFormat: OvellumFormat;\n protect: ProtectConfig;\n /** Site-builder settings used by `manual` mode. */\n site: OvellumSiteConfig;\n}\n\n/** All fields optional — what users actually write in `ovellum.config.ts`. */\nexport type OvellumUserConfig = Partial<Omit<OvellumConfig, 'protect' | 'site'>> & {\n protect?: Partial<ProtectConfig>;\n site?: Partial<OvellumSiteConfig>;\n};\n\nexport const DEFAULT_CONFIG: OvellumConfig = {\n version: 'auto',\n mode: 'hybrid',\n input: './src',\n include: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],\n exclude: ['node_modules', 'dist', '**/*.test.*', '**/*.spec.*', '**/*.d.ts'],\n includeInternal: false,\n includePrivate: false,\n output: './docs',\n defaultFormat: 'md',\n protect: {\n blockTag: '@manual',\n inlineTag: '@preserve',\n orphanStrategy: 'quarantine',\n orphanDir: '.ovellum/orphans',\n orphanRetention: 90,\n },\n site: {\n defaultTheme: 'auto',\n codeTheme: 'github',\n footer: 'Built with Ovellum',\n search: { enabled: false },\n pageMeta: { readingTime: true, lastModified: true },\n topbarNav: [],\n landing: {\n enabled: false,\n hero: { ctas: [] },\n features: [],\n },\n },\n};\n\n/** Frontmatter override block: `ovellum: { mode: 'manual' }`. */\nexport interface OvellumFrontmatterOverride {\n mode?: OvellumMode;\n defaultFormat?: OvellumFormat;\n}\n","export interface OvellumErrorOptions {\n /** Short machine-readable code, e.g. `INVALID_CONFIG`. */\n code: string;\n /** Optional hint to surface in the CLI alongside the message. */\n hint?: string;\n /** Optional underlying cause. */\n cause?: unknown;\n}\n\nexport class OvellumError extends Error {\n readonly code: string;\n readonly hint?: string;\n\n constructor(message: string, options: OvellumErrorOptions) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = 'OvellumError';\n this.code = options.code;\n this.hint = options.hint;\n }\n}\n\nexport class ConfigError extends OvellumError {\n constructor(message: string, options?: { hint?: string; cause?: unknown }) {\n super(message, { code: 'INVALID_CONFIG', hint: options?.hint, cause: options?.cause });\n this.name = 'ConfigError';\n }\n}\n","import type { OvellumUserConfig } from '../types/config.js';\n\n/**\n * Identity helper that gives users type-safe autocomplete in `ovellum.config.ts`.\n * Accepts a partial config; all defaults are applied during load.\n */\nexport function defineConfig(config: OvellumUserConfig): OvellumUserConfig {\n return config;\n}\n","import type {\n OvellumConfig,\n OvellumLandingConfig,\n OvellumSiteConfig,\n OvellumUserConfig,\n ProtectConfig,\n} from '../types/config.js';\n\n/**\n * Shallow merge a user override onto a resolved config. Arrays are replaced\n * wholesale (no concat); the nested `protect`, `site`, `site.landing`, and\n * `site.landing.hero` objects are merged field-by-field. Child wins on every\n * conflict.\n */\nexport function mergeConfig(base: OvellumConfig, override: OvellumUserConfig): OvellumConfig {\n const merged: OvellumConfig = { ...base };\n for (const key of Object.keys(override) as Array<keyof OvellumUserConfig>) {\n const value = override[key];\n if (value === undefined) continue;\n if (key === 'protect') {\n merged.protect = { ...base.protect, ...(value as Partial<ProtectConfig>) };\n continue;\n }\n if (key === 'site') {\n merged.site = mergeSite(base.site, value as Partial<OvellumSiteConfig>);\n continue;\n }\n (merged as unknown as Record<string, unknown>)[key] = value;\n }\n return merged;\n}\n\nfunction mergeSite(\n base: OvellumSiteConfig,\n override: Partial<OvellumSiteConfig>,\n): OvellumSiteConfig {\n const out: OvellumSiteConfig = { ...base, ...override };\n if (override.landing !== undefined) {\n out.landing = mergeLanding(base.landing, override.landing as Partial<OvellumLandingConfig>);\n }\n if (override.search !== undefined) {\n out.search = { ...base.search, ...override.search };\n }\n if (override.pageMeta !== undefined) {\n out.pageMeta = { ...base.pageMeta, ...override.pageMeta };\n }\n return out;\n}\n\nfunction mergeLanding(\n base: OvellumLandingConfig,\n override: Partial<OvellumLandingConfig>,\n): OvellumLandingConfig {\n const out: OvellumLandingConfig = { ...base, ...override };\n if (override.hero !== undefined) {\n out.hero = { ...base.hero, ...override.hero };\n }\n // `features` and `trustStrip` follow the array-wholesale-replacement rule;\n // nothing extra to do here.\n return out;\n}\n","import { ConfigError } from '../errors.js';\nimport type { OvellumUserConfig } from '../types/config.js';\n\nconst MODES = ['hybrid', 'manual', 'auto'] as const;\nconst FORMATS = ['md', 'mdx'] as const;\nconst ORPHAN_STRATEGIES = ['quarantine', 'warn'] as const;\nconst THEMES = ['auto', 'light', 'dark'] as const;\nconst CODE_THEMES = ['github', 'nord', 'solarized'] as const;\nconst CTA_STYLES = ['primary', 'secondary'] as const;\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((v) => typeof v === 'string');\n}\n\n/**\n * Validate a user-supplied config (post-parse, pre-merge). Throws `ConfigError`\n * with a path-qualified message on the first invalid field encountered.\n */\nexport function validateUserConfig(input: unknown): OvellumUserConfig {\n if (!isPlainObject(input)) {\n throw new ConfigError('Config must be an object.', {\n hint: 'Export a plain object from ovellum.config.ts (use defineConfig({ ... })).',\n });\n }\n\n const c = input;\n\n if (c.name !== undefined && typeof c.name !== 'string') {\n throw new ConfigError('`name` must be a string.');\n }\n if (c.version !== undefined && typeof c.version !== 'string') {\n throw new ConfigError(\"`version` must be a string (e.g. '1.0.0' or 'auto').\");\n }\n if (c.mode !== undefined && !MODES.includes(c.mode as (typeof MODES)[number])) {\n throw new ConfigError(`\\`mode\\` must be one of: ${MODES.join(', ')}.`);\n }\n if (c.input !== undefined && typeof c.input !== 'string') {\n throw new ConfigError('`input` must be a string path.');\n }\n if (c.output !== undefined && typeof c.output !== 'string') {\n throw new ConfigError('`output` must be a string path.');\n }\n if (c.include !== undefined && !isStringArray(c.include)) {\n throw new ConfigError('`include` must be an array of glob strings.');\n }\n if (c.exclude !== undefined && !isStringArray(c.exclude)) {\n throw new ConfigError('`exclude` must be an array of glob strings.');\n }\n if (c.includeInternal !== undefined && typeof c.includeInternal !== 'boolean') {\n throw new ConfigError('`includeInternal` must be a boolean.');\n }\n if (c.includePrivate !== undefined && typeof c.includePrivate !== 'boolean') {\n throw new ConfigError('`includePrivate` must be a boolean.');\n }\n if (\n c.defaultFormat !== undefined &&\n !FORMATS.includes(c.defaultFormat as (typeof FORMATS)[number])\n ) {\n throw new ConfigError(`\\`defaultFormat\\` must be one of: ${FORMATS.join(', ')}.`);\n }\n\n if (c.protect !== undefined) {\n if (!isPlainObject(c.protect)) {\n throw new ConfigError('`protect` must be an object.');\n }\n const p = c.protect;\n if (p.blockTag !== undefined && typeof p.blockTag !== 'string') {\n throw new ConfigError('`protect.blockTag` must be a string.');\n }\n if (p.inlineTag !== undefined && typeof p.inlineTag !== 'string') {\n throw new ConfigError('`protect.inlineTag` must be a string.');\n }\n if (\n p.orphanStrategy !== undefined &&\n !ORPHAN_STRATEGIES.includes(p.orphanStrategy as (typeof ORPHAN_STRATEGIES)[number])\n ) {\n throw new ConfigError(\n `\\`protect.orphanStrategy\\` must be one of: ${ORPHAN_STRATEGIES.join(', ')}.`,\n );\n }\n if (p.orphanDir !== undefined && typeof p.orphanDir !== 'string') {\n throw new ConfigError('`protect.orphanDir` must be a string path.');\n }\n if (p.orphanRetention !== undefined) {\n if (typeof p.orphanRetention !== 'number' || !Number.isFinite(p.orphanRetention)) {\n throw new ConfigError('`protect.orphanRetention` must be a finite number of days.');\n }\n if (p.orphanRetention < 0) {\n throw new ConfigError('`protect.orphanRetention` must be >= 0.');\n }\n }\n }\n\n if (c.site !== undefined) {\n if (!isPlainObject(c.site)) {\n throw new ConfigError('`site` must be an object.');\n }\n const s = c.site;\n if (s.title !== undefined && typeof s.title !== 'string') {\n throw new ConfigError('`site.title` must be a string.');\n }\n if (s.description !== undefined && typeof s.description !== 'string') {\n throw new ConfigError('`site.description` must be a string.');\n }\n if (s.baseUrl !== undefined && typeof s.baseUrl !== 'string') {\n throw new ConfigError('`site.baseUrl` must be a string URL.');\n }\n if (s.basePath !== undefined) {\n if (typeof s.basePath !== 'string') {\n throw new ConfigError('`site.basePath` must be a string path.');\n }\n if (s.basePath !== '' && !s.basePath.startsWith('/')) {\n throw new ConfigError(\n '`site.basePath` must start with `/` (e.g. `/ovellum`) or be the empty string.',\n { hint: 'Strip the protocol+host; that belongs in `site.baseUrl`.' },\n );\n }\n }\n if (s.footer !== undefined && typeof s.footer !== 'string') {\n throw new ConfigError('`site.footer` must be a string.');\n }\n if (s.editUrlPattern !== undefined && typeof s.editUrlPattern !== 'string') {\n throw new ConfigError('`site.editUrlPattern` must be a string URL template.');\n }\n if (\n s.defaultTheme !== undefined &&\n !THEMES.includes(s.defaultTheme as (typeof THEMES)[number])\n ) {\n throw new ConfigError(`\\`site.defaultTheme\\` must be one of: ${THEMES.join(', ')}.`);\n }\n if (\n s.codeTheme !== undefined &&\n !CODE_THEMES.includes(s.codeTheme as (typeof CODE_THEMES)[number])\n ) {\n throw new ConfigError(`\\`site.codeTheme\\` must be one of: ${CODE_THEMES.join(', ')}.`);\n }\n if (s.search !== undefined) {\n if (!isPlainObject(s.search)) {\n throw new ConfigError('`site.search` must be an object.');\n }\n if (s.search.enabled !== undefined && typeof s.search.enabled !== 'boolean') {\n throw new ConfigError('`site.search.enabled` must be a boolean.');\n }\n }\n if (s.topbarNav !== undefined) {\n if (!Array.isArray(s.topbarNav)) {\n throw new ConfigError('`site.topbarNav` must be an array.');\n }\n s.topbarNav.forEach((item, i) => {\n const path = `site.topbarNav[${i}]`;\n if (!isPlainObject(item)) throw new ConfigError(`\\`${path}\\` must be an object.`);\n if (typeof item.label !== 'string') {\n throw new ConfigError(`\\`${path}.label\\` must be a string.`);\n }\n if (typeof item.href !== 'string') {\n throw new ConfigError(`\\`${path}.href\\` must be a string.`);\n }\n if (item.external !== undefined && typeof item.external !== 'boolean') {\n throw new ConfigError(`\\`${path}.external\\` must be a boolean.`);\n }\n });\n }\n if (s.pageMeta !== undefined) {\n if (!isPlainObject(s.pageMeta)) {\n throw new ConfigError('`site.pageMeta` must be an object.');\n }\n if (s.pageMeta.readingTime !== undefined && typeof s.pageMeta.readingTime !== 'boolean') {\n throw new ConfigError('`site.pageMeta.readingTime` must be a boolean.');\n }\n if (s.pageMeta.lastModified !== undefined && typeof s.pageMeta.lastModified !== 'boolean') {\n throw new ConfigError('`site.pageMeta.lastModified` must be a boolean.');\n }\n }\n if (s.landing !== undefined) validateLanding(s.landing);\n }\n\n return c as OvellumUserConfig;\n}\n\nfunction validateLanding(value: unknown): void {\n if (!isPlainObject(value)) {\n throw new ConfigError('`site.landing` must be an object.');\n }\n const l = value;\n if (l.enabled !== undefined && typeof l.enabled !== 'boolean') {\n throw new ConfigError('`site.landing.enabled` must be a boolean.');\n }\n if (l.docsHref !== undefined && typeof l.docsHref !== 'string') {\n throw new ConfigError('`site.landing.docsHref` must be a string URL or path.');\n }\n if (l.hero !== undefined) {\n if (!isPlainObject(l.hero)) {\n throw new ConfigError('`site.landing.hero` must be an object.');\n }\n const h = l.hero;\n if (h.title !== undefined && typeof h.title !== 'string') {\n throw new ConfigError('`site.landing.hero.title` must be a string.');\n }\n if (h.subtitle !== undefined && typeof h.subtitle !== 'string') {\n throw new ConfigError('`site.landing.hero.subtitle` must be a string.');\n }\n if (h.ctas !== undefined) {\n if (!Array.isArray(h.ctas)) {\n throw new ConfigError('`site.landing.hero.ctas` must be an array.');\n }\n h.ctas.forEach((cta, i) => validateCta(cta, `site.landing.hero.ctas[${i}]`));\n }\n }\n if (l.features !== undefined) {\n if (!Array.isArray(l.features)) {\n throw new ConfigError('`site.landing.features` must be an array.');\n }\n l.features.forEach((f, i) => validateFeature(f, `site.landing.features[${i}]`));\n }\n if (l.trustStrip !== undefined) {\n if (!isPlainObject(l.trustStrip)) {\n throw new ConfigError('`site.landing.trustStrip` must be an object.');\n }\n const ts = l.trustStrip;\n if (ts.label !== undefined && typeof ts.label !== 'string') {\n throw new ConfigError('`site.landing.trustStrip.label` must be a string.');\n }\n if (ts.items !== undefined) {\n if (!Array.isArray(ts.items)) {\n throw new ConfigError('`site.landing.trustStrip.items` must be an array.');\n }\n ts.items.forEach((it, i) => validateTrustItem(it, `site.landing.trustStrip.items[${i}]`));\n }\n }\n}\n\nfunction validateCta(value: unknown, path: string): void {\n if (!isPlainObject(value)) throw new ConfigError(`\\`${path}\\` must be an object.`);\n const c = value;\n if (typeof c.label !== 'string') throw new ConfigError(`\\`${path}.label\\` must be a string.`);\n if (typeof c.href !== 'string') throw new ConfigError(`\\`${path}.href\\` must be a string.`);\n if (c.style !== undefined && !CTA_STYLES.includes(c.style as (typeof CTA_STYLES)[number])) {\n throw new ConfigError(`\\`${path}.style\\` must be one of: ${CTA_STYLES.join(', ')}.`);\n }\n}\n\nfunction validateFeature(value: unknown, path: string): void {\n if (!isPlainObject(value)) throw new ConfigError(`\\`${path}\\` must be an object.`);\n const f = value;\n if (typeof f.title !== 'string') throw new ConfigError(`\\`${path}.title\\` must be a string.`);\n if (typeof f.description !== 'string') {\n throw new ConfigError(`\\`${path}.description\\` must be a string.`);\n }\n if (f.icon !== undefined && typeof f.icon !== 'string') {\n throw new ConfigError(`\\`${path}.icon\\` must be a string.`);\n }\n}\n\nfunction validateTrustItem(value: unknown, path: string): void {\n if (!isPlainObject(value)) throw new ConfigError(`\\`${path}\\` must be an object.`);\n const t = value;\n if (typeof t.name !== 'string') throw new ConfigError(`\\`${path}.name\\` must be a string.`);\n if (t.href !== undefined && typeof t.href !== 'string') {\n throw new ConfigError(`\\`${path}.href\\` must be a string.`);\n }\n if (t.image !== undefined && typeof t.image !== 'string') {\n throw new ConfigError(`\\`${path}.image\\` must be a string path.`);\n }\n}\n","import { ConfigError } from '../errors.js';\nimport type { OvellumFrontmatterOverride, OvellumMode, OvellumFormat } from '../types/config.js';\n\nconst MODES: readonly OvellumMode[] = ['hybrid', 'manual', 'auto'];\nconst FORMATS: readonly OvellumFormat[] = ['md', 'mdx'];\n\n/**\n * Extract and validate the `ovellum:` block from parsed frontmatter. Returns\n * an empty object when no override is present. Throws on invalid shape.\n */\nexport function parseFrontmatterOverride(\n frontmatter: Record<string, unknown> | undefined,\n): OvellumFrontmatterOverride {\n if (!frontmatter || frontmatter.ovellum === undefined) return {};\n const block = frontmatter.ovellum;\n if (typeof block === 'boolean') {\n // `ovellum: true` is the marker for auto-generated files. Not a config override.\n return {};\n }\n if (typeof block !== 'object' || block === null || Array.isArray(block)) {\n throw new ConfigError(\n \"Frontmatter `ovellum:` must be an object (e.g. `ovellum: { mode: 'manual' }`).\",\n );\n }\n const out: OvellumFrontmatterOverride = {};\n const b = block as Record<string, unknown>;\n if (b.mode !== undefined) {\n if (!MODES.includes(b.mode as OvellumMode)) {\n throw new ConfigError(`Frontmatter \\`ovellum.mode\\` must be one of: ${MODES.join(', ')}.`);\n }\n out.mode = b.mode as OvellumMode;\n }\n if (b.defaultFormat !== undefined) {\n if (!FORMATS.includes(b.defaultFormat as OvellumFormat)) {\n throw new ConfigError(\n `Frontmatter \\`ovellum.defaultFormat\\` must be one of: ${FORMATS.join(', ')}.`,\n );\n }\n out.defaultFormat = b.defaultFormat as OvellumFormat;\n }\n return out;\n}\n","import path from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { loadConfig as c12LoadConfig } from 'c12';\nimport { ConfigError } from '../errors.js';\nimport { DEFAULT_CONFIG } from '../types/config.js';\nimport type { OvellumConfig, OvellumUserConfig } from '../types/config.js';\nimport { mergeConfig } from './merge.js';\nimport { validateUserConfig } from './validate.js';\n\nexport interface LoadOvellumConfigOptions {\n /** Project root. Defaults to `process.cwd()`. */\n cwd?: string;\n /** Override config file name (sans extension). Defaults to `ovellum`. */\n name?: string;\n /** Explicit path to a config file. Overrides discovery. */\n configFile?: string;\n}\n\nexport interface LoadedOvellumConfig {\n config: OvellumConfig;\n /** Absolute path of the loaded config file, or `undefined` if defaults only. */\n configFile?: string;\n /** Resolved project root. */\n cwd: string;\n}\n\nconst CONFIG_EXTENSIONS = ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs', 'json'] as const;\n\n/**\n * Load the root `ovellum.config.*` from `cwd`, validate it, and merge it onto\n * built-in defaults. Returns defaults alone when no config file is present.\n */\nexport async function loadOvellumConfig(\n options: LoadOvellumConfigOptions = {},\n): Promise<LoadedOvellumConfig> {\n const cwd = path.resolve(options.cwd ?? process.cwd());\n const name = options.name ?? 'ovellum';\n\n let raw: unknown;\n let configFile: string | undefined;\n\n try {\n const result = await c12LoadConfig<OvellumUserConfig>({\n cwd,\n name,\n configFile: options.configFile,\n // We apply our own defaults after validation so users see clean errors\n // pointing only at their own fields.\n defaults: {},\n });\n raw = result.config ?? {};\n // c12 returns the bare name (e.g. \"ovellum.config\") even when no file\n // matched, so only treat it as a real file when it points at an existing\n // absolute path.\n const resolved = result.configFile\n ? path.isAbsolute(result.configFile)\n ? result.configFile\n : undefined\n : undefined;\n configFile = resolved && existsSync(resolved) ? resolved : undefined;\n } catch (err) {\n throw new ConfigError('Failed to load ovellum config.', { cause: err });\n }\n\n const userConfig = validateUserConfig(raw);\n const config = mergeConfig(DEFAULT_CONFIG, userConfig);\n return { config, configFile, cwd };\n}\n\n/**\n * Find the deepest `ovellum.config.*` between `cwd` and `targetDir` (inclusive\n * of `targetDir`, exclusive of `cwd`'s parent) and merge it onto `rootConfig`.\n * Returns `rootConfig` unchanged if no nested config is present.\n *\n * Per-directory configs are loaded synchronously via `import()` is overkill —\n * for Phase 1 we only support `.json`, `.js`, `.mjs`, `.cjs` here; `.ts`\n * support requires going through `c12` again. We defer the `.ts` path to a\n * follow-up since the parser pipeline will normally call this on every source\n * file and re-running c12 per directory would be expensive.\n */\nexport async function loadDirectoryOverride(\n rootCwd: string,\n targetDir: string,\n rootConfig: OvellumConfig,\n options: { name?: string } = {},\n): Promise<OvellumConfig> {\n const name = options.name ?? 'ovellum';\n const root = path.resolve(rootCwd);\n let dir = path.resolve(targetDir);\n\n if (!dir.startsWith(root)) {\n throw new ConfigError(`targetDir (${targetDir}) is outside the project root (${rootCwd}).`, {\n hint: 'Per-directory overrides must live within the project root.',\n });\n }\n\n const overrideChain: string[] = [];\n while (dir !== root) {\n const found = findConfigFile(dir, name);\n if (found) overrideChain.unshift(found);\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n if (overrideChain.length === 0) return rootConfig;\n\n let merged = rootConfig;\n for (const file of overrideChain) {\n const raw = await c12LoadConfig<OvellumUserConfig>({\n cwd: path.dirname(file),\n configFile: file,\n name,\n defaults: {},\n });\n const validated = validateUserConfig(raw.config ?? {});\n merged = mergeConfig(merged, validated);\n }\n return merged;\n}\n\nfunction findConfigFile(dir: string, name: string): string | undefined {\n for (const ext of CONFIG_EXTENSIONS) {\n const candidate = path.join(dir, `${name}.config.${ext}`);\n if (existsSync(candidate)) return candidate;\n }\n return undefined;\n}\n","import { existsSync } from 'node:fs';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { OrphanRecord, OvellumConfig, OvellumMode } from '@ovellum/core';\nimport { parseProject } from '@ovellum/parser';\nimport { generateDocs } from '@ovellum/generator';\nimport { readManualDoc } from '@ovellum/reader';\nimport { merge, writeOrphan } from '@ovellum/merger';\nimport { buildSite, type PageOutput } from '@ovellum/site';\n\nexport interface RunBuildInput {\n config: OvellumConfig;\n cwd: string;\n}\n\n/**\n * Shape returned by `runBuild` regardless of mode. Some fields are mode-\n * specific (manual gets `pages` + `outputDir`; auto/hybrid get `written`,\n * `merged`, `orphans`, `quarantined`). Both arms always populate `warnings`\n * and `elapsedMs` so callers can log uniformly.\n */\nexport interface BuildSummary {\n mode: OvellumMode;\n elapsedMs: number;\n warnings: string[];\n\n // Manual-mode fields\n outputDir?: string;\n pages?: PageOutput[];\n landingRendered?: boolean;\n\n // Auto / hybrid fields\n sources?: number;\n written?: string[];\n merged?: string[];\n orphans?: number;\n quarantined?: string[];\n}\n\n/**\n * Run an Ovellum build dispatched by `config.mode`. Shared between\n * `ovellum build` (one-shot) and the watcher used by `ovellum watch` /\n * `ovellum dev` (rebuilds on file changes).\n */\nexport async function runBuild(input: RunBuildInput): Promise<BuildSummary> {\n const { config, cwd } = input;\n const startedAt = Date.now();\n\n if (config.mode === 'manual') {\n const result = await buildSite({ config, cwd });\n return {\n mode: 'manual',\n elapsedMs: Date.now() - startedAt,\n warnings: result.warnings,\n outputDir: result.outputDir,\n pages: result.pages,\n landingRendered: result.landingRendered,\n };\n }\n\n // auto / hybrid\n const project = parseProject({ config, cwd });\n const { files, warnings } = generateDocs(project, config);\n\n const orphanRecords: OrphanRecord[] = [];\n const mergedFiles: string[] = [];\n\n for (const [relOut, generatedBody] of files) {\n const abs = path.resolve(cwd, relOut);\n let finalBody = generatedBody;\n\n if (config.mode === 'hybrid' && existsSync(abs)) {\n const manualDoc = await readManualDoc(abs);\n if (manualDoc.protectedBlocks.length > 0) {\n const result = merge(generatedBody, manualDoc, { sourceFile: relOut });\n finalBody = result.content;\n orphanRecords.push(...result.orphans);\n warnings.push(...result.warnings);\n mergedFiles.push(relOut);\n }\n }\n\n await mkdir(path.dirname(abs), { recursive: true });\n await writeFile(abs, finalBody, 'utf8');\n }\n\n const quarantined: string[] = [];\n if (orphanRecords.length > 0) {\n const orphanDir = path.resolve(cwd, config.protect.orphanDir);\n for (const record of orphanRecords) {\n const archivePath = await writeOrphan(record, orphanDir);\n quarantined.push(path.relative(cwd, archivePath));\n }\n }\n\n return {\n mode: config.mode,\n elapsedMs: Date.now() - startedAt,\n warnings,\n sources: project.files.length,\n written: Array.from(files.keys()),\n merged: mergedFiles,\n orphans: orphanRecords.length,\n quarantined,\n };\n}\n","import path from 'node:path';\nimport { Project, ScriptTarget, ModuleKind } from 'ts-morph';\nimport type { DocFile, DocProject, OvellumConfig } from '@ovellum/core';\nimport { extractFromFile } from './extractors.js';\nimport { extractJsDoc } from './jsdoc.js';\nimport { anchorId, MODULE_SYMBOL } from './anchor.js';\n\nexport interface ParseOptions {\n config: OvellumConfig;\n /** Project root - paths in `config.input`, `include`, `exclude` resolve from here. */\n cwd: string;\n /** Project name for the output IR; defaults to `config.name` or `'project'`. */\n projectName?: string;\n /** Project version for the output IR; defaults to `'0.0.0'` (resolved upstream when 'auto'). */\n projectVersion?: string;\n}\n\n/**\n * Parse a TypeScript/JavaScript project into the Ovellum IR.\n *\n * Implemented as of Phase 2 (slice): functions, classes (methods+props), interfaces, type\n * aliases, enums. Overloads, namespaces, re-exports, and `declare module` are not yet\n * supported - they'll either be skipped or partially captured. See TODO.md Phase 2.\n */\nexport function parseProject(options: ParseOptions): DocProject {\n const { config, cwd } = options;\n const absInput = path.resolve(cwd, config.input);\n\n const project = new Project({\n compilerOptions: {\n allowJs: true,\n target: ScriptTarget.ESNext,\n module: ModuleKind.ESNext,\n strict: false,\n skipLibCheck: true,\n },\n skipAddingFilesFromTsConfig: true,\n useInMemoryFileSystem: false,\n });\n\n const patterns = [\n ...config.include.map((g) => toPosix(path.join(absInput, g))),\n ...config.exclude.map((g) => '!' + toPosix(path.join(absInput, g))),\n ];\n project.addSourceFilesAtPaths(patterns);\n\n const files: DocFile[] = [];\n for (const sf of project.getSourceFiles()) {\n const abs = sf.getFilePath();\n const rel = toPosix(path.relative(cwd, abs));\n const moduleDoc = readModuleJsDoc(sf);\n const nodes = extractFromFile(sf, { relPath: rel, config });\n if (nodes.length === 0 && !moduleDoc.description && !moduleDoc.moduleName) continue;\n\n const docFile: DocFile = { filePath: rel, nodes };\n if (moduleDoc.moduleName) docFile.moduleName = moduleDoc.moduleName;\n if (moduleDoc.description) docFile.description = moduleDoc.description;\n files.push(docFile);\n }\n\n // Sort files for deterministic output ordering.\n files.sort((a, b) => a.filePath.localeCompare(b.filePath));\n\n return {\n name: options.projectName ?? config.name ?? 'project',\n version: options.projectVersion ?? '0.0.0',\n files,\n generatedAt: new Date().toISOString(),\n };\n}\n\nfunction readModuleJsDoc(sf: import('ts-morph').SourceFile): {\n description?: string;\n moduleName?: string;\n} {\n // Look for a JSDoc block at the top of the file. ts-morph attaches leading\n // JSDoc to the first statement; we accept it as \"module-level\" if it carries\n // `@module` or if the file has no other JSDoc-bearing top-level statements\n // above the first statement's actual code.\n const first = sf.getStatements()[0];\n if (!first) return {};\n const docable = first as unknown as { getJsDocs?: () => unknown[] };\n if (typeof docable.getJsDocs !== 'function') return {};\n const info = extractJsDoc(first as unknown as Parameters<typeof extractJsDoc>[0]);\n if (info.moduleName !== undefined) {\n return { description: info.description, moduleName: info.moduleName };\n }\n return {};\n}\n\nfunction toPosix(p: string): string {\n return p.replace(/\\\\/g, '/');\n}\n\nexport { anchorId, MODULE_SYMBOL };\n","/** Build a stable anchor ID per DESIGN.md §8.3: `{relativeFilePath}::{symbolPath}`. */\nexport function anchorId(filePath: string, symbolPath: string): string {\n return `${filePath}::${symbolPath}`;\n}\n\nexport const MODULE_SYMBOL = '__module__';\n","import type { JSDocableNode, JSDoc, JSDocTag } from 'ts-morph';\n\nexport interface JsDocInfo {\n description?: string;\n /** Param name → description, from `@param`. */\n paramDescriptions: Record<string, string>;\n returnsDescription?: string;\n examples: string[];\n throws: string[];\n see: string[];\n deprecated?: string;\n since?: string;\n internal: boolean;\n preserved: boolean;\n /** Module-name from `@module`, only meaningful at file scope. */\n moduleName?: string;\n /** Any unrecognized tag → its raw comment text. */\n tags: Record<string, string>;\n}\n\nconst KNOWN_TAGS = new Set([\n 'param',\n 'returns',\n 'return',\n 'throws',\n 'exception',\n 'example',\n 'deprecated',\n 'since',\n 'see',\n 'remarks',\n 'description',\n 'preserve',\n 'internal',\n 'module',\n]);\n\nexport function emptyJsDocInfo(): JsDocInfo {\n return {\n paramDescriptions: {},\n examples: [],\n throws: [],\n see: [],\n internal: false,\n preserved: false,\n tags: {},\n };\n}\n\nexport function extractJsDoc(node: JSDocableNode): JsDocInfo {\n const blocks = node.getJsDocs();\n if (blocks.length === 0) return emptyJsDocInfo();\n // Use the last JSDoc block (closest to the declaration).\n const block = blocks[blocks.length - 1]!;\n return parseBlock(block);\n}\n\nfunction parseBlock(block: JSDoc): JsDocInfo {\n const out = emptyJsDocInfo();\n const desc = block.getDescription().trim();\n if (desc) out.description = desc;\n\n for (const tag of block.getTags()) {\n consumeTag(tag, out);\n }\n return out;\n}\n\nfunction consumeTag(tag: JSDocTag, info: JsDocInfo): void {\n const name = tag.getTagName();\n const comment = readComment(tag);\n\n switch (name) {\n case 'param': {\n const paramName = readParamName(tag);\n if (paramName) info.paramDescriptions[paramName] = comment;\n return;\n }\n case 'returns':\n case 'return':\n info.returnsDescription = comment;\n return;\n case 'throws':\n case 'exception':\n if (comment) info.throws.push(comment);\n return;\n case 'example':\n if (comment) info.examples.push(comment);\n return;\n case 'deprecated':\n info.deprecated = comment || 'Deprecated.';\n return;\n case 'since':\n info.since = comment;\n return;\n case 'see':\n if (comment) info.see.push(comment);\n return;\n case 'internal':\n info.internal = true;\n return;\n case 'preserve':\n info.preserved = true;\n return;\n case 'module':\n info.moduleName = comment;\n return;\n case 'remarks':\n case 'description':\n // Merge into description if not already set.\n if (!info.description && comment) info.description = comment;\n return;\n default:\n if (!KNOWN_TAGS.has(name)) info.tags[name] = comment;\n }\n}\n\nfunction readComment(tag: JSDocTag): string {\n const raw = tag.getCommentText();\n // Strip a leading dash separator used by `@param name - description`.\n return (raw ?? '').replace(/^\\s*-\\s*/, '').trim();\n}\n\nfunction readParamName(tag: JSDocTag): string | undefined {\n // Try the typed accessor first; fall back to parsing the raw text.\n const node = tag.compilerNode as { name?: { getText?: () => string } };\n const named = node.name?.getText?.();\n if (named) return named;\n const text = tag.getText();\n const match = text.match(/@param\\s+(?:\\{[^}]*\\}\\s+)?([A-Za-z_$][\\w$]*)/);\n return match ? match[1] : undefined;\n}\n","import type {\n ClassDeclaration,\n EnumDeclaration,\n FunctionDeclaration,\n InterfaceDeclaration,\n MethodDeclaration,\n ParameterDeclaration,\n PropertyDeclaration,\n SourceFile,\n TypeAliasDeclaration,\n} from 'ts-morph';\nimport type { DocNode, DocParam, OvellumConfig } from '@ovellum/core';\nimport { anchorId } from './anchor.js';\nimport { extractJsDoc, type JsDocInfo } from './jsdoc.js';\n\ninterface ExtractorContext {\n relPath: string;\n config: OvellumConfig;\n}\n\nexport function extractFromFile(sf: SourceFile, ctx: ExtractorContext): DocNode[] {\n return [\n ...sf.getFunctions().flatMap((fn) => fromFunction(fn, ctx)),\n ...sf.getClasses().flatMap((cls) => fromClass(cls, ctx)),\n ...sf.getInterfaces().flatMap((iface) => fromInterface(iface, ctx)),\n ...sf.getTypeAliases().flatMap((alias) => fromTypeAlias(alias, ctx)),\n ...sf.getEnums().flatMap((en) => fromEnum(en, ctx)),\n ];\n}\n\nfunction shouldInclude(isExported: boolean, jsdoc: JsDocInfo, ctx: ExtractorContext): boolean {\n if (!isExported && !ctx.config.includeInternal) return false;\n if (jsdoc.internal && !ctx.config.includeInternal) return false;\n return true;\n}\n\nfunction fromFunction(fn: FunctionDeclaration, ctx: ExtractorContext): DocNode[] {\n const name = fn.getName();\n if (!name) return [];\n const jsdoc = extractJsDoc(fn);\n const isExported = fn.isExported();\n if (!shouldInclude(isExported, jsdoc, ctx)) return [];\n\n const params = fn.getParameters().map((p) => paramToDoc(p, jsdoc));\n const returnTypeText = fn.getReturnTypeNode()?.getText() ?? fn.getReturnType().getText(fn);\n\n const signature = buildFunctionSignature({\n name,\n generics: fn.getTypeParameters().map((tp) => tp.getText()),\n params: fn.getParameters().map(paramSignaturePart),\n returnType: returnTypeText,\n isAsync: fn.isAsync(),\n });\n\n const node: DocNode = {\n id: anchorId(ctx.relPath, name),\n kind: 'function',\n name,\n filePath: ctx.relPath,\n line: fn.getStartLineNumber(),\n signature,\n isExported,\n isInternal: jsdoc.internal,\n isPreserved: jsdoc.preserved,\n tags: jsdoc.tags,\n params,\n returns: {\n type: returnTypeText,\n description: jsdoc.returnsDescription,\n },\n };\n attachJsDocFields(node, jsdoc);\n return [node];\n}\n\nfunction fromClass(cls: ClassDeclaration, ctx: ExtractorContext): DocNode[] {\n const name = cls.getName();\n if (!name) return [];\n const jsdoc = extractJsDoc(cls);\n const isExported = cls.isExported();\n if (!shouldInclude(isExported, jsdoc, ctx)) return [];\n\n const heritage: string[] = [];\n const extendsClause = cls.getExtends();\n if (extendsClause) heritage.push(`extends ${extendsClause.getText()}`);\n const implementsClause = cls.getImplements();\n if (implementsClause.length > 0) {\n heritage.push(`implements ${implementsClause.map((i) => i.getText()).join(', ')}`);\n }\n const generics = cls.getTypeParameters().map((tp) => tp.getText());\n const gen = generics.length ? `<${generics.join(', ')}>` : '';\n const signature = `class ${name}${gen}${heritage.length ? ' ' + heritage.join(' ') : ''}`;\n\n const children: DocNode[] = [];\n for (const method of cls.getMethods()) {\n const childNode = fromMethod(method, ctx, name);\n if (childNode) children.push(childNode);\n }\n for (const prop of cls.getProperties()) {\n const childNode = fromProperty(prop, ctx, name);\n if (childNode) children.push(childNode);\n }\n\n const node: DocNode = {\n id: anchorId(ctx.relPath, name),\n kind: 'class',\n name,\n filePath: ctx.relPath,\n line: cls.getStartLineNumber(),\n signature,\n isExported,\n isInternal: jsdoc.internal,\n isPreserved: jsdoc.preserved,\n tags: jsdoc.tags,\n children: children.length ? children : undefined,\n };\n attachJsDocFields(node, jsdoc);\n return [node];\n}\n\nfunction fromMethod(\n method: MethodDeclaration,\n ctx: ExtractorContext,\n className: string,\n): DocNode | undefined {\n const name = method.getName();\n const jsdoc = extractJsDoc(method);\n const isStaticOrPublic =\n !method.hasModifier('private') || ctx.config.includePrivate || ctx.config.includeInternal;\n if (!isStaticOrPublic) return undefined;\n if (jsdoc.internal && !ctx.config.includeInternal) return undefined;\n\n const params = method.getParameters().map((p) => paramToDoc(p, jsdoc));\n const returnTypeText =\n method.getReturnTypeNode()?.getText() ?? method.getReturnType().getText(method);\n const generics = method.getTypeParameters().map((tp) => tp.getText());\n const gen = generics.length ? `<${generics.join(', ')}>` : '';\n const signature = `${name}${gen}(${method.getParameters().map(paramSignaturePart).join(', ')}): ${returnTypeText}`;\n\n const node: DocNode = {\n id: anchorId(ctx.relPath, `${className}.${name}`),\n kind: 'method',\n name,\n filePath: ctx.relPath,\n line: method.getStartLineNumber(),\n signature,\n isExported: true,\n isInternal: jsdoc.internal,\n isPreserved: jsdoc.preserved,\n tags: jsdoc.tags,\n params,\n returns: {\n type: returnTypeText,\n description: jsdoc.returnsDescription,\n },\n };\n attachJsDocFields(node, jsdoc);\n return node;\n}\n\nfunction fromProperty(\n prop: PropertyDeclaration,\n ctx: ExtractorContext,\n className: string,\n): DocNode | undefined {\n const name = prop.getName();\n const jsdoc = extractJsDoc(prop);\n const isPrivate = prop.hasModifier('private');\n if (isPrivate && !ctx.config.includePrivate && !ctx.config.includeInternal) return undefined;\n if (jsdoc.internal && !ctx.config.includeInternal) return undefined;\n\n const typeText = prop.getTypeNode()?.getText() ?? prop.getType().getText(prop);\n const node: DocNode = {\n id: anchorId(ctx.relPath, `${className}.${name}`),\n kind: 'property',\n name,\n filePath: ctx.relPath,\n line: prop.getStartLineNumber(),\n signature: `${name}: ${typeText}`,\n isExported: true,\n isInternal: jsdoc.internal,\n isPreserved: jsdoc.preserved,\n tags: jsdoc.tags,\n };\n attachJsDocFields(node, jsdoc);\n return node;\n}\n\nfunction fromInterface(iface: InterfaceDeclaration, ctx: ExtractorContext): DocNode[] {\n const name = iface.getName();\n const jsdoc = extractJsDoc(iface);\n const isExported = iface.isExported();\n if (!shouldInclude(isExported, jsdoc, ctx)) return [];\n\n const extendsList = iface.getExtends().map((e) => e.getText());\n const generics = iface.getTypeParameters().map((tp) => tp.getText());\n const gen = generics.length ? `<${generics.join(', ')}>` : '';\n const ext = extendsList.length ? ` extends ${extendsList.join(', ')}` : '';\n const signature = `interface ${name}${gen}${ext}`;\n\n const children: DocNode[] = [];\n for (const prop of iface.getProperties()) {\n const propJsdoc = extractJsDoc(prop);\n const propType = prop.getTypeNode()?.getText() ?? prop.getType().getText(prop);\n const optional = prop.hasQuestionToken() ? '?' : '';\n const propName = prop.getName();\n const propNode: DocNode = {\n id: anchorId(ctx.relPath, `${name}.${propName}`),\n kind: 'property',\n name: propName,\n filePath: ctx.relPath,\n line: prop.getStartLineNumber(),\n signature: `${propName}${optional}: ${propType}`,\n isExported: true,\n isInternal: propJsdoc.internal,\n isPreserved: propJsdoc.preserved,\n tags: propJsdoc.tags,\n };\n attachJsDocFields(propNode, propJsdoc);\n children.push(propNode);\n }\n for (const method of iface.getMethods()) {\n const methodJsdoc = extractJsDoc(method);\n const methodName = method.getName();\n const methodParams = method.getParameters().map(paramSignaturePart).join(', ');\n const methodReturn =\n method.getReturnTypeNode()?.getText() ?? method.getReturnType().getText(method);\n const methodNode: DocNode = {\n id: anchorId(ctx.relPath, `${name}.${methodName}`),\n kind: 'method',\n name: methodName,\n filePath: ctx.relPath,\n line: method.getStartLineNumber(),\n signature: `${methodName}(${methodParams}): ${methodReturn}`,\n isExported: true,\n isInternal: methodJsdoc.internal,\n isPreserved: methodJsdoc.preserved,\n tags: methodJsdoc.tags,\n params: method.getParameters().map((p) => paramToDoc(p, methodJsdoc)),\n returns: { type: methodReturn, description: methodJsdoc.returnsDescription },\n };\n attachJsDocFields(methodNode, methodJsdoc);\n children.push(methodNode);\n }\n\n const node: DocNode = {\n id: anchorId(ctx.relPath, name),\n kind: 'interface',\n name,\n filePath: ctx.relPath,\n line: iface.getStartLineNumber(),\n signature,\n isExported,\n isInternal: jsdoc.internal,\n isPreserved: jsdoc.preserved,\n tags: jsdoc.tags,\n children: children.length ? children : undefined,\n };\n attachJsDocFields(node, jsdoc);\n return [node];\n}\n\nfunction fromTypeAlias(alias: TypeAliasDeclaration, ctx: ExtractorContext): DocNode[] {\n const name = alias.getName();\n const jsdoc = extractJsDoc(alias);\n const isExported = alias.isExported();\n if (!shouldInclude(isExported, jsdoc, ctx)) return [];\n\n const generics = alias.getTypeParameters().map((tp) => tp.getText());\n const gen = generics.length ? `<${generics.join(', ')}>` : '';\n const typeText = alias.getTypeNode()?.getText() ?? alias.getType().getText(alias);\n\n const node: DocNode = {\n id: anchorId(ctx.relPath, name),\n kind: 'type',\n name,\n filePath: ctx.relPath,\n line: alias.getStartLineNumber(),\n signature: `type ${name}${gen} = ${typeText}`,\n isExported,\n isInternal: jsdoc.internal,\n isPreserved: jsdoc.preserved,\n tags: jsdoc.tags,\n };\n attachJsDocFields(node, jsdoc);\n return [node];\n}\n\nfunction fromEnum(en: EnumDeclaration, ctx: ExtractorContext): DocNode[] {\n const name = en.getName();\n const jsdoc = extractJsDoc(en);\n const isExported = en.isExported();\n if (!shouldInclude(isExported, jsdoc, ctx)) return [];\n\n const children: DocNode[] = en.getMembers().map((member) => {\n const memberJsdoc = extractJsDoc(member);\n const memberName = member.getName();\n const value = member.getInitializer()?.getText();\n const sigBody = value !== undefined ? `${memberName} = ${value}` : memberName;\n const memberNode: DocNode = {\n id: anchorId(ctx.relPath, `${name}.${memberName}`),\n kind: 'property',\n name: memberName,\n filePath: ctx.relPath,\n line: member.getStartLineNumber(),\n signature: sigBody,\n isExported: true,\n isInternal: memberJsdoc.internal,\n isPreserved: memberJsdoc.preserved,\n tags: memberJsdoc.tags,\n };\n attachJsDocFields(memberNode, memberJsdoc);\n return memberNode;\n });\n\n const node: DocNode = {\n id: anchorId(ctx.relPath, name),\n kind: 'enum',\n name,\n filePath: ctx.relPath,\n line: en.getStartLineNumber(),\n signature: `enum ${name}`,\n isExported,\n isInternal: jsdoc.internal,\n isPreserved: jsdoc.preserved,\n tags: jsdoc.tags,\n children,\n };\n attachJsDocFields(node, jsdoc);\n return [node];\n}\n\nfunction paramSignaturePart(p: ParameterDeclaration): string {\n const name = p.getName();\n const type = paramTypeText(p);\n const optional = p.hasQuestionToken() ? '?' : '';\n const rest = p.isRestParameter() ? '...' : '';\n const init = p.getInitializer()?.getText();\n return init\n ? `${rest}${name}${optional}: ${type} = ${init}`\n : `${rest}${name}${optional}: ${type}`;\n}\n\nfunction paramTypeText(p: ParameterDeclaration): string {\n return p.getTypeNode()?.getText() ?? p.getType().getText(p);\n}\n\nfunction paramToDoc(p: ParameterDeclaration, jsdoc: JsDocInfo): DocParam {\n const name = p.getName();\n const defaultValue = p.getInitializer()?.getText();\n const description = jsdoc.paramDescriptions[name];\n const out: DocParam = {\n name,\n type: paramTypeText(p),\n optional: p.hasQuestionToken() || p.isRestParameter() || defaultValue !== undefined,\n };\n if (defaultValue !== undefined) out.defaultValue = defaultValue;\n if (description !== undefined) out.description = description;\n return out;\n}\n\nfunction buildFunctionSignature(opts: {\n name: string;\n generics: string[];\n params: string[];\n returnType: string;\n isAsync: boolean;\n}): string {\n const gen = opts.generics.length ? `<${opts.generics.join(', ')}>` : '';\n const asyncKw = opts.isAsync ? 'async ' : '';\n return `${asyncKw}function ${opts.name}${gen}(${opts.params.join(', ')}): ${opts.returnType}`;\n}\n\nfunction attachJsDocFields(node: DocNode, jsdoc: JsDocInfo): void {\n if (jsdoc.description) node.description = jsdoc.description;\n if (jsdoc.examples.length) node.examples = jsdoc.examples;\n if (jsdoc.throws.length) node.throws = jsdoc.throws;\n if (jsdoc.deprecated) node.deprecated = jsdoc.deprecated;\n if (jsdoc.since) node.since = jsdoc.since;\n}\n","import type { DocFile } from '@ovellum/core';\n\nexport interface FrontmatterFields {\n title: string;\n source: string;\n generated: string;\n ovellum: true;\n}\n\nexport function buildFrontmatter(file: DocFile, generatedAt: string): string {\n const title = file.moduleName ?? defaultTitle(file.filePath);\n const fields: FrontmatterFields = {\n title,\n source: file.filePath,\n generated: generatedAt,\n ovellum: true,\n };\n const yaml = Object.entries(fields)\n .map(([k, v]) => `${k}: ${formatYamlScalar(v)}`)\n .join('\\n');\n return `---\\n${yaml}\\n---`;\n}\n\nfunction defaultTitle(filePath: string): string {\n const segments = filePath.replace(/\\\\/g, '/').split('/');\n const last = segments[segments.length - 1] ?? filePath;\n return last.replace(/\\.(tsx?|jsx?|mts|cts|mjs|cjs)$/, '');\n}\n\nfunction formatYamlScalar(v: unknown): string {\n if (typeof v === 'boolean' || typeof v === 'number') return String(v);\n const s = String(v);\n if (/[:#\\-?{}[\\],&*!|>'\"%@`]/.test(s) || /^\\s|\\s$/.test(s)) {\n return `'${s.replace(/'/g, \"''\")}'`;\n }\n return s;\n}\n","import path from 'node:path';\nimport type { OvellumConfig } from '@ovellum/core';\n\n/**\n * Map a source file path (relative to project root) onto the doc output path\n * (also relative to project root).\n *\n * src/utils/format.ts → docs/utils/format.md\n *\n * The mapping strips the configured `input` directory prefix and rebases under\n * `output`, replacing the extension with `.md` (or `.mdx` when configured).\n */\nexport function outputPathFor(sourceRelPath: string, config: OvellumConfig): string {\n const inputDir = stripLeadingDotSlash(config.input);\n const outputDir = stripLeadingDotSlash(config.output);\n const ext = config.defaultFormat === 'mdx' ? '.mdx' : '.md';\n\n const posix = sourceRelPath.replace(/\\\\/g, '/');\n const trimmed = posix.startsWith(inputDir + '/') ? posix.slice(inputDir.length + 1) : posix;\n const withoutExt = trimmed.replace(/\\.(tsx?|jsx?|mts|cts|mjs|cjs)$/, '');\n return path.posix.join(outputDir, withoutExt + ext);\n}\n\nfunction stripLeadingDotSlash(p: string): string {\n return p.replace(/^\\.\\/+/, '').replace(/\\/+$/, '');\n}\n","import type { DocNode, DocParam } from '@ovellum/core';\n\n/** Render a single top-level node + any children to markdown. */\nexport function renderNode(node: DocNode): string {\n const parts: string[] = [];\n parts.push(headingFor(node));\n parts.push(anchorComment(node));\n parts.push(signatureBlock(node));\n\n if (node.deprecated) {\n parts.push(`> **Deprecated.** ${escapeInline(node.deprecated)}`);\n }\n if (node.description) {\n parts.push(node.description.trim());\n }\n if (node.since) {\n parts.push(`*Since: ${escapeInline(node.since)}*`);\n }\n\n if (node.params && node.params.length > 0) {\n parts.push('**Parameters**');\n parts.push(paramsTable(node.params));\n }\n\n if (node.returns && node.returns.type && node.returns.type !== 'void') {\n const desc = node.returns.description ? ` - ${node.returns.description}` : '';\n parts.push(`**Returns** \\`${node.returns.type}\\`${desc}`);\n }\n\n if (node.throws && node.throws.length > 0) {\n parts.push('**Throws**');\n for (const t of node.throws) parts.push(`- ${escapeInline(t)}`);\n }\n\n if (node.examples && node.examples.length > 0) {\n parts.push('**Example**');\n for (const ex of node.examples) parts.push(fence(ex.trim(), 'typescript'));\n }\n\n if (node.children && node.children.length > 0) {\n parts.push(renderChildren(node));\n }\n\n return parts.filter(Boolean).join('\\n\\n');\n}\n\nfunction renderChildren(parent: DocNode): string {\n const buckets = {\n method: [] as DocNode[],\n property: [] as DocNode[],\n other: [] as DocNode[],\n };\n for (const child of parent.children ?? []) {\n if (child.kind === 'method') buckets.method.push(child);\n else if (child.kind === 'property') buckets.property.push(child);\n else buckets.other.push(child);\n }\n\n const sections: string[] = [];\n if (buckets.property.length) {\n sections.push(`#### Properties\\n\\n${membersTable(buckets.property)}`);\n }\n if (buckets.method.length) {\n sections.push(`#### Methods\\n\\n${buckets.method.map(renderMember).join('\\n\\n')}`);\n }\n if (buckets.other.length) {\n sections.push(buckets.other.map(renderMember).join('\\n\\n'));\n }\n return sections.join('\\n\\n');\n}\n\nfunction renderMember(node: DocNode): string {\n const parts: string[] = [];\n parts.push(`##### \\`${node.name}\\``);\n parts.push(anchorComment(node));\n parts.push(fence(node.signature, 'typescript'));\n if (node.description) parts.push(node.description.trim());\n if (node.params && node.params.length > 0) {\n parts.push(paramsTable(node.params));\n }\n if (node.returns && node.returns.type && node.returns.type !== 'void') {\n parts.push(`Returns \\`${node.returns.type}\\``);\n }\n return parts.filter(Boolean).join('\\n\\n');\n}\n\nfunction headingFor(node: DocNode): string {\n return `## \\`${node.name}\\``;\n}\n\nfunction signatureBlock(node: DocNode): string {\n return fence(node.signature, 'typescript');\n}\n\nfunction paramsTable(params: DocParam[]): string {\n const head = '| Name | Type | Description |\\n| --- | --- | --- |';\n const rows = params.map((p) => {\n const name = `\\`${p.name}${p.optional ? '?' : ''}\\``;\n const type = `\\`${escapePipe(p.type)}\\``;\n const desc = p.description ? escapeInline(p.description) : '';\n const def =\n p.defaultValue !== undefined ? ` *(default: \\`${escapePipe(p.defaultValue)}\\`)*` : '';\n return `| ${name} | ${type} | ${desc}${def} |`;\n });\n return [head, ...rows].join('\\n');\n}\n\nfunction membersTable(props: DocNode[]): string {\n const head = '| Name | Type | Description |\\n| --- | --- | --- |';\n const rows = props.map((p) => {\n const type = signatureTypeOnly(p.signature, p.name);\n const desc = p.description ? escapeInline(p.description) : '';\n return `| \\`${p.name}\\` | \\`${escapePipe(type)}\\` | ${desc} |`;\n });\n return [head, ...rows].join('\\n');\n}\n\nfunction signatureTypeOnly(signature: string, name: string): string {\n // `name: T` or `name?: T` — strip the name + colon.\n const colonMatch = signature.match(new RegExp(`^${escapeRegex(name)}\\\\??\\\\s*:\\\\s*(.+)$`));\n if (colonMatch) return colonMatch[1]!.trim();\n // `name = value` — enum-member shape; show the value as the column body.\n const eqMatch = signature.match(new RegExp(`^${escapeRegex(name)}\\\\s*=\\\\s*(.+)$`));\n if (eqMatch) return eqMatch[1]!.trim();\n return signature;\n}\n\nfunction anchorComment(node: DocNode): string {\n return `<!-- ovellum:anchor id=\"${node.id}\" generated=\"${new Date().toISOString()}\" -->`;\n}\n\nfunction fence(content: string, lang: string): string {\n return '```' + lang + '\\n' + content + '\\n```';\n}\n\nfunction escapeInline(s: string): string {\n return s.replace(/\\n+/g, ' ').trim();\n}\n\nfunction escapePipe(s: string): string {\n return s.replace(/\\|/g, '\\\\|');\n}\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","import type { DocFile, DocProject, OvellumConfig } from '@ovellum/core';\nimport { buildFrontmatter } from './frontmatter.js';\nimport { outputPathFor } from './path.js';\nimport { renderNode } from './templates.js';\n\nexport interface GenerateResult {\n /** Output path (relative to project root) → markdown body. */\n files: Map<string, string>;\n warnings: string[];\n}\n\n/**\n * Render a `DocProject` IR into markdown bodies keyed by output path.\n *\n * Implements the Phase 3 slice: per-file frontmatter, per-symbol templates for\n * function/class/interface/type/enum, anchor comments on every top-level node\n * and class/interface member. MDX detection, sidebar generation, and\n * deprecation callouts beyond a plain blockquote are deferred to later\n * Phase 3 work.\n */\nexport function generateDocs(project: DocProject, config: OvellumConfig): GenerateResult {\n const files = new Map<string, string>();\n const warnings: string[] = [];\n\n for (const file of project.files) {\n const outputPath = outputPathFor(file.filePath, config);\n const body = renderFile(file, project.generatedAt);\n files.set(outputPath, body);\n }\n\n return { files, warnings };\n}\n\nfunction renderFile(file: DocFile, generatedAt: string): string {\n const parts: string[] = [buildFrontmatter(file, generatedAt)];\n\n if (file.description) {\n parts.push(file.description.trim());\n }\n\n for (const node of file.nodes) {\n parts.push(renderNode(node));\n }\n\n return parts.filter(Boolean).join('\\n\\n') + '\\n';\n}\n","import { readFile } from 'node:fs/promises';\nimport matter from 'gray-matter';\nimport type { ManualDoc } from '@ovellum/core';\nimport { extractProtectedZones } from './zones.js';\n\n/**\n * Read a Markdown / MDX file and return a `ManualDoc`: frontmatter, body\n * content (frontmatter stripped), and all protected zones in document order.\n *\n * Errors are thrown via `OvellumError` for unclosed / nested / stray tags so\n * the CLI can surface them with a clear hint.\n */\nexport async function readManualDoc(filePath: string): Promise<ManualDoc> {\n const raw = await readFile(filePath, 'utf8');\n return parseManualDoc(raw, filePath);\n}\n\n/**\n * Like `readManualDoc` but operates on an in-memory string. Useful for tests\n * and for callers that already have the file contents.\n */\nexport function parseManualDoc(raw: string, filePath: string): ManualDoc {\n const parsed = matter(raw);\n const frontmatter = (parsed.data ?? {}) as Record<string, unknown>;\n const content = parsed.content;\n const protectedBlocks = extractProtectedZones(content);\n return { filePath, frontmatter, content, protectedBlocks };\n}\n","import { OvellumError } from '@ovellum/core';\nimport type { ProtectedBlock } from '@ovellum/core';\n\nconst START_RE = /<!--\\s*@manual:start(?:\\s+id=(\"([^\"]*)\"|'([^']*)'))?\\s*-->/g;\nconst END_RE = /<!--\\s*@manual:end\\s*-->/g;\nconst ANCHOR_RE = /<!--\\s*ovellum:anchor\\s+id=(\"([^\"]*)\"|'([^']*)')[^>]*-->/g;\n\ninterface RawTagMatch {\n kind: 'start' | 'end' | 'anchor';\n index: number;\n endIndex: number;\n /** Explicit ID attribute, if present. */\n id?: string;\n /** Line number (1-based) where the tag starts. */\n line: number;\n}\n\n/**\n * Scan a Markdown body for protected zones. Returns the extracted blocks in\n * document order, each associated with the nearest preceding ovellum anchor\n * (when one exists).\n *\n * Errors thrown:\n * - `UNCLOSED_MANUAL_TAG` — a `@manual:start` had no matching `@manual:end`\n * - `NESTED_MANUAL_TAG` — a second `@manual:start` opened before the prior closed\n * - `STRAY_MANUAL_END` — an `@manual:end` was found without a preceding start\n */\nexport function extractProtectedZones(content: string): ProtectedBlock[] {\n const tags = collectTags(content);\n const blocks: ProtectedBlock[] = [];\n\n let lastAnchorId: string | undefined;\n let positionalCounter = 0;\n let openStart: RawTagMatch | null = null;\n\n for (const tag of tags) {\n if (tag.kind === 'anchor') {\n lastAnchorId = tag.id;\n continue;\n }\n if (tag.kind === 'start') {\n if (openStart) {\n throw new OvellumError(\n `Nested @manual:start tag at line ${tag.line} (previous opened at line ${openStart.line}).`,\n {\n code: 'NESTED_MANUAL_TAG',\n hint: 'Close the first @manual block before opening another.',\n },\n );\n }\n openStart = tag;\n continue;\n }\n // tag.kind === 'end'\n if (!openStart) {\n throw new OvellumError(`Stray @manual:end at line ${tag.line}: no matching @manual:start.`, {\n code: 'STRAY_MANUAL_END',\n });\n }\n const inner = content.slice(openStart.endIndex, tag.index);\n const trimmed = inner.replace(/^\\n/, '').replace(/\\n$/, '');\n const hasExplicitId = openStart.id !== undefined && openStart.id.length > 0;\n const id = hasExplicitId ? openStart.id! : `manual-block-${++positionalCounter}`;\n const block: ProtectedBlock = {\n id,\n hasExplicitId,\n content: trimmed,\n startLine: openStart.line,\n endLine: tag.line,\n };\n if (lastAnchorId !== undefined) block.anchorId = lastAnchorId;\n blocks.push(block);\n openStart = null;\n }\n\n if (openStart) {\n throw new OvellumError(`Unclosed @manual:start at line ${openStart.line}.`, {\n code: 'UNCLOSED_MANUAL_TAG',\n hint: 'Add a matching <!-- @manual:end --> tag.',\n });\n }\n\n return blocks;\n}\n\nfunction collectTags(content: string): RawTagMatch[] {\n const tags: RawTagMatch[] = [];\n\n scan(content, START_RE, (m) => {\n tags.push({\n kind: 'start',\n index: m.index,\n endIndex: m.index + m[0].length,\n id: m[2] ?? m[3],\n line: lineNumberAt(content, m.index),\n });\n });\n scan(content, END_RE, (m) => {\n tags.push({\n kind: 'end',\n index: m.index,\n endIndex: m.index + m[0].length,\n line: lineNumberAt(content, m.index),\n });\n });\n scan(content, ANCHOR_RE, (m) => {\n tags.push({\n kind: 'anchor',\n index: m.index,\n endIndex: m.index + m[0].length,\n id: m[2] ?? m[3],\n line: lineNumberAt(content, m.index),\n });\n });\n\n return tags.sort((a, b) => a.index - b.index);\n}\n\nfunction scan(input: string, re: RegExp, onMatch: (m: RegExpExecArray) => void): void {\n re.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(input)) !== null) onMatch(m);\n}\n\nfunction lineNumberAt(content: string, index: number): number {\n let line = 1;\n for (let i = 0; i < index; i++) {\n if (content.charCodeAt(i) === 0x0a) line++;\n }\n return line;\n}\n","const ANCHOR_RE = /<!--\\s*ovellum:anchor\\s+id=(\"([^\"]*)\"|'([^']*)')[^>]*-->/g;\n\nexport interface AnchorMatch {\n id: string;\n /** Byte index where the `<!-- ovellum:anchor ... -->` comment begins. */\n index: number;\n /** Byte index immediately after the `-->`. */\n endIndex: number;\n}\n\n/**\n * Locate every ovellum anchor comment in a Markdown body, in document order.\n */\nexport function findAnchors(content: string): AnchorMatch[] {\n const out: AnchorMatch[] = [];\n ANCHOR_RE.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = ANCHOR_RE.exec(content)) !== null) {\n const id = m[2] ?? m[3];\n if (!id) continue;\n out.push({ id, index: m.index, endIndex: m.index + m[0].length });\n }\n return out;\n}\n","import type { ManualDoc, OrphanRecord, ProtectedBlock } from '@ovellum/core';\nimport { findAnchors } from './anchors.js';\n\nexport interface MergeOptions {\n /** ISO timestamp for any orphan records produced. Defaults to `now`. */\n now?: string;\n /** Output file the manual doc came from — recorded on orphan records. */\n sourceFile?: string;\n}\n\nexport interface MergeResult {\n /** Final merged Markdown content. */\n content: string;\n /** Manual blocks whose anchor no longer exists in the generated content. */\n orphans: OrphanRecord[];\n /** Non-fatal issues (e.g. positional fallback used). */\n warnings: string[];\n}\n\n/**\n * Merge a freshly generated Markdown body with the protected zones extracted\n * from the previous version of the same file.\n *\n * For each protected block in `manual`, we look up its `anchorId` in `generated`.\n * When found, the block is appended to that anchor's section (right before the\n * next anchor or the end of the file). When the anchor no longer exists, the\n * block becomes an orphan: returned in `result.orphans` for the caller to\n * quarantine via `writeOrphan`.\n *\n * Blocks without an `anchorId` (i.e. they had no preceding ovellum anchor in\n * the previous file) are surfaced as warnings and treated as orphans — there\n * is nothing to attach them to.\n */\nexport function merge(\n generated: string,\n manual: ManualDoc,\n options: MergeOptions = {},\n): MergeResult {\n const orphans: OrphanRecord[] = [];\n const warnings: string[] = [];\n const now = options.now ?? new Date().toISOString();\n const sourceFile = options.sourceFile ?? manual.filePath;\n\n // Build a map of anchorId → list of protected blocks (preserve document order)\n const anchorToBlocks = new Map<string, ProtectedBlock[]>();\n const anchorless: ProtectedBlock[] = [];\n for (const block of manual.protectedBlocks) {\n if (!block.anchorId) {\n anchorless.push(block);\n continue;\n }\n let list = anchorToBlocks.get(block.anchorId);\n if (!list) {\n list = [];\n anchorToBlocks.set(block.anchorId, list);\n }\n list.push(block);\n }\n\n for (const block of anchorless) {\n warnings.push(`Protected block ${block.id} has no associated anchor — treated as orphan.`);\n orphans.push(orphanFromBlock(block, undefined, sourceFile, now));\n }\n\n const anchors = findAnchors(generated);\n if (anchors.length === 0) {\n // No anchors in generated content — every anchored block becomes an orphan.\n for (const [anchorId, blocks] of anchorToBlocks) {\n for (const block of blocks) {\n orphans.push(orphanFromBlock(block, anchorId, sourceFile, now));\n }\n }\n return { content: generated, orphans, warnings };\n }\n\n // Walk the generated content and splice protected blocks in at the end of\n // each anchor's section. The \"section end\" is the line where the NEXT\n // heading starts (or end-of-file), because in our output headings precede\n // anchors — so the next anchor's section actually begins at its heading.\n const pieces: string[] = [];\n let cursor = 0;\n\n for (let i = 0; i < anchors.length; i++) {\n const anchor = anchors[i]!;\n const sectionEnd = findSectionEnd(generated, anchor.endIndex);\n\n pieces.push(generated.slice(cursor, sectionEnd));\n\n const blocks = anchorToBlocks.get(anchor.id);\n if (blocks && blocks.length > 0) {\n pieces.push(renderBlocks(blocks));\n anchorToBlocks.delete(anchor.id);\n }\n\n cursor = sectionEnd;\n }\n // Trailing content after the last section (file-level matter only).\n if (cursor < generated.length) {\n pieces.push(generated.slice(cursor));\n }\n\n // Anything still in the map → orphan (its anchor disappeared).\n for (const [anchorId, blocks] of anchorToBlocks) {\n for (const block of blocks) {\n orphans.push(orphanFromBlock(block, anchorId, sourceFile, now));\n }\n }\n\n return { content: pieces.join(''), orphans, warnings };\n}\n\n/**\n * Find the index of the next Markdown heading line (lines starting with\n * `#`, `##`, … followed by a space) after `from`, or `content.length` if no\n * heading remains. Used to bound the current anchor's \"section.\"\n */\nfunction findSectionEnd(content: string, from: number): number {\n const re = /\\n(#{1,6} )/g;\n re.lastIndex = from;\n const m = re.exec(content);\n return m ? m.index + 1 : content.length;\n}\n\nfunction renderBlocks(blocks: ProtectedBlock[]): string {\n return blocks.map((b) => renderBlock(b)).join('\\n');\n}\n\nfunction renderBlock(block: ProtectedBlock): string {\n const idAttr = block.hasExplicitId ? ` id=\"${block.id}\"` : '';\n return `<!-- @manual:start${idAttr} -->\\n${block.content}\\n<!-- @manual:end -->\\n\\n`;\n}\n\nfunction orphanFromBlock(\n block: ProtectedBlock,\n anchorId: string | undefined,\n sourceFile: string,\n orphanedAt: string,\n): OrphanRecord {\n const out: OrphanRecord = {\n orphanedAt,\n sourceFile,\n anchorId: anchorId ?? 'unknown',\n content: block.content,\n };\n if (block.hasExplicitId) out.manualBlockId = block.id;\n return out;\n}\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { OrphanRecord } from '@ovellum/core';\n\n/**\n * Slugify an anchor ID into a path-safe filename component. Replaces every\n * non-`[A-Za-z0-9._-]` byte with `-`, collapses runs of `-`, trims edges.\n */\nexport function slugifyAnchor(anchorId: string): string {\n return anchorId\n .replace(/[^A-Za-z0-9._-]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\n/**\n * Format a Date as `YYYY-MM-DD` in UTC. Used for orphan filenames.\n */\nexport function formatDateUTC(d: Date): string {\n const y = d.getUTCFullYear();\n const m = String(d.getUTCMonth() + 1).padStart(2, '0');\n const day = String(d.getUTCDate()).padStart(2, '0');\n return `${y}-${m}-${day}`;\n}\n\n/**\n * Render an `OrphanRecord` as a Markdown file body with frontmatter + content.\n */\nexport function renderOrphanFile(record: OrphanRecord): string {\n const fields: Record<string, string> = {\n orphaned: record.orphanedAt,\n source_file: record.sourceFile,\n anchor_id: record.anchorId,\n };\n if (record.anchorLastSeen) fields.anchor_last_seen = record.anchorLastSeen;\n if (record.manualBlockId) fields.manual_block_id = record.manualBlockId;\n const yaml = Object.entries(fields)\n .map(([k, v]) => `${k}: ${formatYamlScalar(v)}`)\n .join('\\n');\n return `---\\n${yaml}\\n---\\n\\n${record.content}\\n`;\n}\n\n/**\n * Write an orphan record to disk. Returns the absolute path written.\n */\nexport async function writeOrphan(record: OrphanRecord, orphanDir: string): Promise<string> {\n const slug = slugifyAnchor(record.anchorId);\n const dateStamp = formatDateUTC(new Date(record.orphanedAt));\n const filename = `${dateStamp}_${slug}.md`;\n const absPath = path.resolve(orphanDir, filename);\n await mkdir(orphanDir, { recursive: true });\n await writeFile(absPath, renderOrphanFile(record), 'utf8');\n return absPath;\n}\n\nfunction formatYamlScalar(s: string): string {\n if (/[:#\\-?{}[\\],&*!|>'\"%@`]/.test(s) || /^\\s|\\s$/.test(s)) {\n return `'${s.replace(/'/g, \"''\")}'`;\n }\n return s;\n}\n","import { existsSync } from 'node:fs';\nimport { copyFile, mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport matter from 'gray-matter';\nimport type { OvellumConfig, OvellumSiteConfig } from '@ovellum/core';\nimport { renderMarkdown, type Heading } from './markdown.js';\nimport { buildNav, findAdjacent, findBreadcrumbs, type NavNode } from './nav.js';\nimport { countWords, lastModifiedISO, readingMinutes } from './page-meta.js';\nimport { indexSite } from './search.js';\nimport { generateSitemap } from './sitemap.js';\nimport { renderLanding, renderPage } from './template.js';\n\nexport interface BuildSiteOptions {\n config: OvellumConfig;\n cwd: string;\n /** Build timestamp recorded in page footers. Defaults to `new Date()`. */\n now?: Date;\n}\n\nexport interface PageOutput {\n sourcePath: string;\n outputPath: string;\n url: string;\n title: string;\n}\n\nexport interface BuildSiteResult {\n pages: PageOutput[];\n warnings: string[];\n outputDir: string;\n assetsDir: string;\n /** True when a landing page was rendered at `/`. */\n landingRendered: boolean;\n}\n\nconst TEMPLATE_DIR_NAME = 'templates/default';\nconst LANDING_BODY_FILE = '_landing.md';\n\n/**\n * Build a static site from a folder of `.md` files. Wired by the CLI when\n * `config.mode === 'manual'`.\n *\n * content/index.md → dist/index.html\n * content/getting-started.md → dist/getting-started/index.html\n * content/guides/install.md → dist/guides/install/index.html\n * content/img/logo.svg → dist/img/logo.svg (passthrough)\n *\n * When `config.site.landing.enabled` is true, `dist/index.html` is rendered\n * from the landing template (hero + features + optional `_landing.md` pitch\n * + trust strip), and any `content/index.md` is skipped with a warning.\n *\n * Also writes `dist/assets/ovellum.css` and `dist/assets/ovellum.js` from the\n * bundled default template.\n */\nexport async function buildSite(options: BuildSiteOptions): Promise<BuildSiteResult> {\n const { config, cwd } = options;\n const now = options.now ?? new Date();\n\n const inputAbs = path.resolve(cwd, config.input);\n const outputAbs = path.resolve(cwd, config.output);\n const assetsAbs = path.join(outputAbs, 'assets');\n\n if (config.defaultFormat !== 'md') {\n throw new Error(\n `manual mode currently only supports 'md' output; got '${config.defaultFormat}'.`,\n );\n }\n\n const site = resolveSiteConfig(config);\n const nav = await buildNav(config.input, cwd);\n const warnings: string[] = [];\n\n await mkdir(assetsAbs, { recursive: true });\n await writeStaticAssets(assetsAbs);\n\n const landingEnabled = site.landing.enabled === true;\n const docsHref = landingEnabled ? (site.landing.docsHref ?? firstNavUrl(nav)) : undefined;\n\n const pages: PageOutput[] = [];\n let landingRendered = false;\n\n // Render the landing page first (if enabled) so `content/index.md`\n // can be detected as a conflict during the walk.\n if (landingEnabled) {\n const landingBody = await readLandingBody(inputAbs, site);\n const html = renderLanding({\n site,\n landing: site.landing,\n pitchHtml: landingBody?.html,\n generatedAt: now.toISOString(),\n docsHref,\n });\n await writeFile(path.join(outputAbs, 'index.html'), html, 'utf8');\n pages.push({\n sourcePath: landingBody?.sourcePath ?? '(landing config)',\n outputPath: path.relative(cwd, path.join(outputAbs, 'index.html')).replace(/\\\\/g, '/'),\n url: '/',\n title: site.landing.hero.title ?? site.title,\n });\n landingRendered = true;\n }\n\n for await (const file of walkContent(inputAbs)) {\n const relFromInput = path.relative(inputAbs, file).replace(/\\\\/g, '/');\n if (isMarkdown(file)) {\n const url = urlFor(relFromInput);\n if (landingEnabled && url === '/') {\n warnings.push(\n `Skipped ${relFromInput} because site.landing.enabled is true; ` +\n `the landing template renders / instead. Move prose to ${LANDING_BODY_FILE} ` +\n `or rename this file.`,\n );\n continue;\n }\n const outputPath = path.join(outputAbs, urlToOutputPath(url));\n const { prev, next } = findAdjacent(nav, url);\n const breadcrumbs = findBreadcrumbs(nav, url).map((n) => ({ title: n.title, url: n.url }));\n const sourceRelFromCwd = path.relative(cwd, file).replace(/\\\\/g, '/');\n const result = await renderOne({\n absInput: file,\n url,\n site,\n nav,\n cwd,\n generatedAt: now.toISOString(),\n docsHref,\n prev: prev ? { title: prev.title, url: prev.url } : undefined,\n next: next ? { title: next.title, url: next.url } : undefined,\n breadcrumbs,\n sourceRelFromCwd,\n });\n await mkdir(path.dirname(outputPath), { recursive: true });\n await writeFile(outputPath, result.html, 'utf8');\n pages.push({\n sourcePath: path.relative(cwd, file).replace(/\\\\/g, '/'),\n outputPath: path.relative(cwd, outputPath).replace(/\\\\/g, '/'),\n url,\n title: result.title,\n });\n warnings.push(...result.warnings);\n } else {\n // Passthrough static asset\n const outputPath = path.join(outputAbs, relFromInput);\n await mkdir(path.dirname(outputPath), { recursive: true });\n await copyFile(file, outputPath);\n }\n }\n\n // Sort pages for deterministic summary output (but keep `/` first).\n pages.sort((a, b) => {\n if (a.url === '/') return -1;\n if (b.url === '/') return 1;\n return a.url.localeCompare(b.url);\n });\n\n // Emit sitemap.xml when site.baseUrl is configured.\n if (site.baseUrl) {\n const xml = generateSitemap({ pages, baseUrl: site.baseUrl, basePath: site.basePath });\n if (xml) await writeFile(path.join(outputAbs, 'sitemap.xml'), xml, 'utf8');\n } else {\n warnings.push(\n 'sitemap.xml not generated: set `site.baseUrl` in your config to enable it.',\n );\n }\n\n // Run Pagefind search indexing when enabled.\n if (site.search.enabled) {\n const idx = await indexSite({ outputAbs });\n if (idx.exitCode !== 0) {\n for (const err of idx.errors) warnings.push(`search: ${err}`);\n }\n }\n\n return {\n pages,\n warnings,\n outputDir: path.relative(cwd, outputAbs).replace(/\\\\/g, '/'),\n assetsDir: path.relative(cwd, assetsAbs).replace(/\\\\/g, '/'),\n landingRendered,\n };\n}\n\ninterface RenderOneInput {\n absInput: string;\n url: string;\n site: OvellumSiteConfig & { title: string };\n nav: NavNode;\n cwd: string;\n generatedAt: string;\n docsHref?: string;\n prev?: { title: string; url: string };\n next?: { title: string; url: string };\n breadcrumbs?: Array<{ title: string; url: string }>;\n /** Page's source path relative to the project root; substituted into the edit URL. */\n sourceRelFromCwd: string;\n}\n\ninterface RenderOneResult {\n html: string;\n title: string;\n warnings: string[];\n}\n\nasync function renderOne(input: RenderOneInput): Promise<RenderOneResult> {\n const raw = await readFile(input.absInput, 'utf8');\n const parsed = matter(raw);\n const frontmatter = parsed.data as { title?: string; description?: string };\n const { html: bodyHtml, headings } = await renderMarkdown(parsed.content, {\n codeTheme: input.site.codeTheme,\n });\n const title = frontmatter.title ?? firstHeading(headings) ?? input.site.title;\n\n const editUrl = input.site.editUrlPattern\n ? input.site.editUrlPattern.replace('{path}', input.sourceRelFromCwd)\n : undefined;\n\n const pageMetaCfg = input.site.pageMeta;\n const readingMin = pageMetaCfg.readingTime\n ? readingMinutes(countWords(parsed.content))\n : undefined;\n const lastModified = pageMetaCfg.lastModified\n ? await lastModifiedISO({ absPath: input.absInput, cwd: input.cwd })\n : undefined;\n\n const html = renderPage({\n site: input.site,\n nav: input.nav,\n url: input.url,\n title,\n description: frontmatter.description,\n bodyHtml,\n headings,\n generatedAt: input.generatedAt,\n docsHref: input.docsHref,\n prev: input.prev,\n next: input.next,\n breadcrumbs: input.breadcrumbs,\n editUrl,\n readingMinutes: readingMin,\n lastModified,\n bodyClass: input.url === '/404/' ? 'ov-body-404' : undefined,\n });\n return { html, title, warnings: [] };\n}\n\ninterface LandingBody {\n html: string;\n sourcePath: string;\n}\n\nasync function readLandingBody(\n inputAbs: string,\n site: OvellumSiteConfig,\n): Promise<LandingBody | undefined> {\n const abs = path.join(inputAbs, LANDING_BODY_FILE);\n if (!existsSync(abs)) return undefined;\n const raw = await readFile(abs, 'utf8');\n const { content } = matter(raw);\n if (!content.trim()) return undefined;\n const { html } = await renderMarkdown(content, { codeTheme: site.codeTheme });\n return { html, sourcePath: path.join(path.basename(inputAbs), LANDING_BODY_FILE) };\n}\n\nfunction firstNavUrl(nav: NavNode): string | undefined {\n const first = nav.children.find((c) => c.sourcePath !== undefined);\n return first?.url;\n}\n\nfunction resolveSiteConfig(config: OvellumConfig): OvellumSiteConfig & { title: string } {\n const title = config.site.title ?? config.name ?? 'Ovellum site';\n return { ...config.site, title };\n}\n\nasync function* walkContent(dirAbs: string): AsyncGenerator<string> {\n const entries = await readdir(dirAbs);\n for (const name of entries) {\n if (name.startsWith('_')) continue;\n const abs = path.join(dirAbs, name);\n const st = await stat(abs);\n if (st.isDirectory()) {\n yield* walkContent(abs);\n } else {\n yield abs;\n }\n }\n}\n\nfunction isMarkdown(p: string): boolean {\n return /\\.(md|markdown)$/i.test(p);\n}\n\n/**\n * Map a content-relative path to its public URL.\n *\n * index.md → /\n * getting-started.md → /getting-started/\n * guides/install.md → /guides/install/\n * guides/index.md → /guides/\n */\nfunction urlFor(relFromInput: string): string {\n const noExt = relFromInput.replace(/\\.(md|markdown)$/i, '');\n const parts = noExt.split('/').filter(Boolean);\n if (parts.length === 0) return '/';\n if (parts[parts.length - 1] === 'index') parts.pop();\n if (parts.length === 0) return '/';\n return '/' + parts.join('/') + '/';\n}\n\nfunction urlToOutputPath(url: string): string {\n if (url === '/') return 'index.html';\n return url.replace(/^\\/+/, '').replace(/\\/+$/, '') + '/index.html';\n}\n\nfunction firstHeading(headings: Heading[]): string | undefined {\n const h2 = headings.find((h) => h.depth === 2);\n return h2?.text;\n}\n\nasync function writeStaticAssets(assetsAbs: string): Promise<void> {\n const templateDir = resolveTemplateDir();\n await copyFile(path.join(templateDir, 'style.css'), path.join(assetsAbs, 'ovellum.css'));\n await copyFile(path.join(templateDir, 'script.js'), path.join(assetsAbs, 'ovellum.js'));\n}\n\nfunction resolveTemplateDir(): string {\n // Both possible runtime locations:\n // dist/index.js → dist/templates/default (post-build copy ships this)\n // src/build.ts → src/templates/default (vitest / dev)\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.join(here, TEMPLATE_DIR_NAME),\n path.join(here, '..', 'src', TEMPLATE_DIR_NAME),\n ];\n for (const c of candidates) {\n if (existsSync(c)) return c;\n }\n throw new Error(\n `Could not locate Ovellum default template directory near ${here}. Looked in: ${candidates.join(', ')}`,\n );\n}\n","import { unified } from 'unified';\nimport remarkParse from 'remark-parse';\nimport remarkRehype from 'remark-rehype';\nimport rehypeRaw from 'rehype-raw';\nimport rehypeSanitize, { defaultSchema, type Options as Schema } from 'rehype-sanitize';\nimport rehypeSlug from 'rehype-slug';\nimport rehypeAutolinkHeadings from 'rehype-autolink-headings';\nimport rehypeStringify from 'rehype-stringify';\nimport { visit } from 'unist-util-visit';\nimport { createHighlighter, type Highlighter } from 'shiki';\nimport type { Root, Element, ElementContent } from 'hast';\nimport type { OvellumCodeTheme } from '@ovellum/core';\n\nexport interface Heading {\n depth: number;\n text: string;\n id: string;\n}\n\nexport interface RenderedMarkdown {\n html: string;\n headings: Heading[];\n}\n\nexport interface RenderMarkdownOptions {\n /** Shiki theme pair to highlight code blocks with. Defaults to `'github'`. */\n codeTheme?: OvellumCodeTheme;\n}\n\n/**\n * Each `OvellumCodeTheme` maps to a `{ light, dark }` shiki pair. Both halves\n * are emitted into the HTML through CSS variables; switching `[data-theme]`\n * on `<html>` swaps the colours with zero runtime cost.\n *\n * Nord ships dark-only in shiki, so we pair it with `min-light` — a clean\n * low-saturation light theme that doesn't clash with Nord's frosty palette.\n */\nconst CODE_THEME_PAIRS: Record<OvellumCodeTheme, { light: string; dark: string }> = {\n github: { light: 'github-light', dark: 'github-dark' },\n nord: { light: 'min-light', dark: 'nord' },\n solarized: { light: 'solarized-light', dark: 'solarized-dark' },\n};\n\nconst ALL_SHIKI_THEMES = Array.from(\n new Set(\n Object.values(CODE_THEME_PAIRS).flatMap((pair) => [pair.light, pair.dark]),\n ),\n);\n\nconst SHIKI_LANGS = [\n 'typescript',\n 'tsx',\n 'javascript',\n 'jsx',\n 'json',\n 'bash',\n 'shell',\n 'markdown',\n 'yaml',\n 'html',\n 'css',\n] as const;\n\n// HTML-in-Markdown sanitization policy.\n//\n// We accept raw HTML inside Markdown so authors can mix in <details>, <kbd>,\n// an SVG, etc., but every Markdown source — even one written by a trusted\n// teammate — is sanitized BEFORE shiki injects its highlighted HAST. That\n// order matters: shiki output relies on inline `style` attributes that the\n// sanitizer would strip, so we keep shiki's emissions out of the sanitization\n// path entirely.\n//\n// Removed: <script>, <iframe>, <object>, <embed>, on* event-handler attrs,\n// and any URL whose scheme isn't on the per-attribute allowlist below\n// (so `javascript:`, `vbscript:`, and `data:` URLs are all dropped — including\n// from <img src>, because data:image/svg+xml can carry executable JS).\nconst SANITIZE_SCHEMA: Schema = {\n ...defaultSchema,\n attributes: {\n ...defaultSchema.attributes,\n // Authors writing raw <code> blocks should keep their language class\n // so shiki picks them up on the next pass; defaultSchema already permits\n // `className`, but we widen `code` explicitly to be defensive.\n code: [...(defaultSchema.attributes?.code ?? []), 'className'],\n },\n};\n\n// One highlighter holds every supported theme; the choice per page is just\n// which two names from that bundle we pass to `codeToHast`. Avoids the cost\n// of re-instantiating shiki when a site uses multiple code themes (rare, but\n// possible across separate builds in one process — e.g. tests).\nlet highlighterPromise: Promise<Highlighter> | null = null;\n\nfunction getHighlighter(): Promise<Highlighter> {\n if (!highlighterPromise) {\n highlighterPromise = createHighlighter({\n themes: ALL_SHIKI_THEMES,\n langs: [...SHIKI_LANGS],\n });\n }\n return highlighterPromise;\n}\n\n/**\n * Render a Markdown string to HTML. Returns the HTML body plus a list of\n * h2/h3 headings (with stable ids) for the right-side \"On this page\" ToC.\n *\n * - rehype-slug adds `id=\"…\"` to every heading.\n * - rehype-autolink-headings wraps each heading text in an `<a href=\"#…\">` so\n * clicking the heading copies its URL.\n * - Code fences are rendered with shiki, using the theme pair chosen via\n * `opts.codeTheme` (defaults to `github`) and emitted through CSS\n * variables — switching `[data-theme]` on `<html>` swaps the colours\n * with no runtime cost.\n */\nexport async function renderMarkdown(\n md: string,\n opts: RenderMarkdownOptions = {},\n): Promise<RenderedMarkdown> {\n const highlighter = await getHighlighter();\n const themes = CODE_THEME_PAIRS[opts.codeTheme ?? 'github'] ?? CODE_THEME_PAIRS.github;\n const headings: Heading[] = [];\n\n const file = await unified()\n .use(remarkParse)\n .use(remarkRehype, { allowDangerousHtml: true })\n // rehype-raw parses `raw` HAST nodes (the literal HTML that survived\n // remark-rehype because of allowDangerousHtml) into real element nodes\n // so rehype-sanitize can actually walk them. Without this, raw HTML\n // would either pass straight through or be wholesale dropped — neither\n // is what we want.\n .use(rehypeRaw)\n // Sanitize BEFORE shiki — see SANITIZE_SCHEMA comment above.\n .use(rehypeSanitize, SANITIZE_SCHEMA)\n .use(rehypeSlug)\n .use(rehypeAutolinkHeadings, {\n // `append` keeps the heading text flush-left along with the prose;\n // the `#` indicator floats in after the text on hover (see styles).\n behavior: 'append',\n properties: { className: ['heading-anchor'], 'aria-label': 'Permalink' },\n content: { type: 'text', value: '#' },\n })\n .use(() => (tree: Root) => {\n collectHeadings(tree, headings);\n highlightCodeBlocks(tree, highlighter, themes);\n })\n // allowDangerousHtml stays true so shiki's hast (which has been generated\n // post-sanitize and is trusted) renders without re-escaping.\n .use(rehypeStringify, { allowDangerousHtml: true })\n .process(md);\n\n return { html: String(file), headings };\n}\n\nfunction collectHeadings(tree: Root, into: Heading[]): void {\n visit(tree, 'element', (node: Element) => {\n if (!/^h[2-3]$/.test(node.tagName)) return;\n const depth = Number(node.tagName.slice(1));\n const id = typeof node.properties?.id === 'string' ? node.properties.id : '';\n if (!id) return;\n const text = textOf(node).replace(/^#/, '').trim(); // strip the autolink prefix\n into.push({ depth, text, id });\n });\n}\n\nfunction highlightCodeBlocks(\n tree: Root,\n highlighter: Highlighter,\n themes: { light: string; dark: string },\n): void {\n visit(tree, 'element', (node: Element, index, parent) => {\n if (node.tagName !== 'pre' || !parent || typeof index !== 'number' || !node.children?.length) {\n return;\n }\n const code = node.children.find(\n (c): c is Element => c.type === 'element' && c.tagName === 'code',\n );\n if (!code) return;\n\n const langClass = readClassNames(code).find((c) => c.startsWith('language-'));\n const lang = langClass ? langClass.slice('language-'.length) : 'text';\n if (!SHIKI_LANGS.includes(lang as (typeof SHIKI_LANGS)[number])) return;\n\n const source = textOf(code);\n const hast = highlighter.codeToHast(source, {\n lang: lang as (typeof SHIKI_LANGS)[number],\n themes,\n defaultColor: false,\n });\n const replacement = hast.children[0];\n if (!replacement || replacement.type !== 'element') return;\n (parent.children as ElementContent[])[index] = replacement;\n });\n}\n\nfunction readClassNames(node: Element): string[] {\n const cn = node.properties?.className;\n if (Array.isArray(cn)) return cn.filter((c): c is string => typeof c === 'string');\n if (typeof cn === 'string') return cn.split(/\\s+/);\n return [];\n}\n\nfunction textOf(node: Element): string {\n let out = '';\n for (const child of node.children as ElementContent[]) {\n if (child.type === 'text') out += child.value;\n else if (child.type === 'element') out += textOf(child);\n }\n return out;\n}\n","import { readdir, readFile, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport matter from 'gray-matter';\n\nexport interface NavNode {\n /** Display title. */\n title: string;\n /** Site-relative URL with trailing slash (`/foo/`, `/foo/bar/`, or `/` for root). */\n url: string;\n /** Source file relative to project root, or undefined for directory-only nodes. */\n sourcePath?: string;\n /** Child nodes (sub-pages and sub-directories). */\n children: NavNode[];\n}\n\n/**\n * Flatten a nav tree to the linear reading order — depth-first, root first.\n * Used to compute prev/next links on each doc page.\n *\n * Includes only nodes that point to a real source file (`sourcePath !== undefined`).\n * Directory-only group nodes are skipped.\n */\nexport function flattenNav(root: NavNode): NavNode[] {\n const out: NavNode[] = [];\n function walk(node: NavNode): void {\n if (node.sourcePath !== undefined) out.push(node);\n for (const child of node.children) walk(child);\n }\n walk(root);\n return out;\n}\n\n/**\n * Walk the nav tree to find the chain of ancestors ending at `url`, root-first.\n * Returns `[]` when the url isn't present in the tree.\n *\n * The result includes the root node and the matching node itself, so the last\n * entry is the current page. Callers typically render this as the breadcrumb\n * trail and skip the leading root entry.\n */\nexport function findBreadcrumbs(root: NavNode, url: string): NavNode[] {\n const path: NavNode[] = [];\n function walk(node: NavNode): boolean {\n path.push(node);\n if (node.url === url) return true;\n for (const child of node.children) {\n if (walk(child)) return true;\n }\n path.pop();\n return false;\n }\n walk(root);\n return path;\n}\n\nexport interface AdjacentPages {\n prev?: NavNode;\n next?: NavNode;\n}\n\n/**\n * Find the prev / next page for `url` in the flattened nav order.\n * Returns `{}` when `url` is not in the nav (e.g. the root landing page) or\n * when there's no neighbour on a given side.\n */\nexport function findAdjacent(root: NavNode, url: string): AdjacentPages {\n const flat = flattenNav(root);\n const idx = flat.findIndex((p) => p.url === url);\n if (idx === -1) return {};\n return {\n prev: idx > 0 ? flat[idx - 1] : undefined,\n next: idx + 1 < flat.length ? flat[idx + 1] : undefined,\n };\n}\n\ninterface MetaJson {\n title?: string;\n order?: string[];\n}\n\ninterface FsItem {\n name: string;\n abs: string;\n isDir: boolean;\n}\n\n/**\n * Walk a content directory and build a `NavNode` tree:\n *\n * - `.md` files become page nodes; `index.md` represents its containing\n * directory (its title and url collapse onto the parent node).\n * - Subdirectories become group nodes; each is recursively built.\n * - Per-directory `_meta.json` may set `title` and an explicit `order` of\n * child slugs.\n * - Without explicit order, items sort alphabetically by slug, but any\n * directory's `index` always leads.\n */\nexport async function buildNav(rootDir: string, cwd: string): Promise<NavNode> {\n const absRoot = path.resolve(cwd, rootDir);\n const rel = (abs: string) => '/' + path.posix.relative(absRoot, abs).replace(/\\\\/g, '/');\n return walk(absRoot, '/', cwd, rel);\n}\n\nasync function walk(\n dirAbs: string,\n urlPrefix: string,\n cwd: string,\n rel: (abs: string) => string,\n): Promise<NavNode> {\n const items = await listDir(dirAbs);\n const meta = await readMeta(dirAbs);\n\n const indexItem = items.find((i) => !i.isDir && stem(i.name) === 'index' && isMarkdown(i.name));\n const indexNode = indexItem ? await pageNode(indexItem.abs, urlPrefix, cwd) : undefined;\n\n const children: NavNode[] = [];\n for (const item of items) {\n if (item.name.startsWith('_')) continue;\n if (item === indexItem) continue;\n if (item.isDir) {\n const childUrl = ensureTrailingSlash(urlPrefix + item.name + '/');\n children.push(await walk(item.abs, childUrl, cwd, rel));\n } else if (isMarkdown(item.name)) {\n const childUrl = ensureTrailingSlash(urlPrefix + stem(item.name) + '/');\n children.push(await pageNode(item.abs, childUrl, cwd));\n }\n }\n\n applyOrdering(children, meta);\n\n const title =\n meta?.title ?? indexNode?.title ?? titleFromSegment(path.basename(dirAbs)) ?? 'Untitled';\n const url = ensureTrailingSlash(urlPrefix);\n\n return {\n title,\n url,\n sourcePath: indexNode?.sourcePath,\n children,\n };\n}\n\nasync function pageNode(abs: string, url: string, cwd: string): Promise<NavNode> {\n const raw = await readFile(abs, 'utf8');\n const { data, content } = matter(raw);\n const fmTitle = typeof data.title === 'string' ? data.title : undefined;\n const h1 = firstH1(content);\n const title = fmTitle ?? h1 ?? titleFromSegment(stem(path.basename(abs))) ?? 'Untitled';\n return {\n title,\n url: ensureTrailingSlash(url),\n sourcePath: path.relative(cwd, abs).replace(/\\\\/g, '/'),\n children: [],\n };\n}\n\nasync function listDir(dirAbs: string): Promise<FsItem[]> {\n const names = await readdir(dirAbs);\n const out: FsItem[] = [];\n for (const name of names) {\n const abs = path.join(dirAbs, name);\n const st = await stat(abs);\n out.push({ name, abs, isDir: st.isDirectory() });\n }\n return out;\n}\n\nasync function readMeta(dirAbs: string): Promise<MetaJson | undefined> {\n const metaPath = path.join(dirAbs, '_meta.json');\n try {\n const raw = await readFile(metaPath, 'utf8');\n const parsed = JSON.parse(raw) as MetaJson;\n return parsed;\n } catch {\n return undefined;\n }\n}\n\nfunction applyOrdering(children: NavNode[], meta: MetaJson | undefined): void {\n if (meta?.order && meta.order.length > 0) {\n const rank = new Map(meta.order.map((slug, i) => [slug, i]));\n children.sort((a, b) => {\n const ra = rank.get(slugOf(a)) ?? Number.MAX_SAFE_INTEGER;\n const rb = rank.get(slugOf(b)) ?? Number.MAX_SAFE_INTEGER;\n if (ra !== rb) return ra - rb;\n return a.title.localeCompare(b.title);\n });\n return;\n }\n children.sort((a, b) => a.title.localeCompare(b.title));\n}\n\nfunction slugOf(node: NavNode): string {\n const trimmed = node.url.replace(/\\/+$/, '');\n return trimmed.slice(trimmed.lastIndexOf('/') + 1);\n}\n\nfunction isMarkdown(name: string): boolean {\n return /\\.(md|markdown)$/i.test(name);\n}\n\nfunction stem(name: string): string {\n return name.replace(/\\.(md|markdown)$/i, '');\n}\n\nfunction ensureTrailingSlash(p: string): string {\n return p.endsWith('/') ? p : p + '/';\n}\n\nfunction titleFromSegment(seg: string): string | undefined {\n if (!seg) return undefined;\n return seg\n .split(/[-_]/)\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n}\n\nfunction firstH1(content: string): string | undefined {\n const m = content.match(/^\\s*#\\s+(.+)$/m);\n return m ? m[1]!.trim() : undefined;\n}\n","import { execFile } from 'node:child_process';\nimport { stat } from 'node:fs/promises';\nimport { promisify } from 'node:util';\n\n// `execFile` does NOT spawn a shell — args are passed verbatim. This is the\n// security-critical difference vs. `exec`: a path containing `$(...)`, `;`,\n// backticks, etc. is treated as a literal filename argument to `git`, never\n// interpreted by sh/zsh.\nconst execFileAsync = promisify(execFile);\n\nconst WORDS_PER_MINUTE = 200;\n\n/**\n * Count visible-prose words in a Markdown source. Strips fenced code blocks,\n * inline code, link / image syntax, and frontmatter delimiters before counting\n * so the reading-time estimate reflects what a reader actually reads.\n *\n * Conservative on purpose — it isn't trying to be a perfect linguist; it just\n * needs to be stable and roughly correct.\n */\nexport function countWords(markdown: string): number {\n const stripped = markdown\n // Fenced code blocks (``` … ```)\n .replace(/```[\\s\\S]*?```/g, ' ')\n // Indented code blocks (4-space leading)\n .replace(/^( {4}|\\t).*$/gm, ' ')\n // Inline code (`foo`)\n .replace(/`[^`\\n]*`/g, ' ')\n // Image markup keeps the alt text as words; just strip the URL part.\n .replace(/!\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n // Link markup keeps the link text.\n .replace(/\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n // HTML tags\n .replace(/<[^>]+>/g, ' ')\n // Heading / list / blockquote punctuation\n .replace(/^[#>\\-*+]+\\s+/gm, '');\n // Words = runs of non-whitespace.\n const matches = stripped.match(/\\S+/g);\n return matches ? matches.length : 0;\n}\n\n/**\n * Estimate reading time in whole minutes, rounded up. Always at least 1.\n */\nexport function readingMinutes(words: number): number {\n if (words <= 0) return 0;\n return Math.max(1, Math.ceil(words / WORDS_PER_MINUTE));\n}\n\nexport interface LastModifiedInput {\n /** Absolute path of the source file. */\n absPath: string;\n /** Project root — git commands run with this as cwd. */\n cwd: string;\n}\n\n/**\n * Resolve a page's last-modified timestamp. Prefers `git log -1 --format=%cI`\n * because mtime is unreliable in CI (every checkout sets every file to \"now\");\n * falls back to filesystem mtime when:\n * - git isn't available\n * - the directory isn't a git repo\n * - the file isn't tracked yet\n *\n * Returns an ISO-8601 string, or `undefined` if neither source produced a value.\n */\nexport async function lastModifiedISO(input: LastModifiedInput): Promise<string | undefined> {\n const gitTime = await tryGitLog(input);\n if (gitTime) return gitTime;\n try {\n const s = await stat(input.absPath);\n return s.mtime.toISOString();\n } catch {\n return undefined;\n }\n}\n\nasync function tryGitLog(input: LastModifiedInput): Promise<string | undefined> {\n try {\n const { stdout } = await execFileAsync(\n 'git',\n ['log', '-1', '--format=%cI', '--', input.absPath],\n { cwd: input.cwd, timeout: 2000 },\n );\n const value = stdout.trim();\n return value.length > 0 ? value : undefined;\n } catch {\n return undefined;\n }\n}\n","import * as pagefind from 'pagefind';\n\nexport interface IndexSiteInput {\n /** Absolute path of the `dist/` directory the build wrote. */\n outputAbs: string;\n}\n\nexport interface IndexSiteResult {\n /** Number of pages Pagefind successfully indexed. */\n pageCount: number;\n /** Pagefind's internal exit code (`0` clean). Non-zero means partial failure. */\n exitCode: number;\n /** Any non-fatal errors emitted by Pagefind. */\n errors: string[];\n}\n\n/**\n * Run Pagefind against an already-built site. Emits a `pagefind/` subdirectory\n * inside `outputAbs` containing the index, the wasm bundle, and the default\n * UI assets that the template loads at runtime.\n *\n * Pagefind is heavy as a build-time dep but ships nothing extra at runtime\n * beyond its own bundle (loaded only on pages where the template injects\n * `<script src=\"/pagefind/pagefind-ui.js\">`). When `site.search.enabled` is\n * false, this function is never called and Pagefind doesn't even load.\n */\nexport async function indexSite(input: IndexSiteInput): Promise<IndexSiteResult> {\n const { index } = await pagefind.createIndex({});\n if (!index) {\n return { pageCount: 0, exitCode: 1, errors: ['pagefind.createIndex returned no index'] };\n }\n const addRes = await index.addDirectory({ path: input.outputAbs });\n const writeRes = await index.writeFiles({ outputPath: `${input.outputAbs}/pagefind` });\n await pagefind.close();\n return {\n pageCount: addRes.page_count ?? 0,\n exitCode: writeRes.errors.length === 0 ? 0 : 1,\n errors: writeRes.errors,\n };\n}\n","import type { PageOutput } from './build.js';\n\nexport interface GenerateSitemapInput {\n pages: PageOutput[];\n baseUrl: string;\n /** Site-prefix path (e.g. `/ovellum`). Prepended to each page URL. */\n basePath?: string;\n /** URLs to exclude from the sitemap (e.g. `/404/`). */\n exclude?: string[];\n}\n\n/**\n * Generate a `sitemap.xml` body from the list of pages a site build produced.\n *\n * Returns `undefined` when `baseUrl` is missing — without it we can't emit\n * fully-qualified URLs and most sitemap consumers require absolute paths.\n *\n * v1 emits only `<loc>` per URL. `<lastmod>` (from git mtime) and\n * `<changefreq>` / `<priority>` are deferred until a build-time git lookup\n * is wired.\n */\nexport function generateSitemap(input: GenerateSitemapInput): string | undefined {\n if (!input.baseUrl) return undefined;\n const base = stripTrailingSlash(input.baseUrl);\n const prefix = input.basePath ? stripTrailingSlash(input.basePath) : '';\n const exclude = new Set(input.exclude ?? ['/404/']);\n\n const entries = input.pages\n .filter((p) => !exclude.has(p.url))\n .map((p) => ` <url>\\n <loc>${escapeXml(base + prefix + p.url)}</loc>\\n </url>`)\n .join('\\n');\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${entries}\n</urlset>\n`;\n}\n\nfunction stripTrailingSlash(s: string): string {\n return s.replace(/\\/+$/, '');\n}\n\nfunction escapeXml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n}\n","/**\n * Inline SVG icon registry, backed by Lucide.\n *\n * Each `<svg>` we emit follows Lucide's canonical attribute set:\n *\n * - 24×24 viewBox\n * - fill=\"none\", stroke=\"currentColor\"\n * - stroke-width=\"2\", stroke-linecap=\"round\", stroke-linejoin=\"round\"\n *\n * The icon nodes come straight from the `lucide` package — we import each one\n * by name, which means esbuild/tsup tree-shakes everything else away. Adding a\n * new icon is one import + one entry in REGISTRY.\n *\n * Why import from `lucide/dist/esm/icons/<name>.mjs` instead of the package\n * root: the root export only exposes Lucide's runtime helpers (`createIcons`),\n * not the icon tuples themselves. Each per-icon `.mjs` default-exports an\n * `IconNode[]` like `[['path', { d: 'M4 5h16' }], …]`.\n *\n * Lucide-static (the SVG-file variant) would also work, but it'd mean reading\n * files at module load. This avoids the I/O while keeping the wire payload\n * tiny (≈100B per icon after tree-shaking).\n */\n\nimport Check from 'lucide/dist/esm/icons/check.mjs';\nimport ChevronDown from 'lucide/dist/esm/icons/chevron-down.mjs';\nimport ExternalLink from 'lucide/dist/esm/icons/external-link.mjs';\nimport Menu from 'lucide/dist/esm/icons/menu.mjs';\nimport Monitor from 'lucide/dist/esm/icons/monitor.mjs';\nimport Moon from 'lucide/dist/esm/icons/moon.mjs';\nimport Search from 'lucide/dist/esm/icons/search.mjs';\nimport Sun from 'lucide/dist/esm/icons/sun.mjs';\nimport X from 'lucide/dist/esm/icons/x.mjs';\n\ntype LucideAttrs = Record<string, string | number>;\ntype LucideNode = [string, LucideAttrs, LucideChild[]?];\ntype LucideChild = [string, LucideAttrs, LucideChild[]?];\n\n// Lucide v1 dropped brand marks (trademark concerns). Hand-rolled GitHub mark\n// kept here, matched to Lucide's stroke/curve language so it sits beside the\n// real Lucide icons without looking out of place.\nconst GITHUB_MARK: LucideChild[] = [\n [\n 'path',\n {\n d: 'M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.4 5.4 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4',\n },\n ],\n ['path', { d: 'M9 18c-4.51 2-5-2-7-2' }],\n];\n\n// Public name → Lucide node array. Public names follow our existing API\n// (`close` instead of Lucide's `x`) so renaming doesn't ripple through call\n// sites.\nconst REGISTRY = {\n menu: Menu,\n close: X,\n sun: Sun,\n moon: Moon,\n monitor: Monitor,\n 'chevron-down': ChevronDown,\n github: GITHUB_MARK,\n 'external-link': ExternalLink,\n search: Search,\n check: Check,\n} as const;\n\nexport type IconName = keyof typeof REGISTRY;\n\n/**\n * Backwards-compatible export: each entry is the inner SVG markup (no outer\n * `<svg>` wrapper). Preserved so existing call sites that read from `ICONS`\n * directly keep working.\n */\nexport const ICONS = Object.fromEntries(\n (Object.keys(REGISTRY) as IconName[]).map((name) => [name, nodesToInnerHtml(REGISTRY[name])]),\n) as Record<IconName, string>;\n\nexport interface RenderIconOptions {\n /** CSS class on the `<svg>` element. */\n class?: string;\n /** Pixel size — applied as both width and height. Defaults to 20. */\n size?: number;\n /** `aria-hidden` — true by default since icons are usually decorative. */\n ariaHidden?: boolean;\n /** Visible accessible label. Forces `aria-hidden` off and adds `role=\"img\"`. */\n label?: string;\n}\n\n/**\n * Render an icon as an HTML-ready SVG string. The result is safe to inline\n * directly into a template — every component is statically defined here.\n */\nexport function renderIcon(name: IconName, opts: RenderIconOptions = {}): string {\n const size = opts.size ?? 20;\n const className = opts.class ? ` class=\"${escapeAttr(opts.class)}\"` : '';\n const labelled = typeof opts.label === 'string' && opts.label.length > 0;\n const a11y = labelled\n ? ` role=\"img\" aria-label=\"${escapeAttr(opts.label!)}\"`\n : opts.ariaHidden === false\n ? ''\n : ' aria-hidden=\"true\" focusable=\"false\"';\n const inner = ICONS[name];\n return `<svg${className} width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"${a11y}>${inner}</svg>`;\n}\n\nfunction nodesToInnerHtml(nodes: LucideChild[]): string {\n return nodes.map(nodeToHtml).join('');\n}\n\nfunction nodeToHtml(node: LucideChild | LucideNode): string {\n const [tag, attrs, children] = node;\n const attrStr = Object.entries(attrs)\n .map(([k, v]) => `${k}=\"${escapeAttr(String(v))}\"`)\n .join(' ');\n const inner = children && children.length > 0 ? nodesToInnerHtml(children) : '';\n return inner ? `<${tag} ${attrStr}>${inner}</${tag}>` : `<${tag} ${attrStr}/>`;\n}\n\nfunction escapeAttr(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n","/**\n * Normalise a `site.basePath` config value. Returns the empty string for\n * root-hosted sites, otherwise a string that starts with `/` and has no\n * trailing slash (`/ovellum`, `/docs`, `/foo/bar`).\n *\n * Idempotent — feeding the result back through is a no-op.\n */\nexport function normaliseBasePath(value: string | undefined): string {\n if (!value) return '';\n let s = value.trim();\n if (!s) return '';\n if (!s.startsWith('/')) s = '/' + s;\n while (s.length > 1 && s.endsWith('/')) s = s.slice(0, -1);\n return s === '/' ? '' : s;\n}\n\n/**\n * Prepend the configured base path to a site-internal URL. External URLs,\n * fragment-only links, and relative links pass through unchanged.\n *\n * siteUrl('/foo/', '/ovellum') → '/ovellum/foo/'\n * siteUrl('/', '/ovellum') → '/ovellum/'\n * siteUrl('/foo/', '') → '/foo/'\n * siteUrl('https://x.test/y', '/ov') → 'https://x.test/y'\n * siteUrl('#hash', '/ov') → '#hash'\n * siteUrl('relative.md', '/ov') → 'relative.md'\n */\nexport function siteUrl(url: string, basePath: string): string {\n if (!url) return url;\n if (/^[a-z][a-z0-9+.-]*:/i.test(url)) return url; // any scheme (http, https, mailto, tel, …)\n if (url.startsWith('//')) return url; // protocol-relative\n if (url.startsWith('#')) return url;\n if (!url.startsWith('/')) return url;\n if (!basePath) return url;\n // Avoid double prefixing if the caller already passed a prefixed URL in.\n if (url === basePath || url.startsWith(basePath + '/')) return url;\n return basePath + url;\n}\n\n/**\n * Asset URL helper for things like `/assets/ovellum.css`. Same logic as\n * `siteUrl`, but always returns a trailing slash for the prefix when called\n * with an empty path so callers don't have to special-case the \"/\" case.\n *\n * assetsPrefix('/ovellum') → '/ovellum/'\n * assetsPrefix('') → '/'\n */\nexport function assetsPrefix(basePath: string): string {\n return basePath ? basePath + '/' : '/';\n}\n","import type { OvellumLandingConfig, OvellumSiteConfig } from '@ovellum/core';\nimport { renderIcon } from './icons.js';\nimport type { Heading } from './markdown.js';\nimport type { NavNode } from './nav.js';\nimport { assetsPrefix as assetsPrefixFor, normaliseBasePath, siteUrl } from './url.js';\n\nexport interface ShellOptions {\n site: OvellumSiteConfig & { title: string };\n /** Full <title> for the page (already composed upstream). */\n fullTitle: string;\n /** Used in <meta name=\"description\"> and the canonical link. */\n description?: string;\n /** Site-relative URL for canonical/OG; empty for landings. */\n url: string;\n /** Path prefix for static assets, defaults to '/'. */\n assetsPrefix?: string;\n /** Optional Docs link added to the topbar (typically only on landing pages). */\n docsHref?: string;\n /** Build timestamp (ISO) used in the footer. */\n generatedAt: string;\n /** Body HTML (already rendered) placed between <header> and <footer>. */\n body: string;\n /** Outer body class — distinguishes landing pages from doc pages. */\n bodyClass?: string;\n}\n\nfunction renderShell(opts: ShellOptions): string {\n const basePath = normaliseBasePath(opts.site.basePath);\n const assets = opts.assetsPrefix ?? assetsPrefixFor(basePath);\n const desc = opts.description ?? opts.site.description ?? '';\n // Optional-chain because `site.search` may be undefined when callers pass a\n // partial site object (template/landing tests cast partial fixtures to the\n // full type). DEFAULT_CONFIG sets `search.enabled: false`.\n const searchEnabled = opts.site.search?.enabled === true;\n const searchHead = searchEnabled\n ? `<link rel=\"stylesheet\" href=\"${escapeAttr(assets)}pagefind/pagefind-ui.css\">`\n : '';\n const searchScripts = searchEnabled\n ? `<script src=\"${escapeAttr(assets)}pagefind/pagefind-ui.js\" defer></script>\n <script>\n window.addEventListener('DOMContentLoaded', function () {\n if (typeof PagefindUI === 'undefined') return;\n new PagefindUI({ element: '#ov-search', showSubResults: true, resetStyles: false });\n });\n </script>`\n : '';\n return `<!doctype html>\n<html lang=\"en\" data-theme=\"${escapeAttr(opts.site.defaultTheme)}\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>${escapeHtml(opts.fullTitle)}</title>\n ${desc ? `<meta name=\"description\" content=\"${escapeAttr(desc)}\">` : ''}\n ${opts.site.baseUrl ? `<link rel=\"canonical\" href=\"${escapeAttr(join(opts.site.baseUrl, basePath + opts.url))}\">` : ''}\n <link rel=\"stylesheet\" href=\"${escapeAttr(assets)}assets/ovellum.css\">\n ${searchHead}\n <script>\n (function () {\n try {\n var t = localStorage.getItem('ovellum-theme');\n if (t === 'light' || t === 'dark' || t === 'auto') {\n document.documentElement.setAttribute('data-theme', t);\n }\n } catch (_) {}\n })();\n </script>\n</head>\n<body${opts.bodyClass ? ` class=\"${escapeAttr(opts.bodyClass)}\"` : ''}>\n ${renderTopbar(opts.site, assets, opts.docsHref ? siteUrl(opts.docsHref, basePath) : undefined, searchEnabled, basePath)}\n ${opts.body}\n ${renderFooter(opts.site, opts.generatedAt)}\n ${searchScripts}\n <script src=\"${escapeAttr(assets)}assets/ovellum.js\" defer></script>\n</body>\n</html>\n`;\n}\n\nfunction renderTopbar(\n site: OvellumSiteConfig & { title: string },\n assets: string,\n docsHref: string | undefined,\n searchEnabled: boolean,\n basePath: string,\n): string {\n // Compose the right-side nav: configured items first, then the implicit\n // Docs link (only on the landing page — where docsHref is non-undefined).\n const navItems = site.topbarNav ?? [];\n const items: string[] = navItems.map((item) => {\n const external =\n item.external === true || /^https?:\\/\\//i.test(item.href);\n const href = external ? item.href : siteUrl(item.href, basePath);\n const rel = external ? ' rel=\"noopener\" target=\"_blank\"' : '';\n const icon = external\n ? ` ${renderIcon('external-link', { class: 'ov-topbar-icon', size: 14 })}`\n : '';\n return `<a class=\"ov-topbar-link\" href=\"${escapeAttr(href)}\"${rel}>${escapeHtml(item.label)}${icon}</a>`;\n });\n if (docsHref) {\n items.push(\n `<a class=\"ov-topbar-link ov-topbar-link--docs\" href=\"${escapeAttr(docsHref)}\">Docs</a>`,\n );\n }\n const navLinks = items.join('\\n ');\n const search = searchEnabled ? `<div id=\"ov-search\" class=\"ov-search\"></div>` : '';\n // The hamburger only appears below the responsive breakpoint via CSS.\n const menuButton = `<button class=\"ov-topbar-menu\" type=\"button\"\n aria-label=\"Open menu\" aria-expanded=\"false\" aria-controls=\"ov-mobile-nav\"\n data-ov-menu-toggle>\n <span class=\"ov-topbar-menu-open\">${renderIcon('menu', { size: 22 })}</span>\n <span class=\"ov-topbar-menu-close\">${renderIcon('close', { size: 22 })}</span>\n </button>`;\n const themeButton = `<button class=\"ov-theme-toggle\" type=\"button\"\n aria-label=\"Toggle theme\" title=\"Toggle theme\" data-ov-theme-toggle>\n <span class=\"ov-theme-icon ov-theme-icon-auto\">${renderIcon('monitor')}</span>\n <span class=\"ov-theme-icon ov-theme-icon-light\">${renderIcon('sun')}</span>\n <span class=\"ov-theme-icon ov-theme-icon-dark\">${renderIcon('moon')}</span>\n </button>`;\n return `<header class=\"ov-topbar\">\n <a class=\"ov-brand\" href=\"${escapeAttr(assets)}\">${escapeHtml(site.title)}</a>\n <nav class=\"ov-topbar-nav\" aria-label=\"Primary\">${navLinks}</nav>\n <div class=\"ov-topbar-right\">\n ${search}\n ${themeButton}\n ${menuButton}\n </div>\n <nav id=\"ov-mobile-nav\" class=\"ov-mobile-nav\" aria-label=\"Mobile\">\n ${navLinks}\n </nav>\n </header>`;\n}\n\nfunction renderFooter(site: OvellumSiteConfig & { title: string }, generatedAt: string): string {\n if (!site.footer) return '';\n return `<footer class=\"ov-footer\"><span>${escapeHtml(site.footer)}</span><span class=\"ov-footer-sep\"> · </span><time datetime=\"${escapeAttr(generatedAt)}\">${escapeHtml(generatedAt.slice(0, 10))}</time></footer>`;\n}\n\n// -- doc pages -----------------------------------------------------------\n\nexport interface PrevNextPage {\n title: string;\n url: string;\n}\n\nexport interface RenderPageInput {\n site: OvellumSiteConfig & { title: string };\n /** Root nav. Children are rendered as the sidebar tree. */\n nav: NavNode;\n /** Page's site-relative URL (with trailing slash). Used for marking the active link. */\n url: string;\n /** Page title (already resolved upstream — falls back to the site title for the root). */\n title: string;\n /** Optional description for `<meta name=\"description\">`. */\n description?: string;\n /** Rendered body HTML. */\n bodyHtml: string;\n /** Headings extracted from the body for the right-side ToC. */\n headings: Heading[];\n /** Build timestamp (ISO) used in the footer. */\n generatedAt: string;\n /** Path prefix for static assets, defaults to '/'. */\n assetsPrefix?: string;\n /** Optional Docs link added to the topbar (typically only used when a landing page exists). */\n docsHref?: string;\n /** Previous page in the sidebar's reading order, if any. */\n prev?: PrevNextPage;\n /** Next page in the sidebar's reading order, if any. */\n next?: PrevNextPage;\n /** Resolved \"Edit this page\" URL (already had `{path}` substituted), if set. */\n editUrl?: string;\n /** Breadcrumb trail, root-first. The current page is the last entry. */\n breadcrumbs?: Array<{ title: string; url: string }>;\n /** Reading-time estimate in whole minutes (already computed and rounded). */\n readingMinutes?: number;\n /** ISO-8601 timestamp of the source file's last modification. */\n lastModified?: string;\n /** Optional class added to `<body>`. Used today for the special 404 layout. */\n bodyClass?: string;\n}\n\n/**\n * Render a full HTML document for one doc page (sidebar + content + ToC).\n */\nexport function renderPage(input: RenderPageInput): string {\n const fullTitle =\n input.title && input.title !== input.site.title\n ? `${input.title} · ${input.site.title}`\n : input.site.title;\n\n const basePath = normaliseBasePath(input.site.basePath);\n const sidebar = renderSidebar(input.nav, input.url, basePath);\n const toc = renderToc(input.headings);\n const prevNext = renderPrevNext(input.prev, input.next, basePath);\n const breadcrumbs = renderBreadcrumbs(input.breadcrumbs, basePath);\n const pageMeta = renderPageMeta(input.readingMinutes, input.lastModified);\n const editLink = input.editUrl\n ? `<p class=\"ov-edit-page\"><a class=\"ov-edit-link\" href=\"${escapeAttr(input.editUrl)}\" rel=\"noopener\" target=\"_blank\">Edit this page</a></p>`\n : '';\n\n const body = `<div class=\"ov-layout\">\n <aside class=\"ov-sidebar\" aria-label=\"Site navigation\">${sidebar}</aside>\n <main class=\"ov-content\">\n ${breadcrumbs}\n ${pageMeta}\n <article class=\"ov-prose\">${input.bodyHtml}</article>\n ${editLink}\n ${prevNext}\n </main>\n <aside class=\"ov-toc\" aria-label=\"On this page\">${toc}</aside>\n </div>`;\n\n return renderShell({\n site: input.site,\n fullTitle,\n description: input.description,\n url: input.url,\n assetsPrefix: input.assetsPrefix,\n docsHref: input.docsHref,\n generatedAt: input.generatedAt,\n body,\n bodyClass: input.bodyClass,\n });\n}\n\n// -- landing page --------------------------------------------------------\n\nexport interface RenderLandingInput {\n site: OvellumSiteConfig & { title: string };\n landing: OvellumLandingConfig;\n /** Optional pitch HTML rendered between the feature grid and the trust strip. */\n pitchHtml?: string;\n generatedAt: string;\n assetsPrefix?: string;\n /** Resolved docs entry URL (landing.docsHref or first-nav fallback). */\n docsHref?: string;\n}\n\n/**\n * Render the landing-page document. Sections in order: hero, feature grid,\n * optional pitch (free-form markdown body from `_landing.md`), optional\n * trust strip.\n */\nexport function renderLanding(input: RenderLandingInput): string {\n const heroTitle = input.landing.hero.title ?? input.site.title;\n const fullTitle = input.site.title;\n const basePath = normaliseBasePath(input.site.basePath);\n\n const hero = renderHero(\n heroTitle,\n input.landing.hero.subtitle,\n input.landing.hero.ctas,\n basePath,\n );\n const features = renderFeatures(input.landing.features);\n const pitch = input.pitchHtml\n ? `<section class=\"ov-pitch\"><div class=\"ov-pitch-inner\">${input.pitchHtml}</div></section>`\n : '';\n const trust = renderTrustStrip(input.landing.trustStrip);\n\n const body = `<main class=\"ov-landing\">\n ${hero}\n ${features}\n ${pitch}\n ${trust}\n </main>`;\n\n return renderShell({\n site: input.site,\n fullTitle,\n description: input.site.description,\n url: '/',\n assetsPrefix: input.assetsPrefix,\n docsHref: input.docsHref ? siteUrl(input.docsHref, basePath) : undefined,\n generatedAt: input.generatedAt,\n body,\n bodyClass: 'ov-body-landing',\n });\n}\n\nfunction renderHero(\n title: string,\n subtitle: string | undefined,\n ctas: OvellumLandingConfig['hero']['ctas'],\n basePath: string,\n): string {\n const ctaButtons = ctas\n .map((cta, i) => {\n const style = cta.style ?? (i === 0 ? 'primary' : 'secondary');\n return `<a class=\"ov-cta ov-cta--${escapeAttr(style)}\" href=\"${escapeAttr(siteUrl(cta.href, basePath))}\">${escapeHtml(cta.label)}</a>`;\n })\n .join('\\n ');\n const ctaRow = ctas.length > 0 ? `<div class=\"ov-cta-row\">\\n ${ctaButtons}\\n </div>` : '';\n return `<section class=\"ov-hero\">\n <h1 class=\"ov-hero-title\">${escapeHtml(title)}</h1>\n ${subtitle ? `<p class=\"ov-hero-subtitle\">${escapeHtml(subtitle)}</p>` : ''}\n ${ctaRow}\n </section>`;\n}\n\nfunction renderFeatures(features: OvellumLandingConfig['features']): string {\n if (features.length === 0) return '';\n const cards = features\n .map((f) => {\n const icon = f.icon ? `<div class=\"ov-feature-icon\" aria-hidden=\"true\">${f.icon}</div>` : '';\n return `<article class=\"ov-feature-card\">\n ${icon}\n <h3 class=\"ov-feature-title\">${escapeHtml(f.title)}</h3>\n <p class=\"ov-feature-description\">${escapeHtml(f.description)}</p>\n </article>`;\n })\n .join('\\n ');\n return `<section class=\"ov-feature-grid-wrap\">\n <div class=\"ov-feature-grid\">\n ${cards}\n </div>\n </section>`;\n}\n\nfunction renderTrustStrip(trust: OvellumLandingConfig['trustStrip']): string {\n if (!trust || trust.items.length === 0) return '';\n const items = trust.items\n .map((it) => {\n const inner = it.image\n ? `<img class=\"ov-trust-image\" src=\"${escapeAttr(it.image)}\" alt=\"${escapeAttr(it.name)}\">`\n : `<span class=\"ov-trust-name\">${escapeHtml(it.name)}</span>`;\n return it.href\n ? `<a class=\"ov-trust-item\" href=\"${escapeAttr(it.href)}\">${inner}</a>`\n : `<span class=\"ov-trust-item\">${inner}</span>`;\n })\n .join('\\n ');\n return `<section class=\"ov-trust\">\n ${trust.label ? `<p class=\"ov-trust-label\">${escapeHtml(trust.label)}</p>` : ''}\n <div class=\"ov-trust-items\">\n ${items}\n </div>\n </section>`;\n}\n\n// -- shared helpers ------------------------------------------------------\n\nfunction renderSidebar(nav: NavNode, activeUrl: string, basePath: string): string {\n return `<nav class=\"ov-sidebar-nav\"><ul>${navList(nav.children, activeUrl, basePath)}</ul></nav>`;\n}\n\nfunction navList(nodes: NavNode[], activeUrl: string, basePath: string): string {\n if (nodes.length === 0) return '';\n return nodes\n .map((node) => {\n const isActive = node.url === activeUrl;\n const hasChildren = node.children.length > 0;\n const link = node.sourcePath\n ? `<a class=\"ov-nav-link${isActive ? ' is-active' : ''}\" href=\"${escapeAttr(siteUrl(node.url, basePath))}\">${escapeHtml(node.title)}</a>`\n : `<span class=\"ov-nav-group\">${escapeHtml(node.title)}</span>`;\n const children = hasChildren\n ? `<ul class=\"ov-nav-children\">${navList(node.children, activeUrl, basePath)}</ul>`\n : '';\n return `<li>${link}${children}</li>`;\n })\n .join('');\n}\n\nfunction renderBreadcrumbs(\n trail: Array<{ title: string; url: string }> | undefined,\n basePath: string,\n): string {\n // The trail includes the synthetic root node, so a top-level page like\n // /getting-started/ has length 2. Only render when there's at least one\n // real group between the root and the current page.\n if (!trail || trail.length < 3) return '';\n const visible = trail.slice(1);\n const items = visible\n .map((node, i) => {\n const isLast = i === visible.length - 1;\n if (isLast) {\n return `<li class=\"ov-crumb is-current\" aria-current=\"page\">${escapeHtml(node.title)}</li>`;\n }\n return `<li class=\"ov-crumb\"><a href=\"${escapeAttr(siteUrl(node.url, basePath))}\">${escapeHtml(node.title)}</a></li>`;\n })\n .join('\\n ');\n return `<nav class=\"ov-breadcrumbs\" aria-label=\"Breadcrumb\">\n <ol>\n ${items}\n </ol>\n </nav>`;\n}\n\nfunction renderPageMeta(\n readingMin: number | undefined,\n lastModifiedISO: string | undefined,\n): string {\n const parts: string[] = [];\n if (typeof readingMin === 'number' && readingMin > 0) {\n parts.push(`<span class=\"ov-page-meta-read\">${readingMin} min read</span>`);\n }\n if (lastModifiedISO) {\n const date = lastModifiedISO.slice(0, 10);\n parts.push(\n `<span class=\"ov-page-meta-updated\">Updated <time datetime=\"${escapeAttr(lastModifiedISO)}\">${escapeHtml(date)}</time></span>`,\n );\n }\n if (parts.length === 0) return '';\n return `<p class=\"ov-page-meta\">${parts.join('<span class=\"ov-page-meta-sep\"> · </span>')}</p>`;\n}\n\nfunction renderPrevNext(\n prev: PrevNextPage | undefined,\n next: PrevNextPage | undefined,\n basePath: string,\n): string {\n if (!prev && !next) return '';\n const prevHtml = prev\n ? `<a class=\"ov-prevnext-link ov-prevnext-prev\" href=\"${escapeAttr(siteUrl(prev.url, basePath))}\">\n <span class=\"ov-prevnext-label\">Previous</span>\n <span class=\"ov-prevnext-title\">${escapeHtml(prev.title)}</span>\n </a>`\n : '<span class=\"ov-prevnext-spacer\" aria-hidden=\"true\"></span>';\n const nextHtml = next\n ? `<a class=\"ov-prevnext-link ov-prevnext-next\" href=\"${escapeAttr(siteUrl(next.url, basePath))}\">\n <span class=\"ov-prevnext-label\">Next</span>\n <span class=\"ov-prevnext-title\">${escapeHtml(next.title)}</span>\n </a>`\n : '<span class=\"ov-prevnext-spacer\" aria-hidden=\"true\"></span>';\n return `<nav class=\"ov-prevnext\" aria-label=\"Page navigation\">\n ${prevHtml}\n ${nextHtml}\n </nav>`;\n}\n\nfunction renderToc(headings: Heading[]): string {\n if (headings.length === 0) return '';\n const items = headings\n .map(\n (h) =>\n `<li class=\"ov-toc-h${h.depth}\"><a href=\"#${escapeAttr(h.id)}\">${escapeHtml(h.text)}</a></li>`,\n )\n .join('');\n return `<div class=\"ov-toc-inner\"><p class=\"ov-toc-title\">On this page</p><ul>${items}</ul></div>`;\n}\n\nfunction join(base: string, path: string): string {\n if (!base.endsWith('/')) base += '/';\n return base + path.replace(/^\\//, '');\n}\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\nfunction escapeAttr(s: string): string {\n return escapeHtml(s);\n}\n","import { unified } from 'unified';\nimport remarkParse from 'remark-parse';\nimport { visit } from 'unist-util-visit';\nimport type { Root, Link } from 'mdast';\n\nexport interface MarkdownLink {\n /** Raw href as it appeared in the source (`./foo`, `/bar/`, `https://…`, etc.). */\n target: string;\n /** 1-based source line of the opening `[`. */\n line: number;\n}\n\n/**\n * Extract every `[text](url)` and `<https://…>` autolink from a Markdown body.\n *\n * Uses the same remark parser as the renderer, so links inside fenced code\n * blocks, inline code, and HTML are correctly ignored (the regex-based\n * approach this replaces would match them too).\n *\n * Returned URLs are exactly what the author wrote — no resolution, no\n * normalisation. Caller decides what's internal vs external.\n */\nexport function extractMarkdownLinks(content: string): MarkdownLink[] {\n const tree = unified().use(remarkParse).parse(content) as Root;\n const out: MarkdownLink[] = [];\n visit(tree, 'link', (node: Link) => {\n if (typeof node.url !== 'string') return;\n out.push({\n target: node.url,\n line: node.position?.start.line ?? 1,\n });\n });\n return out;\n}\n","import { existsSync } from 'node:fs';\nimport { readFile, readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { defineCommand } from 'citty';\nimport matter from 'gray-matter';\nimport { ConfigError, loadOvellumConfig, type OvellumConfig } from '@ovellum/core';\nimport { buildNav, extractMarkdownLinks, flattenNav, type NavNode } from '@ovellum/site';\nimport { detectUnsafeScheme } from './check-utils.js';\n\ninterface Issue {\n file: string;\n line: number;\n message: string;\n kind: 'broken-link' | 'unsafe-scheme';\n}\n\nexport const checkCommand = defineCommand({\n meta: {\n name: 'check',\n description:\n 'Validate config and check for broken internal links without writing any output.',\n },\n args: {\n config: {\n type: 'string',\n description: 'Path to ovellum.config.{ts,js,json}',\n },\n cwd: {\n type: 'string',\n description: 'Project root (defaults to current directory)',\n },\n },\n async run({ args }) {\n const cwd = path.resolve(args.cwd ?? process.cwd());\n let loaded;\n try {\n loaded = await loadOvellumConfig({ cwd, configFile: args.config });\n } catch (err) {\n if (err instanceof ConfigError) {\n process.stderr.write(`config error: ${err.message}\\n`);\n if (err.hint) process.stderr.write(`hint: ${err.hint}\\n`);\n process.exit(3);\n }\n throw err;\n }\n const { config, configFile } = loaded;\n\n const startedAt = Date.now();\n let issues: Issue[];\n let files: string[];\n try {\n if (config.mode === 'manual') {\n ({ issues, files } = await checkManual({ config, cwd }));\n } else {\n ({ issues, files } = await checkGenerated({ config, cwd }));\n }\n } catch (err) {\n if (err instanceof ConfigError) {\n process.stderr.write(`check error: ${err.message}\\n`);\n if (err.hint) process.stderr.write(`hint: ${err.hint}\\n`);\n process.exit(1);\n }\n throw err;\n }\n\n const elapsed = Date.now() - startedAt;\n const unsafeCount = issues.filter((i) => i.kind === 'unsafe-scheme').length;\n const brokenCount = issues.length - unsafeCount;\n const lines = [\n `ovellum check complete in ${elapsed}ms`,\n ` config: ${configFile ?? '(defaults)'}`,\n ` mode: ${config.mode}`,\n ` pages: ${files.length}`,\n ` broken links: ${brokenCount}`,\n ` unsafe schemes: ${unsafeCount}`,\n ];\n if (issues.length > 0) {\n lines.push(' details:');\n for (const it of issues) {\n const tag = it.kind === 'unsafe-scheme' ? '[SECURITY] ' : '';\n lines.push(` ${it.file}:${it.line} ${tag}${it.message}`);\n }\n }\n process.stdout.write(lines.join('\\n') + '\\n');\n\n process.exit(issues.length === 0 ? 0 : 1);\n },\n});\n\nfunction collectValidUrls(nav: NavNode, config: OvellumConfig): Set<string> {\n const urls = new Set<string>();\n for (const page of flattenNav(nav)) urls.add(page.url);\n // Landing replaces `/` when enabled.\n if (config.site.landing.enabled) urls.add('/');\n return urls;\n}\n\ninterface CheckRun {\n issues: Issue[];\n files: string[];\n}\n\ninterface CheckInput {\n config: OvellumConfig;\n cwd: string;\n}\n\n/**\n * Manual mode: walk `input/`, validate every internal link against the\n * sidebar nav. This is the original behaviour.\n */\nasync function checkManual({ config, cwd }: CheckInput): Promise<CheckRun> {\n const inputAbs = path.resolve(cwd, config.input);\n const nav = await buildNav(config.input, cwd);\n const validUrls = collectValidUrls(nav, config);\n\n const issues: Issue[] = [];\n const files: string[] = [];\n for await (const file of walkMarkdown(inputAbs)) {\n files.push(file);\n const rel = path.relative(cwd, file).replace(/\\\\/g, '/');\n const raw = await readFile(file, 'utf8');\n const { content } = matter(raw);\n const url = urlForPage(file, inputAbs);\n for (const { target, line } of extractMarkdownLinks(content)) {\n const unsafe = detectUnsafeScheme(target);\n if (unsafe) {\n issues.push({\n file: rel,\n line,\n kind: 'unsafe-scheme',\n message: `unsafe URL scheme '${unsafe}:' — link will be stripped by the HTML sanitizer (raw: ${target})`,\n });\n continue;\n }\n const resolved = resolveLink(target, url);\n if (resolved === undefined) continue; // external / mailto / fragment / unparseable\n if (!validUrls.has(resolved)) {\n issues.push({\n file: rel,\n line,\n kind: 'broken-link',\n message: `broken internal link to ${resolved} (raw: ${target})`,\n });\n }\n }\n }\n return { issues, files };\n}\n\n/**\n * Hybrid / auto modes: the .md files we want to validate are the\n * *generated* ones in `config.output`. Internal links are resolved\n * against the actual files present on disk, since there's no\n * sidebar nav in auto-generated docs.\n *\n * Exits early with a clear message when the output directory doesn't\n * exist — usually because the user hasn't run `ovellum build` yet.\n */\nasync function checkGenerated({ config, cwd }: CheckInput): Promise<CheckRun> {\n const outputAbs = path.resolve(cwd, config.output);\n if (!existsSync(outputAbs)) {\n throw new ConfigError(\n `output directory does not exist: ${path.relative(cwd, outputAbs)}`,\n { hint: 'Run `ovellum build` first; `ovellum check` validates the generated Markdown.' },\n );\n }\n\n // Collect every .md path in the output dir so we can check links against\n // real files. Keys are stored both with and without the `.md` suffix so a\n // link to `./foo` and a link to `./foo.md` both resolve.\n const fileSet = new Set<string>();\n for await (const file of walkMarkdown(outputAbs)) {\n const rel = path.relative(outputAbs, file).replace(/\\\\/g, '/');\n fileSet.add('/' + rel);\n fileSet.add('/' + rel.replace(/\\.md$/i, ''));\n }\n\n const issues: Issue[] = [];\n const files: string[] = [];\n for await (const file of walkMarkdown(outputAbs)) {\n files.push(file);\n const rel = path.relative(cwd, file).replace(/\\\\/g, '/');\n const raw = await readFile(file, 'utf8');\n const { content } = matter(raw);\n const pageRel = '/' + path.relative(outputAbs, file).replace(/\\\\/g, '/');\n for (const { target, line } of extractMarkdownLinks(content)) {\n const unsafe = detectUnsafeScheme(target);\n if (unsafe) {\n issues.push({\n file: rel,\n line,\n kind: 'unsafe-scheme',\n message: `unsafe URL scheme '${unsafe}:' — link will be stripped by the HTML sanitizer (raw: ${target})`,\n });\n continue;\n }\n const resolved = resolveGeneratedLink(target, pageRel);\n if (resolved === undefined) continue;\n if (!fileSet.has(resolved)) {\n issues.push({\n file: rel,\n line,\n kind: 'broken-link',\n message: `broken internal link to ${resolved} (raw: ${target})`,\n });\n }\n }\n }\n return { issues, files };\n}\n\n/**\n * Resolve a link in a generated Markdown file to a path within the output\n * dir (rooted at `/`). Returns undefined for external / fragment / unparseable\n * links — those are not validated.\n */\nfunction resolveGeneratedLink(target: string, pageRel: string): string | undefined {\n if (!target) return undefined;\n if (/^(https?:|mailto:|tel:|data:|ftp:|ssh:)/i.test(target)) return undefined;\n if (target.startsWith('#')) return undefined;\n const cleaned = target.replace(/[?#].*$/, '');\n if (!cleaned) return undefined;\n if (cleaned.startsWith('/')) return cleaned;\n // Relative: resolve against the directory of pageRel.\n const baseDir = pageRel.slice(0, pageRel.lastIndexOf('/') + 1);\n const joined = new URL(cleaned, `https://x.test${baseDir}`).pathname;\n return joined;\n}\n\nasync function* walkMarkdown(dirAbs: string): AsyncGenerator<string> {\n const entries = await readdir(dirAbs);\n for (const name of entries) {\n if (name.startsWith('_')) continue;\n const abs = path.join(dirAbs, name);\n const st = await stat(abs);\n if (st.isDirectory()) {\n yield* walkMarkdown(abs);\n } else if (/\\.(md|markdown)$/i.test(name)) {\n yield abs;\n }\n }\n}\n\nfunction urlForPage(absFile: string, inputAbs: string): string {\n const rel = path.relative(inputAbs, absFile).replace(/\\\\/g, '/');\n const noExt = rel.replace(/\\.(md|markdown)$/i, '');\n const parts = noExt.split('/').filter(Boolean);\n if (parts.length === 0) return '/';\n if (parts[parts.length - 1] === 'index') parts.pop();\n if (parts.length === 0) return '/';\n return '/' + parts.join('/') + '/';\n}\n\nfunction resolveLink(target: string, pageUrl: string): string | undefined {\n if (!target) return undefined;\n if (/^(https?:|mailto:|tel:|data:|ftp:|ssh:)/i.test(target)) return undefined;\n if (target.startsWith('#')) return undefined; // fragment-only — could be checked but defer\n // Strip query and fragment for the resolution check\n const cleaned = target.replace(/[?#].*$/, '');\n if (!cleaned) return undefined;\n if (cleaned.startsWith('/')) {\n return ensureTrailingSlash(cleaned);\n }\n // Relative — resolve against pageUrl's directory\n const base = pageUrl.endsWith('/') ? pageUrl : pageUrl + '/';\n const joined = new URL(cleaned, `https://x.test${base}`).pathname;\n return ensureTrailingSlash(joined);\n}\n\nfunction ensureTrailingSlash(p: string): string {\n if (/\\.[a-z0-9]+$/i.test(p)) return p; // looks like a file path (image, etc.) — leave as is\n return p.endsWith('/') ? p : p + '/';\n}\n","/**\n * URL schemes that have no legitimate use inside a documentation site and\n * are common XSS vectors. We surface these as `[SECURITY]` issues in\n * `ovellum check` even though `renderMarkdown` already strips them at render\n * time — defense in depth, and authors should learn about the link so they\n * can remove it from source.\n *\n * `file:` is included because it can probe local files when the site is\n * opened via `file://` in a desktop context (e.g. an Electron-wrapped docs\n * viewer). Not strictly XSS but still surprising.\n */\nconst UNSAFE_SCHEMES = ['javascript', 'vbscript', 'data', 'file'] as const;\n\n/**\n * Strip ASCII C0 controls, space, and the zero-width / BiDi / BOM\n * characters a browser would silently ignore between scheme bytes.\n *\n * Built via `new RegExp()` on purpose: a regex literal containing the\n * U+0000–U+0020 range trips eslint's `no-control-regex` and\n * `no-irregular-whitespace`, both of which exist for good reasons in\n * other contexts. Spelling the ranges out in a normal string keeps\n * the source linter-clean while producing exactly the same regex at\n * runtime.\n *\n * U+0000–U+0020 NUL through SPACE\n * U+200B–U+200D ZWSP / ZWNJ / ZWJ\n * U+200E–U+200F LTR / RTL marks\n * U+202F NARROW NO-BREAK SPACE\n * U+FEFF BOM / ZWNBSP\n */\nconst STRIP_CONTROLS = new RegExp(\n '[' +\n '\\\\u0000-\\\\u0020' +\n '\\\\u200B-\\\\u200D' +\n '\\\\u200E-\\\\u200F' +\n '\\\\u202F' +\n '\\\\uFEFF' +\n ']',\n 'g',\n);\n\n/**\n * Return the lowercased scheme name if `target` uses one we consider unsafe;\n * otherwise `undefined`. Leading whitespace and HTML-numeric-entity-decoded\n * characters are normalised first so attempts like `\\tjavascript:` or\n * `javas&#x09;cript:` don't slip through.\n */\nexport function detectUnsafeScheme(target: string): string | undefined {\n if (!target) return undefined;\n // Order matters: decode entities FIRST, then strip controls. If we stripped\n // controls first, `javas&#x09;cript:` would still have an entity-encoded tab\n // hiding between the letters.\n const normalised = target\n .replace(/&#x([0-9a-f]+);?/gi, (_, hex: string) => String.fromCharCode(parseInt(hex, 16)))\n .replace(/&#(\\d+);?/g, (_, dec: string) => String.fromCharCode(parseInt(dec, 10)))\n .replace(STRIP_CONTROLS, '')\n .toLowerCase();\n const match = normalised.match(/^([a-z][a-z0-9+.-]*):/);\n if (!match || !match[1]) return undefined;\n const scheme = match[1];\n return (UNSAFE_SCHEMES as readonly string[]).includes(scheme) ? scheme : undefined;\n}\n","import path from 'node:path';\nimport { defineCommand } from 'citty';\nimport { ConfigError, loadOvellumConfig } from '@ovellum/core';\nimport { startDevServer } from '../dev/server.js';\nimport { watchAndBuild } from '../dev/watcher.js';\n\nconst DEFAULT_PORT = 3000;\nconst DEFAULT_HOST = '127.0.0.1';\n\nexport const devCommand = defineCommand({\n meta: {\n name: 'dev',\n description: 'Build, watch for changes, serve, and live-reload connected browsers.',\n },\n args: {\n config: {\n type: 'string',\n description: 'Path to ovellum.config.{ts,js,json}',\n },\n cwd: {\n type: 'string',\n description: 'Project root (defaults to current directory)',\n },\n port: {\n type: 'string',\n description: `Port to bind (default ${DEFAULT_PORT}; auto-bumps if busy)`,\n },\n host: {\n type: 'string',\n description: `Host to bind (default ${DEFAULT_HOST}; pass 0.0.0.0 to expose on the network)`,\n },\n },\n async run({ args }) {\n const cwd = path.resolve(args.cwd ?? process.cwd());\n let loaded;\n try {\n loaded = await loadOvellumConfig({ cwd, configFile: args.config });\n } catch (err) {\n if (err instanceof ConfigError) {\n process.stderr.write(`config error: ${err.message}\\n`);\n if (err.hint) process.stderr.write(`hint: ${err.hint}\\n`);\n process.exit(3);\n }\n throw err;\n }\n const { config, configFile } = loaded;\n\n if (config.mode !== 'manual') {\n process.stderr.write(\n `'dev' currently supports manual mode only. Got '${config.mode}'. ` +\n `Auto / hybrid coverage is tracked in TODO.md Phase 6.\\n`,\n );\n process.exit(1);\n }\n\n const port = parsePort(args.port) ?? DEFAULT_PORT;\n const host = args.host ?? DEFAULT_HOST;\n const outputAbs = path.resolve(cwd, config.output);\n\n process.stdout.write(`ovellum dev starting from ${configFile ?? '(defaults)'}\\n`);\n\n // Start the server first so its `broadcastReload` is in scope when the\n // watcher fires its initial build. The server happily serves 404s\n // during the brief window before dist/ is populated.\n const server = await startDevServer({\n rootDir: outputAbs,\n port,\n host,\n liveReload: true,\n });\n\n const watcher = await watchAndBuild({\n cwd,\n config,\n configFile,\n onBuild: () => server.broadcastReload(),\n });\n\n const inputAbs = path.resolve(cwd, config.input);\n process.stdout.write(\n `\\nwatching ${path.relative(cwd, inputAbs) || inputAbs} for changes…\\n` +\n `local: ${server.url}\\n` +\n `press Ctrl-C to exit.\\n`,\n );\n\n const shutdown = async (): Promise<void> => {\n process.stdout.write('\\nstopping dev server…\\n');\n await Promise.all([watcher.close(), server.close()]);\n process.exit(0);\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n await new Promise(() => {});\n },\n});\n\nfunction parsePort(raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const n = Number(raw);\n if (!Number.isInteger(n) || n < 1 || n > 65535) {\n throw new Error(`--port must be an integer between 1 and 65535; got '${raw}'.`);\n }\n return n;\n}\n","import { createReadStream, existsSync, statSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport http, { type IncomingMessage, type Server, type ServerResponse } from 'node:http';\nimport path from 'node:path';\n\nconst RELOAD_PATH = '/__ovellum/events';\nconst RELOAD_SCRIPT_PATH = '/__ovellum/reload.js';\n\n// Tiny client: subscribe to the SSE channel and reload on the `reload` event.\n// `error` events fire on disconnect; EventSource reconnects on its own, no\n// special handling needed.\nconst RELOAD_CLIENT_SCRIPT = `(function () {\n if (typeof EventSource !== 'function') return;\n var src = new EventSource('${RELOAD_PATH}');\n src.addEventListener('reload', function () { location.reload(); });\n})();`;\n\nconst MIME: Record<string, string> = {\n '.html': 'text/html; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.js': 'text/javascript; charset=utf-8',\n '.mjs': 'text/javascript; charset=utf-8',\n '.json': 'application/json; charset=utf-8',\n '.xml': 'application/xml; charset=utf-8',\n '.svg': 'image/svg+xml',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n '.txt': 'text/plain; charset=utf-8',\n};\n\nexport interface DevServerOptions {\n /** Absolute path of the directory to serve. */\n rootDir: string;\n /** Starting port; the server auto-bumps up to PORT_RANGE times if busy. */\n port: number;\n /** Host to bind. */\n host: string;\n /** When true, HTML responses get a live-reload client injected. */\n liveReload: boolean;\n}\n\nexport interface DevServer {\n /** Final URL the server is listening on (after any port bumping). */\n url: string;\n /** Final port the server bound to. */\n port: number;\n /** Push a `reload` event to every connected SSE client. */\n broadcastReload: () => void;\n /** Stop accepting requests and end open responses. */\n close: () => Promise<void>;\n}\n\nconst PORT_RANGE = 20;\n\n/**\n * Spin up a dev server for a built `dist/` directory.\n *\n * Routing:\n * / → <rootDir>/index.html\n * /foo/ → <rootDir>/foo/index.html\n * /foo/bar.css → <rootDir>/foo/bar.css\n * anything else missing → <rootDir>/404.html (or a built-in fallback)\n *\n * When `liveReload` is on, HTML responses get the client script injected\n * before `</body>`, and the server exposes `/__ovellum/events` (SSE) +\n * `/__ovellum/reload.js`.\n *\n * Port-bumping: if `port` is taken, the server tries `port + 1`, `port + 2`,\n * etc. up to `port + 19`. Throws if none are free.\n */\nexport async function startDevServer(opts: DevServerOptions): Promise<DevServer> {\n const clients = new Set<ServerResponse>();\n\n const handler = async (req: IncomingMessage, res: ServerResponse): Promise<void> => {\n const url = req.url ?? '/';\n const urlPath = url.split('?')[0] ?? '/';\n\n if (opts.liveReload && urlPath === RELOAD_PATH) {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n });\n // Initial comment line keeps proxies from closing the stream early.\n res.write(': connected\\n\\n');\n clients.add(res);\n req.on('close', () => clients.delete(res));\n return;\n }\n\n if (opts.liveReload && urlPath === RELOAD_SCRIPT_PATH) {\n res.writeHead(200, {\n 'Content-Type': MIME['.js']!,\n 'Cache-Control': 'no-store',\n });\n res.end(RELOAD_CLIENT_SCRIPT);\n return;\n }\n\n const filePath = resolveFilePath(opts.rootDir, urlPath);\n if (!filePath) {\n await serve404(opts, res);\n return;\n }\n\n await serveFile(opts, filePath, res);\n };\n\n // Port 0 means \"let the OS pick\" — used in tests so they don't race on a\n // fixed port. Otherwise scan upward from the requested port to find one\n // that's free.\n const startingPort =\n opts.port === 0 ? 0 : await findFreePort(opts.host, opts.port, PORT_RANGE);\n const server: Server = http.createServer((req, res) => {\n handler(req, res).catch((err) => {\n process.stderr.write(`dev-server error: ${(err as Error).message}\\n`);\n if (!res.headersSent) res.writeHead(500);\n res.end('Internal Server Error');\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(startingPort, opts.host, () => {\n server.off('error', reject);\n resolve();\n });\n });\n\n const address = server.address();\n const port = typeof address === 'object' && address ? address.port : startingPort;\n const host = opts.host === '0.0.0.0' ? 'localhost' : opts.host;\n const url = `http://${host}:${port}/`;\n\n return {\n url,\n port,\n broadcastReload(): void {\n for (const res of clients) {\n try {\n res.write('event: reload\\ndata: {}\\n\\n');\n } catch {\n clients.delete(res);\n }\n }\n },\n close: async () =>\n new Promise<void>((resolve) => {\n for (const res of clients) res.end();\n clients.clear();\n server.close(() => resolve());\n }),\n };\n}\n\n/**\n * Resolve a URL path to an absolute filesystem path, applying pretty-URL\n * fallback (`/foo/` → `/foo/index.html`). Returns undefined if no file\n * exists. Defends against path-traversal by rejecting any resolved path\n * that escapes the root.\n */\nfunction resolveFilePath(rootDir: string, urlPath: string): string | undefined {\n // Strip query/hash and normalise.\n let p = decodeURIComponent(urlPath);\n if (!p.startsWith('/')) p = '/' + p;\n const candidate = path.normalize(path.join(rootDir, p));\n // path.normalize collapses `..`; ensure we're still under rootDir.\n const rel = path.relative(rootDir, candidate);\n if (rel.startsWith('..') || path.isAbsolute(rel)) return undefined;\n\n if (existsSync(candidate)) {\n const stat = statSync(candidate);\n if (stat.isFile()) return candidate;\n if (stat.isDirectory()) {\n const indexHtml = path.join(candidate, 'index.html');\n if (existsSync(indexHtml)) return indexHtml;\n }\n }\n // Try `<urlPath>.html` for extensionless requests like `/foo`.\n const withHtml = candidate + '.html';\n if (existsSync(withHtml) && statSync(withHtml).isFile()) return withHtml;\n return undefined;\n}\n\nasync function serveFile(\n opts: DevServerOptions,\n filePath: string,\n res: ServerResponse,\n): Promise<void> {\n const ext = path.extname(filePath).toLowerCase();\n const type = MIME[ext] ?? 'application/octet-stream';\n\n // HTML gets in-memory read so we can inject the reload script.\n if (ext === '.html' && opts.liveReload) {\n const raw = await readFile(filePath, 'utf8');\n const injected = injectReloadScript(raw);\n res.writeHead(200, {\n 'Content-Type': type,\n 'Cache-Control': 'no-store',\n });\n res.end(injected);\n return;\n }\n\n res.writeHead(200, {\n 'Content-Type': type,\n 'Cache-Control': opts.liveReload ? 'no-store' : 'public, max-age=0',\n });\n createReadStream(filePath).pipe(res);\n}\n\nasync function serve404(opts: DevServerOptions, res: ServerResponse): Promise<void> {\n // Prefer the site's own 404.html / 404/index.html so the dev experience\n // matches production behaviour.\n const candidates = [\n path.join(opts.rootDir, '404.html'),\n path.join(opts.rootDir, '404', 'index.html'),\n ];\n for (const c of candidates) {\n if (existsSync(c) && statSync(c).isFile()) {\n const raw = await readFile(c, 'utf8');\n const body = opts.liveReload ? injectReloadScript(raw) : raw;\n res.writeHead(404, {\n 'Content-Type': MIME['.html']!,\n 'Cache-Control': 'no-store',\n });\n res.end(body);\n return;\n }\n }\n res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });\n res.end('Not Found');\n}\n\n/**\n * Insert the live-reload `<script>` immediately before the closing `</body>`.\n * Falls back to appending at the end if `</body>` isn't present.\n */\nexport function injectReloadScript(html: string): string {\n const tag = `<script src=\"${RELOAD_SCRIPT_PATH}\" defer></script>`;\n // Use $& to keep the matched </body> exactly as the author wrote it\n // (mixed-case authors get their styling preserved).\n if (/<\\/body>/i.test(html)) return html.replace(/<\\/body>/i, `${tag}$&`);\n return html + tag;\n}\n\nasync function findFreePort(host: string, start: number, range: number): Promise<number> {\n for (let p = start; p < start + range; p++) {\n if (await isPortFree(host, p)) return p;\n }\n throw new Error(\n `No free port in ${start}–${start + range - 1} on ${host}. ` +\n `Pass --port to pick a different starting point.`,\n );\n}\n\nfunction isPortFree(host: string, port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const probe = http.createServer();\n probe.once('error', () => resolve(false));\n probe.listen(port, host, () => {\n probe.close(() => resolve(true));\n });\n });\n}\n","import path from 'node:path';\nimport chokidar, { type FSWatcher } from 'chokidar';\nimport { ConfigError, loadOvellumConfig, type OvellumConfig } from '@ovellum/core';\nimport { runBuild, type BuildSummary } from './run-build.js';\n\nconst DEBOUNCE_MS = 300;\n\nexport interface WatchAndBuildOptions {\n /** Resolved project root. All paths in the config resolve relative to this. */\n cwd: string;\n /** Initial loaded config. */\n config: OvellumConfig;\n /** Path to the loaded config file, or undefined when defaults-only. */\n configFile: string | undefined;\n /**\n * Called after every successful build (initial + each rebuild). Use this\n * hook to broadcast live-reload events or log custom output.\n */\n onBuild?: (result: BuildSummary) => void | Promise<void>;\n /**\n * Called when a build fails. Default: log to stderr. Override to keep a\n * dev server alive instead of crashing.\n */\n onError?: (err: Error) => void;\n}\n\nexport interface ActiveWatcher {\n /** Close chokidar and release the underlying handles. */\n close: () => Promise<void>;\n}\n\n/**\n * Run an initial build, then watch the input directory and the config file\n * and rebuild on every change (debounced 300 ms). When the config file\n * itself changes, reload it before the next build.\n *\n * Shared between `ovellum watch` (which just logs) and `ovellum dev`\n * (which also broadcasts a live-reload signal via the dev server).\n */\nexport async function watchAndBuild(input: WatchAndBuildOptions): Promise<ActiveWatcher> {\n let { config, configFile } = input;\n const { cwd, onBuild, onError } = input;\n const logError = onError ?? ((err) => process.stderr.write(`build failed: ${err.message}\\n`));\n\n await safeBuild(config, cwd, onBuild, logError);\n\n const inputAbs = path.resolve(cwd, config.input);\n const watchPaths = [inputAbs];\n if (configFile) watchPaths.push(configFile);\n\n const watcher: FSWatcher = chokidar.watch(watchPaths, {\n ignoreInitial: true,\n awaitWriteFinish: { stabilityThreshold: 80, pollInterval: 25 },\n });\n\n let timer: NodeJS.Timeout | undefined;\n let pending: Set<string> = new Set();\n\n const schedule = (file: string): void => {\n pending.add(path.relative(cwd, file).replace(/\\\\/g, '/') || file);\n if (timer) clearTimeout(timer);\n timer = setTimeout(async () => {\n const files = Array.from(pending);\n pending = new Set();\n process.stdout.write(\n `\\nchanged: ${files.length === 1 ? files[0] : `${files.length} files`}\\n`,\n );\n // Reload config if it changed.\n if (configFile && files.some((f) => path.resolve(cwd, f) === configFile)) {\n try {\n const reloaded = await loadOvellumConfig({ cwd, configFile });\n config = reloaded.config;\n configFile = reloaded.configFile;\n process.stdout.write('config reloaded\\n');\n } catch (err) {\n if (err instanceof ConfigError) {\n process.stderr.write(`config error: ${err.message}\\n`);\n if (err.hint) process.stderr.write(`hint: ${err.hint}\\n`);\n return;\n }\n throw err;\n }\n }\n await safeBuild(config, cwd, onBuild, logError);\n }, DEBOUNCE_MS);\n };\n\n watcher.on('add', schedule);\n watcher.on('change', schedule);\n watcher.on('unlink', schedule);\n\n return {\n close: async () => {\n if (timer) clearTimeout(timer);\n await watcher.close();\n },\n };\n}\n\nasync function safeBuild(\n config: OvellumConfig,\n cwd: string,\n onBuild: WatchAndBuildOptions['onBuild'],\n onError: (err: Error) => void,\n): Promise<void> {\n try {\n const result = await runBuild({ config, cwd });\n const count = result.mode === 'manual' ? result.pages?.length ?? 0 : result.written?.length ?? 0;\n const unit = result.mode === 'manual' ? 'page' : 'file';\n process.stdout.write(\n `built ${count} ${unit}(s) in ${result.elapsedMs}ms` +\n (result.warnings.length > 0 ? ` (${result.warnings.length} warning(s))` : '') +\n '\\n',\n );\n for (const w of result.warnings) process.stderr.write(`warning: ${w}\\n`);\n if (onBuild) await onBuild(result);\n } catch (err) {\n onError(err as Error);\n }\n}\n","import { existsSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { confirm, input, select } from '@inquirer/prompts';\nimport { defineCommand } from 'citty';\n\n/**\n * Scaffold a new Ovellum project in the current (or given) directory.\n *\n * Writes (only what's missing — never clobbers an existing file unless\n * `--force` is passed):\n *\n * ovellum.config.json — primary entry. Mode-specific shape.\n * content/index.md — starter doc, manual + hybrid modes only.\n * .gitignore — appended with `dist/` and `.orphans/` if missing.\n *\n * Non-interactive mode (`--yes`): picks every default without prompting.\n */\nexport const initCommand = defineCommand({\n meta: {\n name: 'init',\n description: 'Scaffold a new Ovellum project (config + starter content).',\n },\n args: {\n cwd: {\n type: 'string',\n description: 'Project root (defaults to current directory)',\n },\n yes: {\n type: 'boolean',\n description: 'Skip prompts; accept every default. Implies --force is false.',\n alias: 'y',\n },\n force: {\n type: 'boolean',\n description: 'Overwrite ovellum.config.json if it already exists.',\n },\n },\n async run({ args }) {\n const cwd = path.resolve(args.cwd ?? process.cwd());\n const yes = args.yes === true;\n const force = args.force === true;\n\n const configPath = path.join(cwd, 'ovellum.config.json');\n if (existsSync(configPath) && !force) {\n process.stderr.write(\n `ovellum.config.json already exists at ${configPath}.\\n` +\n `Pass --force to overwrite, or run \\`ovellum init\\` in a different directory.\\n`,\n );\n process.exit(2);\n }\n\n const defaults = await guessDefaults(cwd);\n\n let answers: InitAnswers;\n if (yes) {\n answers = defaults;\n } else {\n try {\n answers = await ask(defaults);\n } catch (err) {\n // @inquirer throws ExitPromptError on Ctrl-C; treat as a clean abort.\n if (err instanceof Error && err.name === 'ExitPromptError') {\n process.stderr.write('Cancelled.\\n');\n process.exit(130);\n }\n throw err;\n }\n }\n\n const writes: string[] = [];\n\n const configJson = renderConfig(answers);\n await writeFile(configPath, configJson, 'utf8');\n writes.push(path.relative(cwd, configPath));\n\n if (answers.mode !== 'auto') {\n const contentDir = path.join(cwd, answers.input);\n const indexMd = path.join(contentDir, 'index.md');\n if (!existsSync(indexMd)) {\n await mkdir(contentDir, { recursive: true });\n await writeFile(indexMd, renderStarterIndex(answers), 'utf8');\n writes.push(path.relative(cwd, indexMd));\n }\n }\n\n const gitignoreUpdated = await ensureGitignore(cwd, answers);\n if (gitignoreUpdated) writes.push('.gitignore');\n\n const lines = [\n `ovellum project initialised in ${cwd === process.cwd() ? '.' : cwd}/`,\n ` mode: ${answers.mode}`,\n ` written:`,\n ...writes.map((w) => ` + ${w}`),\n '',\n 'Next steps:',\n ...nextSteps(answers),\n ];\n process.stdout.write(lines.join('\\n') + '\\n');\n },\n});\n\ninterface InitAnswers {\n name: string;\n mode: 'manual' | 'auto' | 'hybrid';\n title: string;\n description: string;\n input: string;\n output: string;\n tsconfig: string;\n defaultTheme: 'auto' | 'light' | 'dark';\n landing: boolean;\n}\n\nasync function guessDefaults(cwd: string): Promise<InitAnswers> {\n let name = path.basename(cwd) || 'my-docs';\n // If a package.json is present, prefer its name as the default.\n try {\n const raw = await readFile(path.join(cwd, 'package.json'), 'utf8');\n const parsed = JSON.parse(raw) as { name?: string };\n if (typeof parsed.name === 'string' && parsed.name.length > 0) {\n name = parsed.name.replace(/^@[^/]+\\//, '');\n }\n } catch {\n // no package.json or unreadable — fall back to the folder name.\n }\n return {\n name,\n mode: 'manual',\n title: titleFromName(name),\n description: '',\n input: 'content',\n output: 'dist',\n tsconfig: 'tsconfig.json',\n defaultTheme: 'auto',\n landing: false,\n };\n}\n\nasync function ask(d: InitAnswers): Promise<InitAnswers> {\n const name = await input({ message: 'Project name', default: d.name });\n const mode = (await select({\n message: 'Documentation mode',\n default: d.mode,\n choices: [\n {\n name: 'manual — write Markdown by hand; Ovellum builds a static site',\n value: 'manual',\n },\n {\n name: 'auto — generate Markdown from TS/JS source on every build',\n value: 'auto',\n },\n {\n name: 'hybrid — generate, then merge with hand-written zones',\n value: 'hybrid',\n },\n ],\n })) as InitAnswers['mode'];\n\n const title = await input({ message: 'Site title', default: titleFromName(name) });\n const description = await input({\n message: 'Short description (used for <meta name=description>)',\n default: '',\n });\n\n let input_ = d.input;\n let output = d.output;\n let tsconfig = d.tsconfig;\n let landing = d.landing;\n if (mode === 'manual') {\n input_ = await input({ message: 'Content directory', default: d.input });\n output = await input({ message: 'Output directory', default: d.output });\n landing = await confirm({\n message: 'Generate a landing page at / (hero + feature grid)?',\n default: false,\n });\n } else {\n tsconfig = await input({ message: 'TypeScript config', default: d.tsconfig });\n output = await input({\n message: 'Output directory for generated Markdown',\n default: 'docs',\n });\n }\n\n const defaultTheme = (await select({\n message: 'Default theme',\n default: d.defaultTheme,\n choices: [\n { name: 'auto — follow system preference', value: 'auto' },\n { name: 'light', value: 'light' },\n { name: 'dark', value: 'dark' },\n ],\n })) as InitAnswers['defaultTheme'];\n\n return { name, mode, title, description, input: input_, output, tsconfig, defaultTheme, landing };\n}\n\nfunction renderConfig(a: InitAnswers): string {\n // Hand-rolling JSON instead of JSON.stringify so the field order matches the\n // documented schema and the file reads top-to-bottom the same way the docs\n // describe it.\n const base: Record<string, unknown> = {\n $schema: 'https://ovellum.oss.oinam.com/schema/ovellum.config.schema.json',\n name: a.name,\n mode: a.mode,\n };\n if (a.mode === 'manual') {\n base.input = a.input;\n base.output = a.output;\n } else {\n base.tsconfig = a.tsconfig;\n base.output = a.output;\n }\n base.site = renderSiteBlock(a);\n return JSON.stringify(base, null, 2) + '\\n';\n}\n\nfunction renderSiteBlock(a: InitAnswers): Record<string, unknown> {\n const site: Record<string, unknown> = {\n title: a.title,\n defaultTheme: a.defaultTheme,\n };\n if (a.description) site.description = a.description;\n if (a.mode !== 'auto' && a.landing) {\n site.landing = {\n enabled: true,\n hero: {\n title: a.title,\n subtitle: a.description || 'Edit this in ovellum.config.json.',\n ctas: [\n { label: 'Get started', href: '/getting-started/' },\n { label: 'View on GitHub', href: 'https://github.com/' },\n ],\n },\n features: [],\n };\n }\n return site;\n}\n\nfunction renderStarterIndex(a: InitAnswers): string {\n return `---\ntitle: ${a.title}\ndescription: ${a.description || 'Welcome to ' + a.title + '.'}\n---\n\n# ${a.title}\n\n${a.description || `Welcome to **${a.title}**. This file is \\`${a.input}/index.md\\` and it becomes the home page when you run \\`ovellum build\\`.`}\n\n## Next steps\n\n- Edit this file and re-run \\`ovellum build\\` (or \\`ovellum watch\\` for live rebuilds).\n- Add more \\`.md\\` files alongside this one — they become pages automatically.\n- Group pages by creating subdirectories; add \\`_meta.json\\` to control titles\n and ordering. See the [reference](https://ovellum.oss.oinam.com/reference/config/).\n\n## Tips\n\n- Code blocks are syntax-highlighted with Shiki.\n- The right-side ToC is built from your h2/h3 headings.\n- Drop static assets (images, etc.) in this directory; they're copied through.\n`;\n}\n\nasync function ensureGitignore(cwd: string, a: InitAnswers): Promise<boolean> {\n const gi = path.join(cwd, '.gitignore');\n const want = a.mode === 'auto' ? [a.output, '.orphans/'] : [a.output, '.orphans/'];\n const wantNorm = want.map((p) => stripTrailingSlash(p));\n\n let current = '';\n if (existsSync(gi)) current = await readFile(gi, 'utf8');\n const have = new Set(\n current\n .split(/\\r?\\n/)\n .map((l) => stripTrailingSlash(l.trim()))\n .filter(Boolean),\n );\n const missing = wantNorm.filter((p) => !have.has(p));\n if (missing.length === 0) return false;\n\n const prefix = current.length > 0 && !current.endsWith('\\n') ? '\\n' : '';\n const block = `${prefix}# Ovellum\\n${missing.map((p) => p + '/').join('\\n')}\\n`;\n await writeFile(gi, current + block, 'utf8');\n return true;\n}\n\nfunction nextSteps(a: InitAnswers): string[] {\n if (a.mode === 'manual') {\n return [\n ` 1. Edit ${a.input}/index.md and add more pages.`,\n ` 2. Run \\`ovellum build\\` (or \\`ovellum watch\\`) to render the site.`,\n ` 3. Run \\`ovellum check\\` to validate internal links.`,\n ` 4. Deploy ${a.output}/ to GitHub Pages, Netlify, Vercel, or any static host.`,\n ];\n }\n return [\n ` 1. Point \\`tsconfig\\` at the project you want to document.`,\n ` 2. Run \\`ovellum build\\` to generate Markdown into ${a.output}/.`,\n ` 3. ${a.mode === 'hybrid' ? 'Add hand-written zones inside `<!-- ovellum:manual:start --> … <!-- ovellum:manual:end -->` markers; they survive regeneration.' : 'Re-run on every source change; the output is fully regenerated each time.'}`,\n ];\n}\n\nfunction titleFromName(name: string): string {\n return name\n .split(/[-_./@\\s]/)\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n}\n\nfunction stripTrailingSlash(s: string): string {\n return s.endsWith('/') ? s.slice(0, -1) : s;\n}\n","import { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { defineCommand } from 'citty';\nimport { ConfigError, loadOvellumConfig } from '@ovellum/core';\nimport { startDevServer } from '../dev/server.js';\n\nconst DEFAULT_PORT = 3000;\nconst DEFAULT_HOST = '127.0.0.1';\n\nexport const serveCommand = defineCommand({\n meta: {\n name: 'serve',\n description: 'Serve the built site over HTTP. No watch, no live reload.',\n },\n args: {\n config: {\n type: 'string',\n description: 'Path to ovellum.config.{ts,js,json}',\n },\n cwd: {\n type: 'string',\n description: 'Project root (defaults to current directory)',\n },\n port: {\n type: 'string',\n description: `Port to bind (default ${DEFAULT_PORT}; auto-bumps if busy)`,\n },\n host: {\n type: 'string',\n description: `Host to bind (default ${DEFAULT_HOST}; pass 0.0.0.0 to expose on the network)`,\n },\n },\n async run({ args }) {\n const cwd = path.resolve(args.cwd ?? process.cwd());\n let loaded;\n try {\n loaded = await loadOvellumConfig({ cwd, configFile: args.config });\n } catch (err) {\n if (err instanceof ConfigError) {\n process.stderr.write(`config error: ${err.message}\\n`);\n if (err.hint) process.stderr.write(`hint: ${err.hint}\\n`);\n process.exit(3);\n }\n throw err;\n }\n const { config } = loaded;\n\n const outputAbs = path.resolve(cwd, config.output);\n if (!existsSync(outputAbs)) {\n process.stderr.write(\n `output directory does not exist: ${path.relative(cwd, outputAbs)}\\n` +\n `hint: run \\`ovellum build\\` first, or \\`ovellum dev\\` to build + watch + serve.\\n`,\n );\n process.exit(1);\n }\n\n const port = parsePort(args.port) ?? DEFAULT_PORT;\n const host = args.host ?? DEFAULT_HOST;\n\n const server = await startDevServer({\n rootDir: outputAbs,\n port,\n host,\n liveReload: false,\n });\n\n process.stdout.write(\n `ovellum serve\\n` +\n ` serving: ${path.relative(cwd, outputAbs)}/\\n` +\n ` url: ${server.url}\\n` +\n `press Ctrl-C to exit.\\n`,\n );\n\n const shutdown = async (): Promise<void> => {\n process.stdout.write('\\nstopping server…\\n');\n await server.close();\n process.exit(0);\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n await new Promise(() => {});\n },\n});\n\nfunction parsePort(raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const n = Number(raw);\n if (!Number.isInteger(n) || n < 1 || n > 65535) {\n throw new Error(`--port must be an integer between 1 and 65535; got '${raw}'.`);\n }\n return n;\n}\n","import path from 'node:path';\nimport { defineCommand } from 'citty';\nimport { ConfigError, loadOvellumConfig } from '@ovellum/core';\nimport { watchAndBuild } from '../dev/watcher.js';\n\nexport const watchCommand = defineCommand({\n meta: {\n name: 'watch',\n description: 'Build the site, then rebuild on every change under input/.',\n },\n args: {\n config: {\n type: 'string',\n description: 'Path to ovellum.config.{ts,js,json}',\n },\n cwd: {\n type: 'string',\n description: 'Project root (defaults to current directory)',\n },\n },\n async run({ args }) {\n const cwd = path.resolve(args.cwd ?? process.cwd());\n let loaded;\n try {\n loaded = await loadOvellumConfig({ cwd, configFile: args.config });\n } catch (err) {\n if (err instanceof ConfigError) {\n process.stderr.write(`config error: ${err.message}\\n`);\n if (err.hint) process.stderr.write(`hint: ${err.hint}\\n`);\n process.exit(3);\n }\n throw err;\n }\n const { config, configFile } = loaded;\n process.stdout.write(\n `ovellum watch starting from ${configFile ?? '(defaults)'} (mode: ${config.mode})\\n`,\n );\n\n const watcher = await watchAndBuild({ cwd, config, configFile });\n\n const inputAbs = path.resolve(cwd, config.input);\n process.stdout.write(`watching ${path.relative(cwd, inputAbs) || inputAbs} for changes…\\n`);\n process.stdout.write('press Ctrl-C to exit.\\n');\n\n const shutdown = async (): Promise<void> => {\n process.stdout.write('\\nstopping watcher…\\n');\n await watcher.close();\n process.exit(0);\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n await new Promise(() => {});\n },\n});\n"],"mappings":"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","names":["defineCommand","path","input","path","existsSync","mkdir","writeFile","path","path","path","path","input","path","ANCHOR_RE","anchorId","formatYamlScalar","existsSync","mkdir","readFile","readdir","stat","writeFile","path","matter","unified","remarkParse","visit","walk","input","escapeAttr","lastModifiedISO","isMarkdown","input","path","existsSync","mkdir","writeFile","path","existsSync","readFile","readdir","stat","path","defineCommand","matter","defineCommand","path","readFile","matter","existsSync","readdir","stat","ensureTrailingSlash","path","defineCommand","existsSync","readFile","path","url","stat","path","input","path","defineCommand","path","existsSync","mkdir","readFile","writeFile","path","defineCommand","stripTrailingSlash","existsSync","path","defineCommand","DEFAULT_PORT","DEFAULT_HOST","defineCommand","path","existsSync","parsePort","path","defineCommand","defineCommand","path","defineCommand"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/build.ts","../../core/src/types/config.ts","../../core/src/errors.ts","../../core/src/config/define.ts","../../core/src/config/merge.ts","../../core/src/config/validate.ts","../../core/src/config/frontmatter.ts","../../core/src/config/load.ts","../src/dev/run-build.ts","../../parser/src/parse.ts","../../parser/src/anchor.ts","../../parser/src/jsdoc.ts","../../parser/src/extractors.ts","../../generator/src/frontmatter.ts","../../generator/src/path.ts","../../generator/src/templates.ts","../../generator/src/generate.ts","../../reader/src/read.ts","../../reader/src/zones.ts","../../merger/src/anchors.ts","../../merger/src/merge.ts","../../merger/src/orphans.ts","../../site/src/build.ts","../../site/src/markdown.ts","../../site/src/nav.ts","../../site/src/page-meta.ts","../../site/src/search.ts","../../site/src/rss.ts","../../site/src/sitemap.ts","../../site/src/icons.ts","../../site/src/url.ts","../../site/src/template.ts","../../site/src/links.ts","../../../node_modules/.pnpm/ccount@2.0.1/node_modules/ccount/index.js","../../../node_modules/.pnpm/devlop@1.1.0/node_modules/devlop/lib/default.js","../../../node_modules/.pnpm/micromark-util-character@2.1.1/node_modules/micromark-util-character/index.js","../../../node_modules/.pnpm/escape-string-regexp@5.0.0/node_modules/escape-string-regexp/index.js","../../../node_modules/.pnpm/unist-util-is@6.0.1/node_modules/unist-util-is/lib/index.js","../../../node_modules/.pnpm/unist-util-visit-parents@6.0.2/node_modules/unist-util-visit-parents/lib/color.node.js","../../../node_modules/.pnpm/unist-util-visit-parents@6.0.2/node_modules/unist-util-visit-parents/lib/index.js","../../../node_modules/.pnpm/mdast-util-find-and-replace@3.0.2/node_modules/mdast-util-find-and-replace/lib/index.js","../../../node_modules/.pnpm/mdast-util-gfm-autolink-literal@2.0.1/node_modules/mdast-util-gfm-autolink-literal/lib/index.js","../../../node_modules/.pnpm/micromark-util-normalize-identifier@2.0.1/node_modules/micromark-util-normalize-identifier/index.js","../../../node_modules/.pnpm/mdast-util-gfm-footnote@2.1.0/node_modules/mdast-util-gfm-footnote/lib/index.js","../../../node_modules/.pnpm/mdast-util-gfm-strikethrough@2.0.0/node_modules/mdast-util-gfm-strikethrough/lib/index.js","../../../node_modules/.pnpm/markdown-table@3.0.4/node_modules/markdown-table/index.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/blockquote.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/util/pattern-in-scope.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/break.js","../../../node_modules/.pnpm/longest-streak@3.1.0/node_modules/longest-streak/index.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/util/format-code-as-indented.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/util/check-fence.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/code.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/util/check-quote.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/definition.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/util/check-emphasis.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/util/encode-character-reference.js","../../../node_modules/.pnpm/micromark-util-classify-character@2.0.1/node_modules/micromark-util-classify-character/index.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/util/encode-info.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/emphasis.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/util/format-heading-as-setext.js","../../../node_modules/.pnpm/mdast-util-to-string@4.0.0/node_modules/mdast-util-to-string/lib/index.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/heading.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/html.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/image.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/image-reference.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/inline-code.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/util/format-link-as-autolink.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/link.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/link-reference.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/util/check-bullet.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/util/check-bullet-other.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/util/check-bullet-ordered.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/util/check-rule.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/list.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/util/check-list-item-indent.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/list-item.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/paragraph.js","../../../node_modules/.pnpm/mdast-util-phrasing@4.1.0/node_modules/mdast-util-phrasing/lib/index.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/root.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/util/check-strong.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/strong.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/text.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/util/check-rule-repetition.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/thematic-break.js","../../../node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/index.js","../../../node_modules/.pnpm/mdast-util-gfm-table@2.0.0/node_modules/mdast-util-gfm-table/lib/index.js","../../../node_modules/.pnpm/mdast-util-gfm-task-list-item@2.0.0/node_modules/mdast-util-gfm-task-list-item/lib/index.js","../../../node_modules/.pnpm/mdast-util-gfm@3.1.0/node_modules/mdast-util-gfm/lib/index.js","../../../node_modules/.pnpm/micromark-util-chunked@2.0.1/node_modules/micromark-util-chunked/index.js","../../../node_modules/.pnpm/micromark-util-combine-extensions@2.0.1/node_modules/micromark-util-combine-extensions/index.js","../../../node_modules/.pnpm/micromark-extension-gfm-autolink-literal@2.1.0/node_modules/micromark-extension-gfm-autolink-literal/lib/syntax.js","../../../node_modules/.pnpm/micromark-util-resolve-all@2.0.1/node_modules/micromark-util-resolve-all/index.js","../../../node_modules/.pnpm/micromark-factory-space@2.0.1/node_modules/micromark-factory-space/index.js","../../../node_modules/.pnpm/micromark-core-commonmark@2.0.3/node_modules/micromark-core-commonmark/lib/blank-line.js","../../../node_modules/.pnpm/micromark-extension-gfm-footnote@2.1.0/node_modules/micromark-extension-gfm-footnote/lib/syntax.js","../../../node_modules/.pnpm/micromark-extension-gfm-strikethrough@2.1.0/node_modules/micromark-extension-gfm-strikethrough/lib/syntax.js","../../../node_modules/.pnpm/micromark-extension-gfm-table@2.1.1/node_modules/micromark-extension-gfm-table/lib/edit-map.js","../../../node_modules/.pnpm/micromark-extension-gfm-table@2.1.1/node_modules/micromark-extension-gfm-table/lib/infer.js","../../../node_modules/.pnpm/micromark-extension-gfm-table@2.1.1/node_modules/micromark-extension-gfm-table/lib/syntax.js","../../../node_modules/.pnpm/micromark-extension-gfm-task-list-item@2.1.0/node_modules/micromark-extension-gfm-task-list-item/lib/syntax.js","../../../node_modules/.pnpm/micromark-extension-gfm@3.0.0/node_modules/micromark-extension-gfm/index.js","../../../node_modules/.pnpm/remark-gfm@4.0.1/node_modules/remark-gfm/lib/index.js","../src/commands/check.ts","../src/commands/check-utils.ts","../src/commands/dev.ts","../src/dev/server.ts","../src/dev/watcher.ts","../src/commands/init.ts","../src/commands/serve.ts","../src/commands/watch.ts"],"sourcesContent":["import { defineCommand, runMain } from 'citty';\nimport { buildCommand } from './commands/build.js';\nimport { checkCommand } from './commands/check.js';\nimport { devCommand } from './commands/dev.js';\nimport { initCommand } from './commands/init.js';\nimport { serveCommand } from './commands/serve.js';\nimport { watchCommand } from './commands/watch.js';\n\nconst main = defineCommand({\n meta: {\n name: 'ovellum',\n description: 'Ovellum - documentation tool for TypeScript and JavaScript projects.',\n },\n subCommands: {\n init: initCommand,\n build: buildCommand,\n dev: devCommand,\n watch: watchCommand,\n serve: serveCommand,\n check: checkCommand,\n },\n});\n\nvoid runMain(main);\n","import path from 'node:path';\nimport { defineCommand } from 'citty';\nimport { ConfigError, loadOvellumConfig } from '@ovellum/core';\nimport { runBuild, type BuildSummary } from '../dev/run-build.js';\n\nexport const buildCommand = defineCommand({\n meta: {\n name: 'build',\n description: 'Parse source and emit documentation files (or a static site in manual mode).',\n },\n args: {\n config: {\n type: 'string',\n description: 'Path to ovellum.config.{ts,js,json}',\n },\n cwd: {\n type: 'string',\n description: 'Project root (defaults to current directory)',\n },\n },\n async run({ args }) {\n const cwd = path.resolve(args.cwd ?? process.cwd());\n let loaded;\n try {\n loaded = await loadOvellumConfig({ cwd, configFile: args.config });\n } catch (err) {\n if (err instanceof ConfigError) {\n process.stderr.write(`config error: ${err.message}\\n`);\n if (err.hint) process.stderr.write(`hint: ${err.hint}\\n`);\n process.exit(3);\n }\n throw err;\n }\n\n const { config, configFile } = loaded;\n\n if (config.mode !== 'auto' && config.mode !== 'hybrid' && config.mode !== 'manual') {\n process.stderr.write(`'${config.mode}' mode is not recognized.\\n`);\n process.exit(1);\n }\n\n const summary = await runBuild({ config, cwd });\n process.stdout.write(formatBuildSummary(summary, configFile) + '\\n');\n for (const w of summary.warnings) process.stderr.write(`warning: ${w}\\n`);\n },\n});\n\n/**\n * Render a `BuildSummary` as the CLI's stdout block. Exported in case other\n * commands want the same shape (e.g. a future `ovellum status`).\n */\nexport function formatBuildSummary(\n summary: BuildSummary,\n configFile: string | undefined,\n): string {\n const lines = [\n `ovellum build complete in ${summary.elapsedMs}ms`,\n ` config: ${configFile ?? '(defaults)'}`,\n ` mode: ${summary.mode}`,\n ];\n\n if (summary.mode === 'manual') {\n lines.push(\n ` output: ${summary.outputDir}/`,\n ` pages: ${summary.pages?.length ?? 0}`,\n ` warnings: ${summary.warnings.length}`,\n ...(summary.pages ?? []).map((p) => ` → ${p.url} (${p.outputPath})`),\n );\n } else {\n lines.push(\n ` sources: ${summary.sources}`,\n ` written: ${summary.written?.length ?? 0} file(s)`,\n ` merged: ${summary.merged?.length ?? 0} file(s)`,\n ` orphans: ${summary.orphans ?? 0}`,\n ` warnings: ${summary.warnings.length}`,\n ...(summary.written ?? []).map((f) => ` → ${f}`),\n );\n if ((summary.quarantined ?? []).length > 0) {\n lines.push(' quarantined:');\n lines.push(...(summary.quarantined ?? []).map((p) => ` ↪ ${p}`));\n }\n }\n return lines.join('\\n');\n}\n","export type OvellumMode = 'hybrid' | 'manual' | 'auto';\n\nexport type OvellumFormat = 'md' | 'mdx';\n\nexport type OrphanStrategy = 'quarantine' | 'warn';\n\nexport interface ProtectConfig {\n /** Markdown block tag (without `:start`/`:end` suffix). Default: `@manual`. */\n blockTag: string;\n /** JSDoc inline tag. Default: `@preserve`. */\n inlineTag: string;\n orphanStrategy: OrphanStrategy;\n /** Relative path from project root where quarantined orphans are written. */\n orphanDir: string;\n /** Days before orphans are flagged stale by `ovellum orphans --stale`. */\n orphanRetention: number;\n}\n\nexport type OvellumDefaultTheme = 'auto' | 'light' | 'dark';\n\n/**\n * Code-block theme pair (passed to shiki). Each option resolves to a\n * `{ light, dark }` pair so a single build serves both colour schemes\n * via CSS variables. Defaults to `'github'`.\n */\nexport type OvellumCodeTheme = 'github' | 'nord' | 'solarized';\n\nexport type OvellumCtaStyle = 'primary' | 'secondary';\n\nexport interface OvellumLandingCta {\n label: string;\n href: string;\n /** Visual style. Defaults to `'primary'` for the first CTA, `'secondary'` thereafter. */\n style?: OvellumCtaStyle;\n}\n\nexport interface OvellumLandingHeroMedia {\n /**\n * Asset shown by default (and under light theme). Site-relative path or\n * absolute URL. SVG is recommended; the file is referenced via `<img>`\n * so any embedded `<style>`/animations stay self-contained.\n */\n light: string;\n /**\n * Optional dark-theme asset. When set, swapped in via CSS under\n * `[data-theme='dark']`. When unset, `light` is used for both themes.\n */\n dark?: string;\n /** Alt text for assistive tech. Default `''` (decorative). */\n alt?: string;\n}\n\nexport interface OvellumLandingHero {\n /** Defaults to `site.title`. */\n title?: string;\n /** Short tagline rendered under the title. */\n subtitle?: string;\n /** Hero call-to-action buttons. Render in order. */\n ctas: OvellumLandingCta[];\n /**\n * Full-bleed visual rendered behind the title/subtitle/CTA stack. When\n * set, the default dotted-noise + radial-spotlight pseudo-layers are\n * suppressed in favour of the supplied asset(s).\n */\n media?: OvellumLandingHeroMedia;\n}\n\nexport interface OvellumLandingFeature {\n /** Emoji, short string, or raw HTML (e.g. SVG). Rendered as-is. */\n icon?: string;\n title: string;\n description: string;\n}\n\nexport interface OvellumLandingScene {\n /**\n * Default (and light-theme) asset. Site-relative path or absolute URL.\n * Rendered as a full-bleed ambient visual between landing sections.\n */\n light: string;\n /**\n * Optional dark-theme variant. When unset, `light` is used for both themes.\n */\n dark?: string;\n /** Alt text. Default `''` (decorative). */\n alt?: string;\n}\n\nexport interface OvellumLandingTrustItem {\n name: string;\n /** Optional external link. */\n href?: string;\n /** Path (relative to `input/`) to an SVG/PNG passed through as a static asset. */\n image?: string;\n}\n\nexport interface OvellumLandingTrustStrip {\n /** Section label, e.g. `\"Trusted by\"`. */\n label?: string;\n items: OvellumLandingTrustItem[];\n}\n\nexport interface OvellumSiteSearchConfig {\n /** When `true`, Pagefind runs after `ovellum build` and the topbar gains a search box. */\n enabled: boolean;\n}\n\nexport interface OvellumTopbarNavItem {\n /** Visible label. Always rendered (even when `icon` is set) for screen readers. */\n label: string;\n /** Site-relative or external href. */\n href: string;\n /**\n * Optional icon name (one of the registry entries: `github`, `package`,\n * `rss`, `mail`, etc). When set, the desktop topbar renders the icon alone\n * (label kept visually hidden for a11y); the mobile sheet still shows the\n * label beside the icon. When unset, the label is shown as plain text.\n */\n icon?: string;\n /**\n * When `true`, link opens in a new tab with `rel=\"noopener\"` and a small\n * external-link icon is appended. Defaults to `false` (or auto-detected\n * from `href` starting with `http://`/`https://` if you want).\n */\n external?: boolean;\n}\n\nexport interface OvellumFooterNavItem {\n /** Visible label. Always rendered (even when `icon` is set) for screen readers. */\n label: string;\n /** Site-relative or external href. */\n href: string;\n /**\n * Optional icon name (one of the registry entries: `github`, `rss`, `mail`,\n * `package`, etc). When set, the label becomes visually hidden (still\n * accessible) and the icon is rendered alone. When unset, the label is\n * shown as plain text.\n */\n icon?: string;\n /**\n * When `true`, link opens in a new tab with `rel=\"noopener\"`. Auto-detected\n * from `http(s)://` hrefs if omitted.\n */\n external?: boolean;\n}\n\nexport interface OvellumSitePageMetaConfig {\n /** Show \"N min read\" above the article. Default `true`. ~200 wpm. */\n readingTime: boolean;\n /**\n * Show \"Updated YYYY-MM-DD\" above the article. Default `true`. Uses the\n * page's last git-commit time when available, otherwise the filesystem\n * mtime. Falls back to omitting the line if neither is readable.\n */\n lastModified: boolean;\n}\n\nexport interface OvellumLandingConfig {\n /** Render a landing page at `/` instead of the regular doc index. */\n enabled: boolean;\n /**\n * Destination of the top-bar \"Docs\" link. If unset, falls back to the first\n * page in the auto-generated sidebar nav.\n */\n docsHref?: string;\n hero: OvellumLandingHero;\n features: OvellumLandingFeature[];\n /**\n * Ambient \"scene\" visuals interleaved between the rendered landing\n * sections (hero / features / pitch / trust), in order. With three sections\n * after the hero, three scenes fill all three gaps. Extras fall through\n * after the trust strip.\n */\n scenes: OvellumLandingScene[];\n /** Trust strip rendered after the prose body, if any. */\n trustStrip?: OvellumLandingTrustStrip;\n}\n\nexport interface OvellumSiteConfig {\n /** Site title. Defaults to `OvellumConfig.name` or `'Ovellum site'`. */\n title?: string;\n /**\n * Optional version badge rendered next to the brand in the top bar\n * (e.g. `\"v0.2.0\"`). The site has no idea what version of the\n * underlying tool the docs describe — write whatever you want here.\n * Unset = no badge.\n */\n version?: string;\n /** Short description (used in `<meta>` and the footer). */\n description?: string;\n /** Base URL for absolute links / OG cards, e.g. `https://docs.example.com`. */\n baseUrl?: string;\n /**\n * Subpath the site is served from, Jekyll-style. Leading slash, no\n * trailing slash. Example: `\"/ovellum\"` makes the site available at\n * `https://<user>.github.io/ovellum/` — every internal link, asset URL,\n * canonical, and sitemap entry is prefixed with this value. Authors\n * keep writing root-relative links (`/getting-started/`) and the build\n * applies the prefix at render time.\n *\n * Defaults to `\"\"` (no prefix; site is served from the root).\n */\n basePath?: string;\n /** Initial theme before user preference loads. */\n defaultTheme: OvellumDefaultTheme;\n /** Footer text. Empty string disables the footer entirely. */\n footer: string;\n /**\n * Pattern for the \"Edit this page\" link in the page footer. The literal\n * `{path}` is replaced with each page's source path **relative to the\n * build cwd** (`--cwd <dir>`, defaults to `process.cwd()`). When unset\n * the link is not rendered.\n *\n * If you run `ovellum build --cwd website` from a repo root, `{path}`\n * will look like `content/getting-started.md`. Include any prefix you\n * need in the pattern itself:\n *\n * `'https://github.com/owner/repo/edit/main/website/{path}'`.\n */\n editUrlPattern?: string;\n /** Syntax-highlighting theme for fenced code blocks. Default `'github'`. */\n codeTheme: OvellumCodeTheme;\n /** Build-time search indexing via Pagefind. Disabled by default. */\n search: OvellumSiteSearchConfig;\n /** Per-page meta line (reading time + last-modified) above the article. */\n pageMeta: OvellumSitePageMetaConfig;\n /**\n * Right-aligned topbar nav items, rendered to the right of the brand on\n * every page (including the landing). Empty by default. Order is preserved.\n */\n topbarNav: OvellumTopbarNavItem[];\n /**\n * Right-aligned footer nav items (typically social / contact links).\n * Rendered to the right of the `footer` text in the page footer. Empty by\n * default. Order is preserved. Items with `icon` render as icon-only;\n * items without render as plain text.\n */\n footerNav: OvellumFooterNavItem[];\n /** Landing-page settings. Disabled by default. */\n landing: OvellumLandingConfig;\n}\n\nexport interface OvellumConfig {\n /** Defaults to `package.json#name`. */\n name?: string;\n /** `'auto'` reads from `package.json#version`; otherwise a literal version string. */\n version: 'auto' | string;\n mode: OvellumMode;\n /** Source / content directory (TS sources in `auto`/`hybrid`; `.md` content in `manual`). */\n input: string;\n include: string[];\n exclude: string[];\n includeInternal: boolean;\n includePrivate: boolean;\n /** Output directory for generated docs (Markdown for auto/hybrid; HTML for manual). */\n output: string;\n defaultFormat: OvellumFormat;\n protect: ProtectConfig;\n /** Site-builder settings used by `manual` mode. */\n site: OvellumSiteConfig;\n}\n\n/** All fields optional — what users actually write in `ovellum.config.ts`. */\nexport type OvellumUserConfig = Partial<Omit<OvellumConfig, 'protect' | 'site'>> & {\n protect?: Partial<ProtectConfig>;\n site?: Partial<OvellumSiteConfig>;\n};\n\nexport const DEFAULT_CONFIG: OvellumConfig = {\n version: 'auto',\n mode: 'hybrid',\n input: './src',\n include: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],\n exclude: ['node_modules', 'dist', '**/*.test.*', '**/*.spec.*', '**/*.d.ts'],\n includeInternal: false,\n includePrivate: false,\n output: './docs',\n defaultFormat: 'md',\n protect: {\n blockTag: '@manual',\n inlineTag: '@preserve',\n orphanStrategy: 'quarantine',\n orphanDir: '.ovellum/orphans',\n orphanRetention: 90,\n },\n site: {\n defaultTheme: 'auto',\n codeTheme: 'github',\n footer: 'Built with Ovellum',\n search: { enabled: false },\n pageMeta: { readingTime: true, lastModified: true },\n topbarNav: [],\n footerNav: [],\n landing: {\n enabled: false,\n hero: { ctas: [] },\n features: [],\n scenes: [],\n },\n },\n};\n\n/** Frontmatter override block: `ovellum: { mode: 'manual' }`. */\nexport interface OvellumFrontmatterOverride {\n mode?: OvellumMode;\n defaultFormat?: OvellumFormat;\n}\n","export interface OvellumErrorOptions {\n /** Short machine-readable code, e.g. `INVALID_CONFIG`. */\n code: string;\n /** Optional hint to surface in the CLI alongside the message. */\n hint?: string;\n /** Optional underlying cause. */\n cause?: unknown;\n}\n\nexport class OvellumError extends Error {\n readonly code: string;\n readonly hint?: string;\n\n constructor(message: string, options: OvellumErrorOptions) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = 'OvellumError';\n this.code = options.code;\n this.hint = options.hint;\n }\n}\n\nexport class ConfigError extends OvellumError {\n constructor(message: string, options?: { hint?: string; cause?: unknown }) {\n super(message, { code: 'INVALID_CONFIG', hint: options?.hint, cause: options?.cause });\n this.name = 'ConfigError';\n }\n}\n","import type { OvellumUserConfig } from '../types/config.js';\n\n/**\n * Identity helper that gives users type-safe autocomplete in `ovellum.config.ts`.\n * Accepts a partial config; all defaults are applied during load.\n */\nexport function defineConfig(config: OvellumUserConfig): OvellumUserConfig {\n return config;\n}\n","import type {\n OvellumConfig,\n OvellumLandingConfig,\n OvellumSiteConfig,\n OvellumUserConfig,\n ProtectConfig,\n} from '../types/config.js';\n\n/**\n * Shallow merge a user override onto a resolved config. Arrays are replaced\n * wholesale (no concat); the nested `protect`, `site`, `site.landing`, and\n * `site.landing.hero` objects are merged field-by-field. Child wins on every\n * conflict.\n */\nexport function mergeConfig(base: OvellumConfig, override: OvellumUserConfig): OvellumConfig {\n const merged: OvellumConfig = { ...base };\n for (const key of Object.keys(override) as Array<keyof OvellumUserConfig>) {\n const value = override[key];\n if (value === undefined) continue;\n if (key === 'protect') {\n merged.protect = { ...base.protect, ...(value as Partial<ProtectConfig>) };\n continue;\n }\n if (key === 'site') {\n merged.site = mergeSite(base.site, value as Partial<OvellumSiteConfig>);\n continue;\n }\n (merged as unknown as Record<string, unknown>)[key] = value;\n }\n return merged;\n}\n\nfunction mergeSite(\n base: OvellumSiteConfig,\n override: Partial<OvellumSiteConfig>,\n): OvellumSiteConfig {\n const out: OvellumSiteConfig = { ...base, ...override };\n if (override.landing !== undefined) {\n out.landing = mergeLanding(base.landing, override.landing as Partial<OvellumLandingConfig>);\n }\n if (override.search !== undefined) {\n out.search = { ...base.search, ...override.search };\n }\n if (override.pageMeta !== undefined) {\n out.pageMeta = { ...base.pageMeta, ...override.pageMeta };\n }\n return out;\n}\n\nfunction mergeLanding(\n base: OvellumLandingConfig,\n override: Partial<OvellumLandingConfig>,\n): OvellumLandingConfig {\n const out: OvellumLandingConfig = { ...base, ...override };\n if (override.hero !== undefined) {\n out.hero = { ...base.hero, ...override.hero };\n }\n // `features` and `trustStrip` follow the array-wholesale-replacement rule;\n // nothing extra to do here.\n return out;\n}\n","import { ConfigError } from '../errors.js';\nimport type { OvellumUserConfig } from '../types/config.js';\n\nconst MODES = ['hybrid', 'manual', 'auto'] as const;\nconst FORMATS = ['md', 'mdx'] as const;\nconst ORPHAN_STRATEGIES = ['quarantine', 'warn'] as const;\nconst THEMES = ['auto', 'light', 'dark'] as const;\nconst CODE_THEMES = ['github', 'nord', 'solarized'] as const;\nconst CTA_STYLES = ['primary', 'secondary'] as const;\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((v) => typeof v === 'string');\n}\n\n/**\n * Validate a user-supplied config (post-parse, pre-merge). Throws `ConfigError`\n * with a path-qualified message on the first invalid field encountered.\n */\nexport function validateUserConfig(input: unknown): OvellumUserConfig {\n if (!isPlainObject(input)) {\n throw new ConfigError('Config must be an object.', {\n hint: 'Export a plain object from ovellum.config.ts (use defineConfig({ ... })).',\n });\n }\n\n const c = input;\n\n if (c.name !== undefined && typeof c.name !== 'string') {\n throw new ConfigError('`name` must be a string.');\n }\n if (c.version !== undefined && typeof c.version !== 'string') {\n throw new ConfigError(\"`version` must be a string (e.g. '1.0.0' or 'auto').\");\n }\n if (c.mode !== undefined && !MODES.includes(c.mode as (typeof MODES)[number])) {\n throw new ConfigError(`\\`mode\\` must be one of: ${MODES.join(', ')}.`);\n }\n if (c.input !== undefined && typeof c.input !== 'string') {\n throw new ConfigError('`input` must be a string path.');\n }\n if (c.output !== undefined && typeof c.output !== 'string') {\n throw new ConfigError('`output` must be a string path.');\n }\n if (c.include !== undefined && !isStringArray(c.include)) {\n throw new ConfigError('`include` must be an array of glob strings.');\n }\n if (c.exclude !== undefined && !isStringArray(c.exclude)) {\n throw new ConfigError('`exclude` must be an array of glob strings.');\n }\n if (c.includeInternal !== undefined && typeof c.includeInternal !== 'boolean') {\n throw new ConfigError('`includeInternal` must be a boolean.');\n }\n if (c.includePrivate !== undefined && typeof c.includePrivate !== 'boolean') {\n throw new ConfigError('`includePrivate` must be a boolean.');\n }\n if (\n c.defaultFormat !== undefined &&\n !FORMATS.includes(c.defaultFormat as (typeof FORMATS)[number])\n ) {\n throw new ConfigError(`\\`defaultFormat\\` must be one of: ${FORMATS.join(', ')}.`);\n }\n\n if (c.protect !== undefined) {\n if (!isPlainObject(c.protect)) {\n throw new ConfigError('`protect` must be an object.');\n }\n const p = c.protect;\n if (p.blockTag !== undefined && typeof p.blockTag !== 'string') {\n throw new ConfigError('`protect.blockTag` must be a string.');\n }\n if (p.inlineTag !== undefined && typeof p.inlineTag !== 'string') {\n throw new ConfigError('`protect.inlineTag` must be a string.');\n }\n if (\n p.orphanStrategy !== undefined &&\n !ORPHAN_STRATEGIES.includes(p.orphanStrategy as (typeof ORPHAN_STRATEGIES)[number])\n ) {\n throw new ConfigError(\n `\\`protect.orphanStrategy\\` must be one of: ${ORPHAN_STRATEGIES.join(', ')}.`,\n );\n }\n if (p.orphanDir !== undefined && typeof p.orphanDir !== 'string') {\n throw new ConfigError('`protect.orphanDir` must be a string path.');\n }\n if (p.orphanRetention !== undefined) {\n if (typeof p.orphanRetention !== 'number' || !Number.isFinite(p.orphanRetention)) {\n throw new ConfigError('`protect.orphanRetention` must be a finite number of days.');\n }\n if (p.orphanRetention < 0) {\n throw new ConfigError('`protect.orphanRetention` must be >= 0.');\n }\n }\n }\n\n if (c.site !== undefined) {\n if (!isPlainObject(c.site)) {\n throw new ConfigError('`site` must be an object.');\n }\n const s = c.site;\n if (s.title !== undefined && typeof s.title !== 'string') {\n throw new ConfigError('`site.title` must be a string.');\n }\n if (s.description !== undefined && typeof s.description !== 'string') {\n throw new ConfigError('`site.description` must be a string.');\n }\n if (s.baseUrl !== undefined && typeof s.baseUrl !== 'string') {\n throw new ConfigError('`site.baseUrl` must be a string URL.');\n }\n if (s.basePath !== undefined) {\n if (typeof s.basePath !== 'string') {\n throw new ConfigError('`site.basePath` must be a string path.');\n }\n if (s.basePath !== '' && !s.basePath.startsWith('/')) {\n throw new ConfigError(\n '`site.basePath` must start with `/` (e.g. `/ovellum`) or be the empty string.',\n { hint: 'Strip the protocol+host; that belongs in `site.baseUrl`.' },\n );\n }\n }\n if (s.footer !== undefined && typeof s.footer !== 'string') {\n throw new ConfigError('`site.footer` must be a string.');\n }\n if (s.editUrlPattern !== undefined && typeof s.editUrlPattern !== 'string') {\n throw new ConfigError('`site.editUrlPattern` must be a string URL template.');\n }\n if (\n s.defaultTheme !== undefined &&\n !THEMES.includes(s.defaultTheme as (typeof THEMES)[number])\n ) {\n throw new ConfigError(`\\`site.defaultTheme\\` must be one of: ${THEMES.join(', ')}.`);\n }\n if (\n s.codeTheme !== undefined &&\n !CODE_THEMES.includes(s.codeTheme as (typeof CODE_THEMES)[number])\n ) {\n throw new ConfigError(`\\`site.codeTheme\\` must be one of: ${CODE_THEMES.join(', ')}.`);\n }\n if (s.search !== undefined) {\n if (!isPlainObject(s.search)) {\n throw new ConfigError('`site.search` must be an object.');\n }\n if (s.search.enabled !== undefined && typeof s.search.enabled !== 'boolean') {\n throw new ConfigError('`site.search.enabled` must be a boolean.');\n }\n }\n if (s.topbarNav !== undefined) {\n if (!Array.isArray(s.topbarNav)) {\n throw new ConfigError('`site.topbarNav` must be an array.');\n }\n s.topbarNav.forEach((item, i) => {\n const path = `site.topbarNav[${i}]`;\n if (!isPlainObject(item)) throw new ConfigError(`\\`${path}\\` must be an object.`);\n if (typeof item.label !== 'string') {\n throw new ConfigError(`\\`${path}.label\\` must be a string.`);\n }\n if (typeof item.href !== 'string') {\n throw new ConfigError(`\\`${path}.href\\` must be a string.`);\n }\n if (item.icon !== undefined && typeof item.icon !== 'string') {\n throw new ConfigError(`\\`${path}.icon\\` must be a string.`);\n }\n if (item.external !== undefined && typeof item.external !== 'boolean') {\n throw new ConfigError(`\\`${path}.external\\` must be a boolean.`);\n }\n });\n }\n if (s.version !== undefined && typeof s.version !== 'string') {\n throw new ConfigError('`site.version` must be a string when set.');\n }\n if (s.footerNav !== undefined) {\n if (!Array.isArray(s.footerNav)) {\n throw new ConfigError('`site.footerNav` must be an array.');\n }\n s.footerNav.forEach((item, i) => {\n const path = `site.footerNav[${i}]`;\n if (!isPlainObject(item)) throw new ConfigError(`\\`${path}\\` must be an object.`);\n if (typeof item.label !== 'string') {\n throw new ConfigError(`\\`${path}.label\\` must be a string.`);\n }\n if (typeof item.href !== 'string') {\n throw new ConfigError(`\\`${path}.href\\` must be a string.`);\n }\n if (item.icon !== undefined && typeof item.icon !== 'string') {\n throw new ConfigError(`\\`${path}.icon\\` must be a string.`);\n }\n if (item.external !== undefined && typeof item.external !== 'boolean') {\n throw new ConfigError(`\\`${path}.external\\` must be a boolean.`);\n }\n });\n }\n if (s.pageMeta !== undefined) {\n if (!isPlainObject(s.pageMeta)) {\n throw new ConfigError('`site.pageMeta` must be an object.');\n }\n if (s.pageMeta.readingTime !== undefined && typeof s.pageMeta.readingTime !== 'boolean') {\n throw new ConfigError('`site.pageMeta.readingTime` must be a boolean.');\n }\n if (s.pageMeta.lastModified !== undefined && typeof s.pageMeta.lastModified !== 'boolean') {\n throw new ConfigError('`site.pageMeta.lastModified` must be a boolean.');\n }\n }\n if (s.landing !== undefined) validateLanding(s.landing);\n }\n\n return c as OvellumUserConfig;\n}\n\nfunction validateLanding(value: unknown): void {\n if (!isPlainObject(value)) {\n throw new ConfigError('`site.landing` must be an object.');\n }\n const l = value;\n if (l.enabled !== undefined && typeof l.enabled !== 'boolean') {\n throw new ConfigError('`site.landing.enabled` must be a boolean.');\n }\n if (l.docsHref !== undefined && typeof l.docsHref !== 'string') {\n throw new ConfigError('`site.landing.docsHref` must be a string URL or path.');\n }\n if (l.hero !== undefined) {\n if (!isPlainObject(l.hero)) {\n throw new ConfigError('`site.landing.hero` must be an object.');\n }\n const h = l.hero;\n if (h.title !== undefined && typeof h.title !== 'string') {\n throw new ConfigError('`site.landing.hero.title` must be a string.');\n }\n if (h.subtitle !== undefined && typeof h.subtitle !== 'string') {\n throw new ConfigError('`site.landing.hero.subtitle` must be a string.');\n }\n if (h.ctas !== undefined) {\n if (!Array.isArray(h.ctas)) {\n throw new ConfigError('`site.landing.hero.ctas` must be an array.');\n }\n h.ctas.forEach((cta, i) => validateCta(cta, `site.landing.hero.ctas[${i}]`));\n }\n if (h.media !== undefined) validateHeroMedia(h.media);\n }\n if (l.features !== undefined) {\n if (!Array.isArray(l.features)) {\n throw new ConfigError('`site.landing.features` must be an array.');\n }\n l.features.forEach((f, i) => validateFeature(f, `site.landing.features[${i}]`));\n }\n if (l.scenes !== undefined) {\n if (!Array.isArray(l.scenes)) {\n throw new ConfigError('`site.landing.scenes` must be an array.');\n }\n l.scenes.forEach((s, i) => validateScene(s, `site.landing.scenes[${i}]`));\n }\n if (l.trustStrip !== undefined) {\n if (!isPlainObject(l.trustStrip)) {\n throw new ConfigError('`site.landing.trustStrip` must be an object.');\n }\n const ts = l.trustStrip;\n if (ts.label !== undefined && typeof ts.label !== 'string') {\n throw new ConfigError('`site.landing.trustStrip.label` must be a string.');\n }\n if (ts.items !== undefined) {\n if (!Array.isArray(ts.items)) {\n throw new ConfigError('`site.landing.trustStrip.items` must be an array.');\n }\n ts.items.forEach((it, i) => validateTrustItem(it, `site.landing.trustStrip.items[${i}]`));\n }\n }\n}\n\nfunction validateHeroMedia(value: unknown): void {\n if (!isPlainObject(value)) {\n throw new ConfigError('`site.landing.hero.media` must be an object.');\n }\n const m = value;\n if (typeof m.light !== 'string' || m.light.length === 0) {\n throw new ConfigError('`site.landing.hero.media.light` must be a non-empty string path.');\n }\n if (m.dark !== undefined && typeof m.dark !== 'string') {\n throw new ConfigError('`site.landing.hero.media.dark` must be a string path.');\n }\n if (m.alt !== undefined && typeof m.alt !== 'string') {\n throw new ConfigError('`site.landing.hero.media.alt` must be a string.');\n }\n}\n\nfunction validateCta(value: unknown, path: string): void {\n if (!isPlainObject(value)) throw new ConfigError(`\\`${path}\\` must be an object.`);\n const c = value;\n if (typeof c.label !== 'string') throw new ConfigError(`\\`${path}.label\\` must be a string.`);\n if (typeof c.href !== 'string') throw new ConfigError(`\\`${path}.href\\` must be a string.`);\n if (c.style !== undefined && !CTA_STYLES.includes(c.style as (typeof CTA_STYLES)[number])) {\n throw new ConfigError(`\\`${path}.style\\` must be one of: ${CTA_STYLES.join(', ')}.`);\n }\n}\n\nfunction validateFeature(value: unknown, path: string): void {\n if (!isPlainObject(value)) throw new ConfigError(`\\`${path}\\` must be an object.`);\n const f = value;\n if (typeof f.title !== 'string') throw new ConfigError(`\\`${path}.title\\` must be a string.`);\n if (typeof f.description !== 'string') {\n throw new ConfigError(`\\`${path}.description\\` must be a string.`);\n }\n if (f.icon !== undefined && typeof f.icon !== 'string') {\n throw new ConfigError(`\\`${path}.icon\\` must be a string.`);\n }\n}\n\nfunction validateScene(value: unknown, path: string): void {\n if (!isPlainObject(value)) throw new ConfigError(`\\`${path}\\` must be an object.`);\n const s = value;\n if (typeof s.light !== 'string' || s.light.length === 0) {\n throw new ConfigError(`\\`${path}.light\\` must be a non-empty string path.`);\n }\n if (s.dark !== undefined && typeof s.dark !== 'string') {\n throw new ConfigError(`\\`${path}.dark\\` must be a string path.`);\n }\n if (s.alt !== undefined && typeof s.alt !== 'string') {\n throw new ConfigError(`\\`${path}.alt\\` must be a string.`);\n }\n}\n\nfunction validateTrustItem(value: unknown, path: string): void {\n if (!isPlainObject(value)) throw new ConfigError(`\\`${path}\\` must be an object.`);\n const t = value;\n if (typeof t.name !== 'string') throw new ConfigError(`\\`${path}.name\\` must be a string.`);\n if (t.href !== undefined && typeof t.href !== 'string') {\n throw new ConfigError(`\\`${path}.href\\` must be a string.`);\n }\n if (t.image !== undefined && typeof t.image !== 'string') {\n throw new ConfigError(`\\`${path}.image\\` must be a string path.`);\n }\n}\n","import { ConfigError } from '../errors.js';\nimport type { OvellumFrontmatterOverride, OvellumMode, OvellumFormat } from '../types/config.js';\n\nconst MODES: readonly OvellumMode[] = ['hybrid', 'manual', 'auto'];\nconst FORMATS: readonly OvellumFormat[] = ['md', 'mdx'];\n\n/**\n * Extract and validate the `ovellum:` block from parsed frontmatter. Returns\n * an empty object when no override is present. Throws on invalid shape.\n */\nexport function parseFrontmatterOverride(\n frontmatter: Record<string, unknown> | undefined,\n): OvellumFrontmatterOverride {\n if (!frontmatter || frontmatter.ovellum === undefined) return {};\n const block = frontmatter.ovellum;\n if (typeof block === 'boolean') {\n // `ovellum: true` is the marker for auto-generated files. Not a config override.\n return {};\n }\n if (typeof block !== 'object' || block === null || Array.isArray(block)) {\n throw new ConfigError(\n \"Frontmatter `ovellum:` must be an object (e.g. `ovellum: { mode: 'manual' }`).\",\n );\n }\n const out: OvellumFrontmatterOverride = {};\n const b = block as Record<string, unknown>;\n if (b.mode !== undefined) {\n if (!MODES.includes(b.mode as OvellumMode)) {\n throw new ConfigError(`Frontmatter \\`ovellum.mode\\` must be one of: ${MODES.join(', ')}.`);\n }\n out.mode = b.mode as OvellumMode;\n }\n if (b.defaultFormat !== undefined) {\n if (!FORMATS.includes(b.defaultFormat as OvellumFormat)) {\n throw new ConfigError(\n `Frontmatter \\`ovellum.defaultFormat\\` must be one of: ${FORMATS.join(', ')}.`,\n );\n }\n out.defaultFormat = b.defaultFormat as OvellumFormat;\n }\n return out;\n}\n","import path from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { loadConfig as c12LoadConfig } from 'c12';\nimport { ConfigError } from '../errors.js';\nimport { DEFAULT_CONFIG } from '../types/config.js';\nimport type { OvellumConfig, OvellumUserConfig } from '../types/config.js';\nimport { mergeConfig } from './merge.js';\nimport { validateUserConfig } from './validate.js';\n\nexport interface LoadOvellumConfigOptions {\n /** Project root. Defaults to `process.cwd()`. */\n cwd?: string;\n /** Override config file name (sans extension). Defaults to `ovellum`. */\n name?: string;\n /** Explicit path to a config file. Overrides discovery. */\n configFile?: string;\n}\n\nexport interface LoadedOvellumConfig {\n config: OvellumConfig;\n /** Absolute path of the loaded config file, or `undefined` if defaults only. */\n configFile?: string;\n /** Resolved project root. */\n cwd: string;\n}\n\nconst CONFIG_EXTENSIONS = ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs', 'json'] as const;\n\n/**\n * Load the root `ovellum.config.*` from `cwd`, validate it, and merge it onto\n * built-in defaults. Returns defaults alone when no config file is present.\n */\nexport async function loadOvellumConfig(\n options: LoadOvellumConfigOptions = {},\n): Promise<LoadedOvellumConfig> {\n const cwd = path.resolve(options.cwd ?? process.cwd());\n const name = options.name ?? 'ovellum';\n\n let raw: unknown;\n let configFile: string | undefined;\n\n try {\n const result = await c12LoadConfig<OvellumUserConfig>({\n cwd,\n name,\n configFile: options.configFile,\n // We apply our own defaults after validation so users see clean errors\n // pointing only at their own fields.\n defaults: {},\n });\n raw = result.config ?? {};\n // c12 returns the bare name (e.g. \"ovellum.config\") even when no file\n // matched, so only treat it as a real file when it points at an existing\n // absolute path.\n const resolved = result.configFile\n ? path.isAbsolute(result.configFile)\n ? result.configFile\n : undefined\n : undefined;\n configFile = resolved && existsSync(resolved) ? resolved : undefined;\n } catch (err) {\n throw new ConfigError('Failed to load ovellum config.', { cause: err });\n }\n\n const userConfig = validateUserConfig(raw);\n const config = mergeConfig(DEFAULT_CONFIG, userConfig);\n return { config, configFile, cwd };\n}\n\n/**\n * Find the deepest `ovellum.config.*` between `cwd` and `targetDir` (inclusive\n * of `targetDir`, exclusive of `cwd`'s parent) and merge it onto `rootConfig`.\n * Returns `rootConfig` unchanged if no nested config is present.\n *\n * Per-directory configs are loaded synchronously via `import()` is overkill —\n * for Phase 1 we only support `.json`, `.js`, `.mjs`, `.cjs` here; `.ts`\n * support requires going through `c12` again. We defer the `.ts` path to a\n * follow-up since the parser pipeline will normally call this on every source\n * file and re-running c12 per directory would be expensive.\n */\nexport async function loadDirectoryOverride(\n rootCwd: string,\n targetDir: string,\n rootConfig: OvellumConfig,\n options: { name?: string } = {},\n): Promise<OvellumConfig> {\n const name = options.name ?? 'ovellum';\n const root = path.resolve(rootCwd);\n let dir = path.resolve(targetDir);\n\n if (!dir.startsWith(root)) {\n throw new ConfigError(`targetDir (${targetDir}) is outside the project root (${rootCwd}).`, {\n hint: 'Per-directory overrides must live within the project root.',\n });\n }\n\n const overrideChain: string[] = [];\n while (dir !== root) {\n const found = findConfigFile(dir, name);\n if (found) overrideChain.unshift(found);\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n if (overrideChain.length === 0) return rootConfig;\n\n let merged = rootConfig;\n for (const file of overrideChain) {\n const raw = await c12LoadConfig<OvellumUserConfig>({\n cwd: path.dirname(file),\n configFile: file,\n name,\n defaults: {},\n });\n const validated = validateUserConfig(raw.config ?? {});\n merged = mergeConfig(merged, validated);\n }\n return merged;\n}\n\nfunction findConfigFile(dir: string, name: string): string | undefined {\n for (const ext of CONFIG_EXTENSIONS) {\n const candidate = path.join(dir, `${name}.config.${ext}`);\n if (existsSync(candidate)) return candidate;\n }\n return undefined;\n}\n","import { existsSync } from 'node:fs';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { OrphanRecord, OvellumConfig, OvellumMode } from '@ovellum/core';\nimport { parseProject } from '@ovellum/parser';\nimport { generateDocs } from '@ovellum/generator';\nimport { readManualDoc } from '@ovellum/reader';\nimport { merge, writeOrphan } from '@ovellum/merger';\nimport { buildSite, type PageOutput } from '@ovellum/site';\n\nexport interface RunBuildInput {\n config: OvellumConfig;\n cwd: string;\n}\n\n/**\n * Shape returned by `runBuild` regardless of mode. Some fields are mode-\n * specific (manual gets `pages` + `outputDir`; auto/hybrid get `written`,\n * `merged`, `orphans`, `quarantined`). Both arms always populate `warnings`\n * and `elapsedMs` so callers can log uniformly.\n */\nexport interface BuildSummary {\n mode: OvellumMode;\n elapsedMs: number;\n warnings: string[];\n\n // Manual-mode fields\n outputDir?: string;\n pages?: PageOutput[];\n landingRendered?: boolean;\n\n // Auto / hybrid fields\n sources?: number;\n written?: string[];\n merged?: string[];\n orphans?: number;\n quarantined?: string[];\n}\n\n/**\n * Run an Ovellum build dispatched by `config.mode`. Shared between\n * `ovellum build` (one-shot) and the watcher used by `ovellum watch` /\n * `ovellum dev` (rebuilds on file changes).\n */\nexport async function runBuild(input: RunBuildInput): Promise<BuildSummary> {\n const { config, cwd } = input;\n const startedAt = Date.now();\n\n if (config.mode === 'manual') {\n const result = await buildSite({ config, cwd });\n return {\n mode: 'manual',\n elapsedMs: Date.now() - startedAt,\n warnings: result.warnings,\n outputDir: result.outputDir,\n pages: result.pages,\n landingRendered: result.landingRendered,\n };\n }\n\n // auto / hybrid\n const project = parseProject({ config, cwd });\n const { files, warnings } = generateDocs(project, config);\n\n const orphanRecords: OrphanRecord[] = [];\n const mergedFiles: string[] = [];\n\n for (const [relOut, generatedBody] of files) {\n const abs = path.resolve(cwd, relOut);\n let finalBody = generatedBody;\n\n if (config.mode === 'hybrid' && existsSync(abs)) {\n const manualDoc = await readManualDoc(abs);\n warnings.push(...manualDoc.warnings);\n if (manualDoc.protectedBlocks.length > 0) {\n const result = merge(generatedBody, manualDoc, { sourceFile: relOut });\n finalBody = result.content;\n orphanRecords.push(...result.orphans);\n warnings.push(...result.warnings);\n mergedFiles.push(relOut);\n }\n }\n\n await mkdir(path.dirname(abs), { recursive: true });\n await writeFile(abs, finalBody, 'utf8');\n }\n\n const quarantined: string[] = [];\n if (orphanRecords.length > 0) {\n const orphanDir = path.resolve(cwd, config.protect.orphanDir);\n for (const record of orphanRecords) {\n const archivePath = await writeOrphan(record, orphanDir);\n quarantined.push(path.relative(cwd, archivePath));\n }\n }\n\n return {\n mode: config.mode,\n elapsedMs: Date.now() - startedAt,\n warnings,\n sources: project.files.length,\n written: Array.from(files.keys()),\n merged: mergedFiles,\n orphans: orphanRecords.length,\n quarantined,\n };\n}\n","import path from 'node:path';\nimport { Project, ScriptTarget, ModuleKind } from 'ts-morph';\nimport type { DocFile, DocProject, OvellumConfig } from '@ovellum/core';\nimport { extractFromFile } from './extractors.js';\nimport { extractJsDoc } from './jsdoc.js';\nimport { anchorId, MODULE_SYMBOL } from './anchor.js';\n\nexport interface ParseOptions {\n config: OvellumConfig;\n /** Project root - paths in `config.input`, `include`, `exclude` resolve from here. */\n cwd: string;\n /** Project name for the output IR; defaults to `config.name` or `'project'`. */\n projectName?: string;\n /** Project version for the output IR; defaults to `'0.0.0'` (resolved upstream when 'auto'). */\n projectVersion?: string;\n}\n\n/**\n * Parse a TypeScript/JavaScript project into the Ovellum IR.\n *\n * Implemented as of Phase 2 (slice): functions, classes (methods+props), interfaces, type\n * aliases, enums. Overloads, namespaces, re-exports, and `declare module` are not yet\n * supported - they'll either be skipped or partially captured. See TODO.md Phase 2.\n */\nexport function parseProject(options: ParseOptions): DocProject {\n const { config, cwd } = options;\n const absInput = path.resolve(cwd, config.input);\n\n const project = new Project({\n compilerOptions: {\n allowJs: true,\n target: ScriptTarget.ESNext,\n module: ModuleKind.ESNext,\n strict: false,\n skipLibCheck: true,\n },\n skipAddingFilesFromTsConfig: true,\n useInMemoryFileSystem: false,\n });\n\n const patterns = [\n ...config.include.map((g) => toPosix(path.join(absInput, g))),\n ...config.exclude.map((g) => '!' + toPosix(path.join(absInput, g))),\n ];\n project.addSourceFilesAtPaths(patterns);\n\n const files: DocFile[] = [];\n for (const sf of project.getSourceFiles()) {\n const abs = sf.getFilePath();\n const rel = toPosix(path.relative(cwd, abs));\n const moduleDoc = readModuleJsDoc(sf);\n const nodes = extractFromFile(sf, { relPath: rel, config });\n if (nodes.length === 0 && !moduleDoc.description && !moduleDoc.moduleName) continue;\n\n const docFile: DocFile = { filePath: rel, nodes };\n if (moduleDoc.moduleName) docFile.moduleName = moduleDoc.moduleName;\n if (moduleDoc.description) docFile.description = moduleDoc.description;\n files.push(docFile);\n }\n\n // Sort files for deterministic output ordering.\n files.sort((a, b) => a.filePath.localeCompare(b.filePath));\n\n return {\n name: options.projectName ?? config.name ?? 'project',\n version: options.projectVersion ?? '0.0.0',\n files,\n generatedAt: new Date().toISOString(),\n };\n}\n\nfunction readModuleJsDoc(sf: import('ts-morph').SourceFile): {\n description?: string;\n moduleName?: string;\n} {\n // Look for a JSDoc block at the top of the file. ts-morph attaches leading\n // JSDoc to the first statement; we accept it as \"module-level\" if it carries\n // `@module` or if the file has no other JSDoc-bearing top-level statements\n // above the first statement's actual code.\n const first = sf.getStatements()[0];\n if (!first) return {};\n const docable = first as unknown as { getJsDocs?: () => unknown[] };\n if (typeof docable.getJsDocs !== 'function') return {};\n const info = extractJsDoc(first as unknown as Parameters<typeof extractJsDoc>[0]);\n if (info.moduleName !== undefined) {\n return { description: info.description, moduleName: info.moduleName };\n }\n return {};\n}\n\nfunction toPosix(p: string): string {\n return p.replace(/\\\\/g, '/');\n}\n\nexport { anchorId, MODULE_SYMBOL };\n","/** Build a stable anchor ID per DESIGN.md §8.3: `{relativeFilePath}::{symbolPath}`. */\nexport function anchorId(filePath: string, symbolPath: string): string {\n return `${filePath}::${symbolPath}`;\n}\n\nexport const MODULE_SYMBOL = '__module__';\n","import type { JSDocableNode, JSDoc, JSDocTag } from 'ts-morph';\n\nexport interface JsDocInfo {\n description?: string;\n /** Param name → description, from `@param`. */\n paramDescriptions: Record<string, string>;\n returnsDescription?: string;\n examples: string[];\n throws: string[];\n see: string[];\n deprecated?: string;\n since?: string;\n internal: boolean;\n preserved: boolean;\n /** Module-name from `@module`, only meaningful at file scope. */\n moduleName?: string;\n /** Any unrecognized tag → its raw comment text. */\n tags: Record<string, string>;\n}\n\nconst KNOWN_TAGS = new Set([\n 'param',\n 'returns',\n 'return',\n 'throws',\n 'exception',\n 'example',\n 'deprecated',\n 'since',\n 'see',\n 'remarks',\n 'description',\n 'preserve',\n 'internal',\n 'module',\n]);\n\nexport function emptyJsDocInfo(): JsDocInfo {\n return {\n paramDescriptions: {},\n examples: [],\n throws: [],\n see: [],\n internal: false,\n preserved: false,\n tags: {},\n };\n}\n\nexport function extractJsDoc(node: JSDocableNode): JsDocInfo {\n const blocks = node.getJsDocs();\n if (blocks.length === 0) return emptyJsDocInfo();\n // Use the last JSDoc block (closest to the declaration).\n const block = blocks[blocks.length - 1]!;\n return parseBlock(block);\n}\n\nfunction parseBlock(block: JSDoc): JsDocInfo {\n const out = emptyJsDocInfo();\n const desc = block.getDescription().trim();\n if (desc) out.description = desc;\n\n for (const tag of block.getTags()) {\n consumeTag(tag, out);\n }\n return out;\n}\n\nfunction consumeTag(tag: JSDocTag, info: JsDocInfo): void {\n const name = tag.getTagName();\n const comment = readComment(tag);\n\n switch (name) {\n case 'param': {\n const paramName = readParamName(tag);\n if (paramName) info.paramDescriptions[paramName] = comment;\n return;\n }\n case 'returns':\n case 'return':\n info.returnsDescription = comment;\n return;\n case 'throws':\n case 'exception':\n if (comment) info.throws.push(comment);\n return;\n case 'example':\n if (comment) info.examples.push(comment);\n return;\n case 'deprecated':\n info.deprecated = comment || 'Deprecated.';\n return;\n case 'since':\n info.since = comment;\n return;\n case 'see':\n if (comment) info.see.push(comment);\n return;\n case 'internal':\n info.internal = true;\n return;\n case 'preserve':\n info.preserved = true;\n return;\n case 'module':\n info.moduleName = comment;\n return;\n case 'remarks':\n case 'description':\n // Merge into description if not already set.\n if (!info.description && comment) info.description = comment;\n return;\n default:\n if (!KNOWN_TAGS.has(name)) info.tags[name] = comment;\n }\n}\n\nfunction readComment(tag: JSDocTag): string {\n const raw = tag.getCommentText();\n // Strip a leading dash separator used by `@param name - description`.\n return (raw ?? '').replace(/^\\s*-\\s*/, '').trim();\n}\n\nfunction readParamName(tag: JSDocTag): string | undefined {\n // Try the typed accessor first; fall back to parsing the raw text.\n const node = tag.compilerNode as { name?: { getText?: () => string } };\n const named = node.name?.getText?.();\n if (named) return named;\n const text = tag.getText();\n const match = text.match(/@param\\s+(?:\\{[^}]*\\}\\s+)?([A-Za-z_$][\\w$]*)/);\n return match ? match[1] : undefined;\n}\n","import type {\n ClassDeclaration,\n EnumDeclaration,\n FunctionDeclaration,\n InterfaceDeclaration,\n MethodDeclaration,\n ParameterDeclaration,\n PropertyDeclaration,\n SourceFile,\n TypeAliasDeclaration,\n} from 'ts-morph';\nimport type { DocNode, DocParam, OvellumConfig } from '@ovellum/core';\nimport { anchorId } from './anchor.js';\nimport { extractJsDoc, type JsDocInfo } from './jsdoc.js';\n\ninterface ExtractorContext {\n relPath: string;\n config: OvellumConfig;\n}\n\nexport function extractFromFile(sf: SourceFile, ctx: ExtractorContext): DocNode[] {\n return [\n ...sf.getFunctions().flatMap((fn) => fromFunction(fn, ctx)),\n ...sf.getClasses().flatMap((cls) => fromClass(cls, ctx)),\n ...sf.getInterfaces().flatMap((iface) => fromInterface(iface, ctx)),\n ...sf.getTypeAliases().flatMap((alias) => fromTypeAlias(alias, ctx)),\n ...sf.getEnums().flatMap((en) => fromEnum(en, ctx)),\n ];\n}\n\nfunction shouldInclude(isExported: boolean, jsdoc: JsDocInfo, ctx: ExtractorContext): boolean {\n if (!isExported && !ctx.config.includeInternal) return false;\n if (jsdoc.internal && !ctx.config.includeInternal) return false;\n return true;\n}\n\nfunction fromFunction(fn: FunctionDeclaration, ctx: ExtractorContext): DocNode[] {\n const name = fn.getName();\n if (!name) return [];\n const jsdoc = extractJsDoc(fn);\n const isExported = fn.isExported();\n if (!shouldInclude(isExported, jsdoc, ctx)) return [];\n\n const params = fn.getParameters().map((p) => paramToDoc(p, jsdoc));\n const returnTypeText = fn.getReturnTypeNode()?.getText() ?? fn.getReturnType().getText(fn);\n\n const signature = buildFunctionSignature({\n name,\n generics: fn.getTypeParameters().map((tp) => tp.getText()),\n params: fn.getParameters().map(paramSignaturePart),\n returnType: returnTypeText,\n isAsync: fn.isAsync(),\n });\n\n const node: DocNode = {\n id: anchorId(ctx.relPath, name),\n kind: 'function',\n name,\n filePath: ctx.relPath,\n line: fn.getStartLineNumber(),\n signature,\n isExported,\n isInternal: jsdoc.internal,\n isPreserved: jsdoc.preserved,\n tags: jsdoc.tags,\n params,\n returns: {\n type: returnTypeText,\n description: jsdoc.returnsDescription,\n },\n };\n attachJsDocFields(node, jsdoc);\n return [node];\n}\n\nfunction fromClass(cls: ClassDeclaration, ctx: ExtractorContext): DocNode[] {\n const name = cls.getName();\n if (!name) return [];\n const jsdoc = extractJsDoc(cls);\n const isExported = cls.isExported();\n if (!shouldInclude(isExported, jsdoc, ctx)) return [];\n\n const heritage: string[] = [];\n const extendsClause = cls.getExtends();\n if (extendsClause) heritage.push(`extends ${extendsClause.getText()}`);\n const implementsClause = cls.getImplements();\n if (implementsClause.length > 0) {\n heritage.push(`implements ${implementsClause.map((i) => i.getText()).join(', ')}`);\n }\n const generics = cls.getTypeParameters().map((tp) => tp.getText());\n const gen = generics.length ? `<${generics.join(', ')}>` : '';\n const signature = `class ${name}${gen}${heritage.length ? ' ' + heritage.join(' ') : ''}`;\n\n const children: DocNode[] = [];\n for (const method of cls.getMethods()) {\n const childNode = fromMethod(method, ctx, name);\n if (childNode) children.push(childNode);\n }\n for (const prop of cls.getProperties()) {\n const childNode = fromProperty(prop, ctx, name);\n if (childNode) children.push(childNode);\n }\n\n const node: DocNode = {\n id: anchorId(ctx.relPath, name),\n kind: 'class',\n name,\n filePath: ctx.relPath,\n line: cls.getStartLineNumber(),\n signature,\n isExported,\n isInternal: jsdoc.internal,\n isPreserved: jsdoc.preserved,\n tags: jsdoc.tags,\n children: children.length ? children : undefined,\n };\n attachJsDocFields(node, jsdoc);\n return [node];\n}\n\nfunction fromMethod(\n method: MethodDeclaration,\n ctx: ExtractorContext,\n className: string,\n): DocNode | undefined {\n const name = method.getName();\n const jsdoc = extractJsDoc(method);\n const isStaticOrPublic =\n !method.hasModifier('private') || ctx.config.includePrivate || ctx.config.includeInternal;\n if (!isStaticOrPublic) return undefined;\n if (jsdoc.internal && !ctx.config.includeInternal) return undefined;\n\n const params = method.getParameters().map((p) => paramToDoc(p, jsdoc));\n const returnTypeText =\n method.getReturnTypeNode()?.getText() ?? method.getReturnType().getText(method);\n const generics = method.getTypeParameters().map((tp) => tp.getText());\n const gen = generics.length ? `<${generics.join(', ')}>` : '';\n const signature = `${name}${gen}(${method.getParameters().map(paramSignaturePart).join(', ')}): ${returnTypeText}`;\n\n const node: DocNode = {\n id: anchorId(ctx.relPath, `${className}.${name}`),\n kind: 'method',\n name,\n filePath: ctx.relPath,\n line: method.getStartLineNumber(),\n signature,\n isExported: true,\n isInternal: jsdoc.internal,\n isPreserved: jsdoc.preserved,\n tags: jsdoc.tags,\n params,\n returns: {\n type: returnTypeText,\n description: jsdoc.returnsDescription,\n },\n };\n attachJsDocFields(node, jsdoc);\n return node;\n}\n\nfunction fromProperty(\n prop: PropertyDeclaration,\n ctx: ExtractorContext,\n className: string,\n): DocNode | undefined {\n const name = prop.getName();\n const jsdoc = extractJsDoc(prop);\n const isPrivate = prop.hasModifier('private');\n if (isPrivate && !ctx.config.includePrivate && !ctx.config.includeInternal) return undefined;\n if (jsdoc.internal && !ctx.config.includeInternal) return undefined;\n\n const typeText = prop.getTypeNode()?.getText() ?? prop.getType().getText(prop);\n const node: DocNode = {\n id: anchorId(ctx.relPath, `${className}.${name}`),\n kind: 'property',\n name,\n filePath: ctx.relPath,\n line: prop.getStartLineNumber(),\n signature: `${name}: ${typeText}`,\n isExported: true,\n isInternal: jsdoc.internal,\n isPreserved: jsdoc.preserved,\n tags: jsdoc.tags,\n };\n attachJsDocFields(node, jsdoc);\n return node;\n}\n\nfunction fromInterface(iface: InterfaceDeclaration, ctx: ExtractorContext): DocNode[] {\n const name = iface.getName();\n const jsdoc = extractJsDoc(iface);\n const isExported = iface.isExported();\n if (!shouldInclude(isExported, jsdoc, ctx)) return [];\n\n const extendsList = iface.getExtends().map((e) => e.getText());\n const generics = iface.getTypeParameters().map((tp) => tp.getText());\n const gen = generics.length ? `<${generics.join(', ')}>` : '';\n const ext = extendsList.length ? ` extends ${extendsList.join(', ')}` : '';\n const signature = `interface ${name}${gen}${ext}`;\n\n const children: DocNode[] = [];\n for (const prop of iface.getProperties()) {\n const propJsdoc = extractJsDoc(prop);\n const propType = prop.getTypeNode()?.getText() ?? prop.getType().getText(prop);\n const optional = prop.hasQuestionToken() ? '?' : '';\n const propName = prop.getName();\n const propNode: DocNode = {\n id: anchorId(ctx.relPath, `${name}.${propName}`),\n kind: 'property',\n name: propName,\n filePath: ctx.relPath,\n line: prop.getStartLineNumber(),\n signature: `${propName}${optional}: ${propType}`,\n isExported: true,\n isInternal: propJsdoc.internal,\n isPreserved: propJsdoc.preserved,\n tags: propJsdoc.tags,\n };\n attachJsDocFields(propNode, propJsdoc);\n children.push(propNode);\n }\n for (const method of iface.getMethods()) {\n const methodJsdoc = extractJsDoc(method);\n const methodName = method.getName();\n const methodParams = method.getParameters().map(paramSignaturePart).join(', ');\n const methodReturn =\n method.getReturnTypeNode()?.getText() ?? method.getReturnType().getText(method);\n const methodNode: DocNode = {\n id: anchorId(ctx.relPath, `${name}.${methodName}`),\n kind: 'method',\n name: methodName,\n filePath: ctx.relPath,\n line: method.getStartLineNumber(),\n signature: `${methodName}(${methodParams}): ${methodReturn}`,\n isExported: true,\n isInternal: methodJsdoc.internal,\n isPreserved: methodJsdoc.preserved,\n tags: methodJsdoc.tags,\n params: method.getParameters().map((p) => paramToDoc(p, methodJsdoc)),\n returns: { type: methodReturn, description: methodJsdoc.returnsDescription },\n };\n attachJsDocFields(methodNode, methodJsdoc);\n children.push(methodNode);\n }\n\n const node: DocNode = {\n id: anchorId(ctx.relPath, name),\n kind: 'interface',\n name,\n filePath: ctx.relPath,\n line: iface.getStartLineNumber(),\n signature,\n isExported,\n isInternal: jsdoc.internal,\n isPreserved: jsdoc.preserved,\n tags: jsdoc.tags,\n children: children.length ? children : undefined,\n };\n attachJsDocFields(node, jsdoc);\n return [node];\n}\n\nfunction fromTypeAlias(alias: TypeAliasDeclaration, ctx: ExtractorContext): DocNode[] {\n const name = alias.getName();\n const jsdoc = extractJsDoc(alias);\n const isExported = alias.isExported();\n if (!shouldInclude(isExported, jsdoc, ctx)) return [];\n\n const generics = alias.getTypeParameters().map((tp) => tp.getText());\n const gen = generics.length ? `<${generics.join(', ')}>` : '';\n const typeText = alias.getTypeNode()?.getText() ?? alias.getType().getText(alias);\n\n const node: DocNode = {\n id: anchorId(ctx.relPath, name),\n kind: 'type',\n name,\n filePath: ctx.relPath,\n line: alias.getStartLineNumber(),\n signature: `type ${name}${gen} = ${typeText}`,\n isExported,\n isInternal: jsdoc.internal,\n isPreserved: jsdoc.preserved,\n tags: jsdoc.tags,\n };\n attachJsDocFields(node, jsdoc);\n return [node];\n}\n\nfunction fromEnum(en: EnumDeclaration, ctx: ExtractorContext): DocNode[] {\n const name = en.getName();\n const jsdoc = extractJsDoc(en);\n const isExported = en.isExported();\n if (!shouldInclude(isExported, jsdoc, ctx)) return [];\n\n const children: DocNode[] = en.getMembers().map((member) => {\n const memberJsdoc = extractJsDoc(member);\n const memberName = member.getName();\n const value = member.getInitializer()?.getText();\n const sigBody = value !== undefined ? `${memberName} = ${value}` : memberName;\n const memberNode: DocNode = {\n id: anchorId(ctx.relPath, `${name}.${memberName}`),\n kind: 'property',\n name: memberName,\n filePath: ctx.relPath,\n line: member.getStartLineNumber(),\n signature: sigBody,\n isExported: true,\n isInternal: memberJsdoc.internal,\n isPreserved: memberJsdoc.preserved,\n tags: memberJsdoc.tags,\n };\n attachJsDocFields(memberNode, memberJsdoc);\n return memberNode;\n });\n\n const node: DocNode = {\n id: anchorId(ctx.relPath, name),\n kind: 'enum',\n name,\n filePath: ctx.relPath,\n line: en.getStartLineNumber(),\n signature: `enum ${name}`,\n isExported,\n isInternal: jsdoc.internal,\n isPreserved: jsdoc.preserved,\n tags: jsdoc.tags,\n children,\n };\n attachJsDocFields(node, jsdoc);\n return [node];\n}\n\nfunction paramSignaturePart(p: ParameterDeclaration): string {\n const name = p.getName();\n const type = paramTypeText(p);\n const optional = p.hasQuestionToken() ? '?' : '';\n const rest = p.isRestParameter() ? '...' : '';\n const init = p.getInitializer()?.getText();\n return init\n ? `${rest}${name}${optional}: ${type} = ${init}`\n : `${rest}${name}${optional}: ${type}`;\n}\n\nfunction paramTypeText(p: ParameterDeclaration): string {\n return p.getTypeNode()?.getText() ?? p.getType().getText(p);\n}\n\nfunction paramToDoc(p: ParameterDeclaration, jsdoc: JsDocInfo): DocParam {\n const name = p.getName();\n const defaultValue = p.getInitializer()?.getText();\n const description = jsdoc.paramDescriptions[name];\n const out: DocParam = {\n name,\n type: paramTypeText(p),\n optional: p.hasQuestionToken() || p.isRestParameter() || defaultValue !== undefined,\n };\n if (defaultValue !== undefined) out.defaultValue = defaultValue;\n if (description !== undefined) out.description = description;\n return out;\n}\n\nfunction buildFunctionSignature(opts: {\n name: string;\n generics: string[];\n params: string[];\n returnType: string;\n isAsync: boolean;\n}): string {\n const gen = opts.generics.length ? `<${opts.generics.join(', ')}>` : '';\n const asyncKw = opts.isAsync ? 'async ' : '';\n return `${asyncKw}function ${opts.name}${gen}(${opts.params.join(', ')}): ${opts.returnType}`;\n}\n\nfunction attachJsDocFields(node: DocNode, jsdoc: JsDocInfo): void {\n if (jsdoc.description) node.description = jsdoc.description;\n if (jsdoc.examples.length) node.examples = jsdoc.examples;\n if (jsdoc.throws.length) node.throws = jsdoc.throws;\n if (jsdoc.deprecated) node.deprecated = jsdoc.deprecated;\n if (jsdoc.since) node.since = jsdoc.since;\n}\n","import type { DocFile } from '@ovellum/core';\n\nexport interface FrontmatterFields {\n title: string;\n source: string;\n generated: string;\n ovellum: true;\n}\n\nexport function buildFrontmatter(file: DocFile, generatedAt: string): string {\n const title = file.moduleName ?? defaultTitle(file.filePath);\n const fields: FrontmatterFields = {\n title,\n source: file.filePath,\n generated: generatedAt,\n ovellum: true,\n };\n const yaml = Object.entries(fields)\n .map(([k, v]) => `${k}: ${formatYamlScalar(v)}`)\n .join('\\n');\n return `---\\n${yaml}\\n---`;\n}\n\nfunction defaultTitle(filePath: string): string {\n const segments = filePath.replace(/\\\\/g, '/').split('/');\n const last = segments[segments.length - 1] ?? filePath;\n return last.replace(/\\.(tsx?|jsx?|mts|cts|mjs|cjs)$/, '');\n}\n\nfunction formatYamlScalar(v: unknown): string {\n if (typeof v === 'boolean' || typeof v === 'number') return String(v);\n const s = String(v);\n if (/[:#\\-?{}[\\],&*!|>'\"%@`]/.test(s) || /^\\s|\\s$/.test(s)) {\n return `'${s.replace(/'/g, \"''\")}'`;\n }\n return s;\n}\n","import path from 'node:path';\nimport type { OvellumConfig } from '@ovellum/core';\n\n/**\n * Map a source file path (relative to project root) onto the doc output path\n * (also relative to project root).\n *\n * src/utils/format.ts → docs/utils/format.md\n *\n * The mapping strips the configured `input` directory prefix and rebases under\n * `output`, replacing the extension with `.md` (or `.mdx` when configured).\n */\nexport function outputPathFor(sourceRelPath: string, config: OvellumConfig): string {\n const inputDir = stripLeadingDotSlash(config.input);\n const outputDir = stripLeadingDotSlash(config.output);\n const ext = config.defaultFormat === 'mdx' ? '.mdx' : '.md';\n\n const posix = sourceRelPath.replace(/\\\\/g, '/');\n const trimmed = posix.startsWith(inputDir + '/') ? posix.slice(inputDir.length + 1) : posix;\n const withoutExt = trimmed.replace(/\\.(tsx?|jsx?|mts|cts|mjs|cjs)$/, '');\n return path.posix.join(outputDir, withoutExt + ext);\n}\n\nfunction stripLeadingDotSlash(p: string): string {\n return p.replace(/^\\.\\/+/, '').replace(/\\/+$/, '');\n}\n","import type { DocNode, DocParam } from '@ovellum/core';\n\n/** Render a single top-level node + any children to markdown. */\nexport function renderNode(node: DocNode): string {\n const parts: string[] = [];\n parts.push(headingFor(node));\n parts.push(anchorComment(node));\n parts.push(signatureBlock(node));\n\n if (node.deprecated) {\n parts.push(`> **Deprecated.** ${escapeInline(node.deprecated)}`);\n }\n if (node.description) {\n parts.push(node.description.trim());\n }\n if (node.since) {\n parts.push(`*Since: ${escapeInline(node.since)}*`);\n }\n\n if (node.params && node.params.length > 0) {\n parts.push('**Parameters**');\n parts.push(paramsTable(node.params));\n }\n\n if (node.returns && node.returns.type && node.returns.type !== 'void') {\n const desc = node.returns.description ? ` - ${node.returns.description}` : '';\n parts.push(`**Returns** \\`${node.returns.type}\\`${desc}`);\n }\n\n if (node.throws && node.throws.length > 0) {\n parts.push('**Throws**');\n for (const t of node.throws) parts.push(`- ${escapeInline(t)}`);\n }\n\n if (node.examples && node.examples.length > 0) {\n parts.push('**Example**');\n for (const ex of node.examples) parts.push(fence(ex.trim(), 'typescript'));\n }\n\n if (node.children && node.children.length > 0) {\n parts.push(renderChildren(node));\n }\n\n return parts.filter(Boolean).join('\\n\\n');\n}\n\nfunction renderChildren(parent: DocNode): string {\n const buckets = {\n method: [] as DocNode[],\n property: [] as DocNode[],\n other: [] as DocNode[],\n };\n for (const child of parent.children ?? []) {\n if (child.kind === 'method') buckets.method.push(child);\n else if (child.kind === 'property') buckets.property.push(child);\n else buckets.other.push(child);\n }\n\n const sections: string[] = [];\n if (buckets.property.length) {\n sections.push(`#### Properties\\n\\n${membersTable(buckets.property)}`);\n }\n if (buckets.method.length) {\n sections.push(`#### Methods\\n\\n${buckets.method.map(renderMember).join('\\n\\n')}`);\n }\n if (buckets.other.length) {\n sections.push(buckets.other.map(renderMember).join('\\n\\n'));\n }\n return sections.join('\\n\\n');\n}\n\nfunction renderMember(node: DocNode): string {\n const parts: string[] = [];\n parts.push(`##### \\`${node.name}\\``);\n parts.push(anchorComment(node));\n parts.push(fence(node.signature, 'typescript'));\n if (node.description) parts.push(node.description.trim());\n if (node.params && node.params.length > 0) {\n parts.push(paramsTable(node.params));\n }\n if (node.returns && node.returns.type && node.returns.type !== 'void') {\n parts.push(`Returns \\`${node.returns.type}\\``);\n }\n return parts.filter(Boolean).join('\\n\\n');\n}\n\nfunction headingFor(node: DocNode): string {\n return `## \\`${node.name}\\``;\n}\n\nfunction signatureBlock(node: DocNode): string {\n return fence(node.signature, 'typescript');\n}\n\nfunction paramsTable(params: DocParam[]): string {\n const head = '| Name | Type | Description |\\n| --- | --- | --- |';\n const rows = params.map((p) => {\n const name = `\\`${p.name}${p.optional ? '?' : ''}\\``;\n const type = `\\`${escapePipe(p.type)}\\``;\n const desc = p.description ? escapeInline(p.description) : '';\n const def =\n p.defaultValue !== undefined ? ` *(default: \\`${escapePipe(p.defaultValue)}\\`)*` : '';\n return `| ${name} | ${type} | ${desc}${def} |`;\n });\n return [head, ...rows].join('\\n');\n}\n\nfunction membersTable(props: DocNode[]): string {\n const head = '| Name | Type | Description |\\n| --- | --- | --- |';\n const rows = props.map((p) => {\n const type = signatureTypeOnly(p.signature, p.name);\n const desc = p.description ? escapeInline(p.description) : '';\n return `| \\`${p.name}\\` | \\`${escapePipe(type)}\\` | ${desc} |`;\n });\n return [head, ...rows].join('\\n');\n}\n\nfunction signatureTypeOnly(signature: string, name: string): string {\n // `name: T` or `name?: T` — strip the name + colon.\n const colonMatch = signature.match(new RegExp(`^${escapeRegex(name)}\\\\??\\\\s*:\\\\s*(.+)$`));\n if (colonMatch) return colonMatch[1]!.trim();\n // `name = value` — enum-member shape; show the value as the column body.\n const eqMatch = signature.match(new RegExp(`^${escapeRegex(name)}\\\\s*=\\\\s*(.+)$`));\n if (eqMatch) return eqMatch[1]!.trim();\n return signature;\n}\n\nfunction anchorComment(node: DocNode): string {\n return `<!-- ovellum:anchor id=\"${node.id}\" generated=\"${new Date().toISOString()}\" -->`;\n}\n\nfunction fence(content: string, lang: string): string {\n return '```' + lang + '\\n' + content + '\\n```';\n}\n\nfunction escapeInline(s: string): string {\n return s.replace(/\\n+/g, ' ').trim();\n}\n\nfunction escapePipe(s: string): string {\n return s.replace(/\\|/g, '\\\\|');\n}\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","import type { DocFile, DocProject, OvellumConfig } from '@ovellum/core';\nimport { buildFrontmatter } from './frontmatter.js';\nimport { outputPathFor } from './path.js';\nimport { renderNode } from './templates.js';\n\nexport interface GenerateResult {\n /** Output path (relative to project root) → markdown body. */\n files: Map<string, string>;\n warnings: string[];\n}\n\n/**\n * Render a `DocProject` IR into markdown bodies keyed by output path.\n *\n * Implements the Phase 3 slice: per-file frontmatter, per-symbol templates for\n * function/class/interface/type/enum, anchor comments on every top-level node\n * and class/interface member. MDX detection, sidebar generation, and\n * deprecation callouts beyond a plain blockquote are deferred to later\n * Phase 3 work.\n */\nexport function generateDocs(project: DocProject, config: OvellumConfig): GenerateResult {\n const files = new Map<string, string>();\n const warnings: string[] = [];\n\n for (const file of project.files) {\n const outputPath = outputPathFor(file.filePath, config);\n const body = renderFile(file, project.generatedAt);\n files.set(outputPath, body);\n }\n\n return { files, warnings };\n}\n\nfunction renderFile(file: DocFile, generatedAt: string): string {\n const parts: string[] = [buildFrontmatter(file, generatedAt)];\n\n if (file.description) {\n parts.push(file.description.trim());\n }\n\n for (const node of file.nodes) {\n parts.push(renderNode(node));\n }\n\n return parts.filter(Boolean).join('\\n\\n') + '\\n';\n}\n","import { readFile } from 'node:fs/promises';\nimport matter from 'gray-matter';\nimport type { ManualDoc } from '@ovellum/core';\nimport { extractProtectedZones } from './zones.js';\n\n/**\n * Read a Markdown / MDX file and return a `ManualDoc`: frontmatter, body\n * content (frontmatter stripped), and all protected zones in document order.\n *\n * Errors are thrown via `OvellumError` for unclosed / nested / stray tags so\n * the CLI can surface them with a clear hint.\n */\nexport async function readManualDoc(filePath: string): Promise<ManualDoc> {\n const raw = await readFile(filePath, 'utf8');\n return parseManualDoc(raw, filePath);\n}\n\n/**\n * Like `readManualDoc` but operates on an in-memory string. Useful for tests\n * and for callers that already have the file contents.\n */\nexport function parseManualDoc(raw: string, filePath: string): ManualDoc {\n const parsed = matter(raw);\n const frontmatter = (parsed.data ?? {}) as Record<string, unknown>;\n const content = parsed.content;\n const protectedBlocks = extractProtectedZones(content);\n const warnings: string[] = [];\n for (const block of protectedBlocks) {\n if (!block.hasExplicitId) {\n warnings.push(\n `${filePath}:${block.startLine}: protected zone \"${block.id}\" uses a positional fallback id. ` +\n `Add id=\"...\" on the <!-- @manual:start --> tag so the block survives reordering.`,\n );\n }\n }\n return { filePath, frontmatter, content, protectedBlocks, warnings };\n}\n","import { OvellumError } from '@ovellum/core';\nimport type { ProtectedBlock } from '@ovellum/core';\n\nconst START_RE = /<!--\\s*@manual:start(?:\\s+id=(\"([^\"]*)\"|'([^']*)'))?\\s*-->/g;\nconst END_RE = /<!--\\s*@manual:end\\s*-->/g;\nconst ANCHOR_RE = /<!--\\s*ovellum:anchor\\s+id=(\"([^\"]*)\"|'([^']*)')[^>]*-->/g;\n\ninterface RawTagMatch {\n kind: 'start' | 'end' | 'anchor';\n index: number;\n endIndex: number;\n /** Explicit ID attribute, if present. */\n id?: string;\n /** Line number (1-based) where the tag starts. */\n line: number;\n}\n\n/**\n * Scan a Markdown body for protected zones. Returns the extracted blocks in\n * document order, each associated with the nearest preceding ovellum anchor\n * (when one exists).\n *\n * Errors thrown:\n * - `UNCLOSED_MANUAL_TAG` — a `@manual:start` had no matching `@manual:end`\n * - `NESTED_MANUAL_TAG` — a second `@manual:start` opened before the prior closed\n * - `STRAY_MANUAL_END` — an `@manual:end` was found without a preceding start\n */\nexport function extractProtectedZones(content: string): ProtectedBlock[] {\n const tags = collectTags(content);\n const blocks: ProtectedBlock[] = [];\n\n let lastAnchorId: string | undefined;\n let positionalCounter = 0;\n let openStart: RawTagMatch | null = null;\n\n for (const tag of tags) {\n if (tag.kind === 'anchor') {\n lastAnchorId = tag.id;\n continue;\n }\n if (tag.kind === 'start') {\n if (openStart) {\n throw new OvellumError(\n `Nested @manual:start tag at line ${tag.line} (previous opened at line ${openStart.line}).`,\n {\n code: 'NESTED_MANUAL_TAG',\n hint: 'Close the first @manual block before opening another.',\n },\n );\n }\n openStart = tag;\n continue;\n }\n // tag.kind === 'end'\n if (!openStart) {\n throw new OvellumError(`Stray @manual:end at line ${tag.line}: no matching @manual:start.`, {\n code: 'STRAY_MANUAL_END',\n });\n }\n const inner = content.slice(openStart.endIndex, tag.index);\n const trimmed = inner.replace(/^\\n/, '').replace(/\\n$/, '');\n const hasExplicitId = openStart.id !== undefined && openStart.id.length > 0;\n const id = hasExplicitId ? openStart.id! : `manual-block-${++positionalCounter}`;\n const block: ProtectedBlock = {\n id,\n hasExplicitId,\n content: trimmed,\n startLine: openStart.line,\n endLine: tag.line,\n };\n if (lastAnchorId !== undefined) block.anchorId = lastAnchorId;\n blocks.push(block);\n openStart = null;\n }\n\n if (openStart) {\n throw new OvellumError(`Unclosed @manual:start at line ${openStart.line}.`, {\n code: 'UNCLOSED_MANUAL_TAG',\n hint: 'Add a matching <!-- @manual:end --> tag.',\n });\n }\n\n return blocks;\n}\n\nfunction collectTags(content: string): RawTagMatch[] {\n const tags: RawTagMatch[] = [];\n\n scan(content, START_RE, (m) => {\n tags.push({\n kind: 'start',\n index: m.index,\n endIndex: m.index + m[0].length,\n id: m[2] ?? m[3],\n line: lineNumberAt(content, m.index),\n });\n });\n scan(content, END_RE, (m) => {\n tags.push({\n kind: 'end',\n index: m.index,\n endIndex: m.index + m[0].length,\n line: lineNumberAt(content, m.index),\n });\n });\n scan(content, ANCHOR_RE, (m) => {\n tags.push({\n kind: 'anchor',\n index: m.index,\n endIndex: m.index + m[0].length,\n id: m[2] ?? m[3],\n line: lineNumberAt(content, m.index),\n });\n });\n\n return tags.sort((a, b) => a.index - b.index);\n}\n\nfunction scan(input: string, re: RegExp, onMatch: (m: RegExpExecArray) => void): void {\n re.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(input)) !== null) onMatch(m);\n}\n\nfunction lineNumberAt(content: string, index: number): number {\n let line = 1;\n for (let i = 0; i < index; i++) {\n if (content.charCodeAt(i) === 0x0a) line++;\n }\n return line;\n}\n","const ANCHOR_RE = /<!--\\s*ovellum:anchor\\s+id=(\"([^\"]*)\"|'([^']*)')[^>]*-->/g;\n\nexport interface AnchorMatch {\n id: string;\n /** Byte index where the `<!-- ovellum:anchor ... -->` comment begins. */\n index: number;\n /** Byte index immediately after the `-->`. */\n endIndex: number;\n}\n\n/**\n * Locate every ovellum anchor comment in a Markdown body, in document order.\n */\nexport function findAnchors(content: string): AnchorMatch[] {\n const out: AnchorMatch[] = [];\n ANCHOR_RE.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = ANCHOR_RE.exec(content)) !== null) {\n const id = m[2] ?? m[3];\n if (!id) continue;\n out.push({ id, index: m.index, endIndex: m.index + m[0].length });\n }\n return out;\n}\n","import type { ManualDoc, OrphanRecord, ProtectedBlock } from '@ovellum/core';\nimport { findAnchors } from './anchors.js';\n\nexport interface MergeOptions {\n /** ISO timestamp for any orphan records produced. Defaults to `now`. */\n now?: string;\n /** Output file the manual doc came from — recorded on orphan records. */\n sourceFile?: string;\n}\n\nexport interface MergeResult {\n /** Final merged Markdown content. */\n content: string;\n /** Manual blocks whose anchor no longer exists in the generated content. */\n orphans: OrphanRecord[];\n /** Non-fatal issues (e.g. positional fallback used). */\n warnings: string[];\n}\n\n/**\n * Merge a freshly generated Markdown body with the protected zones extracted\n * from the previous version of the same file.\n *\n * For each protected block in `manual`, we look up its `anchorId` in `generated`.\n * When found, the block is appended to that anchor's section (right before the\n * next anchor or the end of the file). When the anchor no longer exists, the\n * block becomes an orphan: returned in `result.orphans` for the caller to\n * quarantine via `writeOrphan`.\n *\n * Blocks without an `anchorId` (i.e. they had no preceding ovellum anchor in\n * the previous file) are surfaced as warnings and treated as orphans — there\n * is nothing to attach them to.\n */\nexport function merge(\n generated: string,\n manual: ManualDoc,\n options: MergeOptions = {},\n): MergeResult {\n const orphans: OrphanRecord[] = [];\n const warnings: string[] = [];\n const now = options.now ?? new Date().toISOString();\n const sourceFile = options.sourceFile ?? manual.filePath;\n\n // Build a map of anchorId → list of protected blocks (preserve document order)\n const anchorToBlocks = new Map<string, ProtectedBlock[]>();\n const anchorless: ProtectedBlock[] = [];\n for (const block of manual.protectedBlocks) {\n if (!block.anchorId) {\n anchorless.push(block);\n continue;\n }\n let list = anchorToBlocks.get(block.anchorId);\n if (!list) {\n list = [];\n anchorToBlocks.set(block.anchorId, list);\n }\n list.push(block);\n }\n\n for (const block of anchorless) {\n warnings.push(`Protected block ${block.id} has no associated anchor — treated as orphan.`);\n orphans.push(orphanFromBlock(block, undefined, sourceFile, now));\n }\n\n const anchors = findAnchors(generated);\n if (anchors.length === 0) {\n // No anchors in generated content — every anchored block becomes an orphan.\n for (const [anchorId, blocks] of anchorToBlocks) {\n for (const block of blocks) {\n orphans.push(orphanFromBlock(block, anchorId, sourceFile, now));\n }\n }\n return { content: generated, orphans, warnings };\n }\n\n // Walk the generated content and splice protected blocks in at the end of\n // each anchor's section. The \"section end\" is the line where the NEXT\n // heading starts (or end-of-file), because in our output headings precede\n // anchors — so the next anchor's section actually begins at its heading.\n const pieces: string[] = [];\n let cursor = 0;\n\n for (let i = 0; i < anchors.length; i++) {\n const anchor = anchors[i]!;\n const sectionEnd = findSectionEnd(generated, anchor.endIndex);\n\n pieces.push(generated.slice(cursor, sectionEnd));\n\n const blocks = anchorToBlocks.get(anchor.id);\n if (blocks && blocks.length > 0) {\n pieces.push(renderBlocks(blocks));\n anchorToBlocks.delete(anchor.id);\n }\n\n cursor = sectionEnd;\n }\n // Trailing content after the last section (file-level matter only).\n if (cursor < generated.length) {\n pieces.push(generated.slice(cursor));\n }\n\n // Anything still in the map → orphan (its anchor disappeared).\n for (const [anchorId, blocks] of anchorToBlocks) {\n for (const block of blocks) {\n orphans.push(orphanFromBlock(block, anchorId, sourceFile, now));\n }\n }\n\n return { content: pieces.join(''), orphans, warnings };\n}\n\n/**\n * Find the index of the next Markdown heading line (lines starting with\n * `#`, `##`, … followed by a space) after `from`, or `content.length` if no\n * heading remains. Used to bound the current anchor's \"section.\"\n */\nfunction findSectionEnd(content: string, from: number): number {\n const re = /\\n(#{1,6} )/g;\n re.lastIndex = from;\n const m = re.exec(content);\n return m ? m.index + 1 : content.length;\n}\n\nfunction renderBlocks(blocks: ProtectedBlock[]): string {\n return blocks.map((b) => renderBlock(b)).join('\\n');\n}\n\nfunction renderBlock(block: ProtectedBlock): string {\n const idAttr = block.hasExplicitId ? ` id=\"${block.id}\"` : '';\n return `<!-- @manual:start${idAttr} -->\\n${block.content}\\n<!-- @manual:end -->\\n\\n`;\n}\n\nfunction orphanFromBlock(\n block: ProtectedBlock,\n anchorId: string | undefined,\n sourceFile: string,\n orphanedAt: string,\n): OrphanRecord {\n const out: OrphanRecord = {\n orphanedAt,\n sourceFile,\n anchorId: anchorId ?? 'unknown',\n content: block.content,\n };\n if (block.hasExplicitId) out.manualBlockId = block.id;\n return out;\n}\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { OrphanRecord } from '@ovellum/core';\n\n/**\n * Slugify an anchor ID into a path-safe filename component. Replaces every\n * non-`[A-Za-z0-9._-]` byte with `-`, collapses runs of `-`, trims edges.\n */\nexport function slugifyAnchor(anchorId: string): string {\n return anchorId\n .replace(/[^A-Za-z0-9._-]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\n/**\n * Format a Date as `YYYY-MM-DD` in UTC. Used for orphan filenames.\n */\nexport function formatDateUTC(d: Date): string {\n const y = d.getUTCFullYear();\n const m = String(d.getUTCMonth() + 1).padStart(2, '0');\n const day = String(d.getUTCDate()).padStart(2, '0');\n return `${y}-${m}-${day}`;\n}\n\n/**\n * Render an `OrphanRecord` as a Markdown file body with frontmatter + content.\n */\nexport function renderOrphanFile(record: OrphanRecord): string {\n const fields: Record<string, string> = {\n orphaned: record.orphanedAt,\n source_file: record.sourceFile,\n anchor_id: record.anchorId,\n };\n if (record.anchorLastSeen) fields.anchor_last_seen = record.anchorLastSeen;\n if (record.manualBlockId) fields.manual_block_id = record.manualBlockId;\n const yaml = Object.entries(fields)\n .map(([k, v]) => `${k}: ${formatYamlScalar(v)}`)\n .join('\\n');\n return `---\\n${yaml}\\n---\\n\\n${record.content}\\n`;\n}\n\n/**\n * Write an orphan record to disk. Returns the absolute path written.\n */\nexport async function writeOrphan(record: OrphanRecord, orphanDir: string): Promise<string> {\n const slug = slugifyAnchor(record.anchorId);\n const dateStamp = formatDateUTC(new Date(record.orphanedAt));\n const filename = `${dateStamp}_${slug}.md`;\n const absPath = path.resolve(orphanDir, filename);\n await mkdir(orphanDir, { recursive: true });\n await writeFile(absPath, renderOrphanFile(record), 'utf8');\n return absPath;\n}\n\nfunction formatYamlScalar(s: string): string {\n if (/[:#\\-?{}[\\],&*!|>'\"%@`]/.test(s) || /^\\s|\\s$/.test(s)) {\n return `'${s.replace(/'/g, \"''\")}'`;\n }\n return s;\n}\n","import { existsSync } from 'node:fs';\nimport { copyFile, mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport matter from 'gray-matter';\nimport type { OvellumConfig, OvellumSiteConfig } from '@ovellum/core';\nimport { renderMarkdown, type Heading } from './markdown.js';\nimport { buildNav, findAdjacent, findBreadcrumbs, type NavNode } from './nav.js';\nimport { countWords, lastModifiedISO, readingMinutes } from './page-meta.js';\nimport { indexSite } from './search.js';\nimport { generateRss } from './rss.js';\nimport { generateSitemap } from './sitemap.js';\nimport { renderLanding, renderPage } from './template.js';\n\nexport interface BuildSiteOptions {\n config: OvellumConfig;\n cwd: string;\n /** Build timestamp recorded in page footers. Defaults to `new Date()`. */\n now?: Date;\n}\n\nexport interface PageOutput {\n sourcePath: string;\n outputPath: string;\n url: string;\n title: string;\n /** Frontmatter `description`, when set. Used by the RSS feed and metadata. */\n description?: string;\n /** ISO-8601 last-modified timestamp from git → fs mtime fallback. */\n lastModified?: string;\n}\n\nexport interface BuildSiteResult {\n pages: PageOutput[];\n warnings: string[];\n outputDir: string;\n assetsDir: string;\n /** True when a landing page was rendered at `/`. */\n landingRendered: boolean;\n}\n\nconst TEMPLATE_DIR_NAME = 'templates/default';\nconst LANDING_BODY_FILE = '_landing.md';\n\n/**\n * Build a static site from a folder of `.md` files. Wired by the CLI when\n * `config.mode === 'manual'`.\n *\n * content/index.md → dist/index.html\n * content/getting-started.md → dist/getting-started/index.html\n * content/guides/install.md → dist/guides/install/index.html\n * content/img/logo.svg → dist/img/logo.svg (passthrough)\n *\n * When `config.site.landing.enabled` is true, `dist/index.html` is rendered\n * from the landing template (hero + features + optional `_landing.md` pitch\n * + trust strip), and any `content/index.md` is skipped with a warning.\n *\n * Also writes `dist/assets/ovellum.css` and `dist/assets/ovellum.js` from the\n * bundled default template.\n */\nexport async function buildSite(options: BuildSiteOptions): Promise<BuildSiteResult> {\n const { config, cwd } = options;\n const now = options.now ?? new Date();\n\n const inputAbs = path.resolve(cwd, config.input);\n const outputAbs = path.resolve(cwd, config.output);\n const assetsAbs = path.join(outputAbs, 'assets');\n\n if (config.defaultFormat !== 'md') {\n throw new Error(\n `manual mode currently only supports 'md' output; got '${config.defaultFormat}'.`,\n );\n }\n\n const site = resolveSiteConfig(config);\n const nav = await buildNav(config.input, cwd);\n const warnings: string[] = [];\n\n await mkdir(assetsAbs, { recursive: true });\n await writeStaticAssets(assetsAbs);\n\n const landingEnabled = site.landing.enabled === true;\n const docsHref = landingEnabled ? (site.landing.docsHref ?? firstNavUrl(nav)) : undefined;\n\n const pages: PageOutput[] = [];\n let landingRendered = false;\n\n // Render the landing page first (if enabled) so `content/index.md`\n // can be detected as a conflict during the walk.\n if (landingEnabled) {\n const landingBody = await readLandingBody(inputAbs, site);\n const html = renderLanding({\n site,\n landing: site.landing,\n pitchHtml: landingBody?.html,\n generatedAt: now.toISOString(),\n docsHref,\n });\n await writeFile(path.join(outputAbs, 'index.html'), html, 'utf8');\n pages.push({\n sourcePath: landingBody?.sourcePath ?? '(landing config)',\n outputPath: path.relative(cwd, path.join(outputAbs, 'index.html')).replace(/\\\\/g, '/'),\n url: '/',\n title: site.landing.hero.title ?? site.title,\n });\n landingRendered = true;\n }\n\n for await (const file of walkContent(inputAbs)) {\n const relFromInput = path.relative(inputAbs, file).replace(/\\\\/g, '/');\n if (isMarkdown(file)) {\n const url = urlFor(relFromInput);\n if (landingEnabled && url === '/') {\n warnings.push(\n `Skipped ${relFromInput} because site.landing.enabled is true; ` +\n `the landing template renders / instead. Move prose to ${LANDING_BODY_FILE} ` +\n `or rename this file.`,\n );\n continue;\n }\n const outputPath = path.join(outputAbs, urlToOutputPath(url));\n const { prev, next } = findAdjacent(nav, url);\n const breadcrumbs = findBreadcrumbs(nav, url).map((n) => ({ title: n.title, url: n.url }));\n const sourceRelFromCwd = path.relative(cwd, file).replace(/\\\\/g, '/');\n const result = await renderOne({\n absInput: file,\n url,\n site,\n // Sidebar renders the section subtree; prev/next + breadcrumbs above\n // still use the full nav so reading order spans the whole site.\n nav: sidebarRootFor(nav),\n cwd,\n generatedAt: now.toISOString(),\n docsHref,\n prev: prev ? { title: prev.title, url: prev.url } : undefined,\n next: next ? { title: next.title, url: next.url } : undefined,\n breadcrumbs,\n sourceRelFromCwd,\n });\n await mkdir(path.dirname(outputPath), { recursive: true });\n await writeFile(outputPath, result.html, 'utf8');\n pages.push({\n sourcePath: path.relative(cwd, file).replace(/\\\\/g, '/'),\n outputPath: path.relative(cwd, outputPath).replace(/\\\\/g, '/'),\n url,\n title: result.title,\n description: result.description,\n lastModified: result.lastModified,\n });\n warnings.push(...result.warnings);\n } else {\n // Passthrough static asset\n const outputPath = path.join(outputAbs, relFromInput);\n await mkdir(path.dirname(outputPath), { recursive: true });\n await copyFile(file, outputPath);\n }\n }\n\n // Sort pages for deterministic summary output (but keep `/` first).\n pages.sort((a, b) => {\n if (a.url === '/') return -1;\n if (b.url === '/') return 1;\n return a.url.localeCompare(b.url);\n });\n\n // Emit sitemap.xml and feed.xml when site.baseUrl is configured.\n if (site.baseUrl) {\n const xml = generateSitemap({ pages, baseUrl: site.baseUrl, basePath: site.basePath });\n if (xml) await writeFile(path.join(outputAbs, 'sitemap.xml'), xml, 'utf8');\n\n const rss = generateRss({\n pages,\n baseUrl: site.baseUrl,\n basePath: site.basePath,\n title: site.title,\n description: site.description,\n exclude: ['/404/', '/'],\n generatedAt: now,\n });\n if (rss) await writeFile(path.join(outputAbs, 'feed.xml'), rss, 'utf8');\n } else {\n warnings.push(\n 'sitemap.xml and feed.xml not generated: set `site.baseUrl` in your config to enable them.',\n );\n }\n\n // Run Pagefind search indexing when enabled.\n if (site.search.enabled) {\n const idx = await indexSite({ outputAbs });\n if (idx.exitCode !== 0) {\n for (const err of idx.errors) warnings.push(`search: ${err}`);\n }\n }\n\n return {\n pages,\n warnings,\n outputDir: path.relative(cwd, outputAbs).replace(/\\\\/g, '/'),\n assetsDir: path.relative(cwd, assetsAbs).replace(/\\\\/g, '/'),\n landingRendered,\n };\n}\n\ninterface RenderOneInput {\n absInput: string;\n url: string;\n site: OvellumSiteConfig & { title: string };\n nav: NavNode;\n cwd: string;\n generatedAt: string;\n docsHref?: string;\n prev?: { title: string; url: string };\n next?: { title: string; url: string };\n breadcrumbs?: Array<{ title: string; url: string }>;\n /** Page's source path relative to the project root; substituted into the edit URL. */\n sourceRelFromCwd: string;\n}\n\ninterface RenderOneResult {\n html: string;\n title: string;\n description?: string;\n lastModified?: string;\n warnings: string[];\n}\n\nasync function renderOne(input: RenderOneInput): Promise<RenderOneResult> {\n const raw = await readFile(input.absInput, 'utf8');\n const parsed = matter(raw);\n const frontmatter = parsed.data as { title?: string; description?: string };\n const { html: bodyHtml, headings } = await renderMarkdown(parsed.content, {\n codeTheme: input.site.codeTheme,\n });\n const title = frontmatter.title ?? firstHeading(headings) ?? input.site.title;\n\n const editUrl = input.site.editUrlPattern\n ? input.site.editUrlPattern.replace('{path}', input.sourceRelFromCwd)\n : undefined;\n\n const pageMetaCfg = input.site.pageMeta;\n const readingMin = pageMetaCfg.readingTime\n ? readingMinutes(countWords(parsed.content))\n : undefined;\n const lastModified = pageMetaCfg.lastModified\n ? await lastModifiedISO({ absPath: input.absInput, cwd: input.cwd })\n : undefined;\n\n const html = renderPage({\n site: input.site,\n nav: input.nav,\n url: input.url,\n title,\n description: frontmatter.description,\n bodyHtml,\n headings,\n generatedAt: input.generatedAt,\n docsHref: input.docsHref,\n prev: input.prev,\n next: input.next,\n breadcrumbs: input.breadcrumbs,\n editUrl,\n readingMinutes: readingMin,\n lastModified,\n bodyClass: input.url === '/404/' ? 'ov-body-404' : undefined,\n });\n return {\n html,\n title,\n description: frontmatter.description,\n lastModified,\n warnings: [],\n };\n}\n\ninterface LandingBody {\n html: string;\n sourcePath: string;\n}\n\nasync function readLandingBody(\n inputAbs: string,\n site: OvellumSiteConfig,\n): Promise<LandingBody | undefined> {\n const abs = path.join(inputAbs, LANDING_BODY_FILE);\n if (!existsSync(abs)) return undefined;\n const raw = await readFile(abs, 'utf8');\n const { content } = matter(raw);\n if (!content.trim()) return undefined;\n const { html } = await renderMarkdown(content, { codeTheme: site.codeTheme });\n return { html, sourcePath: path.join(path.basename(inputAbs), LANDING_BODY_FILE) };\n}\n\nfunction firstNavUrl(nav: NavNode): string | undefined {\n const first = nav.children.find((c) => c.sourcePath !== undefined);\n return first?.url;\n}\n\n/**\n * Choose the nav subtree to render in the sidebar.\n *\n * When a site funnels all of its pages through a single top-level section\n * (e.g. everything under `/docs`), we root the sidebar at that section so its\n * pages sit at the top level instead of under a redundant wrapper — and stray\n * root entries (a 404 page, a `public/` asset folder) stay out of the nav.\n * The section's own index page is surfaced as the leading sidebar item.\n *\n * This only kicks in for the single-section shape: a site with loose root\n * pages alongside groups (the usual multi-section layout) keeps the full nav.\n */\nfunction sidebarRootFor(nav: NavNode): NavNode {\n const groups = nav.children.filter((c) => c.children.length > 0);\n // Root-level content pages (a page node is childless with a source file).\n // The synthetic 404 page doesn't count — it's not part of the reading flow.\n const looseRootPages = nav.children.filter(\n (c) => c.sourcePath !== undefined && c.children.length === 0 && c.url !== '/404/',\n );\n if (groups.length !== 1 || looseRootPages.length > 0) return nav;\n const section = groups[0]!;\n const lead: NavNode[] = section.sourcePath\n ? [\n {\n title: section.title,\n url: section.url,\n sourcePath: section.sourcePath,\n children: [],\n },\n ]\n : [];\n return { ...section, children: [...lead, ...section.children] };\n}\n\nfunction resolveSiteConfig(config: OvellumConfig): OvellumSiteConfig & { title: string } {\n const title = config.site.title ?? config.name ?? 'Ovellum site';\n return { ...config.site, title };\n}\n\nasync function* walkContent(dirAbs: string): AsyncGenerator<string> {\n const entries = await readdir(dirAbs);\n for (const name of entries) {\n if (name.startsWith('_')) continue;\n const abs = path.join(dirAbs, name);\n const st = await stat(abs);\n if (st.isDirectory()) {\n yield* walkContent(abs);\n } else {\n yield abs;\n }\n }\n}\n\nfunction isMarkdown(p: string): boolean {\n return /\\.(md|markdown)$/i.test(p);\n}\n\n/**\n * Map a content-relative path to its public URL.\n *\n * index.md → /\n * getting-started.md → /getting-started/\n * guides/install.md → /guides/install/\n * guides/index.md → /guides/\n */\nfunction urlFor(relFromInput: string): string {\n const noExt = relFromInput.replace(/\\.(md|markdown)$/i, '');\n const parts = noExt.split('/').filter(Boolean);\n if (parts.length === 0) return '/';\n if (parts[parts.length - 1] === 'index') parts.pop();\n if (parts.length === 0) return '/';\n return '/' + parts.join('/') + '/';\n}\n\nfunction urlToOutputPath(url: string): string {\n if (url === '/') return 'index.html';\n return url.replace(/^\\/+/, '').replace(/\\/+$/, '') + '/index.html';\n}\n\nfunction firstHeading(headings: Heading[]): string | undefined {\n const h2 = headings.find((h) => h.depth === 2);\n return h2?.text;\n}\n\nasync function writeStaticAssets(assetsAbs: string): Promise<void> {\n const templateDir = resolveTemplateDir();\n await copyFile(path.join(templateDir, 'style.css'), path.join(assetsAbs, 'ovellum.css'));\n await copyFile(path.join(templateDir, 'script.js'), path.join(assetsAbs, 'ovellum.js'));\n}\n\nfunction resolveTemplateDir(): string {\n // Both possible runtime locations:\n // dist/index.js → dist/templates/default (post-build copy ships this)\n // src/build.ts → src/templates/default (vitest / dev)\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.join(here, TEMPLATE_DIR_NAME),\n path.join(here, '..', 'src', TEMPLATE_DIR_NAME),\n ];\n for (const c of candidates) {\n if (existsSync(c)) return c;\n }\n throw new Error(\n `Could not locate Ovellum default template directory near ${here}. Looked in: ${candidates.join(', ')}`,\n );\n}\n","import { unified } from 'unified';\nimport remarkParse from 'remark-parse';\nimport remarkGfm from 'remark-gfm';\nimport remarkRehype from 'remark-rehype';\nimport rehypeRaw from 'rehype-raw';\nimport rehypeSanitize, { defaultSchema, type Options as Schema } from 'rehype-sanitize';\nimport rehypeSlug from 'rehype-slug';\nimport rehypeAutolinkHeadings from 'rehype-autolink-headings';\nimport rehypeStringify from 'rehype-stringify';\nimport { visit } from 'unist-util-visit';\nimport { createHighlighter, type Highlighter } from 'shiki';\nimport type { Root, Element, ElementContent } from 'hast';\nimport type { OvellumCodeTheme } from '@ovellum/core';\n\nexport interface Heading {\n depth: number;\n text: string;\n id: string;\n}\n\nexport interface RenderedMarkdown {\n html: string;\n headings: Heading[];\n}\n\nexport interface RenderMarkdownOptions {\n /** Shiki theme pair to highlight code blocks with. Defaults to `'github'`. */\n codeTheme?: OvellumCodeTheme;\n}\n\n/**\n * Each `OvellumCodeTheme` maps to a `{ light, dark }` shiki pair. Both halves\n * are emitted into the HTML through CSS variables; switching `[data-theme]`\n * on `<html>` swaps the colours with zero runtime cost.\n *\n * Nord ships dark-only in shiki, so we pair it with `min-light` — a clean\n * low-saturation light theme that doesn't clash with Nord's frosty palette.\n */\nconst CODE_THEME_PAIRS: Record<OvellumCodeTheme, { light: string; dark: string }> = {\n github: { light: 'github-light', dark: 'github-dark' },\n nord: { light: 'min-light', dark: 'nord' },\n solarized: { light: 'solarized-light', dark: 'solarized-dark' },\n};\n\nconst ALL_SHIKI_THEMES = Array.from(\n new Set(\n Object.values(CODE_THEME_PAIRS).flatMap((pair) => [pair.light, pair.dark]),\n ),\n);\n\nconst SHIKI_LANGS = [\n 'typescript',\n 'tsx',\n 'javascript',\n 'jsx',\n 'json',\n 'bash',\n 'shell',\n 'markdown',\n 'yaml',\n 'html',\n 'css',\n] as const;\n\n// HTML-in-Markdown sanitization policy.\n//\n// We accept raw HTML inside Markdown so authors can mix in <details>, <kbd>,\n// an SVG, etc., but every Markdown source — even one written by a trusted\n// teammate — is sanitized BEFORE shiki injects its highlighted HAST. That\n// order matters: shiki output relies on inline `style` attributes that the\n// sanitizer would strip, so we keep shiki's emissions out of the sanitization\n// path entirely.\n//\n// Removed: <script>, <iframe>, <object>, <embed>, on* event-handler attrs,\n// and any URL whose scheme isn't on the per-attribute allowlist below\n// (so `javascript:`, `vbscript:`, and `data:` URLs are all dropped — including\n// from <img src>, because data:image/svg+xml can carry executable JS).\nconst SANITIZE_SCHEMA: Schema = {\n ...defaultSchema,\n attributes: {\n ...defaultSchema.attributes,\n // Authors writing raw <code> blocks should keep their language class\n // so shiki picks them up on the next pass; defaultSchema already permits\n // `className`, but we widen `code` explicitly to be defensive.\n code: [...(defaultSchema.attributes?.code ?? []), 'className'],\n },\n};\n\n// One highlighter holds every supported theme; the choice per page is just\n// which two names from that bundle we pass to `codeToHast`. Avoids the cost\n// of re-instantiating shiki when a site uses multiple code themes (rare, but\n// possible across separate builds in one process — e.g. tests).\nlet highlighterPromise: Promise<Highlighter> | null = null;\n\nfunction getHighlighter(): Promise<Highlighter> {\n if (!highlighterPromise) {\n highlighterPromise = createHighlighter({\n themes: ALL_SHIKI_THEMES,\n langs: [...SHIKI_LANGS],\n });\n }\n return highlighterPromise;\n}\n\n/**\n * Render a Markdown string to HTML. Returns the HTML body plus a list of\n * h2/h3 headings (with stable ids) for the right-side \"On this page\" ToC.\n *\n * - rehype-slug adds `id=\"…\"` to every heading.\n * - rehype-autolink-headings wraps each heading text in an `<a href=\"#…\">` so\n * clicking the heading copies its URL.\n * - Code fences are rendered with shiki, using the theme pair chosen via\n * `opts.codeTheme` (defaults to `github`) and emitted through CSS\n * variables — switching `[data-theme]` on `<html>` swaps the colours\n * with no runtime cost.\n */\nexport async function renderMarkdown(\n md: string,\n opts: RenderMarkdownOptions = {},\n): Promise<RenderedMarkdown> {\n const highlighter = await getHighlighter();\n const themes = CODE_THEME_PAIRS[opts.codeTheme ?? 'github'] ?? CODE_THEME_PAIRS.github;\n const headings: Heading[] = [];\n\n const file = await unified()\n .use(remarkParse)\n // GFM enables tables, strikethrough, task lists, and literal autolinks\n // — Markdown features people expect, none of which CommonMark includes.\n .use(remarkGfm)\n .use(remarkRehype, { allowDangerousHtml: true })\n // rehype-raw parses `raw` HAST nodes (the literal HTML that survived\n // remark-rehype because of allowDangerousHtml) into real element nodes\n // so rehype-sanitize can actually walk them. Without this, raw HTML\n // would either pass straight through or be wholesale dropped — neither\n // is what we want.\n .use(rehypeRaw)\n // Sanitize BEFORE shiki — see SANITIZE_SCHEMA comment above.\n .use(rehypeSanitize, SANITIZE_SCHEMA)\n // Transform `> [!NOTE]` etc. blockquotes into ov-callout panels. Runs\n // post-sanitize so the className we add is trusted — the HAST we emit\n // here doesn't go back through sanitization.\n .use(rehypeCallouts)\n // Wrap every `<table>` in `<div class=\"ov-table-wrap\">` so a table\n // wider than the prose column scrolls horizontally instead of\n // blowing out the layout.\n .use(rehypeTableWrap)\n .use(rehypeSlug)\n .use(rehypeAutolinkHeadings, {\n // `append` keeps the heading text flush-left along with the prose;\n // the `#` indicator floats in after the text on hover (see styles).\n behavior: 'append',\n properties: { className: ['heading-anchor'], 'aria-label': 'Permalink' },\n content: { type: 'text', value: '#' },\n })\n .use(() => (tree: Root) => {\n collectHeadings(tree, headings);\n highlightCodeBlocks(tree, highlighter, themes);\n })\n // allowDangerousHtml stays true so shiki's hast (which has been generated\n // post-sanitize and is trusted) renders without re-escaping.\n .use(rehypeStringify, { allowDangerousHtml: true })\n .process(md);\n\n return { html: String(file), headings };\n}\n\n/**\n * Wrap each top-level `<table>` in `<div class=\"ov-table-wrap\">` so the\n * CSS can put `overflow-x: auto` on the wrapper and let wide tables\n * scroll horizontally without forcing the parent column to grow.\n *\n * Skips tables that are already inside an `.ov-table-wrap` (defensive\n * — relevant if authors hand-wrap a table in raw HTML).\n */\nfunction rehypeTableWrap() {\n return (tree: Root): void => {\n visit(tree, 'element', (node: Element, index, parent) => {\n if (node.tagName !== 'table') return;\n if (!parent || typeof index !== 'number') return;\n if (\n parent.type === 'element' &&\n readClassNames(parent as Element).includes('ov-table-wrap')\n ) {\n return;\n }\n const wrapper: Element = {\n type: 'element',\n tagName: 'div',\n properties: { className: ['ov-table-wrap'] },\n children: [node],\n };\n (parent.children as ElementContent[])[index] = wrapper;\n });\n };\n}\n\ntype CalloutType = 'note' | 'tip' | 'important' | 'warning' | 'caution';\nconst CALLOUT_RE = /^\\s*\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\][^\\S\\n]*\\n?/i;\nconst CALLOUT_LABEL: Record<CalloutType, string> = {\n note: 'Note',\n tip: 'Tip',\n important: 'Important',\n warning: 'Warning',\n caution: 'Caution',\n};\n\n/**\n * remark/rehype plugin that turns GitHub-flavored alert blockquotes into\n * `.ov-callout` panels.\n *\n * > [!NOTE]\n * > Body content.\n *\n * becomes\n *\n * <div class=\"ov-callout ov-callout--note\">\n * <div class=\"ov-callout-label\">Note</div>\n * <p>Body content.</p>\n * </div>\n *\n * The blockquote must open with `[!TYPE]` on its first text node. Anything\n * else is left as a normal blockquote.\n */\nfunction rehypeCallouts() {\n return (tree: Root): void => {\n visit(tree, 'element', (node: Element) => {\n if (node.tagName !== 'blockquote') return;\n const firstP = node.children.find(\n (c): c is Element => c.type === 'element' && c.tagName === 'p',\n );\n if (!firstP) return;\n const firstText = firstP.children[0];\n if (!firstText || firstText.type !== 'text') return;\n const m = CALLOUT_RE.exec(firstText.value);\n if (!m) return;\n\n const type = m[1]!.toLowerCase() as CalloutType;\n firstText.value = firstText.value.slice(m[0].length);\n // If stripping the marker left only whitespace, drop the paragraph\n // (and any line break that preceded the body).\n const stripped = firstText.value.replace(/^\\s+/, '');\n if (\n firstP.children.length === 1 &&\n firstText.type === 'text' &&\n stripped.length === 0\n ) {\n node.children = node.children.filter((c) => c !== firstP);\n } else {\n // Keep the paragraph but normalize the leading newline / whitespace\n // we left behind on the first text node.\n firstText.value = stripped;\n }\n\n node.tagName = 'div';\n node.properties = {\n ...(node.properties ?? {}),\n className: ['ov-callout', `ov-callout--${type}`],\n };\n const label: Element = {\n type: 'element',\n tagName: 'div',\n properties: { className: ['ov-callout-label'] },\n children: [{ type: 'text', value: CALLOUT_LABEL[type] }],\n };\n node.children = [label, ...node.children];\n });\n };\n}\n\nfunction collectHeadings(tree: Root, into: Heading[]): void {\n visit(tree, 'element', (node: Element) => {\n if (!/^h[2-3]$/.test(node.tagName)) return;\n const depth = Number(node.tagName.slice(1));\n const id = typeof node.properties?.id === 'string' ? node.properties.id : '';\n if (!id) return;\n // rehype-autolink-headings appends a `<a class=\"heading-anchor\">#</a>` to\n // every heading. Skip that child when collecting the text so the ToC\n // doesn't read \"Install#\" / \"1. Build#\" etc.\n const text = textOfHeading(node).trim();\n into.push({ depth, text, id });\n });\n}\n\nfunction textOfHeading(node: Element): string {\n let out = '';\n for (const child of node.children as ElementContent[]) {\n if (child.type === 'text') {\n out += child.value;\n } else if (child.type === 'element') {\n const classNames = readClassNames(child);\n if (classNames.includes('heading-anchor')) continue;\n out += textOf(child);\n }\n }\n return out;\n}\n\nfunction highlightCodeBlocks(\n tree: Root,\n highlighter: Highlighter,\n themes: { light: string; dark: string },\n): void {\n visit(tree, 'element', (node: Element, index, parent) => {\n if (node.tagName !== 'pre' || !parent || typeof index !== 'number' || !node.children?.length) {\n return;\n }\n const code = node.children.find(\n (c): c is Element => c.type === 'element' && c.tagName === 'code',\n );\n if (!code) return;\n\n const langClass = readClassNames(code).find((c) => c.startsWith('language-'));\n const lang = langClass ? langClass.slice('language-'.length) : 'text';\n if (!SHIKI_LANGS.includes(lang as (typeof SHIKI_LANGS)[number])) return;\n\n const source = textOf(code);\n const hast = highlighter.codeToHast(source, {\n lang: lang as (typeof SHIKI_LANGS)[number],\n themes,\n defaultColor: false,\n });\n const replacement = hast.children[0];\n if (!replacement || replacement.type !== 'element') return;\n // Tag the rendered <pre> with its language so CSS can surface a\n // subtle eyebrow label (top-right of every fenced block). Also\n // tag a `data-copy` attribute that the client-side copy button\n // hook (script.js) looks for to know which blocks are eligible.\n replacement.properties = {\n ...(replacement.properties ?? {}),\n 'data-language': LANG_LABEL[lang as (typeof SHIKI_LANGS)[number]] ?? lang,\n 'data-copy': 'true',\n };\n (parent.children as ElementContent[])[index] = replacement;\n });\n}\n\n/**\n * Display labels for the shiki language IDs we support. Lowercase,\n * short — sits in the corner of the code block as a quiet eyebrow.\n */\nconst LANG_LABEL: Record<(typeof SHIKI_LANGS)[number], string> = {\n typescript: 'ts',\n tsx: 'tsx',\n javascript: 'js',\n jsx: 'jsx',\n json: 'json',\n bash: 'bash',\n shell: 'shell',\n markdown: 'md',\n yaml: 'yaml',\n html: 'html',\n css: 'css',\n};\n\nfunction readClassNames(node: Element): string[] {\n const cn = node.properties?.className;\n if (Array.isArray(cn)) return cn.filter((c): c is string => typeof c === 'string');\n if (typeof cn === 'string') return cn.split(/\\s+/);\n return [];\n}\n\nfunction textOf(node: Element): string {\n let out = '';\n for (const child of node.children as ElementContent[]) {\n if (child.type === 'text') out += child.value;\n else if (child.type === 'element') out += textOf(child);\n }\n return out;\n}\n","import { readdir, readFile, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport matter from 'gray-matter';\n\nexport interface NavNode {\n /** Display title. */\n title: string;\n /** Site-relative URL with trailing slash (`/foo/`, `/foo/bar/`, or `/` for root). */\n url: string;\n /** Source file relative to project root, or undefined for directory-only nodes. */\n sourcePath?: string;\n /** Child nodes (sub-pages and sub-directories). */\n children: NavNode[];\n}\n\n/**\n * Flatten a nav tree to the linear reading order — depth-first, root first.\n * Used to compute prev/next links on each doc page.\n *\n * Includes only nodes that point to a real source file (`sourcePath !== undefined`).\n * Directory-only group nodes are skipped.\n */\nexport function flattenNav(root: NavNode): NavNode[] {\n const out: NavNode[] = [];\n function walk(node: NavNode): void {\n if (node.sourcePath !== undefined) out.push(node);\n for (const child of node.children) walk(child);\n }\n walk(root);\n return out;\n}\n\n/**\n * Walk the nav tree to find the chain of ancestors ending at `url`, root-first.\n * Returns `[]` when the url isn't present in the tree.\n *\n * The result includes the root node and the matching node itself, so the last\n * entry is the current page. Callers typically render this as the breadcrumb\n * trail and skip the leading root entry.\n */\nexport function findBreadcrumbs(root: NavNode, url: string): NavNode[] {\n const path: NavNode[] = [];\n function walk(node: NavNode): boolean {\n path.push(node);\n if (node.url === url) return true;\n for (const child of node.children) {\n if (walk(child)) return true;\n }\n path.pop();\n return false;\n }\n walk(root);\n return path;\n}\n\nexport interface AdjacentPages {\n prev?: NavNode;\n next?: NavNode;\n}\n\n/**\n * Find the prev / next page for `url` in the flattened nav order.\n * Returns `{}` when `url` is not in the nav (e.g. the root landing page) or\n * when there's no neighbour on a given side.\n */\nexport function findAdjacent(root: NavNode, url: string): AdjacentPages {\n const flat = flattenNav(root);\n const idx = flat.findIndex((p) => p.url === url);\n if (idx === -1) return {};\n return {\n prev: idx > 0 ? flat[idx - 1] : undefined,\n next: idx + 1 < flat.length ? flat[idx + 1] : undefined,\n };\n}\n\ninterface MetaJson {\n title?: string;\n order?: string[];\n}\n\ninterface FsItem {\n name: string;\n abs: string;\n isDir: boolean;\n}\n\n/**\n * Walk a content directory and build a `NavNode` tree:\n *\n * - `.md` files become page nodes; `index.md` represents its containing\n * directory (its title and url collapse onto the parent node).\n * - Subdirectories become group nodes; each is recursively built.\n * - Per-directory `_meta.json` may set `title` and an explicit `order` of\n * child slugs.\n * - Without explicit order, items sort alphabetically by slug, but any\n * directory's `index` always leads.\n */\nexport async function buildNav(rootDir: string, cwd: string): Promise<NavNode> {\n const absRoot = path.resolve(cwd, rootDir);\n const rel = (abs: string) => '/' + path.posix.relative(absRoot, abs).replace(/\\\\/g, '/');\n return walk(absRoot, '/', cwd, rel);\n}\n\nasync function walk(\n dirAbs: string,\n urlPrefix: string,\n cwd: string,\n rel: (abs: string) => string,\n): Promise<NavNode> {\n const items = await listDir(dirAbs);\n const meta = await readMeta(dirAbs);\n\n const indexItem = items.find((i) => !i.isDir && stem(i.name) === 'index' && isMarkdown(i.name));\n const indexNode = indexItem ? await pageNode(indexItem.abs, urlPrefix, cwd) : undefined;\n\n const children: NavNode[] = [];\n for (const item of items) {\n if (item.name.startsWith('_')) continue;\n if (item === indexItem) continue;\n if (item.isDir) {\n const childUrl = ensureTrailingSlash(urlPrefix + item.name + '/');\n children.push(await walk(item.abs, childUrl, cwd, rel));\n } else if (isMarkdown(item.name)) {\n const childUrl = ensureTrailingSlash(urlPrefix + stem(item.name) + '/');\n children.push(await pageNode(item.abs, childUrl, cwd));\n }\n }\n\n applyOrdering(children, meta);\n\n const title =\n meta?.title ?? indexNode?.title ?? titleFromSegment(path.basename(dirAbs)) ?? 'Untitled';\n const url = ensureTrailingSlash(urlPrefix);\n\n return {\n title,\n url,\n sourcePath: indexNode?.sourcePath,\n children,\n };\n}\n\nasync function pageNode(abs: string, url: string, cwd: string): Promise<NavNode> {\n const raw = await readFile(abs, 'utf8');\n const { data, content } = matter(raw);\n const fmTitle = typeof data.title === 'string' ? data.title : undefined;\n const h1 = firstH1(content);\n const title = fmTitle ?? h1 ?? titleFromSegment(stem(path.basename(abs))) ?? 'Untitled';\n return {\n title,\n url: ensureTrailingSlash(url),\n sourcePath: path.relative(cwd, abs).replace(/\\\\/g, '/'),\n children: [],\n };\n}\n\nasync function listDir(dirAbs: string): Promise<FsItem[]> {\n const names = await readdir(dirAbs);\n const out: FsItem[] = [];\n for (const name of names) {\n const abs = path.join(dirAbs, name);\n const st = await stat(abs);\n out.push({ name, abs, isDir: st.isDirectory() });\n }\n return out;\n}\n\nasync function readMeta(dirAbs: string): Promise<MetaJson | undefined> {\n const metaPath = path.join(dirAbs, '_meta.json');\n try {\n const raw = await readFile(metaPath, 'utf8');\n const parsed = JSON.parse(raw) as MetaJson;\n return parsed;\n } catch {\n return undefined;\n }\n}\n\nfunction applyOrdering(children: NavNode[], meta: MetaJson | undefined): void {\n if (meta?.order && meta.order.length > 0) {\n const rank = new Map(meta.order.map((slug, i) => [slug, i]));\n children.sort((a, b) => {\n const ra = rank.get(slugOf(a)) ?? Number.MAX_SAFE_INTEGER;\n const rb = rank.get(slugOf(b)) ?? Number.MAX_SAFE_INTEGER;\n if (ra !== rb) return ra - rb;\n return a.title.localeCompare(b.title);\n });\n return;\n }\n children.sort((a, b) => a.title.localeCompare(b.title));\n}\n\nfunction slugOf(node: NavNode): string {\n const trimmed = node.url.replace(/\\/+$/, '');\n return trimmed.slice(trimmed.lastIndexOf('/') + 1);\n}\n\nfunction isMarkdown(name: string): boolean {\n return /\\.(md|markdown)$/i.test(name);\n}\n\nfunction stem(name: string): string {\n return name.replace(/\\.(md|markdown)$/i, '');\n}\n\nfunction ensureTrailingSlash(p: string): string {\n return p.endsWith('/') ? p : p + '/';\n}\n\nfunction titleFromSegment(seg: string): string | undefined {\n if (!seg) return undefined;\n return seg\n .split(/[-_]/)\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n}\n\nfunction firstH1(content: string): string | undefined {\n const m = content.match(/^\\s*#\\s+(.+)$/m);\n return m ? m[1]!.trim() : undefined;\n}\n","import { execFile } from 'node:child_process';\nimport { stat } from 'node:fs/promises';\nimport { promisify } from 'node:util';\n\n// `execFile` does NOT spawn a shell — args are passed verbatim. This is the\n// security-critical difference vs. `exec`: a path containing `$(...)`, `;`,\n// backticks, etc. is treated as a literal filename argument to `git`, never\n// interpreted by sh/zsh.\nconst execFileAsync = promisify(execFile);\n\nconst WORDS_PER_MINUTE = 200;\n\n/**\n * Count visible-prose words in a Markdown source. Strips fenced code blocks,\n * inline code, link / image syntax, and frontmatter delimiters before counting\n * so the reading-time estimate reflects what a reader actually reads.\n *\n * Conservative on purpose — it isn't trying to be a perfect linguist; it just\n * needs to be stable and roughly correct.\n */\nexport function countWords(markdown: string): number {\n const stripped = markdown\n // Fenced code blocks (``` … ```)\n .replace(/```[\\s\\S]*?```/g, ' ')\n // Indented code blocks (4-space leading)\n .replace(/^( {4}|\\t).*$/gm, ' ')\n // Inline code (`foo`)\n .replace(/`[^`\\n]*`/g, ' ')\n // Image markup keeps the alt text as words; just strip the URL part.\n .replace(/!\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n // Link markup keeps the link text.\n .replace(/\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n // HTML tags\n .replace(/<[^>]+>/g, ' ')\n // Heading / list / blockquote punctuation\n .replace(/^[#>\\-*+]+\\s+/gm, '');\n // Words = runs of non-whitespace.\n const matches = stripped.match(/\\S+/g);\n return matches ? matches.length : 0;\n}\n\n/**\n * Estimate reading time in whole minutes, rounded up. Always at least 1.\n */\nexport function readingMinutes(words: number): number {\n if (words <= 0) return 0;\n return Math.max(1, Math.ceil(words / WORDS_PER_MINUTE));\n}\n\nexport interface LastModifiedInput {\n /** Absolute path of the source file. */\n absPath: string;\n /** Project root — git commands run with this as cwd. */\n cwd: string;\n}\n\n/**\n * Resolve a page's last-modified timestamp. Prefers `git log -1 --format=%cI`\n * because mtime is unreliable in CI (every checkout sets every file to \"now\");\n * falls back to filesystem mtime when:\n * - git isn't available\n * - the directory isn't a git repo\n * - the file isn't tracked yet\n *\n * Returns an ISO-8601 string, or `undefined` if neither source produced a value.\n */\nexport async function lastModifiedISO(input: LastModifiedInput): Promise<string | undefined> {\n const gitTime = await tryGitLog(input);\n if (gitTime) return gitTime;\n try {\n const s = await stat(input.absPath);\n return s.mtime.toISOString();\n } catch {\n return undefined;\n }\n}\n\nasync function tryGitLog(input: LastModifiedInput): Promise<string | undefined> {\n try {\n const { stdout } = await execFileAsync(\n 'git',\n ['log', '-1', '--format=%cI', '--', input.absPath],\n { cwd: input.cwd, timeout: 2000 },\n );\n const value = stdout.trim();\n return value.length > 0 ? value : undefined;\n } catch {\n return undefined;\n }\n}\n","import * as pagefind from 'pagefind';\n\nexport interface IndexSiteInput {\n /** Absolute path of the `dist/` directory the build wrote. */\n outputAbs: string;\n}\n\nexport interface IndexSiteResult {\n /** Number of pages Pagefind successfully indexed. */\n pageCount: number;\n /** Pagefind's internal exit code (`0` clean). Non-zero means partial failure. */\n exitCode: number;\n /** Any non-fatal errors emitted by Pagefind. */\n errors: string[];\n}\n\n/**\n * Run Pagefind against an already-built site. Emits a `pagefind/` subdirectory\n * inside `outputAbs` containing the index, the wasm bundle, and the default\n * UI assets that the template loads at runtime.\n *\n * Pagefind is heavy as a build-time dep but ships nothing extra at runtime\n * beyond its own bundle (loaded only on pages where the template injects\n * `<script src=\"/pagefind/pagefind-ui.js\">`). When `site.search.enabled` is\n * false, this function is never called and Pagefind doesn't even load.\n */\nexport async function indexSite(input: IndexSiteInput): Promise<IndexSiteResult> {\n const { index } = await pagefind.createIndex({});\n if (!index) {\n return { pageCount: 0, exitCode: 1, errors: ['pagefind.createIndex returned no index'] };\n }\n const addRes = await index.addDirectory({ path: input.outputAbs });\n const writeRes = await index.writeFiles({ outputPath: `${input.outputAbs}/pagefind` });\n await pagefind.close();\n return {\n pageCount: addRes.page_count ?? 0,\n exitCode: writeRes.errors.length === 0 ? 0 : 1,\n errors: writeRes.errors,\n };\n}\n","import type { PageOutput } from './build.js';\n\nexport interface GenerateRssInput {\n pages: PageOutput[];\n baseUrl: string;\n /** Site-prefix path (e.g. `/ovellum`). Prepended to each page URL. */\n basePath?: string;\n /** Channel title — `site.title`. */\n title: string;\n /** Channel description — `site.description`, optional. */\n description?: string;\n /** URLs to exclude from the feed (e.g. `/404/`, `/`). */\n exclude?: string[];\n /** Cap on the number of items emitted. Defaults to 20. */\n limit?: number;\n /** Build timestamp used for the channel's `<lastBuildDate>`. */\n generatedAt?: Date;\n}\n\n/**\n * Generate an RSS 2.0 feed body from the pages a site build produced.\n *\n * Returns `undefined` when `baseUrl` is missing — RSS items require\n * absolute URLs and the channel `<link>` is required.\n *\n * Items are sorted by `lastModified` (newest first); pages with no\n * `lastModified` fall to the end in their original order. Pages without\n * a `description` emit an empty `<description>` element, which is valid\n * RSS 2.0.\n */\nexport function generateRss(input: GenerateRssInput): string | undefined {\n if (!input.baseUrl) return undefined;\n const base = stripTrailingSlash(input.baseUrl);\n const prefix = input.basePath ? stripTrailingSlash(input.basePath) : '';\n const exclude = new Set(input.exclude ?? ['/404/']);\n const limit = input.limit ?? 20;\n const generatedAt = input.generatedAt ?? new Date();\n\n const homeLink = base + (prefix || '/');\n const selfLink = base + prefix + '/feed.xml';\n\n const items = input.pages\n .filter((p) => !exclude.has(p.url))\n .sort((a, b) => compareLastMod(a.lastModified, b.lastModified))\n .slice(0, limit)\n .map((p) => renderItem(p, base + prefix));\n\n const channelDesc = input.description ? escapeXml(input.description) : '';\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\">\n <channel>\n <title>${escapeXml(input.title)}</title>\n <link>${escapeXml(homeLink)}</link>\n <description>${channelDesc}</description>\n <atom:link href=\"${escapeXml(selfLink)}\" rel=\"self\" type=\"application/rss+xml\" />\n <lastBuildDate>${toRfc822(generatedAt)}</lastBuildDate>\n${items.join('\\n')}\n </channel>\n</rss>\n`;\n}\n\nfunction renderItem(page: PageOutput, baseWithPrefix: string): string {\n const link = baseWithPrefix + page.url;\n const pubDate = page.lastModified ? toRfc822(new Date(page.lastModified)) : undefined;\n const lines = [\n ' <item>',\n ` <title>${escapeXml(page.title)}</title>`,\n ` <link>${escapeXml(link)}</link>`,\n ` <guid isPermaLink=\"true\">${escapeXml(link)}</guid>`,\n ` <description>${page.description ? escapeXml(page.description) : ''}</description>`,\n ];\n if (pubDate) lines.push(` <pubDate>${pubDate}</pubDate>`);\n lines.push(' </item>');\n return lines.join('\\n');\n}\n\nfunction compareLastMod(a: string | undefined, b: string | undefined): number {\n if (a && b) return b.localeCompare(a);\n if (a && !b) return -1;\n if (!a && b) return 1;\n return 0;\n}\n\nfunction toRfc822(d: Date): string {\n return d.toUTCString();\n}\n\nfunction stripTrailingSlash(s: string): string {\n return s.replace(/\\/+$/, '');\n}\n\nfunction escapeXml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n}\n","import type { PageOutput } from './build.js';\n\nexport interface GenerateSitemapInput {\n pages: PageOutput[];\n baseUrl: string;\n /** Site-prefix path (e.g. `/ovellum`). Prepended to each page URL. */\n basePath?: string;\n /** URLs to exclude from the sitemap (e.g. `/404/`). */\n exclude?: string[];\n}\n\n/**\n * Generate a `sitemap.xml` body from the list of pages a site build produced.\n *\n * Returns `undefined` when `baseUrl` is missing — without it we can't emit\n * fully-qualified URLs and most sitemap consumers require absolute paths.\n *\n * v1 emits only `<loc>` per URL. `<lastmod>` (from git mtime) and\n * `<changefreq>` / `<priority>` are deferred until a build-time git lookup\n * is wired.\n */\nexport function generateSitemap(input: GenerateSitemapInput): string | undefined {\n if (!input.baseUrl) return undefined;\n const base = stripTrailingSlash(input.baseUrl);\n const prefix = input.basePath ? stripTrailingSlash(input.basePath) : '';\n const exclude = new Set(input.exclude ?? ['/404/']);\n\n const entries = input.pages\n .filter((p) => !exclude.has(p.url))\n .map((p) => ` <url>\\n <loc>${escapeXml(base + prefix + p.url)}</loc>\\n </url>`)\n .join('\\n');\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${entries}\n</urlset>\n`;\n}\n\nfunction stripTrailingSlash(s: string): string {\n return s.replace(/\\/+$/, '');\n}\n\nfunction escapeXml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n}\n","/**\n * Inline SVG icon registry, backed by Lucide.\n *\n * Each `<svg>` we emit follows Lucide's canonical attribute set:\n *\n * - 24×24 viewBox\n * - fill=\"none\", stroke=\"currentColor\"\n * - stroke-width=\"2\", stroke-linecap=\"round\", stroke-linejoin=\"round\"\n *\n * The icon nodes come straight from the `lucide` package — we import each one\n * by name, which means esbuild/tsup tree-shakes everything else away. Adding a\n * new icon is one import + one entry in REGISTRY.\n *\n * Why import from `lucide/dist/esm/icons/<name>.mjs` instead of the package\n * root: the root export only exposes Lucide's runtime helpers (`createIcons`),\n * not the icon tuples themselves. Each per-icon `.mjs` default-exports an\n * `IconNode[]` like `[['path', { d: 'M4 5h16' }], …]`.\n *\n * Lucide-static (the SVG-file variant) would also work, but it'd mean reading\n * files at module load. This avoids the I/O while keeping the wire payload\n * tiny (≈100B per icon after tree-shaking).\n */\n\nimport Check from 'lucide/dist/esm/icons/check.mjs';\nimport ChevronDown from 'lucide/dist/esm/icons/chevron-down.mjs';\nimport ExternalLink from 'lucide/dist/esm/icons/external-link.mjs';\nimport Mail from 'lucide/dist/esm/icons/mail.mjs';\nimport Menu from 'lucide/dist/esm/icons/menu.mjs';\nimport Monitor from 'lucide/dist/esm/icons/monitor.mjs';\nimport Moon from 'lucide/dist/esm/icons/moon.mjs';\nimport Package from 'lucide/dist/esm/icons/package.mjs';\nimport Rss from 'lucide/dist/esm/icons/rss.mjs';\nimport Search from 'lucide/dist/esm/icons/search.mjs';\nimport Sun from 'lucide/dist/esm/icons/sun.mjs';\nimport X from 'lucide/dist/esm/icons/x.mjs';\n\ntype LucideAttrs = Record<string, string | number>;\ntype LucideNode = [string, LucideAttrs, LucideChild[]?];\ntype LucideChild = [string, LucideAttrs, LucideChild[]?];\n\n// Lucide v1 dropped brand marks (trademark concerns). Hand-rolled GitHub mark\n// kept here, matched to Lucide's stroke/curve language so it sits beside the\n// real Lucide icons without looking out of place.\nconst GITHUB_MARK: LucideChild[] = [\n [\n 'path',\n {\n d: 'M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.4 5.4 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4',\n },\n ],\n ['path', { d: 'M9 18c-4.51 2-5-2-7-2' }],\n];\n\n// Public name → Lucide node array. Public names follow our existing API\n// (`close` instead of Lucide's `x`) so renaming doesn't ripple through call\n// sites.\nconst REGISTRY = {\n menu: Menu,\n close: X,\n sun: Sun,\n moon: Moon,\n monitor: Monitor,\n 'chevron-down': ChevronDown,\n github: GITHUB_MARK,\n 'external-link': ExternalLink,\n search: Search,\n check: Check,\n rss: Rss,\n mail: Mail,\n package: Package,\n} as const;\n\nexport type IconName = keyof typeof REGISTRY;\n\n/**\n * Backwards-compatible export: each entry is the inner SVG markup (no outer\n * `<svg>` wrapper). Preserved so existing call sites that read from `ICONS`\n * directly keep working.\n */\nexport const ICONS = Object.fromEntries(\n (Object.keys(REGISTRY) as IconName[]).map((name) => [name, nodesToInnerHtml(REGISTRY[name])]),\n) as Record<IconName, string>;\n\nexport interface RenderIconOptions {\n /** CSS class on the `<svg>` element. */\n class?: string;\n /** Pixel size — applied as both width and height. Defaults to 20. */\n size?: number;\n /** `aria-hidden` — true by default since icons are usually decorative. */\n ariaHidden?: boolean;\n /** Visible accessible label. Forces `aria-hidden` off and adds `role=\"img\"`. */\n label?: string;\n}\n\n/**\n * Render an icon as an HTML-ready SVG string. The result is safe to inline\n * directly into a template — every component is statically defined here.\n */\nexport function renderIcon(name: IconName, opts: RenderIconOptions = {}): string {\n const size = opts.size ?? 20;\n const className = opts.class ? ` class=\"${escapeAttr(opts.class)}\"` : '';\n const labelled = typeof opts.label === 'string' && opts.label.length > 0;\n const a11y = labelled\n ? ` role=\"img\" aria-label=\"${escapeAttr(opts.label!)}\"`\n : opts.ariaHidden === false\n ? ''\n : ' aria-hidden=\"true\" focusable=\"false\"';\n const inner = ICONS[name];\n return `<svg${className} width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"${a11y}>${inner}</svg>`;\n}\n\nfunction nodesToInnerHtml(nodes: LucideChild[]): string {\n return nodes.map(nodeToHtml).join('');\n}\n\nfunction nodeToHtml(node: LucideChild | LucideNode): string {\n const [tag, attrs, children] = node;\n const attrStr = Object.entries(attrs)\n .map(([k, v]) => `${k}=\"${escapeAttr(String(v))}\"`)\n .join(' ');\n const inner = children && children.length > 0 ? nodesToInnerHtml(children) : '';\n return inner ? `<${tag} ${attrStr}>${inner}</${tag}>` : `<${tag} ${attrStr}/>`;\n}\n\nfunction escapeAttr(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n","/**\n * Normalise a `site.basePath` config value. Returns the empty string for\n * root-hosted sites, otherwise a string that starts with `/` and has no\n * trailing slash (`/ovellum`, `/docs`, `/foo/bar`).\n *\n * Idempotent — feeding the result back through is a no-op.\n */\nexport function normaliseBasePath(value: string | undefined): string {\n if (!value) return '';\n let s = value.trim();\n if (!s) return '';\n if (!s.startsWith('/')) s = '/' + s;\n while (s.length > 1 && s.endsWith('/')) s = s.slice(0, -1);\n return s === '/' ? '' : s;\n}\n\n/**\n * Prepend the configured base path to a site-internal URL. External URLs,\n * fragment-only links, and relative links pass through unchanged.\n *\n * siteUrl('/foo/', '/ovellum') → '/ovellum/foo/'\n * siteUrl('/', '/ovellum') → '/ovellum/'\n * siteUrl('/foo/', '') → '/foo/'\n * siteUrl('https://x.test/y', '/ov') → 'https://x.test/y'\n * siteUrl('#hash', '/ov') → '#hash'\n * siteUrl('relative.md', '/ov') → 'relative.md'\n */\nexport function siteUrl(url: string, basePath: string): string {\n if (!url) return url;\n if (/^[a-z][a-z0-9+.-]*:/i.test(url)) return url; // any scheme (http, https, mailto, tel, …)\n if (url.startsWith('//')) return url; // protocol-relative\n if (url.startsWith('#')) return url;\n if (!url.startsWith('/')) return url;\n if (!basePath) return url;\n // Avoid double prefixing if the caller already passed a prefixed URL in.\n if (url === basePath || url.startsWith(basePath + '/')) return url;\n return basePath + url;\n}\n\n/**\n * Asset URL helper for things like `/assets/ovellum.css`. Same logic as\n * `siteUrl`, but always returns a trailing slash for the prefix when called\n * with an empty path so callers don't have to special-case the \"/\" case.\n *\n * assetsPrefix('/ovellum') → '/ovellum/'\n * assetsPrefix('') → '/'\n */\nexport function assetsPrefix(basePath: string): string {\n return basePath ? basePath + '/' : '/';\n}\n","import type { OvellumLandingConfig, OvellumSiteConfig } from '@ovellum/core';\nimport { ICONS, renderIcon, type IconName } from './icons.js';\nimport type { Heading } from './markdown.js';\nimport type { NavNode } from './nav.js';\nimport { assetsPrefix as assetsPrefixFor, normaliseBasePath, siteUrl } from './url.js';\n\nexport interface ShellOptions {\n site: OvellumSiteConfig & { title: string };\n /** Full <title> for the page (already composed upstream). */\n fullTitle: string;\n /** Used in <meta name=\"description\"> and the canonical link. */\n description?: string;\n /** Site-relative URL for canonical/OG; empty for landings. */\n url: string;\n /** Path prefix for static assets, defaults to '/'. */\n assetsPrefix?: string;\n /** Optional Docs link added to the topbar (typically only on landing pages). */\n docsHref?: string;\n /** Build timestamp (ISO) used in the footer. */\n generatedAt: string;\n /** Body HTML (already rendered) placed between <header> and <footer>. */\n body: string;\n /** Outer body class — distinguishes landing pages from doc pages. */\n bodyClass?: string;\n}\n\nfunction renderShell(opts: ShellOptions): string {\n const basePath = normaliseBasePath(opts.site.basePath);\n const assets = opts.assetsPrefix ?? assetsPrefixFor(basePath);\n const desc = opts.description ?? opts.site.description ?? '';\n // Optional-chain because `site.search` may be undefined when callers pass a\n // partial site object (template/landing tests cast partial fixtures to the\n // full type). DEFAULT_CONFIG sets `search.enabled: false`.\n const searchEnabled = opts.site.search?.enabled === true;\n const searchHead = searchEnabled\n ? `<link rel=\"stylesheet\" href=\"${escapeAttr(assets)}pagefind/pagefind-ui.css\">`\n : '';\n const searchScripts = searchEnabled\n ? `<script src=\"${escapeAttr(assets)}pagefind/pagefind-ui.js\" defer></script>\n <script>\n window.addEventListener('DOMContentLoaded', function () {\n if (typeof PagefindUI === 'undefined') return;\n new PagefindUI({ element: '#ov-search', showSubResults: true, resetStyles: false });\n });\n </script>`\n : '';\n return `<!doctype html>\n<html lang=\"en\" data-theme=\"${escapeAttr(opts.site.defaultTheme)}\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <!-- Drives Safari's URL bar tint and the top-of-page rubber-band area.\n data-light / data-dark are hex approximations of --color-bg\n (body) in light + dark — the topbar now reads as a continuation\n of the body, so the URL bar should match body, not chrome.\n Update these if --color-bg moves. The inline boot script below\n picks the right one before paint, and script.js keeps it in\n sync with the theme toggle + OS changes. -->\n <meta name=\"theme-color\" id=\"ov-theme-color\" data-light=\"#f4f4f4\" data-dark=\"#101010\" content=\"#f4f4f4\">\n <title>${escapeHtml(opts.fullTitle)}</title>\n ${desc ? `<meta name=\"description\" content=\"${escapeAttr(desc)}\">` : ''}\n ${opts.site.baseUrl ? `<link rel=\"canonical\" href=\"${escapeAttr(join(opts.site.baseUrl, basePath + opts.url))}\">` : ''}\n ${opts.site.baseUrl ? `<link rel=\"alternate\" type=\"application/rss+xml\" title=\"${escapeAttr(opts.site.title)}\" href=\"${escapeAttr(join(opts.site.baseUrl, basePath + '/feed.xml'))}\">` : ''}\n <link rel=\"stylesheet\" href=\"${escapeAttr(assets)}assets/ovellum.css\">\n ${searchHead}\n <script>\n (function () {\n try {\n var t = localStorage.getItem('ovellum-theme');\n if (t === 'light' || t === 'dark' || t === 'auto') {\n document.documentElement.setAttribute('data-theme', t);\n } else {\n t = document.documentElement.getAttribute('data-theme') || 'auto';\n }\n var effective = t;\n if (t === 'auto') {\n effective = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n var meta = document.getElementById('ov-theme-color');\n if (meta) {\n meta.setAttribute('content', meta.getAttribute(effective === 'dark' ? 'data-dark' : 'data-light'));\n }\n } catch (_) {}\n })();\n </script>\n</head>\n<body${opts.bodyClass ? ` class=\"${escapeAttr(opts.bodyClass)}\"` : ''}>\n ${renderTopbar(opts.site, assets, opts.docsHref ? siteUrl(opts.docsHref, basePath) : undefined, searchEnabled, basePath)}\n ${opts.body}\n ${renderFooter(opts.site, opts.generatedAt, basePath)}\n ${searchScripts}\n <script src=\"${escapeAttr(assets)}assets/ovellum.js\" defer></script>\n</body>\n</html>\n`;\n}\n\n// Ovellum wordmark glyph. Source of truth lives at\n// `website/brand/ovellum-logo.afdesign`; the canonical export sits at\n// `website/content/public/ovellum-logo.svg`. Inlined here (stripped of the\n// XML prolog and editor-specific namespaces, `fill=\"currentColor\"` set) so\n// the mark follows light/dark theme alongside the wordmark beside it.\n// Decorative: the adjacent text \"Ovellum\" carries the accessible name.\nconst BRAND_MARK = `<svg class=\"ov-brand-mark\" width=\"24\" height=\"24\" viewBox=\"0 0 3334 3334\" fill=\"currentColor\" aria-hidden=\"true\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1610.79,192.942l-603.283,-0.069c-72.722,290.674 -294.48,871.657 -294.48,871.657c-53.158,128.398 -37.404,275.067 41.795,389.217l743.687,1149.95l0,233.06c-42.509,41.505 -68.98,99.335 -68.98,163.352c-0.069,126.096 102.07,228.236 228.167,228.167c126.096,0.069 228.308,-102.144 228.235,-228.236c-0,-64.017 -26.471,-121.847 -68.985,-163.21l0,-233.06l743.765,-1150.03c79.122,-114.228 94.806,-260.819 41.722,-389.143c0,-0 -221.472,-580.983 -294.052,-871.652l-603.352,0l-94.239,-0.005Zm323.188,921.357c0,140.409 -104.731,256.078 -240.177,273.7l0,1386.96c-11.868,-1.795 -23.809,-3.093 -36.036,-3.093c-12.375,-0 -24.243,1.224 -36.037,3.093l-0,-1386.97c-135.593,-17.623 -240.251,-133.218 -240.251,-273.627c0,-152.635 123.652,-276.287 276.288,-276.287c152.635,0 276.282,123.656 276.213,276.223Z\"/></svg>`;\n\ninterface ResolvedTopbarItem {\n label: string;\n href: string;\n external: boolean;\n icon?: IconName;\n}\n\n/** Resolve each configured item's href once so the auto-Docs link can dedupe. */\nfunction resolveTopbarItems(\n site: OvellumSiteConfig & { title: string },\n basePath: string,\n): ResolvedTopbarItem[] {\n return (site.topbarNav ?? []).map((item) => {\n const external = item.external === true || /^https?:\\/\\//i.test(item.href);\n const icon = item.icon && item.icon in ICONS ? (item.icon as IconName) : undefined;\n return {\n label: item.label,\n href: external ? item.href : siteUrl(item.href, basePath),\n external,\n icon,\n };\n });\n}\n\n/**\n * Render the topbar nav links. `compact` collapses icon items to icon-only\n * (desktop); otherwise the icon sits beside its visible label (mobile sheet).\n * The implicit \"Docs\" link is appended only when nothing already points there.\n */\nfunction renderTopbarLinks(\n items: ResolvedTopbarItem[],\n docsHref: string | undefined,\n compact: boolean,\n): string {\n const links = items.map(({ label, href, external, icon }) => {\n const rel = external ? ' rel=\"noopener\" target=\"_blank\"' : '';\n if (icon && compact) {\n return `<a class=\"ov-topbar-link ov-topbar-link--icon\" href=\"${escapeAttr(href)}\"${rel} aria-label=\"${escapeAttr(label)}\" title=\"${escapeAttr(label)}\">${renderIcon(icon, { class: 'ov-topbar-glyph', size: 18 })}<span class=\"ov-sr-only\">${escapeHtml(label)}</span></a>`;\n }\n const glyph = icon ? `${renderIcon(icon, { class: 'ov-topbar-glyph', size: 18 })}` : '';\n const ext =\n external && !icon\n ? ` ${renderIcon('external-link', { class: 'ov-topbar-icon', size: 14 })}`\n : '';\n return `<a class=\"ov-topbar-link\" href=\"${escapeAttr(href)}\"${rel}>${glyph}${escapeHtml(label)}${ext}</a>`;\n });\n if (docsHref && !items.some((it) => it.href === docsHref)) {\n links.push(\n `<a class=\"ov-topbar-link ov-topbar-link--docs\" href=\"${escapeAttr(docsHref)}\">Docs</a>`,\n );\n }\n return links.join('\\n ');\n}\n\nfunction renderTopbar(\n site: OvellumSiteConfig & { title: string },\n assets: string,\n docsHref: string | undefined,\n searchEnabled: boolean,\n basePath: string,\n): string {\n const items = resolveTopbarItems(site, basePath);\n const desktopLinks = renderTopbarLinks(items, docsHref, true);\n const mobileLinks = renderTopbarLinks(items, docsHref, false);\n const search = searchEnabled ? `<div id=\"ov-search\" class=\"ov-search\"></div>` : '';\n // The hamburger only appears below the responsive breakpoint via CSS.\n const menuButton = `<button class=\"ov-topbar-menu\" type=\"button\"\n aria-label=\"Open menu\" aria-expanded=\"false\" aria-controls=\"ov-mobile-nav\"\n data-ov-menu-toggle>\n <span class=\"ov-topbar-menu-open\">${renderIcon('menu', { size: 22 })}</span>\n <span class=\"ov-topbar-menu-close\">${renderIcon('close', { size: 22 })}</span>\n </button>`;\n // Two instances: one in the desktop cluster, one in the mobile sheet. Both\n // carry `data-ov-theme-toggle` and stay in sync via the `:root[data-theme]`\n // CSS — script.js wires every instance, not just the first.\n const themeButton = `<button class=\"ov-theme-toggle\" type=\"button\"\n aria-label=\"Toggle theme\" title=\"Toggle theme\" data-ov-theme-toggle>\n <span class=\"ov-theme-icon ov-theme-icon-auto\">${renderIcon('monitor')}</span>\n <span class=\"ov-theme-icon ov-theme-icon-light\">${renderIcon('sun')}</span>\n <span class=\"ov-theme-icon ov-theme-icon-dark\">${renderIcon('moon')}</span>\n </button>`;\n const versionBadge = site.version\n ? `<span class=\"ov-brand-version\" aria-label=\"Stable version ${escapeAttr(site.version)}\">${escapeHtml(site.version)}</span>`\n : '';\n return `<header class=\"ov-topbar\">\n <div class=\"ov-topbar-inner\">\n <div class=\"ov-brand-row\">\n <a class=\"ov-brand\" href=\"${escapeAttr(assets)}\">${BRAND_MARK}<span class=\"ov-brand-name\">${escapeHtml(site.title)}</span></a>\n ${versionBadge}\n </div>\n <div class=\"ov-topbar-search\">${search}</div>\n <div class=\"ov-topbar-right\">\n <nav class=\"ov-topbar-nav\" aria-label=\"Primary\">${desktopLinks}</nav>\n ${themeButton}\n ${menuButton}\n </div>\n <nav id=\"ov-mobile-nav\" class=\"ov-mobile-nav\" aria-label=\"Mobile\">\n ${mobileLinks}\n <div class=\"ov-mobile-theme\">\n <span class=\"ov-mobile-theme-label\">Theme</span>\n ${themeButton}\n </div>\n </nav>\n </div>\n </header>`;\n}\n\nfunction renderFooter(\n site: OvellumSiteConfig & { title: string },\n generatedAt: string,\n basePath: string,\n): string {\n const items = site.footerNav ?? [];\n const hasItems = items.length > 0;\n if (!site.footer && !hasItems) return '';\n\n const left = site.footer\n ? `<div class=\"ov-footer-left\"><span>${escapeHtml(site.footer)}</span><span class=\"ov-footer-sep\">·</span><time datetime=\"${escapeAttr(generatedAt)}\">${escapeHtml(generatedAt.slice(0, 10))}</time></div>`\n : '<div class=\"ov-footer-left\"></div>';\n\n const right = hasItems\n ? `<nav class=\"ov-footer-right\" aria-label=\"Site links\">${items.map((item) => renderFooterNavItem(item, basePath)).join('')}</nav>`\n : '';\n\n return `<footer class=\"ov-footer\"><div class=\"ov-footer-inner\">${left}${right}</div></footer>`;\n}\n\nfunction renderFooterNavItem(\n item: { label: string; href: string; icon?: string; external?: boolean },\n basePath: string,\n): string {\n const external = item.external === true || /^https?:\\/\\//i.test(item.href);\n const href = external ? item.href : siteUrl(item.href, basePath);\n const rel = external ? ' rel=\"noopener\" target=\"_blank\"' : '';\n const iconName = item.icon as IconName | undefined;\n if (iconName && iconName in ICONS) {\n return `<a class=\"ov-footer-link ov-footer-link--icon\" href=\"${escapeAttr(href)}\"${rel} aria-label=\"${escapeAttr(item.label)}\" title=\"${escapeAttr(item.label)}\">${renderIcon(iconName, { class: 'ov-footer-icon', size: 18 })}<span class=\"ov-sr-only\">${escapeHtml(item.label)}</span></a>`;\n }\n return `<a class=\"ov-footer-link\" href=\"${escapeAttr(href)}\"${rel}>${escapeHtml(item.label)}</a>`;\n}\n\n// -- doc pages -----------------------------------------------------------\n\nexport interface PrevNextPage {\n title: string;\n url: string;\n}\n\nexport interface RenderPageInput {\n site: OvellumSiteConfig & { title: string };\n /** Root nav. Children are rendered as the sidebar tree. */\n nav: NavNode;\n /** Page's site-relative URL (with trailing slash). Used for marking the active link. */\n url: string;\n /** Page title (already resolved upstream — falls back to the site title for the root). */\n title: string;\n /** Optional description for `<meta name=\"description\">`. */\n description?: string;\n /** Rendered body HTML. */\n bodyHtml: string;\n /** Headings extracted from the body for the right-side ToC. */\n headings: Heading[];\n /** Build timestamp (ISO) used in the footer. */\n generatedAt: string;\n /** Path prefix for static assets, defaults to '/'. */\n assetsPrefix?: string;\n /** Optional Docs link added to the topbar (typically only used when a landing page exists). */\n docsHref?: string;\n /** Previous page in the sidebar's reading order, if any. */\n prev?: PrevNextPage;\n /** Next page in the sidebar's reading order, if any. */\n next?: PrevNextPage;\n /** Resolved \"Edit this page\" URL (already had `{path}` substituted), if set. */\n editUrl?: string;\n /** Breadcrumb trail, root-first. The current page is the last entry. */\n breadcrumbs?: Array<{ title: string; url: string }>;\n /** Reading-time estimate in whole minutes (already computed and rounded). */\n readingMinutes?: number;\n /** ISO-8601 timestamp of the source file's last modification. */\n lastModified?: string;\n /** Optional class added to `<body>`. Used today for the special 404 layout. */\n bodyClass?: string;\n}\n\n/**\n * Render a full HTML document for one doc page (sidebar + content + ToC).\n */\nexport function renderPage(input: RenderPageInput): string {\n const fullTitle =\n input.title && input.title !== input.site.title\n ? `${input.title} · ${input.site.title}`\n : input.site.title;\n\n const basePath = normaliseBasePath(input.site.basePath);\n const sidebar = renderSidebar(input.nav, input.url, basePath);\n const toc = renderToc(input.headings);\n const prevNext = renderPrevNext(input.prev, input.next, basePath);\n const breadcrumbs = renderBreadcrumbs(input.breadcrumbs, basePath);\n const pageMeta = renderPageMeta(input.readingMinutes, input.lastModified);\n const editLink = input.editUrl\n ? `<p class=\"ov-edit-page\"><a class=\"ov-edit-link\" href=\"${escapeAttr(input.editUrl)}\" rel=\"noopener\" target=\"_blank\">Edit this page</a></p>`\n : '';\n\n const body = `<div class=\"ov-layout\">\n <aside class=\"ov-sidebar\" aria-label=\"Site navigation\">${sidebar}</aside>\n <main class=\"ov-content\">\n ${breadcrumbs}\n ${pageMeta}\n <article class=\"ov-prose\">${input.bodyHtml}</article>\n ${editLink}\n ${prevNext}\n </main>\n <aside class=\"ov-toc\" aria-label=\"On this page\">${toc}</aside>\n </div>`;\n\n return renderShell({\n site: input.site,\n fullTitle,\n description: input.description,\n url: input.url,\n assetsPrefix: input.assetsPrefix,\n docsHref: input.docsHref,\n generatedAt: input.generatedAt,\n body,\n bodyClass: input.bodyClass,\n });\n}\n\n// -- landing page --------------------------------------------------------\n\nexport interface RenderLandingInput {\n site: OvellumSiteConfig & { title: string };\n landing: OvellumLandingConfig;\n /** Optional pitch HTML rendered between the feature grid and the trust strip. */\n pitchHtml?: string;\n generatedAt: string;\n assetsPrefix?: string;\n /** Resolved docs entry URL (landing.docsHref or first-nav fallback). */\n docsHref?: string;\n}\n\n/**\n * Render the landing-page document. Sections in order: hero, feature grid,\n * optional pitch (free-form markdown body from `_landing.md`), optional\n * trust strip.\n */\nexport function renderLanding(input: RenderLandingInput): string {\n const heroTitle = input.landing.hero.title ?? input.site.title;\n const fullTitle = input.site.title;\n const basePath = normaliseBasePath(input.site.basePath);\n\n const hero = renderHero(\n heroTitle,\n input.landing.hero.subtitle,\n input.landing.hero.ctas,\n input.landing.hero.media,\n basePath,\n );\n const features = renderFeatures(input.landing.features);\n const pitch = input.pitchHtml\n ? `<section class=\"ov-pitch\"><div class=\"ov-pitch-inner\">${input.pitchHtml}</div></section>`\n : '';\n const trust = renderTrustStrip(input.landing.trustStrip);\n\n // Interleave scenes between the rendered sections, in order. With three\n // sections after the hero, three scenes fill all three gaps; extras fall\n // through after the last section.\n const sections = [hero, features, pitch, trust].filter((s) => s !== '');\n const scenes = input.landing.scenes ?? [];\n const interleaved: string[] = [];\n sections.forEach((section, i) => {\n interleaved.push(section);\n if (i < sections.length - 1 && scenes[i]) {\n interleaved.push(renderScene(scenes[i], i, basePath));\n }\n });\n scenes.slice(Math.max(0, sections.length - 1)).forEach((sc, j) => {\n interleaved.push(renderScene(sc, sections.length - 1 + j, basePath));\n });\n\n const body = `<main class=\"ov-landing\">\n ${interleaved.join('\\n ')}\n </main>`;\n\n return renderShell({\n site: input.site,\n fullTitle,\n description: input.site.description,\n url: '/',\n assetsPrefix: input.assetsPrefix,\n docsHref: input.docsHref ? siteUrl(input.docsHref, basePath) : undefined,\n generatedAt: input.generatedAt,\n body,\n bodyClass: 'ov-body-landing',\n });\n}\n\nfunction renderHero(\n title: string,\n subtitle: string | undefined,\n ctas: OvellumLandingConfig['hero']['ctas'],\n media: OvellumLandingConfig['hero']['media'],\n basePath: string,\n): string {\n const ctaButtons = ctas\n .map((cta, i) => {\n const style = cta.style ?? (i === 0 ? 'primary' : 'secondary');\n return `<a class=\"ov-cta ov-cta--${escapeAttr(style)}\" href=\"${escapeAttr(siteUrl(cta.href, basePath))}\">${escapeHtml(cta.label)}</a>`;\n })\n .join('\\n ');\n const ctaRow = ctas.length > 0 ? `<div class=\"ov-cta-row\">\\n ${ctaButtons}\\n </div>` : '';\n const art = media ? renderHeroArt(media, basePath) : '';\n const sectionAttrs = media ? ' data-media' : '';\n return `<section class=\"ov-hero\"${sectionAttrs}>\n ${art}\n <div class=\"ov-hero-inner\">\n <h1 class=\"ov-hero-title\">${escapeHtml(title)}</h1>\n ${subtitle ? `<p class=\"ov-hero-subtitle\">${escapeHtml(subtitle)}</p>` : ''}\n ${ctaRow}\n </div>\n </section>`;\n}\n\nfunction renderHeroArt(\n media: NonNullable<OvellumLandingConfig['hero']['media']>,\n basePath: string,\n): string {\n const alt = media.alt ?? '';\n const lightSrc = escapeAttr(siteUrl(media.light, basePath));\n const darkSrc = media.dark ? escapeAttr(siteUrl(media.dark, basePath)) : lightSrc;\n // Two images stacked; CSS toggles visibility by `[data-theme]`. Both share the\n // same alt so screen readers only announce one decorative scene.\n return `<div class=\"ov-hero-art\" aria-hidden=\"${alt ? 'false' : 'true'}\">\n <img class=\"ov-hero-art-img ov-hero-art-img--light\" src=\"${lightSrc}\" alt=\"${escapeAttr(alt)}\" loading=\"eager\" decoding=\"async\">\n <img class=\"ov-hero-art-img ov-hero-art-img--dark\" src=\"${darkSrc}\" alt=\"\" loading=\"eager\" decoding=\"async\">\n </div>`;\n}\n\nfunction renderScene(\n scene: OvellumLandingConfig['scenes'][number],\n index: number,\n basePath: string,\n): string {\n const alt = scene.alt ?? '';\n const lightSrc = escapeAttr(siteUrl(scene.light, basePath));\n const darkSrc = scene.dark ? escapeAttr(siteUrl(scene.dark, basePath)) : lightSrc;\n return `<section class=\"ov-scene\" aria-hidden=\"${alt ? 'false' : 'true'}\" style=\"--ov-scene-i: ${index};\">\n <figure class=\"ov-scene-art\">\n <img class=\"ov-scene-img ov-scene-img--light\" src=\"${lightSrc}\" alt=\"${escapeAttr(alt)}\" loading=\"lazy\" decoding=\"async\">\n <img class=\"ov-scene-img ov-scene-img--dark\" src=\"${darkSrc}\" alt=\"\" loading=\"lazy\" decoding=\"async\">\n </figure>\n </section>`;\n}\n\nfunction renderFeatures(features: OvellumLandingConfig['features']): string {\n if (features.length === 0) return '';\n const cards = features\n .map((f) => {\n const icon = f.icon ? `<div class=\"ov-feature-icon\" aria-hidden=\"true\">${f.icon}</div>` : '';\n return `<article class=\"ov-card ov-feature-card\">\n ${icon}\n <h3 class=\"ov-feature-title\">${escapeHtml(f.title)}</h3>\n <p class=\"ov-feature-description\">${escapeHtml(f.description)}</p>\n </article>`;\n })\n .join('\\n ');\n return `<section class=\"ov-feature-grid-wrap\">\n <div class=\"ov-feature-grid\">\n ${cards}\n </div>\n </section>`;\n}\n\nfunction renderTrustStrip(trust: OvellumLandingConfig['trustStrip']): string {\n if (!trust || trust.items.length === 0) return '';\n const items = trust.items\n .map((it) => {\n const inner = it.image\n ? `<img class=\"ov-trust-image\" src=\"${escapeAttr(it.image)}\" alt=\"${escapeAttr(it.name)}\">`\n : `<span class=\"ov-trust-name\">${escapeHtml(it.name)}</span>`;\n return it.href\n ? `<a class=\"ov-trust-item\" href=\"${escapeAttr(it.href)}\">${inner}</a>`\n : `<span class=\"ov-trust-item\">${inner}</span>`;\n })\n .join('\\n ');\n return `<section class=\"ov-trust\">\n ${trust.label ? `<p class=\"ov-trust-label\">${escapeHtml(trust.label)}</p>` : ''}\n <div class=\"ov-trust-items\">\n ${items}\n </div>\n </section>`;\n}\n\n// -- shared helpers ------------------------------------------------------\n\nfunction renderSidebar(nav: NavNode, activeUrl: string, basePath: string): string {\n return `<nav class=\"ov-sidebar-nav\"><ul>${navList(nav.children, activeUrl, basePath)}</ul></nav>`;\n}\n\nfunction navList(nodes: NavNode[], activeUrl: string, basePath: string): string {\n if (nodes.length === 0) return '';\n return nodes\n .map((node) => {\n const isActive = node.url === activeUrl;\n const hasChildren = node.children.length > 0;\n const link = node.sourcePath\n ? `<a class=\"ov-nav-link${isActive ? ' is-active' : ''}\" href=\"${escapeAttr(siteUrl(node.url, basePath))}\">${escapeHtml(node.title)}</a>`\n : `<span class=\"ov-nav-group\">${escapeHtml(node.title)}</span>`;\n const children = hasChildren\n ? `<ul class=\"ov-nav-children\">${navList(node.children, activeUrl, basePath)}</ul>`\n : '';\n return `<li>${link}${children}</li>`;\n })\n .join('');\n}\n\nfunction renderBreadcrumbs(\n trail: Array<{ title: string; url: string }> | undefined,\n basePath: string,\n): string {\n // The trail includes the synthetic root node, so a top-level page like\n // /getting-started/ has length 2. Only render when there's at least one\n // real group between the root and the current page.\n if (!trail || trail.length < 3) return '';\n const visible = trail.slice(1);\n const items = visible\n .map((node, i) => {\n const isLast = i === visible.length - 1;\n if (isLast) {\n return `<li class=\"ov-crumb is-current\" aria-current=\"page\">${escapeHtml(node.title)}</li>`;\n }\n return `<li class=\"ov-crumb\"><a href=\"${escapeAttr(siteUrl(node.url, basePath))}\">${escapeHtml(node.title)}</a></li>`;\n })\n .join('\\n ');\n return `<nav class=\"ov-breadcrumbs\" aria-label=\"Breadcrumb\">\n <ol>\n ${items}\n </ol>\n </nav>`;\n}\n\nfunction renderPageMeta(\n readingMin: number | undefined,\n lastModifiedISO: string | undefined,\n): string {\n const parts: string[] = [];\n if (typeof readingMin === 'number' && readingMin > 0) {\n parts.push(`<span class=\"ov-page-meta-read\">${readingMin} min read</span>`);\n }\n if (lastModifiedISO) {\n const date = lastModifiedISO.slice(0, 10);\n parts.push(\n `<span class=\"ov-page-meta-updated\">Updated <time datetime=\"${escapeAttr(lastModifiedISO)}\">${escapeHtml(date)}</time></span>`,\n );\n }\n if (parts.length === 0) return '';\n return `<p class=\"ov-page-meta\">${parts.join('<span class=\"ov-page-meta-sep\"> · </span>')}</p>`;\n}\n\nfunction renderPrevNext(\n prev: PrevNextPage | undefined,\n next: PrevNextPage | undefined,\n basePath: string,\n): string {\n if (!prev && !next) return '';\n const prevHtml = prev\n ? `<a class=\"ov-prevnext-link ov-prevnext-prev\" href=\"${escapeAttr(siteUrl(prev.url, basePath))}\">\n <span class=\"ov-prevnext-label\">Previous</span>\n <span class=\"ov-prevnext-title\">${escapeHtml(prev.title)}</span>\n </a>`\n : '<span class=\"ov-prevnext-spacer\" aria-hidden=\"true\"></span>';\n const nextHtml = next\n ? `<a class=\"ov-prevnext-link ov-prevnext-next\" href=\"${escapeAttr(siteUrl(next.url, basePath))}\">\n <span class=\"ov-prevnext-label\">Next</span>\n <span class=\"ov-prevnext-title\">${escapeHtml(next.title)}</span>\n </a>`\n : '<span class=\"ov-prevnext-spacer\" aria-hidden=\"true\"></span>';\n return `<nav class=\"ov-prevnext\" aria-label=\"Page navigation\">\n ${prevHtml}\n ${nextHtml}\n </nav>`;\n}\n\nfunction renderToc(headings: Heading[]): string {\n if (headings.length === 0) return '';\n const items = headings\n .map(\n (h) =>\n `<li class=\"ov-toc-h${h.depth}\"><a href=\"#${escapeAttr(h.id)}\">${escapeHtml(h.text)}</a></li>`,\n )\n .join('');\n return `<div class=\"ov-toc-inner\"><p class=\"ov-toc-title\">On this page</p><ul>${items}</ul></div>`;\n}\n\nfunction join(base: string, path: string): string {\n if (!base.endsWith('/')) base += '/';\n return base + path.replace(/^\\//, '');\n}\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\nfunction escapeAttr(s: string): string {\n return escapeHtml(s);\n}\n","import { unified } from 'unified';\nimport remarkParse from 'remark-parse';\nimport { visit } from 'unist-util-visit';\nimport type { Root, Link } from 'mdast';\n\nexport interface MarkdownLink {\n /** Raw href as it appeared in the source (`./foo`, `/bar/`, `https://…`, etc.). */\n target: string;\n /** 1-based source line of the opening `[`. */\n line: number;\n}\n\n/**\n * Extract every `[text](url)` and `<https://…>` autolink from a Markdown body.\n *\n * Uses the same remark parser as the renderer, so links inside fenced code\n * blocks, inline code, and HTML are correctly ignored (the regex-based\n * approach this replaces would match them too).\n *\n * Returned URLs are exactly what the author wrote — no resolution, no\n * normalisation. Caller decides what's internal vs external.\n */\nexport function extractMarkdownLinks(content: string): MarkdownLink[] {\n const tree = unified().use(remarkParse).parse(content) as Root;\n const out: MarkdownLink[] = [];\n visit(tree, 'link', (node: Link) => {\n if (typeof node.url !== 'string') return;\n out.push({\n target: node.url,\n line: node.position?.start.line ?? 1,\n });\n });\n return out;\n}\n","/**\n * Count how often a character (or substring) is used in a string.\n *\n * @param {string} value\n * Value to search in.\n * @param {string} character\n * Character (or substring) to look for.\n * @return {number}\n * Number of times `character` occurred in `value`.\n */\nexport function ccount(value, character) {\n const source = String(value)\n\n if (typeof character !== 'string') {\n throw new TypeError('Expected character')\n }\n\n let count = 0\n let index = source.indexOf(character)\n\n while (index !== -1) {\n count++\n index = source.indexOf(character, index + character.length)\n }\n\n return count\n}\n","export function deprecate(fn) {\n return fn\n}\n\nexport function equal() {}\n\nexport function ok() {}\n\nexport function unreachable() {}\n","/**\n * @import {Code} from 'micromark-util-types'\n */\n\n/**\n * Check whether the character code represents an ASCII alpha (`a` through `z`,\n * case insensitive).\n *\n * An **ASCII alpha** is an ASCII upper alpha or ASCII lower alpha.\n *\n * An **ASCII upper alpha** is a character in the inclusive range U+0041 (`A`)\n * to U+005A (`Z`).\n *\n * An **ASCII lower alpha** is a character in the inclusive range U+0061 (`a`)\n * to U+007A (`z`).\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiAlpha = regexCheck(/[A-Za-z]/);\n\n/**\n * Check whether the character code represents an ASCII alphanumeric (`a`\n * through `z`, case insensitive, or `0` through `9`).\n *\n * An **ASCII alphanumeric** is an ASCII digit (see `asciiDigit`) or ASCII alpha\n * (see `asciiAlpha`).\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiAlphanumeric = regexCheck(/[\\dA-Za-z]/);\n\n/**\n * Check whether the character code represents an ASCII atext.\n *\n * atext is an ASCII alphanumeric (see `asciiAlphanumeric`), or a character in\n * the inclusive ranges U+0023 NUMBER SIGN (`#`) to U+0027 APOSTROPHE (`'`),\n * U+002A ASTERISK (`*`), U+002B PLUS SIGN (`+`), U+002D DASH (`-`), U+002F\n * SLASH (`/`), U+003D EQUALS TO (`=`), U+003F QUESTION MARK (`?`), U+005E\n * CARET (`^`) to U+0060 GRAVE ACCENT (`` ` ``), or U+007B LEFT CURLY BRACE\n * (`{`) to U+007E TILDE (`~`).\n *\n * See:\n * **\\[RFC5322]**:\n * [Internet Message Format](https://tools.ietf.org/html/rfc5322).\n * P. Resnick.\n * IETF.\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiAtext = regexCheck(/[#-'*+\\--9=?A-Z^-~]/);\n\n/**\n * Check whether a character code is an ASCII control character.\n *\n * An **ASCII control** is a character in the inclusive range U+0000 NULL (NUL)\n * to U+001F (US), or U+007F (DEL).\n *\n * @param {Code} code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport function asciiControl(code) {\n return (\n // Special whitespace codes (which have negative values), C0 and Control\n // character DEL\n code !== null && (code < 32 || code === 127)\n );\n}\n\n/**\n * Check whether the character code represents an ASCII digit (`0` through `9`).\n *\n * An **ASCII digit** is a character in the inclusive range U+0030 (`0`) to\n * U+0039 (`9`).\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiDigit = regexCheck(/\\d/);\n\n/**\n * Check whether the character code represents an ASCII hex digit (`a` through\n * `f`, case insensitive, or `0` through `9`).\n *\n * An **ASCII hex digit** is an ASCII digit (see `asciiDigit`), ASCII upper hex\n * digit, or an ASCII lower hex digit.\n *\n * An **ASCII upper hex digit** is a character in the inclusive range U+0041\n * (`A`) to U+0046 (`F`).\n *\n * An **ASCII lower hex digit** is a character in the inclusive range U+0061\n * (`a`) to U+0066 (`f`).\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiHexDigit = regexCheck(/[\\dA-Fa-f]/);\n\n/**\n * Check whether the character code represents ASCII punctuation.\n *\n * An **ASCII punctuation** is a character in the inclusive ranges U+0021\n * EXCLAMATION MARK (`!`) to U+002F SLASH (`/`), U+003A COLON (`:`) to U+0040 AT\n * SIGN (`@`), U+005B LEFT SQUARE BRACKET (`[`) to U+0060 GRAVE ACCENT\n * (`` ` ``), or U+007B LEFT CURLY BRACE (`{`) to U+007E TILDE (`~`).\n *\n * @param code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport const asciiPunctuation = regexCheck(/[!-/:-@[-`{-~]/);\n\n/**\n * Check whether a character code is a markdown line ending.\n *\n * A **markdown line ending** is the virtual characters M-0003 CARRIAGE RETURN\n * LINE FEED (CRLF), M-0004 LINE FEED (LF) and M-0005 CARRIAGE RETURN (CR).\n *\n * In micromark, the actual character U+000A LINE FEED (LF) and U+000D CARRIAGE\n * RETURN (CR) are replaced by these virtual characters depending on whether\n * they occurred together.\n *\n * @param {Code} code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport function markdownLineEnding(code) {\n return code !== null && code < -2;\n}\n\n/**\n * Check whether a character code is a markdown line ending (see\n * `markdownLineEnding`) or markdown space (see `markdownSpace`).\n *\n * @param {Code} code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport function markdownLineEndingOrSpace(code) {\n return code !== null && (code < 0 || code === 32);\n}\n\n/**\n * Check whether a character code is a markdown space.\n *\n * A **markdown space** is the concrete character U+0020 SPACE (SP) and the\n * virtual characters M-0001 VIRTUAL SPACE (VS) and M-0002 HORIZONTAL TAB (HT).\n *\n * In micromark, the actual character U+0009 CHARACTER TABULATION (HT) is\n * replaced by one M-0002 HORIZONTAL TAB (HT) and between 0 and 3 M-0001 VIRTUAL\n * SPACE (VS) characters, depending on the column at which the tab occurred.\n *\n * @param {Code} code\n * Code.\n * @returns {boolean}\n * Whether it matches.\n */\nexport function markdownSpace(code) {\n return code === -2 || code === -1 || code === 32;\n}\n\n// Size note: removing ASCII from the regex and using `asciiPunctuation` here\n// In fact adds to the bundle size.\n/**\n * Check whether the character code represents Unicode punctuation.\n *\n * A **Unicode punctuation** is a character in the Unicode `Pc` (Punctuation,\n * Connector), `Pd` (Punctuation, Dash), `Pe` (Punctuation, Close), `Pf`\n * (Punctuation, Final quote), `Pi` (Punctuation, Initial quote), `Po`\n * (Punctuation, Other), or `Ps` (Punctuation, Open) categories, or an ASCII\n * punctuation (see `asciiPunctuation`).\n *\n * See:\n * **\\[UNICODE]**:\n * [The Unicode Standard](https://www.unicode.org/versions/).\n * Unicode Consortium.\n *\n * @param code\n * Code.\n * @returns\n * Whether it matches.\n */\nexport const unicodePunctuation = regexCheck(/\\p{P}|\\p{S}/u);\n\n/**\n * Check whether the character code represents Unicode whitespace.\n *\n * Note that this does handle micromark specific markdown whitespace characters.\n * See `markdownLineEndingOrSpace` to check that.\n *\n * A **Unicode whitespace** is a character in the Unicode `Zs` (Separator,\n * Space) category, or U+0009 CHARACTER TABULATION (HT), U+000A LINE FEED (LF),\n * U+000C (FF), or U+000D CARRIAGE RETURN (CR) (**\\[UNICODE]**).\n *\n * See:\n * **\\[UNICODE]**:\n * [The Unicode Standard](https://www.unicode.org/versions/).\n * Unicode Consortium.\n *\n * @param code\n * Code.\n * @returns\n * Whether it matches.\n */\nexport const unicodeWhitespace = regexCheck(/\\s/);\n\n/**\n * Create a code check from a regex.\n *\n * @param {RegExp} regex\n * Expression.\n * @returns {(code: Code) => boolean}\n * Check.\n */\nfunction regexCheck(regex) {\n return check;\n\n /**\n * Check whether a code matches the bound regex.\n *\n * @param {Code} code\n * Character code.\n * @returns {boolean}\n * Whether the character code matches the bound regex.\n */\n function check(code) {\n return code !== null && code > -1 && regex.test(String.fromCharCode(code));\n }\n}","export default function escapeStringRegexp(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\t// Escape characters with special meaning either inside or outside character sets.\n\t// Use a simple backslash escape when it’s always valid, and a `\\xnn` escape when the simpler form would be disallowed by Unicode patterns’ stricter grammar.\n\treturn string\n\t\t.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n\t\t.replace(/-/g, '\\\\x2d');\n}\n","/**\n * @import {Node, Parent} from 'unist'\n */\n\n/**\n * @template Fn\n * @template Fallback\n * @typedef {Fn extends (value: any) => value is infer Thing ? Thing : Fallback} Predicate\n */\n\n/**\n * @callback Check\n * Check that an arbitrary value is a node.\n * @param {unknown} this\n * The given context.\n * @param {unknown} [node]\n * Anything (typically a node).\n * @param {number | null | undefined} [index]\n * The node’s position in its parent.\n * @param {Parent | null | undefined} [parent]\n * The node’s parent.\n * @returns {boolean}\n * Whether this is a node and passes a test.\n *\n * @typedef {Record<string, unknown> | Node} Props\n * Object to check for equivalence.\n *\n * Note: `Node` is included as it is common but is not indexable.\n *\n * @typedef {Array<Props | TestFunction | string> | ReadonlyArray<Props | TestFunction | string> | Props | TestFunction | string | null | undefined} Test\n * Check for an arbitrary node.\n *\n * @callback TestFunction\n * Check if a node passes a test.\n * @param {unknown} this\n * The given context.\n * @param {Node} node\n * A node.\n * @param {number | undefined} [index]\n * The node’s position in its parent.\n * @param {Parent | undefined} [parent]\n * The node’s parent.\n * @returns {boolean | undefined | void}\n * Whether this node passes the test.\n *\n * Note: `void` is included until TS sees no return as `undefined`.\n */\n\n/**\n * Check if `node` is a `Node` and whether it passes the given test.\n *\n * @param {unknown} node\n * Thing to check, typically `Node`.\n * @param {Test} test\n * A check for a specific node.\n * @param {number | null | undefined} index\n * The node’s position in its parent.\n * @param {Parent | null | undefined} parent\n * The node’s parent.\n * @param {unknown} context\n * Context object (`this`) to pass to `test` functions.\n * @returns {boolean}\n * Whether `node` is a node and passes a test.\n */\nexport const is =\n // Note: overloads in JSDoc can’t yet use different `@template`s.\n /**\n * @type {(\n * (<Condition extends ReadonlyArray<string>>(node: unknown, test: Condition, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & {type: Condition[number]}) &\n * (<Condition extends Array<string>>(node: unknown, test: Condition, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & {type: Condition[number]}) &\n * (<Condition extends string>(node: unknown, test: Condition, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & {type: Condition}) &\n * (<Condition extends Props>(node: unknown, test: Condition, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & Condition) &\n * (<Condition extends TestFunction>(node: unknown, test: Condition, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & Predicate<Condition, Node>) &\n * ((node?: null | undefined) => false) &\n * ((node: unknown, test?: null | undefined, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node) &\n * ((node: unknown, test?: Test, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => boolean)\n * )}\n */\n (\n /**\n * @param {unknown} [node]\n * @param {Test} [test]\n * @param {number | null | undefined} [index]\n * @param {Parent | null | undefined} [parent]\n * @param {unknown} [context]\n * @returns {boolean}\n */\n // eslint-disable-next-line max-params\n function (node, test, index, parent, context) {\n const check = convert(test)\n\n if (\n index !== undefined &&\n index !== null &&\n (typeof index !== 'number' ||\n index < 0 ||\n index === Number.POSITIVE_INFINITY)\n ) {\n throw new Error('Expected positive finite index')\n }\n\n if (\n parent !== undefined &&\n parent !== null &&\n (!is(parent) || !parent.children)\n ) {\n throw new Error('Expected parent node')\n }\n\n if (\n (parent === undefined || parent === null) !==\n (index === undefined || index === null)\n ) {\n throw new Error('Expected both parent and index')\n }\n\n return looksLikeANode(node)\n ? check.call(context, node, index, parent)\n : false\n }\n )\n\n/**\n * Generate an assertion from a test.\n *\n * Useful if you’re going to test many nodes, for example when creating a\n * utility where something else passes a compatible test.\n *\n * The created function is a bit faster because it expects valid input only:\n * a `node`, `index`, and `parent`.\n *\n * @param {Test} test\n * * when nullish, checks if `node` is a `Node`.\n * * when `string`, works like passing `(node) => node.type === test`.\n * * when `function` checks if function passed the node is true.\n * * when `object`, checks that all keys in test are in node, and that they have (strictly) equal values.\n * * when `array`, checks if any one of the subtests pass.\n * @returns {Check}\n * An assertion.\n */\nexport const convert =\n // Note: overloads in JSDoc can’t yet use different `@template`s.\n /**\n * @type {(\n * (<Condition extends string>(test: Condition) => (node: unknown, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & {type: Condition}) &\n * (<Condition extends Props>(test: Condition) => (node: unknown, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & Condition) &\n * (<Condition extends TestFunction>(test: Condition) => (node: unknown, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & Predicate<Condition, Node>) &\n * ((test?: null | undefined) => (node?: unknown, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node) &\n * ((test?: Test) => Check)\n * )}\n */\n (\n /**\n * @param {Test} [test]\n * @returns {Check}\n */\n function (test) {\n if (test === null || test === undefined) {\n return ok\n }\n\n if (typeof test === 'function') {\n return castFactory(test)\n }\n\n if (typeof test === 'object') {\n return Array.isArray(test)\n ? anyFactory(test)\n : // Cast because `ReadonlyArray` goes into the above but `isArray`\n // narrows to `Array`.\n propertiesFactory(/** @type {Props} */ (test))\n }\n\n if (typeof test === 'string') {\n return typeFactory(test)\n }\n\n throw new Error('Expected function, string, or object as test')\n }\n )\n\n/**\n * @param {Array<Props | TestFunction | string>} tests\n * @returns {Check}\n */\nfunction anyFactory(tests) {\n /** @type {Array<Check>} */\n const checks = []\n let index = -1\n\n while (++index < tests.length) {\n checks[index] = convert(tests[index])\n }\n\n return castFactory(any)\n\n /**\n * @this {unknown}\n * @type {TestFunction}\n */\n function any(...parameters) {\n let index = -1\n\n while (++index < checks.length) {\n if (checks[index].apply(this, parameters)) return true\n }\n\n return false\n }\n}\n\n/**\n * Turn an object into a test for a node with a certain fields.\n *\n * @param {Props} check\n * @returns {Check}\n */\nfunction propertiesFactory(check) {\n const checkAsRecord = /** @type {Record<string, unknown>} */ (check)\n\n return castFactory(all)\n\n /**\n * @param {Node} node\n * @returns {boolean}\n */\n function all(node) {\n const nodeAsRecord = /** @type {Record<string, unknown>} */ (\n /** @type {unknown} */ (node)\n )\n\n /** @type {string} */\n let key\n\n for (key in check) {\n if (nodeAsRecord[key] !== checkAsRecord[key]) return false\n }\n\n return true\n }\n}\n\n/**\n * Turn a string into a test for a node with a certain type.\n *\n * @param {string} check\n * @returns {Check}\n */\nfunction typeFactory(check) {\n return castFactory(type)\n\n /**\n * @param {Node} node\n */\n function type(node) {\n return node && node.type === check\n }\n}\n\n/**\n * Turn a custom test into a test for a node that passes that test.\n *\n * @param {TestFunction} testFunction\n * @returns {Check}\n */\nfunction castFactory(testFunction) {\n return check\n\n /**\n * @this {unknown}\n * @type {Check}\n */\n function check(value, index, parent) {\n return Boolean(\n looksLikeANode(value) &&\n testFunction.call(\n this,\n value,\n typeof index === 'number' ? index : undefined,\n parent || undefined\n )\n )\n }\n}\n\nfunction ok() {\n return true\n}\n\n/**\n * @param {unknown} value\n * @returns {value is Node}\n */\nfunction looksLikeANode(value) {\n return value !== null && typeof value === 'object' && 'type' in value\n}\n","/**\n * @param {string} d\n * @returns {string}\n */\nexport function color(d) {\n return '\\u001B[33m' + d + '\\u001B[39m'\n}\n","/**\n * @import {Node as UnistNode, Parent as UnistParent} from 'unist'\n */\n\n/**\n * @typedef {Exclude<import('unist-util-is').Test, undefined> | undefined} Test\n * Test from `unist-util-is`.\n *\n * Note: we have remove and add `undefined`, because otherwise when generating\n * automatic `.d.ts` files, TS tries to flatten paths from a local perspective,\n * which doesn’t work when publishing on npm.\n */\n\n/**\n * @typedef {(\n * Fn extends (value: any) => value is infer Thing\n * ? Thing\n * : Fallback\n * )} Predicate\n * Get the value of a type guard `Fn`.\n * @template Fn\n * Value; typically function that is a type guard (such as `(x): x is Y`).\n * @template Fallback\n * Value to yield if `Fn` is not a type guard.\n */\n\n/**\n * @typedef {(\n * Check extends null | undefined // No test.\n * ? Value\n * : Value extends {type: Check} // String (type) test.\n * ? Value\n * : Value extends Check // Partial test.\n * ? Value\n * : Check extends Function // Function test.\n * ? Predicate<Check, Value> extends Value\n * ? Predicate<Check, Value>\n * : never\n * : never // Some other test?\n * )} MatchesOne\n * Check whether a node matches a primitive check in the type system.\n * @template Value\n * Value; typically unist `Node`.\n * @template Check\n * Value; typically `unist-util-is`-compatible test, but not arrays.\n */\n\n/**\n * @typedef {(\n * Check extends ReadonlyArray<infer T>\n * ? MatchesOne<Value, T>\n * : Check extends Array<infer T>\n * ? MatchesOne<Value, T>\n * : MatchesOne<Value, Check>\n * )} Matches\n * Check whether a node matches a check in the type system.\n * @template Value\n * Value; typically unist `Node`.\n * @template Check\n * Value; typically `unist-util-is`-compatible test.\n */\n\n/**\n * @typedef {0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10} Uint\n * Number; capped reasonably.\n */\n\n/**\n * @typedef {I extends 0 ? 1 : I extends 1 ? 2 : I extends 2 ? 3 : I extends 3 ? 4 : I extends 4 ? 5 : I extends 5 ? 6 : I extends 6 ? 7 : I extends 7 ? 8 : I extends 8 ? 9 : 10} Increment\n * Increment a number in the type system.\n * @template {Uint} [I=0]\n * Index.\n */\n\n/**\n * @typedef {(\n * Node extends UnistParent\n * ? Node extends {children: Array<infer Children>}\n * ? Child extends Children ? Node : never\n * : never\n * : never\n * )} InternalParent\n * Collect nodes that can be parents of `Child`.\n * @template {UnistNode} Node\n * All node types in a tree.\n * @template {UnistNode} Child\n * Node to search for.\n */\n\n/**\n * @typedef {InternalParent<InclusiveDescendant<Tree>, Child>} Parent\n * Collect nodes in `Tree` that can be parents of `Child`.\n * @template {UnistNode} Tree\n * All node types in a tree.\n * @template {UnistNode} Child\n * Node to search for.\n */\n\n/**\n * @typedef {(\n * Depth extends Max\n * ? never\n * :\n * | InternalParent<Node, Child>\n * | InternalAncestor<Node, InternalParent<Node, Child>, Max, Increment<Depth>>\n * )} InternalAncestor\n * Collect nodes in `Tree` that can be ancestors of `Child`.\n * @template {UnistNode} Node\n * All node types in a tree.\n * @template {UnistNode} Child\n * Node to search for.\n * @template {Uint} [Max=10]\n * Max; searches up to this depth.\n * @template {Uint} [Depth=0]\n * Current depth.\n */\n\n/**\n * @typedef {InternalAncestor<InclusiveDescendant<Tree>, Child>} Ancestor\n * Collect nodes in `Tree` that can be ancestors of `Child`.\n * @template {UnistNode} Tree\n * All node types in a tree.\n * @template {UnistNode} Child\n * Node to search for.\n */\n\n/**\n * @typedef {(\n * Tree extends UnistParent\n * ? Depth extends Max\n * ? Tree\n * : Tree | InclusiveDescendant<Tree['children'][number], Max, Increment<Depth>>\n * : Tree\n * )} InclusiveDescendant\n * Collect all (inclusive) descendants of `Tree`.\n *\n * > 👉 **Note**: for performance reasons, this seems to be the fastest way to\n * > recurse without actually running into an infinite loop, which the\n * > previous version did.\n * >\n * > Practically, a max of `2` is typically enough assuming a `Root` is\n * > passed, but it doesn’t improve performance.\n * > It gets higher with `List > ListItem > Table > TableRow > TableCell`.\n * > Using up to `10` doesn’t hurt or help either.\n * @template {UnistNode} Tree\n * Tree type.\n * @template {Uint} [Max=10]\n * Max; searches up to this depth.\n * @template {Uint} [Depth=0]\n * Current depth.\n */\n\n/**\n * @typedef {'skip' | boolean} Action\n * Union of the action types.\n *\n * @typedef {number} Index\n * Move to the sibling at `index` next (after node itself is completely\n * traversed).\n *\n * Useful if mutating the tree, such as removing the node the visitor is\n * currently on, or any of its previous siblings.\n * Results less than 0 or greater than or equal to `children.length` stop\n * traversing the parent.\n *\n * @typedef {[(Action | null | undefined | void)?, (Index | null | undefined)?]} ActionTuple\n * List with one or two values, the first an action, the second an index.\n *\n * @typedef {Action | ActionTuple | Index | null | undefined | void} VisitorResult\n * Any value that can be returned from a visitor.\n */\n\n/**\n * @callback Visitor\n * Handle a node (matching `test`, if given).\n *\n * Visitors are free to transform `node`.\n * They can also transform the parent of node (the last of `ancestors`).\n *\n * Replacing `node` itself, if `SKIP` is not returned, still causes its\n * descendants to be walked (which is a bug).\n *\n * When adding or removing previous siblings of `node` (or next siblings, in\n * case of reverse), the `Visitor` should return a new `Index` to specify the\n * sibling to traverse after `node` is traversed.\n * Adding or removing next siblings of `node` (or previous siblings, in case\n * of reverse) is handled as expected without needing to return a new `Index`.\n *\n * Removing the children property of an ancestor still results in them being\n * traversed.\n * @param {Visited} node\n * Found node.\n * @param {Array<VisitedParents>} ancestors\n * Ancestors of `node`.\n * @returns {VisitorResult}\n * What to do next.\n *\n * An `Index` is treated as a tuple of `[CONTINUE, Index]`.\n * An `Action` is treated as a tuple of `[Action]`.\n *\n * Passing a tuple back only makes sense if the `Action` is `SKIP`.\n * When the `Action` is `EXIT`, that action can be returned.\n * When the `Action` is `CONTINUE`, `Index` can be returned.\n * @template {UnistNode} [Visited=UnistNode]\n * Visited node type.\n * @template {UnistParent} [VisitedParents=UnistParent]\n * Ancestor type.\n */\n\n/**\n * @typedef {Visitor<Matches<InclusiveDescendant<Tree>, Check>, Ancestor<Tree, Matches<InclusiveDescendant<Tree>, Check>>>} BuildVisitor\n * Build a typed `Visitor` function from a tree and a test.\n *\n * It will infer which values are passed as `node` and which as `parents`.\n * @template {UnistNode} [Tree=UnistNode]\n * Tree type.\n * @template {Test} [Check=Test]\n * Test type.\n */\n\nimport {convert} from 'unist-util-is'\nimport {color} from 'unist-util-visit-parents/do-not-use-color'\n\n/** @type {Readonly<ActionTuple>} */\nconst empty = []\n\n/**\n * Continue traversing as normal.\n */\nexport const CONTINUE = true\n\n/**\n * Stop traversing immediately.\n */\nexport const EXIT = false\n\n/**\n * Do not traverse this node’s children.\n */\nexport const SKIP = 'skip'\n\n/**\n * Visit nodes, with ancestral information.\n *\n * This algorithm performs *depth-first* *tree traversal* in *preorder*\n * (**NLR**) or if `reverse` is given, in *reverse preorder* (**NRL**).\n *\n * You can choose for which nodes `visitor` is called by passing a `test`.\n * For complex tests, you should test yourself in `visitor`, as it will be\n * faster and will have improved type information.\n *\n * Walking the tree is an intensive task.\n * Make use of the return values of the visitor when possible.\n * Instead of walking a tree multiple times, walk it once, use `unist-util-is`\n * to check if a node matches, and then perform different operations.\n *\n * You can change the tree.\n * See `Visitor` for more info.\n *\n * @overload\n * @param {Tree} tree\n * @param {Check} check\n * @param {BuildVisitor<Tree, Check>} visitor\n * @param {boolean | null | undefined} [reverse]\n * @returns {undefined}\n *\n * @overload\n * @param {Tree} tree\n * @param {BuildVisitor<Tree>} visitor\n * @param {boolean | null | undefined} [reverse]\n * @returns {undefined}\n *\n * @param {UnistNode} tree\n * Tree to traverse.\n * @param {Visitor | Test} test\n * `unist-util-is`-compatible test\n * @param {Visitor | boolean | null | undefined} [visitor]\n * Handle each node.\n * @param {boolean | null | undefined} [reverse]\n * Traverse in reverse preorder (NRL) instead of the default preorder (NLR).\n * @returns {undefined}\n * Nothing.\n *\n * @template {UnistNode} Tree\n * Node type.\n * @template {Test} Check\n * `unist-util-is`-compatible test.\n */\nexport function visitParents(tree, test, visitor, reverse) {\n /** @type {Test} */\n let check\n\n if (typeof test === 'function' && typeof visitor !== 'function') {\n reverse = visitor\n // @ts-expect-error no visitor given, so `visitor` is test.\n visitor = test\n } else {\n // @ts-expect-error visitor given, so `test` isn’t a visitor.\n check = test\n }\n\n const is = convert(check)\n const step = reverse ? -1 : 1\n\n factory(tree, undefined, [])()\n\n /**\n * @param {UnistNode} node\n * @param {number | undefined} index\n * @param {Array<UnistParent>} parents\n */\n function factory(node, index, parents) {\n const value = /** @type {Record<string, unknown>} */ (\n node && typeof node === 'object' ? node : {}\n )\n\n if (typeof value.type === 'string') {\n const name =\n // `hast`\n typeof value.tagName === 'string'\n ? value.tagName\n : // `xast`\n typeof value.name === 'string'\n ? value.name\n : undefined\n\n Object.defineProperty(visit, 'name', {\n value:\n 'node (' + color(node.type + (name ? '<' + name + '>' : '')) + ')'\n })\n }\n\n return visit\n\n function visit() {\n /** @type {Readonly<ActionTuple>} */\n let result = empty\n /** @type {Readonly<ActionTuple>} */\n let subresult\n /** @type {number} */\n let offset\n /** @type {Array<UnistParent>} */\n let grandparents\n\n if (!test || is(node, index, parents[parents.length - 1] || undefined)) {\n // @ts-expect-error: `visitor` is now a visitor.\n result = toResult(visitor(node, parents))\n\n if (result[0] === EXIT) {\n return result\n }\n }\n\n if ('children' in node && node.children) {\n const nodeAsParent = /** @type {UnistParent} */ (node)\n\n if (nodeAsParent.children && result[0] !== SKIP) {\n offset = (reverse ? nodeAsParent.children.length : -1) + step\n grandparents = parents.concat(nodeAsParent)\n\n while (offset > -1 && offset < nodeAsParent.children.length) {\n const child = nodeAsParent.children[offset]\n\n subresult = factory(child, offset, grandparents)()\n\n if (subresult[0] === EXIT) {\n return subresult\n }\n\n offset =\n typeof subresult[1] === 'number' ? subresult[1] : offset + step\n }\n }\n }\n\n return result\n }\n }\n}\n\n/**\n * Turn a return value into a clean result.\n *\n * @param {VisitorResult} value\n * Valid return values from visitors.\n * @returns {Readonly<ActionTuple>}\n * Clean result.\n */\nfunction toResult(value) {\n if (Array.isArray(value)) {\n return value\n }\n\n if (typeof value === 'number') {\n return [CONTINUE, value]\n }\n\n return value === null || value === undefined ? empty : [value]\n}\n","/**\n * @import {Nodes, Parents, PhrasingContent, Root, Text} from 'mdast'\n * @import {BuildVisitor, Test, VisitorResult} from 'unist-util-visit-parents'\n */\n\n/**\n * @typedef RegExpMatchObject\n * Info on the match.\n * @property {number} index\n * The index of the search at which the result was found.\n * @property {string} input\n * A copy of the search string in the text node.\n * @property {[...Array<Parents>, Text]} stack\n * All ancestors of the text node, where the last node is the text itself.\n *\n * @typedef {RegExp | string} Find\n * Pattern to find.\n *\n * Strings are escaped and then turned into global expressions.\n *\n * @typedef {Array<FindAndReplaceTuple>} FindAndReplaceList\n * Several find and replaces, in array form.\n *\n * @typedef {[Find, Replace?]} FindAndReplaceTuple\n * Find and replace in tuple form.\n *\n * @typedef {ReplaceFunction | string | null | undefined} Replace\n * Thing to replace with.\n *\n * @callback ReplaceFunction\n * Callback called when a search matches.\n * @param {...any} parameters\n * The parameters are the result of corresponding search expression:\n *\n * * `value` (`string`) — whole match\n * * `...capture` (`Array<string>`) — matches from regex capture groups\n * * `match` (`RegExpMatchObject`) — info on the match\n * @returns {Array<PhrasingContent> | PhrasingContent | string | false | null | undefined}\n * Thing to replace with.\n *\n * * when `null`, `undefined`, `''`, remove the match\n * * …or when `false`, do not replace at all\n * * …or when `string`, replace with a text node of that value\n * * …or when `Node` or `Array<Node>`, replace with those nodes\n *\n * @typedef {[RegExp, ReplaceFunction]} Pair\n * Normalized find and replace.\n *\n * @typedef {Array<Pair>} Pairs\n * All find and replaced.\n *\n * @typedef Options\n * Configuration.\n * @property {Test | null | undefined} [ignore]\n * Test for which nodes to ignore (optional).\n */\n\nimport escape from 'escape-string-regexp'\nimport {visitParents} from 'unist-util-visit-parents'\nimport {convert} from 'unist-util-is'\n\n/**\n * Find patterns in a tree and replace them.\n *\n * The algorithm searches the tree in *preorder* for complete values in `Text`\n * nodes.\n * Partial matches are not supported.\n *\n * @param {Nodes} tree\n * Tree to change.\n * @param {FindAndReplaceList | FindAndReplaceTuple} list\n * Patterns to find.\n * @param {Options | null | undefined} [options]\n * Configuration (when `find` is not `Find`).\n * @returns {undefined}\n * Nothing.\n */\nexport function findAndReplace(tree, list, options) {\n const settings = options || {}\n const ignored = convert(settings.ignore || [])\n const pairs = toPairs(list)\n let pairIndex = -1\n\n while (++pairIndex < pairs.length) {\n visitParents(tree, 'text', visitor)\n }\n\n /** @type {BuildVisitor<Root, 'text'>} */\n function visitor(node, parents) {\n let index = -1\n /** @type {Parents | undefined} */\n let grandparent\n\n while (++index < parents.length) {\n const parent = parents[index]\n /** @type {Array<Nodes> | undefined} */\n const siblings = grandparent ? grandparent.children : undefined\n\n if (\n ignored(\n parent,\n siblings ? siblings.indexOf(parent) : undefined,\n grandparent\n )\n ) {\n return\n }\n\n grandparent = parent\n }\n\n if (grandparent) {\n return handler(node, parents)\n }\n }\n\n /**\n * Handle a text node which is not in an ignored parent.\n *\n * @param {Text} node\n * Text node.\n * @param {Array<Parents>} parents\n * Parents.\n * @returns {VisitorResult}\n * Result.\n */\n function handler(node, parents) {\n const parent = parents[parents.length - 1]\n const find = pairs[pairIndex][0]\n const replace = pairs[pairIndex][1]\n let start = 0\n /** @type {Array<Nodes>} */\n const siblings = parent.children\n const index = siblings.indexOf(node)\n let change = false\n /** @type {Array<PhrasingContent>} */\n let nodes = []\n\n find.lastIndex = 0\n\n let match = find.exec(node.value)\n\n while (match) {\n const position = match.index\n /** @type {RegExpMatchObject} */\n const matchObject = {\n index: match.index,\n input: match.input,\n stack: [...parents, node]\n }\n let value = replace(...match, matchObject)\n\n if (typeof value === 'string') {\n value = value.length > 0 ? {type: 'text', value} : undefined\n }\n\n // It wasn’t a match after all.\n if (value === false) {\n // False acts as if there was no match.\n // So we need to reset `lastIndex`, which currently being at the end of\n // the current match, to the beginning.\n find.lastIndex = position + 1\n } else {\n if (start !== position) {\n nodes.push({\n type: 'text',\n value: node.value.slice(start, position)\n })\n }\n\n if (Array.isArray(value)) {\n nodes.push(...value)\n } else if (value) {\n nodes.push(value)\n }\n\n start = position + match[0].length\n change = true\n }\n\n if (!find.global) {\n break\n }\n\n match = find.exec(node.value)\n }\n\n if (change) {\n if (start < node.value.length) {\n nodes.push({type: 'text', value: node.value.slice(start)})\n }\n\n parent.children.splice(index, 1, ...nodes)\n } else {\n nodes = [node]\n }\n\n return index + nodes.length\n }\n}\n\n/**\n * Turn a tuple or a list of tuples into pairs.\n *\n * @param {FindAndReplaceList | FindAndReplaceTuple} tupleOrList\n * Schema.\n * @returns {Pairs}\n * Clean pairs.\n */\nfunction toPairs(tupleOrList) {\n /** @type {Pairs} */\n const result = []\n\n if (!Array.isArray(tupleOrList)) {\n throw new TypeError('Expected find and replace tuple or list of tuples')\n }\n\n /** @type {FindAndReplaceList} */\n // @ts-expect-error: correct.\n const list =\n !tupleOrList[0] || Array.isArray(tupleOrList[0])\n ? tupleOrList\n : [tupleOrList]\n\n let index = -1\n\n while (++index < list.length) {\n const tuple = list[index]\n result.push([toExpression(tuple[0]), toFunction(tuple[1])])\n }\n\n return result\n}\n\n/**\n * Turn a find into an expression.\n *\n * @param {Find} find\n * Find.\n * @returns {RegExp}\n * Expression.\n */\nfunction toExpression(find) {\n return typeof find === 'string' ? new RegExp(escape(find), 'g') : find\n}\n\n/**\n * Turn a replace into a function.\n *\n * @param {Replace} replace\n * Replace.\n * @returns {ReplaceFunction}\n * Function.\n */\nfunction toFunction(replace) {\n return typeof replace === 'function'\n ? replace\n : function () {\n return replace\n }\n}\n","/**\n * @import {RegExpMatchObject, ReplaceFunction} from 'mdast-util-find-and-replace'\n * @import {CompileContext, Extension as FromMarkdownExtension, Handle as FromMarkdownHandle, Transform as FromMarkdownTransform} from 'mdast-util-from-markdown'\n * @import {ConstructName, Options as ToMarkdownExtension} from 'mdast-util-to-markdown'\n * @import {Link, PhrasingContent} from 'mdast'\n */\n\nimport {ccount} from 'ccount'\nimport {ok as assert} from 'devlop'\nimport {unicodePunctuation, unicodeWhitespace} from 'micromark-util-character'\nimport {findAndReplace} from 'mdast-util-find-and-replace'\n\n/** @type {ConstructName} */\nconst inConstruct = 'phrasing'\n/** @type {Array<ConstructName>} */\nconst notInConstruct = ['autolink', 'link', 'image', 'label']\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM autolink\n * literals in markdown.\n *\n * @returns {FromMarkdownExtension}\n * Extension for `mdast-util-to-markdown` to enable GFM autolink literals.\n */\nexport function gfmAutolinkLiteralFromMarkdown() {\n return {\n transforms: [transformGfmAutolinkLiterals],\n enter: {\n literalAutolink: enterLiteralAutolink,\n literalAutolinkEmail: enterLiteralAutolinkValue,\n literalAutolinkHttp: enterLiteralAutolinkValue,\n literalAutolinkWww: enterLiteralAutolinkValue\n },\n exit: {\n literalAutolink: exitLiteralAutolink,\n literalAutolinkEmail: exitLiteralAutolinkEmail,\n literalAutolinkHttp: exitLiteralAutolinkHttp,\n literalAutolinkWww: exitLiteralAutolinkWww\n }\n }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM autolink\n * literals in markdown.\n *\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown` to enable GFM autolink literals.\n */\nexport function gfmAutolinkLiteralToMarkdown() {\n return {\n unsafe: [\n {\n character: '@',\n before: '[+\\\\-.\\\\w]',\n after: '[\\\\-.\\\\w]',\n inConstruct,\n notInConstruct\n },\n {\n character: '.',\n before: '[Ww]',\n after: '[\\\\-.\\\\w]',\n inConstruct,\n notInConstruct\n },\n {\n character: ':',\n before: '[ps]',\n after: '\\\\/',\n inConstruct,\n notInConstruct\n }\n ]\n }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterLiteralAutolink(token) {\n this.enter({type: 'link', title: null, url: '', children: []}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterLiteralAutolinkValue(token) {\n this.config.enter.autolinkProtocol.call(this, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitLiteralAutolinkHttp(token) {\n this.config.exit.autolinkProtocol.call(this, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitLiteralAutolinkWww(token) {\n this.config.exit.data.call(this, token)\n const node = this.stack[this.stack.length - 1]\n assert(node.type === 'link')\n node.url = 'http://' + this.sliceSerialize(token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitLiteralAutolinkEmail(token) {\n this.config.exit.autolinkEmail.call(this, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitLiteralAutolink(token) {\n this.exit(token)\n}\n\n/** @type {FromMarkdownTransform} */\nfunction transformGfmAutolinkLiterals(tree) {\n findAndReplace(\n tree,\n [\n [/(https?:\\/\\/|www(?=\\.))([-.\\w]+)([^ \\t\\r\\n]*)/gi, findUrl],\n [/(?<=^|\\s|\\p{P}|\\p{S})([-.\\w+]+)@([-\\w]+(?:\\.[-\\w]+)+)/gu, findEmail]\n ],\n {ignore: ['link', 'linkReference']}\n )\n}\n\n/**\n * @type {ReplaceFunction}\n * @param {string} _\n * @param {string} protocol\n * @param {string} domain\n * @param {string} path\n * @param {RegExpMatchObject} match\n * @returns {Array<PhrasingContent> | Link | false}\n */\n// eslint-disable-next-line max-params\nfunction findUrl(_, protocol, domain, path, match) {\n let prefix = ''\n\n // Not an expected previous character.\n if (!previous(match)) {\n return false\n }\n\n // Treat `www` as part of the domain.\n if (/^w/i.test(protocol)) {\n domain = protocol + domain\n protocol = ''\n prefix = 'http://'\n }\n\n if (!isCorrectDomain(domain)) {\n return false\n }\n\n const parts = splitUrl(domain + path)\n\n if (!parts[0]) return false\n\n /** @type {Link} */\n const result = {\n type: 'link',\n title: null,\n url: prefix + protocol + parts[0],\n children: [{type: 'text', value: protocol + parts[0]}]\n }\n\n if (parts[1]) {\n return [result, {type: 'text', value: parts[1]}]\n }\n\n return result\n}\n\n/**\n * @type {ReplaceFunction}\n * @param {string} _\n * @param {string} atext\n * @param {string} label\n * @param {RegExpMatchObject} match\n * @returns {Link | false}\n */\nfunction findEmail(_, atext, label, match) {\n if (\n // Not an expected previous character.\n !previous(match, true) ||\n // Label ends in not allowed character.\n /[-\\d_]$/.test(label)\n ) {\n return false\n }\n\n return {\n type: 'link',\n title: null,\n url: 'mailto:' + atext + '@' + label,\n children: [{type: 'text', value: atext + '@' + label}]\n }\n}\n\n/**\n * @param {string} domain\n * @returns {boolean}\n */\nfunction isCorrectDomain(domain) {\n const parts = domain.split('.')\n\n if (\n parts.length < 2 ||\n (parts[parts.length - 1] &&\n (/_/.test(parts[parts.length - 1]) ||\n !/[a-zA-Z\\d]/.test(parts[parts.length - 1]))) ||\n (parts[parts.length - 2] &&\n (/_/.test(parts[parts.length - 2]) ||\n !/[a-zA-Z\\d]/.test(parts[parts.length - 2])))\n ) {\n return false\n }\n\n return true\n}\n\n/**\n * @param {string} url\n * @returns {[string, string | undefined]}\n */\nfunction splitUrl(url) {\n const trailExec = /[!\"&'),.:;<>?\\]}]+$/.exec(url)\n\n if (!trailExec) {\n return [url, undefined]\n }\n\n url = url.slice(0, trailExec.index)\n\n let trail = trailExec[0]\n let closingParenIndex = trail.indexOf(')')\n const openingParens = ccount(url, '(')\n let closingParens = ccount(url, ')')\n\n while (closingParenIndex !== -1 && openingParens > closingParens) {\n url += trail.slice(0, closingParenIndex + 1)\n trail = trail.slice(closingParenIndex + 1)\n closingParenIndex = trail.indexOf(')')\n closingParens++\n }\n\n return [url, trail]\n}\n\n/**\n * @param {RegExpMatchObject} match\n * @param {boolean | null | undefined} [email=false]\n * @returns {boolean}\n */\nfunction previous(match, email) {\n const code = match.input.charCodeAt(match.index - 1)\n\n return (\n (match.index === 0 ||\n unicodeWhitespace(code) ||\n unicodePunctuation(code)) &&\n // If it’s an email, the previous character should not be a slash.\n (!email || code !== 47)\n )\n}\n","/**\n * Normalize an identifier (as found in references, definitions).\n *\n * Collapses markdown whitespace, trim, and then lower- and uppercase.\n *\n * Some characters are considered “uppercase”, such as U+03F4 (`ϴ`), but if their\n * lowercase counterpart (U+03B8 (`θ`)) is uppercased will result in a different\n * uppercase character (U+0398 (`Θ`)).\n * So, to get a canonical form, we perform both lower- and uppercase.\n *\n * Using uppercase last makes sure keys will never interact with default\n * prototypal values (such as `constructor`): nothing in the prototype of\n * `Object` is uppercase.\n *\n * @param {string} value\n * Identifier to normalize.\n * @returns {string}\n * Normalized identifier.\n */\nexport function normalizeIdentifier(value) {\n return value\n // Collapse markdown whitespace.\n .replace(/[\\t\\n\\r ]+/g, \" \")\n // Trim.\n .replace(/^ | $/g, '')\n // Some characters are considered “uppercase”, but if their lowercase\n // counterpart is uppercased will result in a different uppercase\n // character.\n // Hence, to get that form, we perform both lower- and uppercase.\n // Upper case makes sure keys will not interact with default prototypal\n // methods: no method is uppercase.\n .toLowerCase().toUpperCase();\n}","/**\n * @import {\n * CompileContext,\n * Extension as FromMarkdownExtension,\n * Handle as FromMarkdownHandle\n * } from 'mdast-util-from-markdown'\n * @import {ToMarkdownOptions} from 'mdast-util-gfm-footnote'\n * @import {\n * Handle as ToMarkdownHandle,\n * Map,\n * Options as ToMarkdownExtension\n * } from 'mdast-util-to-markdown'\n * @import {FootnoteDefinition, FootnoteReference} from 'mdast'\n */\n\nimport {ok as assert} from 'devlop'\nimport {normalizeIdentifier} from 'micromark-util-normalize-identifier'\n\nfootnoteReference.peek = footnoteReferencePeek\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteCallString() {\n this.buffer()\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteCall(token) {\n this.enter({type: 'footnoteReference', identifier: '', label: ''}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteDefinitionLabelString() {\n this.buffer()\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteDefinition(token) {\n this.enter(\n {type: 'footnoteDefinition', identifier: '', label: '', children: []},\n token\n )\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteCallString(token) {\n const label = this.resume()\n const node = this.stack[this.stack.length - 1]\n assert(node.type === 'footnoteReference')\n node.identifier = normalizeIdentifier(\n this.sliceSerialize(token)\n ).toLowerCase()\n node.label = label\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteCall(token) {\n this.exit(token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteDefinitionLabelString(token) {\n const label = this.resume()\n const node = this.stack[this.stack.length - 1]\n assert(node.type === 'footnoteDefinition')\n node.identifier = normalizeIdentifier(\n this.sliceSerialize(token)\n ).toLowerCase()\n node.label = label\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteDefinition(token) {\n this.exit(token)\n}\n\n/** @type {ToMarkdownHandle} */\nfunction footnoteReferencePeek() {\n return '['\n}\n\n/**\n * @type {ToMarkdownHandle}\n * @param {FootnoteReference} node\n */\nfunction footnoteReference(node, _, state, info) {\n const tracker = state.createTracker(info)\n let value = tracker.move('[^')\n const exit = state.enter('footnoteReference')\n const subexit = state.enter('reference')\n value += tracker.move(\n state.safe(state.associationId(node), {after: ']', before: value})\n )\n subexit()\n exit()\n value += tracker.move(']')\n return value\n}\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM footnotes\n * in markdown.\n *\n * @returns {FromMarkdownExtension}\n * Extension for `mdast-util-from-markdown`.\n */\nexport function gfmFootnoteFromMarkdown() {\n return {\n enter: {\n gfmFootnoteCallString: enterFootnoteCallString,\n gfmFootnoteCall: enterFootnoteCall,\n gfmFootnoteDefinitionLabelString: enterFootnoteDefinitionLabelString,\n gfmFootnoteDefinition: enterFootnoteDefinition\n },\n exit: {\n gfmFootnoteCallString: exitFootnoteCallString,\n gfmFootnoteCall: exitFootnoteCall,\n gfmFootnoteDefinitionLabelString: exitFootnoteDefinitionLabelString,\n gfmFootnoteDefinition: exitFootnoteDefinition\n }\n }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM footnotes\n * in markdown.\n *\n * @param {ToMarkdownOptions | null | undefined} [options]\n * Configuration (optional).\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown`.\n */\nexport function gfmFootnoteToMarkdown(options) {\n // To do: next major: change default.\n let firstLineBlank = false\n\n if (options && options.firstLineBlank) {\n firstLineBlank = true\n }\n\n return {\n handlers: {footnoteDefinition, footnoteReference},\n // This is on by default already.\n unsafe: [{character: '[', inConstruct: ['label', 'phrasing', 'reference']}]\n }\n\n /**\n * @type {ToMarkdownHandle}\n * @param {FootnoteDefinition} node\n */\n function footnoteDefinition(node, _, state, info) {\n const tracker = state.createTracker(info)\n let value = tracker.move('[^')\n const exit = state.enter('footnoteDefinition')\n const subexit = state.enter('label')\n value += tracker.move(\n state.safe(state.associationId(node), {before: value, after: ']'})\n )\n subexit()\n\n value += tracker.move(']:')\n\n if (node.children && node.children.length > 0) {\n tracker.shift(4)\n\n value += tracker.move(\n (firstLineBlank ? '\\n' : ' ') +\n state.indentLines(\n state.containerFlow(node, tracker.current()),\n firstLineBlank ? mapAll : mapExceptFirst\n )\n )\n }\n\n exit()\n\n return value\n }\n}\n\n/** @type {Map} */\nfunction mapExceptFirst(line, index, blank) {\n return index === 0 ? line : mapAll(line, index, blank)\n}\n\n/** @type {Map} */\nfunction mapAll(line, index, blank) {\n return (blank ? '' : ' ') + line\n}\n","/**\n * @typedef {import('mdast').Delete} Delete\n *\n * @typedef {import('mdast-util-from-markdown').CompileContext} CompileContext\n * @typedef {import('mdast-util-from-markdown').Extension} FromMarkdownExtension\n * @typedef {import('mdast-util-from-markdown').Handle} FromMarkdownHandle\n *\n * @typedef {import('mdast-util-to-markdown').ConstructName} ConstructName\n * @typedef {import('mdast-util-to-markdown').Handle} ToMarkdownHandle\n * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownExtension\n */\n\n/**\n * List of constructs that occur in phrasing (paragraphs, headings), but cannot\n * contain strikethrough.\n * So they sort of cancel each other out.\n * Note: could use a better name.\n *\n * Note: keep in sync with: <https://github.com/syntax-tree/mdast-util-to-markdown/blob/8ce8dbf/lib/unsafe.js#L14>\n *\n * @type {Array<ConstructName>}\n */\nconst constructsWithoutStrikethrough = [\n 'autolink',\n 'destinationLiteral',\n 'destinationRaw',\n 'reference',\n 'titleQuote',\n 'titleApostrophe'\n]\n\nhandleDelete.peek = peekDelete\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM\n * strikethrough in markdown.\n *\n * @returns {FromMarkdownExtension}\n * Extension for `mdast-util-from-markdown` to enable GFM strikethrough.\n */\nexport function gfmStrikethroughFromMarkdown() {\n return {\n canContainEols: ['delete'],\n enter: {strikethrough: enterStrikethrough},\n exit: {strikethrough: exitStrikethrough}\n }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM\n * strikethrough in markdown.\n *\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown` to enable GFM strikethrough.\n */\nexport function gfmStrikethroughToMarkdown() {\n return {\n unsafe: [\n {\n character: '~',\n inConstruct: 'phrasing',\n notInConstruct: constructsWithoutStrikethrough\n }\n ],\n handlers: {delete: handleDelete}\n }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterStrikethrough(token) {\n this.enter({type: 'delete', children: []}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitStrikethrough(token) {\n this.exit(token)\n}\n\n/**\n * @type {ToMarkdownHandle}\n * @param {Delete} node\n */\nfunction handleDelete(node, _, state, info) {\n const tracker = state.createTracker(info)\n const exit = state.enter('strikethrough')\n let value = tracker.move('~~')\n value += state.containerPhrasing(node, {\n ...tracker.current(),\n before: value,\n after: '~'\n })\n value += tracker.move('~~')\n exit()\n return value\n}\n\n/** @type {ToMarkdownHandle} */\nfunction peekDelete() {\n return '~'\n}\n","// To do: next major: remove.\n/**\n * @typedef {Options} MarkdownTableOptions\n * Configuration.\n */\n\n/**\n * @typedef Options\n * Configuration.\n * @property {boolean | null | undefined} [alignDelimiters=true]\n * Whether to align the delimiters (default: `true`);\n * they are aligned by default:\n *\n * ```markdown\n * | Alpha | B |\n * | ----- | ----- |\n * | C | Delta |\n * ```\n *\n * Pass `false` to make them staggered:\n *\n * ```markdown\n * | Alpha | B |\n * | - | - |\n * | C | Delta |\n * ```\n * @property {ReadonlyArray<string | null | undefined> | string | null | undefined} [align]\n * How to align columns (default: `''`);\n * one style for all columns or styles for their respective columns;\n * each style is either `'l'` (left), `'r'` (right), or `'c'` (center);\n * other values are treated as `''`, which doesn’t place the colon in the\n * alignment row but does align left;\n * *only the lowercased first character is used, so `Right` is fine.*\n * @property {boolean | null | undefined} [delimiterEnd=true]\n * Whether to end each row with the delimiter (default: `true`).\n *\n * > 👉 **Note**: please don’t use this: it could create fragile structures\n * > that aren’t understandable to some markdown parsers.\n *\n * When `true`, there are ending delimiters:\n *\n * ```markdown\n * | Alpha | B |\n * | ----- | ----- |\n * | C | Delta |\n * ```\n *\n * When `false`, there are no ending delimiters:\n *\n * ```markdown\n * | Alpha | B\n * | ----- | -----\n * | C | Delta\n * ```\n * @property {boolean | null | undefined} [delimiterStart=true]\n * Whether to begin each row with the delimiter (default: `true`).\n *\n * > 👉 **Note**: please don’t use this: it could create fragile structures\n * > that aren’t understandable to some markdown parsers.\n *\n * When `true`, there are starting delimiters:\n *\n * ```markdown\n * | Alpha | B |\n * | ----- | ----- |\n * | C | Delta |\n * ```\n *\n * When `false`, there are no starting delimiters:\n *\n * ```markdown\n * Alpha | B |\n * ----- | ----- |\n * C | Delta |\n * ```\n * @property {boolean | null | undefined} [padding=true]\n * Whether to add a space of padding between delimiters and cells\n * (default: `true`).\n *\n * When `true`, there is padding:\n *\n * ```markdown\n * | Alpha | B |\n * | ----- | ----- |\n * | C | Delta |\n * ```\n *\n * When `false`, there is no padding:\n *\n * ```markdown\n * |Alpha|B |\n * |-----|-----|\n * |C |Delta|\n * ```\n * @property {((value: string) => number) | null | undefined} [stringLength]\n * Function to detect the length of table cell content (optional);\n * this is used when aligning the delimiters (`|`) between table cells;\n * full-width characters and emoji mess up delimiter alignment when viewing\n * the markdown source;\n * to fix this, you can pass this function,\n * which receives the cell content and returns its “visible” size;\n * note that what is and isn’t visible depends on where the text is displayed.\n *\n * Without such a function, the following:\n *\n * ```js\n * markdownTable([\n * ['Alpha', 'Bravo'],\n * ['中文', 'Charlie'],\n * ['👩‍❤️‍👩', 'Delta']\n * ])\n * ```\n *\n * Yields:\n *\n * ```markdown\n * | Alpha | Bravo |\n * | - | - |\n * | 中文 | Charlie |\n * | 👩‍❤️‍👩 | Delta |\n * ```\n *\n * With [`string-width`](https://github.com/sindresorhus/string-width):\n *\n * ```js\n * import stringWidth from 'string-width'\n *\n * markdownTable(\n * [\n * ['Alpha', 'Bravo'],\n * ['中文', 'Charlie'],\n * ['👩‍❤️‍👩', 'Delta']\n * ],\n * {stringLength: stringWidth}\n * )\n * ```\n *\n * Yields:\n *\n * ```markdown\n * | Alpha | Bravo |\n * | ----- | ------- |\n * | 中文 | Charlie |\n * | 👩‍❤️‍👩 | Delta |\n * ```\n */\n\n/**\n * @param {string} value\n * Cell value.\n * @returns {number}\n * Cell size.\n */\nfunction defaultStringLength(value) {\n return value.length\n}\n\n/**\n * Generate a markdown\n * ([GFM](https://docs.github.com/en/github/writing-on-github/working-with-advanced-formatting/organizing-information-with-tables))\n * table.\n *\n * @param {ReadonlyArray<ReadonlyArray<string | null | undefined>>} table\n * Table data (matrix of strings).\n * @param {Readonly<Options> | null | undefined} [options]\n * Configuration (optional).\n * @returns {string}\n * Result.\n */\nexport function markdownTable(table, options) {\n const settings = options || {}\n // To do: next major: change to spread.\n const align = (settings.align || []).concat()\n const stringLength = settings.stringLength || defaultStringLength\n /** @type {Array<number>} Character codes as symbols for alignment per column. */\n const alignments = []\n /** @type {Array<Array<string>>} Cells per row. */\n const cellMatrix = []\n /** @type {Array<Array<number>>} Sizes of each cell per row. */\n const sizeMatrix = []\n /** @type {Array<number>} */\n const longestCellByColumn = []\n let mostCellsPerRow = 0\n let rowIndex = -1\n\n // This is a superfluous loop if we don’t align delimiters, but otherwise we’d\n // do superfluous work when aligning, so optimize for aligning.\n while (++rowIndex < table.length) {\n /** @type {Array<string>} */\n const row = []\n /** @type {Array<number>} */\n const sizes = []\n let columnIndex = -1\n\n if (table[rowIndex].length > mostCellsPerRow) {\n mostCellsPerRow = table[rowIndex].length\n }\n\n while (++columnIndex < table[rowIndex].length) {\n const cell = serialize(table[rowIndex][columnIndex])\n\n if (settings.alignDelimiters !== false) {\n const size = stringLength(cell)\n sizes[columnIndex] = size\n\n if (\n longestCellByColumn[columnIndex] === undefined ||\n size > longestCellByColumn[columnIndex]\n ) {\n longestCellByColumn[columnIndex] = size\n }\n }\n\n row.push(cell)\n }\n\n cellMatrix[rowIndex] = row\n sizeMatrix[rowIndex] = sizes\n }\n\n // Figure out which alignments to use.\n let columnIndex = -1\n\n if (typeof align === 'object' && 'length' in align) {\n while (++columnIndex < mostCellsPerRow) {\n alignments[columnIndex] = toAlignment(align[columnIndex])\n }\n } else {\n const code = toAlignment(align)\n\n while (++columnIndex < mostCellsPerRow) {\n alignments[columnIndex] = code\n }\n }\n\n // Inject the alignment row.\n columnIndex = -1\n /** @type {Array<string>} */\n const row = []\n /** @type {Array<number>} */\n const sizes = []\n\n while (++columnIndex < mostCellsPerRow) {\n const code = alignments[columnIndex]\n let before = ''\n let after = ''\n\n if (code === 99 /* `c` */) {\n before = ':'\n after = ':'\n } else if (code === 108 /* `l` */) {\n before = ':'\n } else if (code === 114 /* `r` */) {\n after = ':'\n }\n\n // There *must* be at least one hyphen-minus in each alignment cell.\n let size =\n settings.alignDelimiters === false\n ? 1\n : Math.max(\n 1,\n longestCellByColumn[columnIndex] - before.length - after.length\n )\n\n const cell = before + '-'.repeat(size) + after\n\n if (settings.alignDelimiters !== false) {\n size = before.length + size + after.length\n\n if (size > longestCellByColumn[columnIndex]) {\n longestCellByColumn[columnIndex] = size\n }\n\n sizes[columnIndex] = size\n }\n\n row[columnIndex] = cell\n }\n\n // Inject the alignment row.\n cellMatrix.splice(1, 0, row)\n sizeMatrix.splice(1, 0, sizes)\n\n rowIndex = -1\n /** @type {Array<string>} */\n const lines = []\n\n while (++rowIndex < cellMatrix.length) {\n const row = cellMatrix[rowIndex]\n const sizes = sizeMatrix[rowIndex]\n columnIndex = -1\n /** @type {Array<string>} */\n const line = []\n\n while (++columnIndex < mostCellsPerRow) {\n const cell = row[columnIndex] || ''\n let before = ''\n let after = ''\n\n if (settings.alignDelimiters !== false) {\n const size =\n longestCellByColumn[columnIndex] - (sizes[columnIndex] || 0)\n const code = alignments[columnIndex]\n\n if (code === 114 /* `r` */) {\n before = ' '.repeat(size)\n } else if (code === 99 /* `c` */) {\n if (size % 2) {\n before = ' '.repeat(size / 2 + 0.5)\n after = ' '.repeat(size / 2 - 0.5)\n } else {\n before = ' '.repeat(size / 2)\n after = before\n }\n } else {\n after = ' '.repeat(size)\n }\n }\n\n if (settings.delimiterStart !== false && !columnIndex) {\n line.push('|')\n }\n\n if (\n settings.padding !== false &&\n // Don’t add the opening space if we’re not aligning and the cell is\n // empty: there will be a closing space.\n !(settings.alignDelimiters === false && cell === '') &&\n (settings.delimiterStart !== false || columnIndex)\n ) {\n line.push(' ')\n }\n\n if (settings.alignDelimiters !== false) {\n line.push(before)\n }\n\n line.push(cell)\n\n if (settings.alignDelimiters !== false) {\n line.push(after)\n }\n\n if (settings.padding !== false) {\n line.push(' ')\n }\n\n if (\n settings.delimiterEnd !== false ||\n columnIndex !== mostCellsPerRow - 1\n ) {\n line.push('|')\n }\n }\n\n lines.push(\n settings.delimiterEnd === false\n ? line.join('').replace(/ +$/, '')\n : line.join('')\n )\n }\n\n return lines.join('\\n')\n}\n\n/**\n * @param {string | null | undefined} [value]\n * Value to serialize.\n * @returns {string}\n * Result.\n */\nfunction serialize(value) {\n return value === null || value === undefined ? '' : String(value)\n}\n\n/**\n * @param {string | null | undefined} value\n * Value.\n * @returns {number}\n * Alignment.\n */\nfunction toAlignment(value) {\n const code = typeof value === 'string' ? value.codePointAt(0) : 0\n\n return code === 67 /* `C` */ || code === 99 /* `c` */\n ? 99 /* `c` */\n : code === 76 /* `L` */ || code === 108 /* `l` */\n ? 108 /* `l` */\n : code === 82 /* `R` */ || code === 114 /* `r` */\n ? 114 /* `r` */\n : 0\n}\n","/**\n * @import {Blockquote, Parents} from 'mdast'\n * @import {Info, Map, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {Blockquote} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function blockquote(node, _, state, info) {\n const exit = state.enter('blockquote')\n const tracker = state.createTracker(info)\n tracker.move('> ')\n tracker.shift(2)\n const value = state.indentLines(\n state.containerFlow(node, tracker.current()),\n map\n )\n exit()\n return value\n}\n\n/** @type {Map} */\nfunction map(line, _, blank) {\n return '>' + (blank ? '' : ' ') + line\n}\n","/**\n * @import {ConstructName, Unsafe} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {Array<ConstructName>} stack\n * @param {Unsafe} pattern\n * @returns {boolean}\n */\nexport function patternInScope(stack, pattern) {\n return (\n listInScope(stack, pattern.inConstruct, true) &&\n !listInScope(stack, pattern.notInConstruct, false)\n )\n}\n\n/**\n * @param {Array<ConstructName>} stack\n * @param {Unsafe['inConstruct']} list\n * @param {boolean} none\n * @returns {boolean}\n */\nfunction listInScope(stack, list, none) {\n if (typeof list === 'string') {\n list = [list]\n }\n\n if (!list || list.length === 0) {\n return none\n }\n\n let index = -1\n\n while (++index < list.length) {\n if (stack.includes(list[index])) {\n return true\n }\n }\n\n return false\n}\n","/**\n * @import {Break, Parents} from 'mdast'\n * @import {Info, State} from 'mdast-util-to-markdown'\n */\n\nimport {patternInScope} from '../util/pattern-in-scope.js'\n\n/**\n * @param {Break} _\n * @param {Parents | undefined} _1\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function hardBreak(_, _1, state, info) {\n let index = -1\n\n while (++index < state.unsafe.length) {\n // If we can’t put eols in this construct (setext headings, tables), use a\n // space instead.\n if (\n state.unsafe[index].character === '\\n' &&\n patternInScope(state.stack, state.unsafe[index])\n ) {\n return /[ \\t]/.test(info.before) ? '' : ' '\n }\n }\n\n return '\\\\\\n'\n}\n","/**\n * Get the count of the longest repeating streak of `substring` in `value`.\n *\n * @param {string} value\n * Content to search in.\n * @param {string} substring\n * Substring to look for, typically one character.\n * @returns {number}\n * Count of most frequent adjacent `substring`s in `value`.\n */\nexport function longestStreak(value, substring) {\n const source = String(value)\n let index = source.indexOf(substring)\n let expected = index\n let count = 0\n let max = 0\n\n if (typeof substring !== 'string') {\n throw new TypeError('Expected substring')\n }\n\n while (index !== -1) {\n if (index === expected) {\n if (++count > max) {\n max = count\n }\n } else {\n count = 1\n }\n\n expected = index + substring.length\n index = source.indexOf(substring, expected)\n }\n\n return max\n}\n","/**\n * @import {State} from 'mdast-util-to-markdown'\n * @import {Code} from 'mdast'\n */\n\n/**\n * @param {Code} node\n * @param {State} state\n * @returns {boolean}\n */\nexport function formatCodeAsIndented(node, state) {\n return Boolean(\n state.options.fences === false &&\n node.value &&\n // If there’s no info…\n !node.lang &&\n // And there’s a non-whitespace character…\n /[^ \\r\\n]/.test(node.value) &&\n // And the value doesn’t start or end in a blank…\n !/^[\\t ]*(?:[\\r\\n]|$)|(?:^|[\\r\\n])[\\t ]*$/.test(node.value)\n )\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['fence'], null | undefined>}\n */\nexport function checkFence(state) {\n const marker = state.options.fence || '`'\n\n if (marker !== '`' && marker !== '~') {\n throw new Error(\n 'Cannot serialize code with `' +\n marker +\n '` for `options.fence`, expected `` ` `` or `~`'\n )\n }\n\n return marker\n}\n","/**\n * @import {Info, Map, State} from 'mdast-util-to-markdown'\n * @import {Code, Parents} from 'mdast'\n */\n\nimport {longestStreak} from 'longest-streak'\nimport {formatCodeAsIndented} from '../util/format-code-as-indented.js'\nimport {checkFence} from '../util/check-fence.js'\n\n/**\n * @param {Code} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function code(node, _, state, info) {\n const marker = checkFence(state)\n const raw = node.value || ''\n const suffix = marker === '`' ? 'GraveAccent' : 'Tilde'\n\n if (formatCodeAsIndented(node, state)) {\n const exit = state.enter('codeIndented')\n const value = state.indentLines(raw, map)\n exit()\n return value\n }\n\n const tracker = state.createTracker(info)\n const sequence = marker.repeat(Math.max(longestStreak(raw, marker) + 1, 3))\n const exit = state.enter('codeFenced')\n let value = tracker.move(sequence)\n\n if (node.lang) {\n const subexit = state.enter(`codeFencedLang${suffix}`)\n value += tracker.move(\n state.safe(node.lang, {\n before: value,\n after: ' ',\n encode: ['`'],\n ...tracker.current()\n })\n )\n subexit()\n }\n\n if (node.lang && node.meta) {\n const subexit = state.enter(`codeFencedMeta${suffix}`)\n value += tracker.move(' ')\n value += tracker.move(\n state.safe(node.meta, {\n before: value,\n after: '\\n',\n encode: ['`'],\n ...tracker.current()\n })\n )\n subexit()\n }\n\n value += tracker.move('\\n')\n\n if (raw) {\n value += tracker.move(raw + '\\n')\n }\n\n value += tracker.move(sequence)\n exit()\n return value\n}\n\n/** @type {Map} */\nfunction map(line, _, blank) {\n return (blank ? '' : ' ') + line\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['quote'], null | undefined>}\n */\nexport function checkQuote(state) {\n const marker = state.options.quote || '\"'\n\n if (marker !== '\"' && marker !== \"'\") {\n throw new Error(\n 'Cannot serialize title with `' +\n marker +\n '` for `options.quote`, expected `\"`, or `\\'`'\n )\n }\n\n return marker\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Definition, Parents} from 'mdast'\n */\n\nimport {checkQuote} from '../util/check-quote.js'\n\n/**\n * @param {Definition} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function definition(node, _, state, info) {\n const quote = checkQuote(state)\n const suffix = quote === '\"' ? 'Quote' : 'Apostrophe'\n const exit = state.enter('definition')\n let subexit = state.enter('label')\n const tracker = state.createTracker(info)\n let value = tracker.move('[')\n value += tracker.move(\n state.safe(state.associationId(node), {\n before: value,\n after: ']',\n ...tracker.current()\n })\n )\n value += tracker.move(']: ')\n\n subexit()\n\n if (\n // If there’s no url, or…\n !node.url ||\n // If there are control characters or whitespace.\n /[\\0- \\u007F]/.test(node.url)\n ) {\n subexit = state.enter('destinationLiteral')\n value += tracker.move('<')\n value += tracker.move(\n state.safe(node.url, {before: value, after: '>', ...tracker.current()})\n )\n value += tracker.move('>')\n } else {\n // No whitespace, raw is prettier.\n subexit = state.enter('destinationRaw')\n value += tracker.move(\n state.safe(node.url, {\n before: value,\n after: node.title ? ' ' : '\\n',\n ...tracker.current()\n })\n )\n }\n\n subexit()\n\n if (node.title) {\n subexit = state.enter(`title${suffix}`)\n value += tracker.move(' ' + quote)\n value += tracker.move(\n state.safe(node.title, {\n before: value,\n after: quote,\n ...tracker.current()\n })\n )\n value += tracker.move(quote)\n subexit()\n }\n\n exit()\n\n return value\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['emphasis'], null | undefined>}\n */\nexport function checkEmphasis(state) {\n const marker = state.options.emphasis || '*'\n\n if (marker !== '*' && marker !== '_') {\n throw new Error(\n 'Cannot serialize emphasis with `' +\n marker +\n '` for `options.emphasis`, expected `*`, or `_`'\n )\n }\n\n return marker\n}\n","/**\n * Encode a code point as a character reference.\n *\n * @param {number} code\n * Code point to encode.\n * @returns {string}\n * Encoded character reference.\n */\nexport function encodeCharacterReference(code) {\n return '&#x' + code.toString(16).toUpperCase() + ';'\n}\n","/**\n * @import {Code} from 'micromark-util-types'\n */\n\nimport { markdownLineEndingOrSpace, unicodePunctuation, unicodeWhitespace } from 'micromark-util-character';\n/**\n * Classify whether a code represents whitespace, punctuation, or something\n * else.\n *\n * Used for attention (emphasis, strong), whose sequences can open or close\n * based on the class of surrounding characters.\n *\n * > 👉 **Note**: eof (`null`) is seen as whitespace.\n *\n * @param {Code} code\n * Code.\n * @returns {typeof constants.characterGroupWhitespace | typeof constants.characterGroupPunctuation | undefined}\n * Group.\n */\nexport function classifyCharacter(code) {\n if (code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {\n return 1;\n }\n if (unicodePunctuation(code)) {\n return 2;\n }\n}","/**\n * @import {EncodeSides} from '../types.js'\n */\n\nimport {classifyCharacter} from 'micromark-util-classify-character'\n\n/**\n * Check whether to encode (as a character reference) the characters\n * surrounding an attention run.\n *\n * Which characters are around an attention run influence whether it works or\n * not.\n *\n * See <https://github.com/orgs/syntax-tree/discussions/60> for more info.\n * See this markdown in a particular renderer to see what works:\n *\n * ```markdown\n * | | A (letter inside) | B (punctuation inside) | C (whitespace inside) | D (nothing inside) |\n * | ----------------------- | ----------------- | ---------------------- | --------------------- | ------------------ |\n * | 1 (letter outside) | x*y*z | x*.*z | x* *z | x**z |\n * | 2 (punctuation outside) | .*y*. | .*.*. | .* *. | .**. |\n * | 3 (whitespace outside) | x *y* z | x *.* z | x * * z | x ** z |\n * | 4 (nothing outside) | *x* | *.* | * * | ** |\n * ```\n *\n * @param {number} outside\n * Code point on the outer side of the run.\n * @param {number} inside\n * Code point on the inner side of the run.\n * @param {'*' | '_'} marker\n * Marker of the run.\n * Underscores are handled more strictly (they form less often) than\n * asterisks.\n * @returns {EncodeSides}\n * Whether to encode characters.\n */\n// Important: punctuation must never be encoded.\n// Punctuation is solely used by markdown constructs.\n// And by encoding itself.\n// Encoding them will break constructs or double encode things.\nexport function encodeInfo(outside, inside, marker) {\n const outsideKind = classifyCharacter(outside)\n const insideKind = classifyCharacter(inside)\n\n // Letter outside:\n if (outsideKind === undefined) {\n return insideKind === undefined\n ? // Letter inside:\n // we have to encode *both* letters for `_` as it is looser.\n // it already forms for `*` (and GFMs `~`).\n marker === '_'\n ? {inside: true, outside: true}\n : {inside: false, outside: false}\n : insideKind === 1\n ? // Whitespace inside: encode both (letter, whitespace).\n {inside: true, outside: true}\n : // Punctuation inside: encode outer (letter)\n {inside: false, outside: true}\n }\n\n // Whitespace outside:\n if (outsideKind === 1) {\n return insideKind === undefined\n ? // Letter inside: already forms.\n {inside: false, outside: false}\n : insideKind === 1\n ? // Whitespace inside: encode both (whitespace).\n {inside: true, outside: true}\n : // Punctuation inside: already forms.\n {inside: false, outside: false}\n }\n\n // Punctuation outside:\n return insideKind === undefined\n ? // Letter inside: already forms.\n {inside: false, outside: false}\n : insideKind === 1\n ? // Whitespace inside: encode inner (whitespace).\n {inside: true, outside: false}\n : // Punctuation inside: already forms.\n {inside: false, outside: false}\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Emphasis, Parents} from 'mdast'\n */\n\nimport {checkEmphasis} from '../util/check-emphasis.js'\nimport {encodeCharacterReference} from '../util/encode-character-reference.js'\nimport {encodeInfo} from '../util/encode-info.js'\n\nemphasis.peek = emphasisPeek\n\n/**\n * @param {Emphasis} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function emphasis(node, _, state, info) {\n const marker = checkEmphasis(state)\n const exit = state.enter('emphasis')\n const tracker = state.createTracker(info)\n const before = tracker.move(marker)\n\n let between = tracker.move(\n state.containerPhrasing(node, {\n after: marker,\n before,\n ...tracker.current()\n })\n )\n const betweenHead = between.charCodeAt(0)\n const open = encodeInfo(\n info.before.charCodeAt(info.before.length - 1),\n betweenHead,\n marker\n )\n\n if (open.inside) {\n between = encodeCharacterReference(betweenHead) + between.slice(1)\n }\n\n const betweenTail = between.charCodeAt(between.length - 1)\n const close = encodeInfo(info.after.charCodeAt(0), betweenTail, marker)\n\n if (close.inside) {\n between = between.slice(0, -1) + encodeCharacterReference(betweenTail)\n }\n\n const after = tracker.move(marker)\n\n exit()\n\n state.attentionEncodeSurroundingInfo = {\n after: close.outside,\n before: open.outside\n }\n return before + between + after\n}\n\n/**\n * @param {Emphasis} _\n * @param {Parents | undefined} _1\n * @param {State} state\n * @returns {string}\n */\nfunction emphasisPeek(_, _1, state) {\n return state.options.emphasis || '*'\n}\n","/**\n * @import {State} from 'mdast-util-to-markdown'\n * @import {Heading} from 'mdast'\n */\n\nimport {EXIT, visit} from 'unist-util-visit'\nimport {toString} from 'mdast-util-to-string'\n\n/**\n * @param {Heading} node\n * @param {State} state\n * @returns {boolean}\n */\nexport function formatHeadingAsSetext(node, state) {\n let literalWithBreak = false\n\n // Look for literals with a line break.\n // Note that this also\n visit(node, function (node) {\n if (\n ('value' in node && /\\r?\\n|\\r/.test(node.value)) ||\n node.type === 'break'\n ) {\n literalWithBreak = true\n return EXIT\n }\n })\n\n return Boolean(\n (!node.depth || node.depth < 3) &&\n toString(node) &&\n (state.options.setext || literalWithBreak)\n )\n}\n","/**\n * @typedef {import('mdast').Nodes} Nodes\n *\n * @typedef Options\n * Configuration (optional).\n * @property {boolean | null | undefined} [includeImageAlt=true]\n * Whether to use `alt` for `image`s (default: `true`).\n * @property {boolean | null | undefined} [includeHtml=true]\n * Whether to use `value` of HTML (default: `true`).\n */\n\n/** @type {Options} */\nconst emptyOptions = {}\n\n/**\n * Get the text content of a node or list of nodes.\n *\n * Prefers the node’s plain-text fields, otherwise serializes its children,\n * and if the given value is an array, serialize the nodes in it.\n *\n * @param {unknown} [value]\n * Thing to serialize, typically `Node`.\n * @param {Options | null | undefined} [options]\n * Configuration (optional).\n * @returns {string}\n * Serialized `value`.\n */\nexport function toString(value, options) {\n const settings = options || emptyOptions\n const includeImageAlt =\n typeof settings.includeImageAlt === 'boolean'\n ? settings.includeImageAlt\n : true\n const includeHtml =\n typeof settings.includeHtml === 'boolean' ? settings.includeHtml : true\n\n return one(value, includeImageAlt, includeHtml)\n}\n\n/**\n * One node or several nodes.\n *\n * @param {unknown} value\n * Thing to serialize.\n * @param {boolean} includeImageAlt\n * Include image `alt`s.\n * @param {boolean} includeHtml\n * Include HTML.\n * @returns {string}\n * Serialized node.\n */\nfunction one(value, includeImageAlt, includeHtml) {\n if (node(value)) {\n if ('value' in value) {\n return value.type === 'html' && !includeHtml ? '' : value.value\n }\n\n if (includeImageAlt && 'alt' in value && value.alt) {\n return value.alt\n }\n\n if ('children' in value) {\n return all(value.children, includeImageAlt, includeHtml)\n }\n }\n\n if (Array.isArray(value)) {\n return all(value, includeImageAlt, includeHtml)\n }\n\n return ''\n}\n\n/**\n * Serialize a list of nodes.\n *\n * @param {Array<unknown>} values\n * Thing to serialize.\n * @param {boolean} includeImageAlt\n * Include image `alt`s.\n * @param {boolean} includeHtml\n * Include HTML.\n * @returns {string}\n * Serialized nodes.\n */\nfunction all(values, includeImageAlt, includeHtml) {\n /** @type {Array<string>} */\n const result = []\n let index = -1\n\n while (++index < values.length) {\n result[index] = one(values[index], includeImageAlt, includeHtml)\n }\n\n return result.join('')\n}\n\n/**\n * Check if `value` looks like a node.\n *\n * @param {unknown} value\n * Thing.\n * @returns {value is Nodes}\n * Whether `value` is a node.\n */\nfunction node(value) {\n return Boolean(value && typeof value === 'object')\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Heading, Parents} from 'mdast'\n */\n\nimport {encodeCharacterReference} from '../util/encode-character-reference.js'\nimport {formatHeadingAsSetext} from '../util/format-heading-as-setext.js'\n\n/**\n * @param {Heading} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function heading(node, _, state, info) {\n const rank = Math.max(Math.min(6, node.depth || 1), 1)\n const tracker = state.createTracker(info)\n\n if (formatHeadingAsSetext(node, state)) {\n const exit = state.enter('headingSetext')\n const subexit = state.enter('phrasing')\n const value = state.containerPhrasing(node, {\n ...tracker.current(),\n before: '\\n',\n after: '\\n'\n })\n subexit()\n exit()\n\n return (\n value +\n '\\n' +\n (rank === 1 ? '=' : '-').repeat(\n // The whole size…\n value.length -\n // Minus the position of the character after the last EOL (or\n // 0 if there is none)…\n (Math.max(value.lastIndexOf('\\r'), value.lastIndexOf('\\n')) + 1)\n )\n )\n }\n\n const sequence = '#'.repeat(rank)\n const exit = state.enter('headingAtx')\n const subexit = state.enter('phrasing')\n\n // Note: for proper tracking, we should reset the output positions when there\n // is no content returned, because then the space is not output.\n // Practically, in that case, there is no content, so it doesn’t matter that\n // we’ve tracked one too many characters.\n tracker.move(sequence + ' ')\n\n let value = state.containerPhrasing(node, {\n before: '# ',\n after: '\\n',\n ...tracker.current()\n })\n\n if (/^[\\t ]/.test(value)) {\n // To do: what effect has the character reference on tracking?\n value = encodeCharacterReference(value.charCodeAt(0)) + value.slice(1)\n }\n\n value = value ? sequence + ' ' + value : sequence\n\n if (state.options.closeAtx) {\n value += ' ' + sequence\n }\n\n subexit()\n exit()\n\n return value\n}\n","/**\n * @import {Html} from 'mdast'\n */\n\nhtml.peek = htmlPeek\n\n/**\n * @param {Html} node\n * @returns {string}\n */\nexport function html(node) {\n return node.value || ''\n}\n\n/**\n * @returns {string}\n */\nfunction htmlPeek() {\n return '<'\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Image, Parents} from 'mdast'\n */\n\nimport {checkQuote} from '../util/check-quote.js'\n\nimage.peek = imagePeek\n\n/**\n * @param {Image} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function image(node, _, state, info) {\n const quote = checkQuote(state)\n const suffix = quote === '\"' ? 'Quote' : 'Apostrophe'\n const exit = state.enter('image')\n let subexit = state.enter('label')\n const tracker = state.createTracker(info)\n let value = tracker.move('![')\n value += tracker.move(\n state.safe(node.alt, {before: value, after: ']', ...tracker.current()})\n )\n value += tracker.move('](')\n\n subexit()\n\n if (\n // If there’s no url but there is a title…\n (!node.url && node.title) ||\n // If there are control characters or whitespace.\n /[\\0- \\u007F]/.test(node.url)\n ) {\n subexit = state.enter('destinationLiteral')\n value += tracker.move('<')\n value += tracker.move(\n state.safe(node.url, {before: value, after: '>', ...tracker.current()})\n )\n value += tracker.move('>')\n } else {\n // No whitespace, raw is prettier.\n subexit = state.enter('destinationRaw')\n value += tracker.move(\n state.safe(node.url, {\n before: value,\n after: node.title ? ' ' : ')',\n ...tracker.current()\n })\n )\n }\n\n subexit()\n\n if (node.title) {\n subexit = state.enter(`title${suffix}`)\n value += tracker.move(' ' + quote)\n value += tracker.move(\n state.safe(node.title, {\n before: value,\n after: quote,\n ...tracker.current()\n })\n )\n value += tracker.move(quote)\n subexit()\n }\n\n value += tracker.move(')')\n exit()\n\n return value\n}\n\n/**\n * @returns {string}\n */\nfunction imagePeek() {\n return '!'\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {ImageReference, Parents} from 'mdast'\n */\n\nimageReference.peek = imageReferencePeek\n\n/**\n * @param {ImageReference} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function imageReference(node, _, state, info) {\n const type = node.referenceType\n const exit = state.enter('imageReference')\n let subexit = state.enter('label')\n const tracker = state.createTracker(info)\n let value = tracker.move('![')\n const alt = state.safe(node.alt, {\n before: value,\n after: ']',\n ...tracker.current()\n })\n value += tracker.move(alt + '][')\n\n subexit()\n // Hide the fact that we’re in phrasing, because escapes don’t work.\n const stack = state.stack\n state.stack = []\n subexit = state.enter('reference')\n // Note: for proper tracking, we should reset the output positions when we end\n // up making a `shortcut` reference, because then there is no brace output.\n // Practically, in that case, there is no content, so it doesn’t matter that\n // we’ve tracked one too many characters.\n const reference = state.safe(state.associationId(node), {\n before: value,\n after: ']',\n ...tracker.current()\n })\n subexit()\n state.stack = stack\n exit()\n\n if (type === 'full' || !alt || alt !== reference) {\n value += tracker.move(reference + ']')\n } else if (type === 'shortcut') {\n // Remove the unwanted `[`.\n value = value.slice(0, -1)\n } else {\n value += tracker.move(']')\n }\n\n return value\n}\n\n/**\n * @returns {string}\n */\nfunction imageReferencePeek() {\n return '!'\n}\n","/**\n * @import {State} from 'mdast-util-to-markdown'\n * @import {InlineCode, Parents} from 'mdast'\n */\n\ninlineCode.peek = inlineCodePeek\n\n/**\n * @param {InlineCode} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @returns {string}\n */\nexport function inlineCode(node, _, state) {\n let value = node.value || ''\n let sequence = '`'\n let index = -1\n\n // If there is a single grave accent on its own in the code, use a fence of\n // two.\n // If there are two in a row, use one.\n while (new RegExp('(^|[^`])' + sequence + '([^`]|$)').test(value)) {\n sequence += '`'\n }\n\n // If this is not just spaces or eols (tabs don’t count), and either the\n // first or last character are a space, eol, or tick, then pad with spaces.\n if (\n /[^ \\r\\n]/.test(value) &&\n ((/^[ \\r\\n]/.test(value) && /[ \\r\\n]$/.test(value)) || /^`|`$/.test(value))\n ) {\n value = ' ' + value + ' '\n }\n\n // We have a potential problem: certain characters after eols could result in\n // blocks being seen.\n // For example, if someone injected the string `'\\n# b'`, then that would\n // result in an ATX heading.\n // We can’t escape characters in `inlineCode`, but because eols are\n // transformed to spaces when going from markdown to HTML anyway, we can swap\n // them out.\n while (++index < state.unsafe.length) {\n const pattern = state.unsafe[index]\n const expression = state.compilePattern(pattern)\n /** @type {RegExpExecArray | null} */\n let match\n\n // Only look for `atBreak`s.\n // Btw: note that `atBreak` patterns will always start the regex at LF or\n // CR.\n if (!pattern.atBreak) continue\n\n while ((match = expression.exec(value))) {\n let position = match.index\n\n // Support CRLF (patterns only look for one of the characters).\n if (\n value.charCodeAt(position) === 10 /* `\\n` */ &&\n value.charCodeAt(position - 1) === 13 /* `\\r` */\n ) {\n position--\n }\n\n value = value.slice(0, position) + ' ' + value.slice(match.index + 1)\n }\n }\n\n return sequence + value + sequence\n}\n\n/**\n * @returns {string}\n */\nfunction inlineCodePeek() {\n return '`'\n}\n","/**\n * @import {State} from 'mdast-util-to-markdown'\n * @import {Link} from 'mdast'\n */\n\nimport {toString} from 'mdast-util-to-string'\n\n/**\n * @param {Link} node\n * @param {State} state\n * @returns {boolean}\n */\nexport function formatLinkAsAutolink(node, state) {\n const raw = toString(node)\n\n return Boolean(\n !state.options.resourceLink &&\n // If there’s a url…\n node.url &&\n // And there’s a no title…\n !node.title &&\n // And the content of `node` is a single text node…\n node.children &&\n node.children.length === 1 &&\n node.children[0].type === 'text' &&\n // And if the url is the same as the content…\n (raw === node.url || 'mailto:' + raw === node.url) &&\n // And that starts w/ a protocol…\n /^[a-z][a-z+.-]+:/i.test(node.url) &&\n // And that doesn’t contain ASCII control codes (character escapes and\n // references don’t work), space, or angle brackets…\n !/[\\0- <>\\u007F]/.test(node.url)\n )\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Link, Parents} from 'mdast'\n * @import {Exit} from '../types.js'\n */\n\nimport {checkQuote} from '../util/check-quote.js'\nimport {formatLinkAsAutolink} from '../util/format-link-as-autolink.js'\n\nlink.peek = linkPeek\n\n/**\n * @param {Link} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function link(node, _, state, info) {\n const quote = checkQuote(state)\n const suffix = quote === '\"' ? 'Quote' : 'Apostrophe'\n const tracker = state.createTracker(info)\n /** @type {Exit} */\n let exit\n /** @type {Exit} */\n let subexit\n\n if (formatLinkAsAutolink(node, state)) {\n // Hide the fact that we’re in phrasing, because escapes don’t work.\n const stack = state.stack\n state.stack = []\n exit = state.enter('autolink')\n let value = tracker.move('<')\n value += tracker.move(\n state.containerPhrasing(node, {\n before: value,\n after: '>',\n ...tracker.current()\n })\n )\n value += tracker.move('>')\n exit()\n state.stack = stack\n return value\n }\n\n exit = state.enter('link')\n subexit = state.enter('label')\n let value = tracker.move('[')\n value += tracker.move(\n state.containerPhrasing(node, {\n before: value,\n after: '](',\n ...tracker.current()\n })\n )\n value += tracker.move('](')\n subexit()\n\n if (\n // If there’s no url but there is a title…\n (!node.url && node.title) ||\n // If there are control characters or whitespace.\n /[\\0- \\u007F]/.test(node.url)\n ) {\n subexit = state.enter('destinationLiteral')\n value += tracker.move('<')\n value += tracker.move(\n state.safe(node.url, {before: value, after: '>', ...tracker.current()})\n )\n value += tracker.move('>')\n } else {\n // No whitespace, raw is prettier.\n subexit = state.enter('destinationRaw')\n value += tracker.move(\n state.safe(node.url, {\n before: value,\n after: node.title ? ' ' : ')',\n ...tracker.current()\n })\n )\n }\n\n subexit()\n\n if (node.title) {\n subexit = state.enter(`title${suffix}`)\n value += tracker.move(' ' + quote)\n value += tracker.move(\n state.safe(node.title, {\n before: value,\n after: quote,\n ...tracker.current()\n })\n )\n value += tracker.move(quote)\n subexit()\n }\n\n value += tracker.move(')')\n\n exit()\n return value\n}\n\n/**\n * @param {Link} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @returns {string}\n */\nfunction linkPeek(node, _, state) {\n return formatLinkAsAutolink(node, state) ? '<' : '['\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {LinkReference, Parents} from 'mdast'\n */\n\nlinkReference.peek = linkReferencePeek\n\n/**\n * @param {LinkReference} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function linkReference(node, _, state, info) {\n const type = node.referenceType\n const exit = state.enter('linkReference')\n let subexit = state.enter('label')\n const tracker = state.createTracker(info)\n let value = tracker.move('[')\n const text = state.containerPhrasing(node, {\n before: value,\n after: ']',\n ...tracker.current()\n })\n value += tracker.move(text + '][')\n\n subexit()\n // Hide the fact that we’re in phrasing, because escapes don’t work.\n const stack = state.stack\n state.stack = []\n subexit = state.enter('reference')\n // Note: for proper tracking, we should reset the output positions when we end\n // up making a `shortcut` reference, because then there is no brace output.\n // Practically, in that case, there is no content, so it doesn’t matter that\n // we’ve tracked one too many characters.\n const reference = state.safe(state.associationId(node), {\n before: value,\n after: ']',\n ...tracker.current()\n })\n subexit()\n state.stack = stack\n exit()\n\n if (type === 'full' || !text || text !== reference) {\n value += tracker.move(reference + ']')\n } else if (type === 'shortcut') {\n // Remove the unwanted `[`.\n value = value.slice(0, -1)\n } else {\n value += tracker.move(']')\n }\n\n return value\n}\n\n/**\n * @returns {string}\n */\nfunction linkReferencePeek() {\n return '['\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['bullet'], null | undefined>}\n */\nexport function checkBullet(state) {\n const marker = state.options.bullet || '*'\n\n if (marker !== '*' && marker !== '+' && marker !== '-') {\n throw new Error(\n 'Cannot serialize items with `' +\n marker +\n '` for `options.bullet`, expected `*`, `+`, or `-`'\n )\n }\n\n return marker\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\nimport {checkBullet} from './check-bullet.js'\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['bullet'], null | undefined>}\n */\nexport function checkBulletOther(state) {\n const bullet = checkBullet(state)\n const bulletOther = state.options.bulletOther\n\n if (!bulletOther) {\n return bullet === '*' ? '-' : '*'\n }\n\n if (bulletOther !== '*' && bulletOther !== '+' && bulletOther !== '-') {\n throw new Error(\n 'Cannot serialize items with `' +\n bulletOther +\n '` for `options.bulletOther`, expected `*`, `+`, or `-`'\n )\n }\n\n if (bulletOther === bullet) {\n throw new Error(\n 'Expected `bullet` (`' +\n bullet +\n '`) and `bulletOther` (`' +\n bulletOther +\n '`) to be different'\n )\n }\n\n return bulletOther\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['bulletOrdered'], null | undefined>}\n */\nexport function checkBulletOrdered(state) {\n const marker = state.options.bulletOrdered || '.'\n\n if (marker !== '.' && marker !== ')') {\n throw new Error(\n 'Cannot serialize items with `' +\n marker +\n '` for `options.bulletOrdered`, expected `.` or `)`'\n )\n }\n\n return marker\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['rule'], null | undefined>}\n */\nexport function checkRule(state) {\n const marker = state.options.rule || '*'\n\n if (marker !== '*' && marker !== '-' && marker !== '_') {\n throw new Error(\n 'Cannot serialize rules with `' +\n marker +\n '` for `options.rule`, expected `*`, `-`, or `_`'\n )\n }\n\n return marker\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {List, Parents} from 'mdast'\n */\n\nimport {checkBullet} from '../util/check-bullet.js'\nimport {checkBulletOther} from '../util/check-bullet-other.js'\nimport {checkBulletOrdered} from '../util/check-bullet-ordered.js'\nimport {checkRule} from '../util/check-rule.js'\n\n/**\n * @param {List} node\n * @param {Parents | undefined} parent\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function list(node, parent, state, info) {\n const exit = state.enter('list')\n const bulletCurrent = state.bulletCurrent\n /** @type {string} */\n let bullet = node.ordered ? checkBulletOrdered(state) : checkBullet(state)\n /** @type {string} */\n const bulletOther = node.ordered\n ? bullet === '.'\n ? ')'\n : '.'\n : checkBulletOther(state)\n let useDifferentMarker =\n parent && state.bulletLastUsed ? bullet === state.bulletLastUsed : false\n\n if (!node.ordered) {\n const firstListItem = node.children ? node.children[0] : undefined\n\n // If there’s an empty first list item directly in two list items,\n // we have to use a different bullet:\n //\n // ```markdown\n // * - *\n // ```\n //\n // …because otherwise it would become one big thematic break.\n if (\n // Bullet could be used as a thematic break marker:\n (bullet === '*' || bullet === '-') &&\n // Empty first list item:\n firstListItem &&\n (!firstListItem.children || !firstListItem.children[0]) &&\n // Directly in two other list items:\n state.stack[state.stack.length - 1] === 'list' &&\n state.stack[state.stack.length - 2] === 'listItem' &&\n state.stack[state.stack.length - 3] === 'list' &&\n state.stack[state.stack.length - 4] === 'listItem' &&\n // That are each the first child.\n state.indexStack[state.indexStack.length - 1] === 0 &&\n state.indexStack[state.indexStack.length - 2] === 0 &&\n state.indexStack[state.indexStack.length - 3] === 0\n ) {\n useDifferentMarker = true\n }\n\n // If there’s a thematic break at the start of the first list item,\n // we have to use a different bullet:\n //\n // ```markdown\n // * ---\n // ```\n //\n // …because otherwise it would become one big thematic break.\n if (checkRule(state) === bullet && firstListItem) {\n let index = -1\n\n while (++index < node.children.length) {\n const item = node.children[index]\n\n if (\n item &&\n item.type === 'listItem' &&\n item.children &&\n item.children[0] &&\n item.children[0].type === 'thematicBreak'\n ) {\n useDifferentMarker = true\n break\n }\n }\n }\n }\n\n if (useDifferentMarker) {\n bullet = bulletOther\n }\n\n state.bulletCurrent = bullet\n const value = state.containerFlow(node, info)\n state.bulletLastUsed = bullet\n state.bulletCurrent = bulletCurrent\n exit()\n return value\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['listItemIndent'], null | undefined>}\n */\nexport function checkListItemIndent(state) {\n const style = state.options.listItemIndent || 'one'\n\n if (style !== 'tab' && style !== 'one' && style !== 'mixed') {\n throw new Error(\n 'Cannot serialize items with `' +\n style +\n '` for `options.listItemIndent`, expected `tab`, `one`, or `mixed`'\n )\n }\n\n return style\n}\n","/**\n * @import {Info, Map, State} from 'mdast-util-to-markdown'\n * @import {ListItem, Parents} from 'mdast'\n */\n\nimport {checkBullet} from '../util/check-bullet.js'\nimport {checkListItemIndent} from '../util/check-list-item-indent.js'\n\n/**\n * @param {ListItem} node\n * @param {Parents | undefined} parent\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function listItem(node, parent, state, info) {\n const listItemIndent = checkListItemIndent(state)\n let bullet = state.bulletCurrent || checkBullet(state)\n\n // Add the marker value for ordered lists.\n if (parent && parent.type === 'list' && parent.ordered) {\n bullet =\n (typeof parent.start === 'number' && parent.start > -1\n ? parent.start\n : 1) +\n (state.options.incrementListMarker === false\n ? 0\n : parent.children.indexOf(node)) +\n bullet\n }\n\n let size = bullet.length + 1\n\n if (\n listItemIndent === 'tab' ||\n (listItemIndent === 'mixed' &&\n ((parent && parent.type === 'list' && parent.spread) || node.spread))\n ) {\n size = Math.ceil(size / 4) * 4\n }\n\n const tracker = state.createTracker(info)\n tracker.move(bullet + ' '.repeat(size - bullet.length))\n tracker.shift(size)\n const exit = state.enter('listItem')\n const value = state.indentLines(\n state.containerFlow(node, tracker.current()),\n map\n )\n exit()\n\n return value\n\n /** @type {Map} */\n function map(line, index, blank) {\n if (index) {\n return (blank ? '' : ' '.repeat(size)) + line\n }\n\n return (blank ? bullet : bullet + ' '.repeat(size - bullet.length)) + line\n }\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Paragraph, Parents} from 'mdast'\n */\n\n/**\n * @param {Paragraph} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function paragraph(node, _, state, info) {\n const exit = state.enter('paragraph')\n const subexit = state.enter('phrasing')\n const value = state.containerPhrasing(node, info)\n subexit()\n exit()\n return value\n}\n","/**\n * @typedef {import('mdast').Html} Html\n * @typedef {import('mdast').PhrasingContent} PhrasingContent\n */\n\nimport {convert} from 'unist-util-is'\n\n/**\n * Check if the given value is *phrasing content*.\n *\n * > 👉 **Note**: Excludes `html`, which can be both phrasing or flow.\n *\n * @param node\n * Thing to check, typically `Node`.\n * @returns\n * Whether `value` is phrasing content.\n */\n\nexport const phrasing =\n /** @type {(node?: unknown) => node is Exclude<PhrasingContent, Html>} */\n (\n convert([\n 'break',\n 'delete',\n 'emphasis',\n // To do: next major: removed since footnotes were added to GFM.\n 'footnote',\n 'footnoteReference',\n 'image',\n 'imageReference',\n 'inlineCode',\n // Enabled by `mdast-util-math`:\n 'inlineMath',\n 'link',\n 'linkReference',\n // Enabled by `mdast-util-mdx`:\n 'mdxJsxTextElement',\n // Enabled by `mdast-util-mdx`:\n 'mdxTextExpression',\n 'strong',\n 'text',\n // Enabled by `mdast-util-directive`:\n 'textDirective'\n ])\n )\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Parents, Root} from 'mdast'\n */\n\nimport {phrasing} from 'mdast-util-phrasing'\n\n/**\n * @param {Root} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function root(node, _, state, info) {\n // Note: `html` nodes are ambiguous.\n const hasPhrasing = node.children.some(function (d) {\n return phrasing(d)\n })\n\n const container = hasPhrasing ? state.containerPhrasing : state.containerFlow\n return container.call(state, node, info)\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['strong'], null | undefined>}\n */\nexport function checkStrong(state) {\n const marker = state.options.strong || '*'\n\n if (marker !== '*' && marker !== '_') {\n throw new Error(\n 'Cannot serialize strong with `' +\n marker +\n '` for `options.strong`, expected `*`, or `_`'\n )\n }\n\n return marker\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Parents, Strong} from 'mdast'\n */\n\nimport {checkStrong} from '../util/check-strong.js'\nimport {encodeCharacterReference} from '../util/encode-character-reference.js'\nimport {encodeInfo} from '../util/encode-info.js'\n\nstrong.peek = strongPeek\n\n/**\n * @param {Strong} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function strong(node, _, state, info) {\n const marker = checkStrong(state)\n const exit = state.enter('strong')\n const tracker = state.createTracker(info)\n const before = tracker.move(marker + marker)\n\n let between = tracker.move(\n state.containerPhrasing(node, {\n after: marker,\n before,\n ...tracker.current()\n })\n )\n const betweenHead = between.charCodeAt(0)\n const open = encodeInfo(\n info.before.charCodeAt(info.before.length - 1),\n betweenHead,\n marker\n )\n\n if (open.inside) {\n between = encodeCharacterReference(betweenHead) + between.slice(1)\n }\n\n const betweenTail = between.charCodeAt(between.length - 1)\n const close = encodeInfo(info.after.charCodeAt(0), betweenTail, marker)\n\n if (close.inside) {\n between = between.slice(0, -1) + encodeCharacterReference(betweenTail)\n }\n\n const after = tracker.move(marker + marker)\n\n exit()\n\n state.attentionEncodeSurroundingInfo = {\n after: close.outside,\n before: open.outside\n }\n return before + between + after\n}\n\n/**\n * @param {Strong} _\n * @param {Parents | undefined} _1\n * @param {State} state\n * @returns {string}\n */\nfunction strongPeek(_, _1, state) {\n return state.options.strong || '*'\n}\n","/**\n * @import {Info, State} from 'mdast-util-to-markdown'\n * @import {Parents, Text} from 'mdast'\n */\n\n/**\n * @param {Text} node\n * @param {Parents | undefined} _\n * @param {State} state\n * @param {Info} info\n * @returns {string}\n */\nexport function text(node, _, state, info) {\n return state.safe(node.value, info)\n}\n","/**\n * @import {Options, State} from 'mdast-util-to-markdown'\n */\n\n/**\n * @param {State} state\n * @returns {Exclude<Options['ruleRepetition'], null | undefined>}\n */\nexport function checkRuleRepetition(state) {\n const repetition = state.options.ruleRepetition || 3\n\n if (repetition < 3) {\n throw new Error(\n 'Cannot serialize rules with repetition `' +\n repetition +\n '` for `options.ruleRepetition`, expected `3` or more'\n )\n }\n\n return repetition\n}\n","/**\n * @import {State} from 'mdast-util-to-markdown'\n * @import {Parents, ThematicBreak} from 'mdast'\n */\n\nimport {checkRuleRepetition} from '../util/check-rule-repetition.js'\nimport {checkRule} from '../util/check-rule.js'\n\n/**\n * @param {ThematicBreak} _\n * @param {Parents | undefined} _1\n * @param {State} state\n * @returns {string}\n */\nexport function thematicBreak(_, _1, state) {\n const value = (\n checkRule(state) + (state.options.ruleSpaces ? ' ' : '')\n ).repeat(checkRuleRepetition(state))\n\n return state.options.ruleSpaces ? value.slice(0, -1) : value\n}\n","import {blockquote} from './blockquote.js'\nimport {hardBreak} from './break.js'\nimport {code} from './code.js'\nimport {definition} from './definition.js'\nimport {emphasis} from './emphasis.js'\nimport {heading} from './heading.js'\nimport {html} from './html.js'\nimport {image} from './image.js'\nimport {imageReference} from './image-reference.js'\nimport {inlineCode} from './inline-code.js'\nimport {link} from './link.js'\nimport {linkReference} from './link-reference.js'\nimport {list} from './list.js'\nimport {listItem} from './list-item.js'\nimport {paragraph} from './paragraph.js'\nimport {root} from './root.js'\nimport {strong} from './strong.js'\nimport {text} from './text.js'\nimport {thematicBreak} from './thematic-break.js'\n\n/**\n * Default (CommonMark) handlers.\n */\nexport const handle = {\n blockquote,\n break: hardBreak,\n code,\n definition,\n emphasis,\n hardBreak,\n heading,\n html,\n image,\n imageReference,\n inlineCode,\n link,\n linkReference,\n list,\n listItem,\n paragraph,\n root,\n strong,\n text,\n thematicBreak\n}\n","/**\n * @typedef {import('mdast').InlineCode} InlineCode\n * @typedef {import('mdast').Table} Table\n * @typedef {import('mdast').TableCell} TableCell\n * @typedef {import('mdast').TableRow} TableRow\n *\n * @typedef {import('markdown-table').Options} MarkdownTableOptions\n *\n * @typedef {import('mdast-util-from-markdown').CompileContext} CompileContext\n * @typedef {import('mdast-util-from-markdown').Extension} FromMarkdownExtension\n * @typedef {import('mdast-util-from-markdown').Handle} FromMarkdownHandle\n *\n * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownExtension\n * @typedef {import('mdast-util-to-markdown').Handle} ToMarkdownHandle\n * @typedef {import('mdast-util-to-markdown').State} State\n * @typedef {import('mdast-util-to-markdown').Info} Info\n */\n\n/**\n * @typedef Options\n * Configuration.\n * @property {boolean | null | undefined} [tableCellPadding=true]\n * Whether to add a space of padding between delimiters and cells (default:\n * `true`).\n * @property {boolean | null | undefined} [tablePipeAlign=true]\n * Whether to align the delimiters (default: `true`).\n * @property {MarkdownTableOptions['stringLength'] | null | undefined} [stringLength]\n * Function to detect the length of table cell content, used when aligning\n * the delimiters between cells (optional).\n */\n\nimport {ok as assert} from 'devlop'\nimport {markdownTable} from 'markdown-table'\nimport {defaultHandlers} from 'mdast-util-to-markdown'\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM tables in\n * markdown.\n *\n * @returns {FromMarkdownExtension}\n * Extension for `mdast-util-from-markdown` to enable GFM tables.\n */\nexport function gfmTableFromMarkdown() {\n return {\n enter: {\n table: enterTable,\n tableData: enterCell,\n tableHeader: enterCell,\n tableRow: enterRow\n },\n exit: {\n codeText: exitCodeText,\n table: exitTable,\n tableData: exit,\n tableHeader: exit,\n tableRow: exit\n }\n }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterTable(token) {\n const align = token._align\n assert(align, 'expected `_align` on table')\n this.enter(\n {\n type: 'table',\n align: align.map(function (d) {\n return d === 'none' ? null : d\n }),\n children: []\n },\n token\n )\n this.data.inTable = true\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitTable(token) {\n this.exit(token)\n this.data.inTable = undefined\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterRow(token) {\n this.enter({type: 'tableRow', children: []}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exit(token) {\n this.exit(token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterCell(token) {\n this.enter({type: 'tableCell', children: []}, token)\n}\n\n// Overwrite the default code text data handler to unescape escaped pipes when\n// they are in tables.\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitCodeText(token) {\n let value = this.resume()\n\n if (this.data.inTable) {\n value = value.replace(/\\\\([\\\\|])/g, replace)\n }\n\n const node = this.stack[this.stack.length - 1]\n assert(node.type === 'inlineCode')\n node.value = value\n this.exit(token)\n}\n\n/**\n * @param {string} $0\n * @param {string} $1\n * @returns {string}\n */\nfunction replace($0, $1) {\n // Pipes work, backslashes don’t (but can’t escape pipes).\n return $1 === '|' ? $1 : $0\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM tables in\n * markdown.\n *\n * @param {Options | null | undefined} [options]\n * Configuration.\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown` to enable GFM tables.\n */\nexport function gfmTableToMarkdown(options) {\n const settings = options || {}\n const padding = settings.tableCellPadding\n const alignDelimiters = settings.tablePipeAlign\n const stringLength = settings.stringLength\n const around = padding ? ' ' : '|'\n\n return {\n unsafe: [\n {character: '\\r', inConstruct: 'tableCell'},\n {character: '\\n', inConstruct: 'tableCell'},\n // A pipe, when followed by a tab or space (padding), or a dash or colon\n // (unpadded delimiter row), could result in a table.\n {atBreak: true, character: '|', after: '[\\t :-]'},\n // A pipe in a cell must be encoded.\n {character: '|', inConstruct: 'tableCell'},\n // A colon must be followed by a dash, in which case it could start a\n // delimiter row.\n {atBreak: true, character: ':', after: '-'},\n // A delimiter row can also start with a dash, when followed by more\n // dashes, a colon, or a pipe.\n // This is a stricter version than the built in check for lists, thematic\n // breaks, and setex heading underlines though:\n // <https://github.com/syntax-tree/mdast-util-to-markdown/blob/51a2038/lib/unsafe.js#L57>\n {atBreak: true, character: '-', after: '[:|-]'}\n ],\n handlers: {\n inlineCode: inlineCodeWithTable,\n table: handleTable,\n tableCell: handleTableCell,\n tableRow: handleTableRow\n }\n }\n\n /**\n * @type {ToMarkdownHandle}\n * @param {Table} node\n */\n function handleTable(node, _, state, info) {\n return serializeData(handleTableAsData(node, state, info), node.align)\n }\n\n /**\n * This function isn’t really used normally, because we handle rows at the\n * table level.\n * But, if someone passes in a table row, this ensures we make somewhat sense.\n *\n * @type {ToMarkdownHandle}\n * @param {TableRow} node\n */\n function handleTableRow(node, _, state, info) {\n const row = handleTableRowAsData(node, state, info)\n const value = serializeData([row])\n // `markdown-table` will always add an align row\n return value.slice(0, value.indexOf('\\n'))\n }\n\n /**\n * @type {ToMarkdownHandle}\n * @param {TableCell} node\n */\n function handleTableCell(node, _, state, info) {\n const exit = state.enter('tableCell')\n const subexit = state.enter('phrasing')\n const value = state.containerPhrasing(node, {\n ...info,\n before: around,\n after: around\n })\n subexit()\n exit()\n return value\n }\n\n /**\n * @param {Array<Array<string>>} matrix\n * @param {Array<string | null | undefined> | null | undefined} [align]\n */\n function serializeData(matrix, align) {\n return markdownTable(matrix, {\n align,\n // @ts-expect-error: `markdown-table` types should support `null`.\n alignDelimiters,\n // @ts-expect-error: `markdown-table` types should support `null`.\n padding,\n // @ts-expect-error: `markdown-table` types should support `null`.\n stringLength\n })\n }\n\n /**\n * @param {Table} node\n * @param {State} state\n * @param {Info} info\n */\n function handleTableAsData(node, state, info) {\n const children = node.children\n let index = -1\n /** @type {Array<Array<string>>} */\n const result = []\n const subexit = state.enter('table')\n\n while (++index < children.length) {\n result[index] = handleTableRowAsData(children[index], state, info)\n }\n\n subexit()\n\n return result\n }\n\n /**\n * @param {TableRow} node\n * @param {State} state\n * @param {Info} info\n */\n function handleTableRowAsData(node, state, info) {\n const children = node.children\n let index = -1\n /** @type {Array<string>} */\n const result = []\n const subexit = state.enter('tableRow')\n\n while (++index < children.length) {\n // Note: the positional info as used here is incorrect.\n // Making it correct would be impossible due to aligning cells?\n // And it would need copy/pasting `markdown-table` into this project.\n result[index] = handleTableCell(children[index], node, state, info)\n }\n\n subexit()\n\n return result\n }\n\n /**\n * @type {ToMarkdownHandle}\n * @param {InlineCode} node\n */\n function inlineCodeWithTable(node, parent, state) {\n let value = defaultHandlers.inlineCode(node, parent, state)\n\n if (state.stack.includes('tableCell')) {\n value = value.replace(/\\|/g, '\\\\$&')\n }\n\n return value\n }\n}\n","/**\n * @typedef {import('mdast').ListItem} ListItem\n * @typedef {import('mdast').Paragraph} Paragraph\n * @typedef {import('mdast-util-from-markdown').CompileContext} CompileContext\n * @typedef {import('mdast-util-from-markdown').Extension} FromMarkdownExtension\n * @typedef {import('mdast-util-from-markdown').Handle} FromMarkdownHandle\n * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownExtension\n * @typedef {import('mdast-util-to-markdown').Handle} ToMarkdownHandle\n */\n\nimport {ok as assert} from 'devlop'\nimport {defaultHandlers} from 'mdast-util-to-markdown'\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM task\n * list items in markdown.\n *\n * @returns {FromMarkdownExtension}\n * Extension for `mdast-util-from-markdown` to enable GFM task list items.\n */\nexport function gfmTaskListItemFromMarkdown() {\n return {\n exit: {\n taskListCheckValueChecked: exitCheck,\n taskListCheckValueUnchecked: exitCheck,\n paragraph: exitParagraphWithTaskListItem\n }\n }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM task list\n * items in markdown.\n *\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown` to enable GFM task list items.\n */\nexport function gfmTaskListItemToMarkdown() {\n return {\n unsafe: [{atBreak: true, character: '-', after: '[:|-]'}],\n handlers: {listItem: listItemWithTaskListItem}\n }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitCheck(token) {\n // We’re always in a paragraph, in a list item.\n const node = this.stack[this.stack.length - 2]\n assert(node.type === 'listItem')\n node.checked = token.type === 'taskListCheckValueChecked'\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitParagraphWithTaskListItem(token) {\n const parent = this.stack[this.stack.length - 2]\n\n if (\n parent &&\n parent.type === 'listItem' &&\n typeof parent.checked === 'boolean'\n ) {\n const node = this.stack[this.stack.length - 1]\n assert(node.type === 'paragraph')\n const head = node.children[0]\n\n if (head && head.type === 'text') {\n const siblings = parent.children\n let index = -1\n /** @type {Paragraph | undefined} */\n let firstParaghraph\n\n while (++index < siblings.length) {\n const sibling = siblings[index]\n if (sibling.type === 'paragraph') {\n firstParaghraph = sibling\n break\n }\n }\n\n if (firstParaghraph === node) {\n // Must start with a space or a tab.\n head.value = head.value.slice(1)\n\n if (head.value.length === 0) {\n node.children.shift()\n } else if (\n node.position &&\n head.position &&\n typeof head.position.start.offset === 'number'\n ) {\n head.position.start.column++\n head.position.start.offset++\n node.position.start = Object.assign({}, head.position.start)\n }\n }\n }\n }\n\n this.exit(token)\n}\n\n/**\n * @type {ToMarkdownHandle}\n * @param {ListItem} node\n */\nfunction listItemWithTaskListItem(node, parent, state, info) {\n const head = node.children[0]\n const checkable =\n typeof node.checked === 'boolean' && head && head.type === 'paragraph'\n const checkbox = '[' + (node.checked ? 'x' : ' ') + '] '\n const tracker = state.createTracker(info)\n\n if (checkable) {\n tracker.move(checkbox)\n }\n\n let value = defaultHandlers.listItem(node, parent, state, {\n ...info,\n ...tracker.current()\n })\n\n if (checkable) {\n value = value.replace(/^(?:[*+-]|\\d+\\.)([\\r\\n]| {1,3})/, check)\n }\n\n return value\n\n /**\n * @param {string} $0\n * @returns {string}\n */\n function check($0) {\n return $0 + checkbox\n }\n}\n","/**\n * @import {Extension as FromMarkdownExtension} from 'mdast-util-from-markdown'\n * @import {Options} from 'mdast-util-gfm'\n * @import {Options as ToMarkdownExtension} from 'mdast-util-to-markdown'\n */\n\nimport {\n gfmAutolinkLiteralFromMarkdown,\n gfmAutolinkLiteralToMarkdown\n} from 'mdast-util-gfm-autolink-literal'\nimport {\n gfmFootnoteFromMarkdown,\n gfmFootnoteToMarkdown\n} from 'mdast-util-gfm-footnote'\nimport {\n gfmStrikethroughFromMarkdown,\n gfmStrikethroughToMarkdown\n} from 'mdast-util-gfm-strikethrough'\nimport {gfmTableFromMarkdown, gfmTableToMarkdown} from 'mdast-util-gfm-table'\nimport {\n gfmTaskListItemFromMarkdown,\n gfmTaskListItemToMarkdown\n} from 'mdast-util-gfm-task-list-item'\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM (autolink\n * literals, footnotes, strikethrough, tables, tasklists).\n *\n * @returns {Array<FromMarkdownExtension>}\n * Extension for `mdast-util-from-markdown` to enable GFM (autolink literals,\n * footnotes, strikethrough, tables, tasklists).\n */\nexport function gfmFromMarkdown() {\n return [\n gfmAutolinkLiteralFromMarkdown(),\n gfmFootnoteFromMarkdown(),\n gfmStrikethroughFromMarkdown(),\n gfmTableFromMarkdown(),\n gfmTaskListItemFromMarkdown()\n ]\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM (autolink\n * literals, footnotes, strikethrough, tables, tasklists).\n *\n * @param {Options | null | undefined} [options]\n * Configuration (optional).\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown` to enable GFM (autolink literals,\n * footnotes, strikethrough, tables, tasklists).\n */\nexport function gfmToMarkdown(options) {\n return {\n extensions: [\n gfmAutolinkLiteralToMarkdown(),\n gfmFootnoteToMarkdown(options),\n gfmStrikethroughToMarkdown(),\n gfmTableToMarkdown(options),\n gfmTaskListItemToMarkdown()\n ]\n }\n}\n","/**\n * Like `Array#splice`, but smarter for giant arrays.\n *\n * `Array#splice` takes all items to be inserted as individual argument which\n * causes a stack overflow in V8 when trying to insert 100k items for instance.\n *\n * Otherwise, this does not return the removed items, and takes `items` as an\n * array instead of rest parameters.\n *\n * @template {unknown} T\n * Item type.\n * @param {Array<T>} list\n * List to operate on.\n * @param {number} start\n * Index to remove/insert at (can be negative).\n * @param {number} remove\n * Number of items to remove.\n * @param {Array<T>} items\n * Items to inject into `list`.\n * @returns {undefined}\n * Nothing.\n */\nexport function splice(list, start, remove, items) {\n const end = list.length;\n let chunkStart = 0;\n /** @type {Array<unknown>} */\n let parameters;\n\n // Make start between zero and `end` (included).\n if (start < 0) {\n start = -start > end ? 0 : end + start;\n } else {\n start = start > end ? end : start;\n }\n remove = remove > 0 ? remove : 0;\n\n // No need to chunk the items if there’s only a couple (10k) items.\n if (items.length < 10000) {\n parameters = Array.from(items);\n parameters.unshift(start, remove);\n // @ts-expect-error Hush, it’s fine.\n list.splice(...parameters);\n } else {\n // Delete `remove` items starting from `start`\n if (remove) list.splice(start, remove);\n\n // Insert the items in chunks to not cause stack overflows.\n while (chunkStart < items.length) {\n parameters = items.slice(chunkStart, chunkStart + 10000);\n parameters.unshift(start, 0);\n // @ts-expect-error Hush, it’s fine.\n list.splice(...parameters);\n chunkStart += 10000;\n start += 10000;\n }\n }\n}\n\n/**\n * Append `items` (an array) at the end of `list` (another array).\n * When `list` was empty, returns `items` instead.\n *\n * This prevents a potentially expensive operation when `list` is empty,\n * and adds items in batches to prevent V8 from hanging.\n *\n * @template {unknown} T\n * Item type.\n * @param {Array<T>} list\n * List to operate on.\n * @param {Array<T>} items\n * Items to add to `list`.\n * @returns {Array<T>}\n * Either `list` or `items`.\n */\nexport function push(list, items) {\n if (list.length > 0) {\n splice(list, list.length, 0, items);\n return list;\n }\n return items;\n}","/**\n * @import {\n * Extension,\n * Handles,\n * HtmlExtension,\n * NormalizedExtension\n * } from 'micromark-util-types'\n */\n\nimport {splice} from 'micromark-util-chunked'\n\nconst hasOwnProperty = {}.hasOwnProperty\n\n/**\n * Combine multiple syntax extensions into one.\n *\n * @param {ReadonlyArray<Extension>} extensions\n * List of syntax extensions.\n * @returns {NormalizedExtension}\n * A single combined extension.\n */\nexport function combineExtensions(extensions) {\n /** @type {NormalizedExtension} */\n const all = {}\n let index = -1\n\n while (++index < extensions.length) {\n syntaxExtension(all, extensions[index])\n }\n\n return all\n}\n\n/**\n * Merge `extension` into `all`.\n *\n * @param {NormalizedExtension} all\n * Extension to merge into.\n * @param {Extension} extension\n * Extension to merge.\n * @returns {undefined}\n * Nothing.\n */\nfunction syntaxExtension(all, extension) {\n /** @type {keyof Extension} */\n let hook\n\n for (hook in extension) {\n const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined\n /** @type {Record<string, unknown>} */\n const left = maybe || (all[hook] = {})\n /** @type {Record<string, unknown> | undefined} */\n const right = extension[hook]\n /** @type {string} */\n let code\n\n if (right) {\n for (code in right) {\n if (!hasOwnProperty.call(left, code)) left[code] = []\n const value = right[code]\n constructs(\n // @ts-expect-error Looks like a list.\n left[code],\n Array.isArray(value) ? value : value ? [value] : []\n )\n }\n }\n }\n}\n\n/**\n * Merge `list` into `existing` (both lists of constructs).\n * Mutates `existing`.\n *\n * @param {Array<unknown>} existing\n * List of constructs to merge into.\n * @param {Array<unknown>} list\n * List of constructs to merge.\n * @returns {undefined}\n * Nothing.\n */\nfunction constructs(existing, list) {\n let index = -1\n /** @type {Array<unknown>} */\n const before = []\n\n while (++index < list.length) {\n // @ts-expect-error Looks like an object.\n ;(list[index].add === 'after' ? existing : before).push(list[index])\n }\n\n splice(existing, 0, 0, before)\n}\n\n/**\n * Combine multiple HTML extensions into one.\n *\n * @param {ReadonlyArray<HtmlExtension>} htmlExtensions\n * List of HTML extensions.\n * @returns {HtmlExtension}\n * Single combined HTML extension.\n */\nexport function combineHtmlExtensions(htmlExtensions) {\n /** @type {HtmlExtension} */\n const handlers = {}\n let index = -1\n\n while (++index < htmlExtensions.length) {\n htmlExtension(handlers, htmlExtensions[index])\n }\n\n return handlers\n}\n\n/**\n * Merge `extension` into `all`.\n *\n * @param {HtmlExtension} all\n * Extension to merge into.\n * @param {HtmlExtension} extension\n * Extension to merge.\n * @returns {undefined}\n * Nothing.\n */\nfunction htmlExtension(all, extension) {\n /** @type {keyof HtmlExtension} */\n let hook\n\n for (hook in extension) {\n const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined\n const left = maybe || (all[hook] = {})\n const right = extension[hook]\n /** @type {keyof Handles} */\n let type\n\n if (right) {\n for (type in right) {\n // @ts-expect-error assume document vs regular handler are managed correctly.\n left[type] = right[type]\n }\n }\n }\n}\n","/**\n * @import {Code, ConstructRecord, Event, Extension, Previous, State, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { asciiAlpha, asciiAlphanumeric, asciiControl, markdownLineEndingOrSpace, unicodePunctuation, unicodeWhitespace } from 'micromark-util-character';\nconst wwwPrefix = {\n tokenize: tokenizeWwwPrefix,\n partial: true\n};\nconst domain = {\n tokenize: tokenizeDomain,\n partial: true\n};\nconst path = {\n tokenize: tokenizePath,\n partial: true\n};\nconst trail = {\n tokenize: tokenizeTrail,\n partial: true\n};\nconst emailDomainDotTrail = {\n tokenize: tokenizeEmailDomainDotTrail,\n partial: true\n};\nconst wwwAutolink = {\n name: 'wwwAutolink',\n tokenize: tokenizeWwwAutolink,\n previous: previousWww\n};\nconst protocolAutolink = {\n name: 'protocolAutolink',\n tokenize: tokenizeProtocolAutolink,\n previous: previousProtocol\n};\nconst emailAutolink = {\n name: 'emailAutolink',\n tokenize: tokenizeEmailAutolink,\n previous: previousEmail\n};\n\n/** @type {ConstructRecord} */\nconst text = {};\n\n/**\n * Create an extension for `micromark` to support GitHub autolink literal\n * syntax.\n *\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `extensions` to enable GFM\n * autolink literal syntax.\n */\nexport function gfmAutolinkLiteral() {\n return {\n text\n };\n}\n\n/** @type {Code} */\nlet code = 48;\n\n// Add alphanumerics.\nwhile (code < 123) {\n text[code] = emailAutolink;\n code++;\n if (code === 58) code = 65;else if (code === 91) code = 97;\n}\ntext[43] = emailAutolink;\ntext[45] = emailAutolink;\ntext[46] = emailAutolink;\ntext[95] = emailAutolink;\ntext[72] = [emailAutolink, protocolAutolink];\ntext[104] = [emailAutolink, protocolAutolink];\ntext[87] = [emailAutolink, wwwAutolink];\ntext[119] = [emailAutolink, wwwAutolink];\n\n// To do: perform email autolink literals on events, afterwards.\n// That’s where `markdown-rs` and `cmark-gfm` perform it.\n// It should look for `@`, then for atext backwards, and then for a label\n// forwards.\n// To do: `mailto:`, `xmpp:` protocol as prefix.\n\n/**\n * Email autolink literal.\n *\n * ```markdown\n * > | a contact@example.org b\n * ^^^^^^^^^^^^^^^^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeEmailAutolink(effects, ok, nok) {\n const self = this;\n /** @type {boolean | undefined} */\n let dot;\n /** @type {boolean} */\n let data;\n return start;\n\n /**\n * Start of email autolink literal.\n *\n * ```markdown\n * > | a contact@example.org b\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n if (!gfmAtext(code) || !previousEmail.call(self, self.previous) || previousUnbalanced(self.events)) {\n return nok(code);\n }\n effects.enter('literalAutolink');\n effects.enter('literalAutolinkEmail');\n return atext(code);\n }\n\n /**\n * In email atext.\n *\n * ```markdown\n * > | a contact@example.org b\n * ^\n * ```\n *\n * @type {State}\n */\n function atext(code) {\n if (gfmAtext(code)) {\n effects.consume(code);\n return atext;\n }\n if (code === 64) {\n effects.consume(code);\n return emailDomain;\n }\n return nok(code);\n }\n\n /**\n * In email domain.\n *\n * The reference code is a bit overly complex as it handles the `@`, of which\n * there may be just one.\n * Source: <https://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L318>\n *\n * ```markdown\n * > | a contact@example.org b\n * ^\n * ```\n *\n * @type {State}\n */\n function emailDomain(code) {\n // Dot followed by alphanumerical (not `-` or `_`).\n if (code === 46) {\n return effects.check(emailDomainDotTrail, emailDomainAfter, emailDomainDot)(code);\n }\n\n // Alphanumerical, `-`, and `_`.\n if (code === 45 || code === 95 || asciiAlphanumeric(code)) {\n data = true;\n effects.consume(code);\n return emailDomain;\n }\n\n // To do: `/` if xmpp.\n\n // Note: normally we’d truncate trailing punctuation from the link.\n // However, email autolink literals cannot contain any of those markers,\n // except for `.`, but that can only occur if it isn’t trailing.\n // So we can ignore truncating!\n return emailDomainAfter(code);\n }\n\n /**\n * In email domain, on dot that is not a trail.\n *\n * ```markdown\n * > | a contact@example.org b\n * ^\n * ```\n *\n * @type {State}\n */\n function emailDomainDot(code) {\n effects.consume(code);\n dot = true;\n return emailDomain;\n }\n\n /**\n * After email domain.\n *\n * ```markdown\n * > | a contact@example.org b\n * ^\n * ```\n *\n * @type {State}\n */\n function emailDomainAfter(code) {\n // Domain must not be empty, must include a dot, and must end in alphabetical.\n // Source: <https://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L332>.\n if (data && dot && asciiAlpha(self.previous)) {\n effects.exit('literalAutolinkEmail');\n effects.exit('literalAutolink');\n return ok(code);\n }\n return nok(code);\n }\n}\n\n/**\n * `www` autolink literal.\n *\n * ```markdown\n * > | a www.example.org b\n * ^^^^^^^^^^^^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeWwwAutolink(effects, ok, nok) {\n const self = this;\n return wwwStart;\n\n /**\n * Start of www autolink literal.\n *\n * ```markdown\n * > | www.example.com/a?b#c\n * ^\n * ```\n *\n * @type {State}\n */\n function wwwStart(code) {\n if (code !== 87 && code !== 119 || !previousWww.call(self, self.previous) || previousUnbalanced(self.events)) {\n return nok(code);\n }\n effects.enter('literalAutolink');\n effects.enter('literalAutolinkWww');\n // Note: we *check*, so we can discard the `www.` we parsed.\n // If it worked, we consider it as a part of the domain.\n return effects.check(wwwPrefix, effects.attempt(domain, effects.attempt(path, wwwAfter), nok), nok)(code);\n }\n\n /**\n * After a www autolink literal.\n *\n * ```markdown\n * > | www.example.com/a?b#c\n * ^\n * ```\n *\n * @type {State}\n */\n function wwwAfter(code) {\n effects.exit('literalAutolinkWww');\n effects.exit('literalAutolink');\n return ok(code);\n }\n}\n\n/**\n * Protocol autolink literal.\n *\n * ```markdown\n * > | a https://example.org b\n * ^^^^^^^^^^^^^^^^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeProtocolAutolink(effects, ok, nok) {\n const self = this;\n let buffer = '';\n let seen = false;\n return protocolStart;\n\n /**\n * Start of protocol autolink literal.\n *\n * ```markdown\n * > | https://example.com/a?b#c\n * ^\n * ```\n *\n * @type {State}\n */\n function protocolStart(code) {\n if ((code === 72 || code === 104) && previousProtocol.call(self, self.previous) && !previousUnbalanced(self.events)) {\n effects.enter('literalAutolink');\n effects.enter('literalAutolinkHttp');\n buffer += String.fromCodePoint(code);\n effects.consume(code);\n return protocolPrefixInside;\n }\n return nok(code);\n }\n\n /**\n * In protocol.\n *\n * ```markdown\n * > | https://example.com/a?b#c\n * ^^^^^\n * ```\n *\n * @type {State}\n */\n function protocolPrefixInside(code) {\n // `5` is size of `https`\n if (asciiAlpha(code) && buffer.length < 5) {\n // @ts-expect-error: definitely number.\n buffer += String.fromCodePoint(code);\n effects.consume(code);\n return protocolPrefixInside;\n }\n if (code === 58) {\n const protocol = buffer.toLowerCase();\n if (protocol === 'http' || protocol === 'https') {\n effects.consume(code);\n return protocolSlashesInside;\n }\n }\n return nok(code);\n }\n\n /**\n * In slashes.\n *\n * ```markdown\n * > | https://example.com/a?b#c\n * ^^\n * ```\n *\n * @type {State}\n */\n function protocolSlashesInside(code) {\n if (code === 47) {\n effects.consume(code);\n if (seen) {\n return afterProtocol;\n }\n seen = true;\n return protocolSlashesInside;\n }\n return nok(code);\n }\n\n /**\n * After protocol, before domain.\n *\n * ```markdown\n * > | https://example.com/a?b#c\n * ^\n * ```\n *\n * @type {State}\n */\n function afterProtocol(code) {\n // To do: this is different from `markdown-rs`:\n // https://github.com/wooorm/markdown-rs/blob/b3a921c761309ae00a51fe348d8a43adbc54b518/src/construct/gfm_autolink_literal.rs#L172-L182\n return code === null || asciiControl(code) || markdownLineEndingOrSpace(code) || unicodeWhitespace(code) || unicodePunctuation(code) ? nok(code) : effects.attempt(domain, effects.attempt(path, protocolAfter), nok)(code);\n }\n\n /**\n * After a protocol autolink literal.\n *\n * ```markdown\n * > | https://example.com/a?b#c\n * ^\n * ```\n *\n * @type {State}\n */\n function protocolAfter(code) {\n effects.exit('literalAutolinkHttp');\n effects.exit('literalAutolink');\n return ok(code);\n }\n}\n\n/**\n * `www` prefix.\n *\n * ```markdown\n * > | a www.example.org b\n * ^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeWwwPrefix(effects, ok, nok) {\n let size = 0;\n return wwwPrefixInside;\n\n /**\n * In www prefix.\n *\n * ```markdown\n * > | www.example.com\n * ^^^^\n * ```\n *\n * @type {State}\n */\n function wwwPrefixInside(code) {\n if ((code === 87 || code === 119) && size < 3) {\n size++;\n effects.consume(code);\n return wwwPrefixInside;\n }\n if (code === 46 && size === 3) {\n effects.consume(code);\n return wwwPrefixAfter;\n }\n return nok(code);\n }\n\n /**\n * After www prefix.\n *\n * ```markdown\n * > | www.example.com\n * ^\n * ```\n *\n * @type {State}\n */\n function wwwPrefixAfter(code) {\n // If there is *anything*, we can link.\n return code === null ? nok(code) : ok(code);\n }\n}\n\n/**\n * Domain.\n *\n * ```markdown\n * > | a https://example.org b\n * ^^^^^^^^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeDomain(effects, ok, nok) {\n /** @type {boolean | undefined} */\n let underscoreInLastSegment;\n /** @type {boolean | undefined} */\n let underscoreInLastLastSegment;\n /** @type {boolean | undefined} */\n let seen;\n return domainInside;\n\n /**\n * In domain.\n *\n * ```markdown\n * > | https://example.com/a\n * ^^^^^^^^^^^\n * ```\n *\n * @type {State}\n */\n function domainInside(code) {\n // Check whether this marker, which is a trailing punctuation\n // marker, optionally followed by more trailing markers, and then\n // followed by an end.\n if (code === 46 || code === 95) {\n return effects.check(trail, domainAfter, domainAtPunctuation)(code);\n }\n\n // GH documents that only alphanumerics (other than `-`, `.`, and `_`) can\n // occur, which sounds like ASCII only, but they also support `www.點看.com`,\n // so that’s Unicode.\n // Instead of some new production for Unicode alphanumerics, markdown\n // already has that for Unicode punctuation and whitespace, so use those.\n // Source: <https://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L12>.\n if (code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code) || code !== 45 && unicodePunctuation(code)) {\n return domainAfter(code);\n }\n seen = true;\n effects.consume(code);\n return domainInside;\n }\n\n /**\n * In domain, at potential trailing punctuation, that was not trailing.\n *\n * ```markdown\n * > | https://example.com\n * ^\n * ```\n *\n * @type {State}\n */\n function domainAtPunctuation(code) {\n // There is an underscore in the last segment of the domain\n if (code === 95) {\n underscoreInLastSegment = true;\n }\n // Otherwise, it’s a `.`: save the last segment underscore in the\n // penultimate segment slot.\n else {\n underscoreInLastLastSegment = underscoreInLastSegment;\n underscoreInLastSegment = undefined;\n }\n effects.consume(code);\n return domainInside;\n }\n\n /**\n * After domain.\n *\n * ```markdown\n * > | https://example.com/a\n * ^\n * ```\n *\n * @type {State} */\n function domainAfter(code) {\n // Note: that’s GH says a dot is needed, but it’s not true:\n // <https://github.com/github/cmark-gfm/issues/279>\n if (underscoreInLastLastSegment || underscoreInLastSegment || !seen) {\n return nok(code);\n }\n return ok(code);\n }\n}\n\n/**\n * Path.\n *\n * ```markdown\n * > | a https://example.org/stuff b\n * ^^^^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizePath(effects, ok) {\n let sizeOpen = 0;\n let sizeClose = 0;\n return pathInside;\n\n /**\n * In path.\n *\n * ```markdown\n * > | https://example.com/a\n * ^^\n * ```\n *\n * @type {State}\n */\n function pathInside(code) {\n if (code === 40) {\n sizeOpen++;\n effects.consume(code);\n return pathInside;\n }\n\n // To do: `markdown-rs` also needs this.\n // If this is a paren, and there are less closings than openings,\n // we don’t check for a trail.\n if (code === 41 && sizeClose < sizeOpen) {\n return pathAtPunctuation(code);\n }\n\n // Check whether this trailing punctuation marker is optionally\n // followed by more trailing markers, and then followed\n // by an end.\n if (code === 33 || code === 34 || code === 38 || code === 39 || code === 41 || code === 42 || code === 44 || code === 46 || code === 58 || code === 59 || code === 60 || code === 63 || code === 93 || code === 95 || code === 126) {\n return effects.check(trail, ok, pathAtPunctuation)(code);\n }\n if (code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {\n return ok(code);\n }\n effects.consume(code);\n return pathInside;\n }\n\n /**\n * In path, at potential trailing punctuation, that was not trailing.\n *\n * ```markdown\n * > | https://example.com/a\"b\n * ^\n * ```\n *\n * @type {State}\n */\n function pathAtPunctuation(code) {\n // Count closing parens.\n if (code === 41) {\n sizeClose++;\n }\n effects.consume(code);\n return pathInside;\n }\n}\n\n/**\n * Trail.\n *\n * This calls `ok` if this *is* the trail, followed by an end, which means\n * the entire trail is not part of the link.\n * It calls `nok` if this *is* part of the link.\n *\n * ```markdown\n * > | https://example.com\").\n * ^^^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeTrail(effects, ok, nok) {\n return trail;\n\n /**\n * In trail of domain or path.\n *\n * ```markdown\n * > | https://example.com\").\n * ^\n * ```\n *\n * @type {State}\n */\n function trail(code) {\n // Regular trailing punctuation.\n if (code === 33 || code === 34 || code === 39 || code === 41 || code === 42 || code === 44 || code === 46 || code === 58 || code === 59 || code === 63 || code === 95 || code === 126) {\n effects.consume(code);\n return trail;\n }\n\n // `&` followed by one or more alphabeticals and then a `;`, is\n // as a whole considered as trailing punctuation.\n // In all other cases, it is considered as continuation of the URL.\n if (code === 38) {\n effects.consume(code);\n return trailCharacterReferenceStart;\n }\n\n // Needed because we allow literals after `[`, as we fix:\n // <https://github.com/github/cmark-gfm/issues/278>.\n // Check that it is not followed by `(` or `[`.\n if (code === 93) {\n effects.consume(code);\n return trailBracketAfter;\n }\n if (\n // `<` is an end.\n code === 60 ||\n // So is whitespace.\n code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {\n return ok(code);\n }\n return nok(code);\n }\n\n /**\n * In trail, after `]`.\n *\n * > 👉 **Note**: this deviates from `cmark-gfm` to fix a bug.\n * > See end of <https://github.com/github/cmark-gfm/issues/278> for more.\n *\n * ```markdown\n * > | https://example.com](\n * ^\n * ```\n *\n * @type {State}\n */\n function trailBracketAfter(code) {\n // Whitespace or something that could start a resource or reference is the end.\n // Switch back to trail otherwise.\n if (code === null || code === 40 || code === 91 || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {\n return ok(code);\n }\n return trail(code);\n }\n\n /**\n * In character-reference like trail, after `&`.\n *\n * ```markdown\n * > | https://example.com&amp;).\n * ^\n * ```\n *\n * @type {State}\n */\n function trailCharacterReferenceStart(code) {\n // When non-alpha, it’s not a trail.\n return asciiAlpha(code) ? trailCharacterReferenceInside(code) : nok(code);\n }\n\n /**\n * In character-reference like trail.\n *\n * ```markdown\n * > | https://example.com&amp;).\n * ^\n * ```\n *\n * @type {State}\n */\n function trailCharacterReferenceInside(code) {\n // Switch back to trail if this is well-formed.\n if (code === 59) {\n effects.consume(code);\n return trail;\n }\n if (asciiAlpha(code)) {\n effects.consume(code);\n return trailCharacterReferenceInside;\n }\n\n // It’s not a trail.\n return nok(code);\n }\n}\n\n/**\n * Dot in email domain trail.\n *\n * This calls `ok` if this *is* the trail, followed by an end, which means\n * the trail is not part of the link.\n * It calls `nok` if this *is* part of the link.\n *\n * ```markdown\n * > | contact@example.org.\n * ^\n * ```\n *\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeEmailDomainDotTrail(effects, ok, nok) {\n return start;\n\n /**\n * Dot.\n *\n * ```markdown\n * > | contact@example.org.\n * ^ ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n // Must be dot.\n effects.consume(code);\n return after;\n }\n\n /**\n * After dot.\n *\n * ```markdown\n * > | contact@example.org.\n * ^ ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n // Not a trail if alphanumeric.\n return asciiAlphanumeric(code) ? nok(code) : ok(code);\n }\n}\n\n/**\n * See:\n * <https://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L156>.\n *\n * @type {Previous}\n */\nfunction previousWww(code) {\n return code === null || code === 40 || code === 42 || code === 95 || code === 91 || code === 93 || code === 126 || markdownLineEndingOrSpace(code);\n}\n\n/**\n * See:\n * <https://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L214>.\n *\n * @type {Previous}\n */\nfunction previousProtocol(code) {\n return !asciiAlpha(code);\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Previous}\n */\nfunction previousEmail(code) {\n // Do not allow a slash “inside” atext.\n // The reference code is a bit weird, but that’s what it results in.\n // Source: <https://github.com/github/cmark-gfm/blob/ef1cfcb/extensions/autolink.c#L307>.\n // Other than slash, every preceding character is allowed.\n return !(code === 47 || gfmAtext(code));\n}\n\n/**\n * @param {Code} code\n * @returns {boolean}\n */\nfunction gfmAtext(code) {\n return code === 43 || code === 45 || code === 46 || code === 95 || asciiAlphanumeric(code);\n}\n\n/**\n * @param {Array<Event>} events\n * @returns {boolean}\n */\nfunction previousUnbalanced(events) {\n let index = events.length;\n let result = false;\n while (index--) {\n const token = events[index][1];\n if ((token.type === 'labelLink' || token.type === 'labelImage') && !token._balanced) {\n result = true;\n break;\n }\n\n // If we’ve seen this token, and it was marked as not having any unbalanced\n // bracket before it, we can exit.\n if (token._gfmAutolinkLiteralWalkedInto) {\n result = false;\n break;\n }\n }\n if (events.length > 0 && !result) {\n // Mark the last token as “walked into” w/o finding\n // anything.\n events[events.length - 1][1]._gfmAutolinkLiteralWalkedInto = true;\n }\n return result;\n}","/**\n * @import {Event, Resolver, TokenizeContext} from 'micromark-util-types'\n */\n\n/**\n * Call all `resolveAll`s.\n *\n * @param {ReadonlyArray<{resolveAll?: Resolver | undefined}>} constructs\n * List of constructs, optionally with `resolveAll`s.\n * @param {Array<Event>} events\n * List of events.\n * @param {TokenizeContext} context\n * Context used by `tokenize`.\n * @returns {Array<Event>}\n * Changed events.\n */\nexport function resolveAll(constructs, events, context) {\n /** @type {Array<Resolver>} */\n const called = []\n let index = -1\n\n while (++index < constructs.length) {\n const resolve = constructs[index].resolveAll\n\n if (resolve && !called.includes(resolve)) {\n events = resolve(events, context)\n called.push(resolve)\n }\n }\n\n return events\n}\n","/**\n * @import {Effects, State, TokenType} from 'micromark-util-types'\n */\n\nimport { markdownSpace } from 'micromark-util-character';\n\n// To do: implement `spaceOrTab`, `spaceOrTabMinMax`, `spaceOrTabWithOptions`.\n\n/**\n * Parse spaces and tabs.\n *\n * There is no `nok` parameter:\n *\n * * spaces in markdown are often optional, in which case this factory can be\n * used and `ok` will be switched to whether spaces were found or not\n * * one line ending or space can be detected with `markdownSpace(code)` right\n * before using `factorySpace`\n *\n * ###### Examples\n *\n * Where `␉` represents a tab (plus how much it expands) and `␠` represents a\n * single space.\n *\n * ```markdown\n * ␉\n * ␠␠␠␠\n * ␉␠\n * ```\n *\n * @param {Effects} effects\n * Context.\n * @param {State} ok\n * State switched to when successful.\n * @param {TokenType} type\n * Type (`' \\t'`).\n * @param {number | undefined} [max=Infinity]\n * Max (exclusive).\n * @returns {State}\n * Start state.\n */\nexport function factorySpace(effects, ok, type, max) {\n const limit = max ? max - 1 : Number.POSITIVE_INFINITY;\n let size = 0;\n return start;\n\n /** @type {State} */\n function start(code) {\n if (markdownSpace(code)) {\n effects.enter(type);\n return prefix(code);\n }\n return ok(code);\n }\n\n /** @type {State} */\n function prefix(code) {\n if (markdownSpace(code) && size++ < limit) {\n effects.consume(code);\n return prefix;\n }\n effects.exit(type);\n return ok(code);\n }\n}","/**\n * @import {\n * Construct,\n * State,\n * TokenizeContext,\n * Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const blankLine = {\n partial: true,\n tokenize: tokenizeBlankLine\n};\n\n/**\n * @this {TokenizeContext}\n * Context.\n * @type {Tokenizer}\n */\nfunction tokenizeBlankLine(effects, ok, nok) {\n return start;\n\n /**\n * Start of blank line.\n *\n * > 👉 **Note**: `␠` represents a space character.\n *\n * ```markdown\n * > | ␠␠␊\n * ^\n * > | ␊\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n return markdownSpace(code) ? factorySpace(effects, after, \"linePrefix\")(code) : after(code);\n }\n\n /**\n * At eof/eol, after optional whitespace.\n *\n * > 👉 **Note**: `␠` represents a space character.\n *\n * ```markdown\n * > | ␠␠␊\n * ^\n * > | ␊\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n return code === null || markdownLineEnding(code) ? ok(code) : nok(code);\n }\n}","/**\n * @import {Event, Exiter, Extension, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { blankLine } from 'micromark-core-commonmark';\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEndingOrSpace } from 'micromark-util-character';\nimport { normalizeIdentifier } from 'micromark-util-normalize-identifier';\nconst indent = {\n tokenize: tokenizeIndent,\n partial: true\n};\n\n// To do: micromark should support a `_hiddenGfmFootnoteSupport`, which only\n// affects label start (image).\n// That will let us drop `tokenizePotentialGfmFootnote*`.\n// It currently has a `_hiddenFootnoteSupport`, which affects that and more.\n// That can be removed when `micromark-extension-footnote` is archived.\n\n/**\n * Create an extension for `micromark` to enable GFM footnote syntax.\n *\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `extensions` to\n * enable GFM footnote syntax.\n */\nexport function gfmFootnote() {\n /** @type {Extension} */\n return {\n document: {\n [91]: {\n name: 'gfmFootnoteDefinition',\n tokenize: tokenizeDefinitionStart,\n continuation: {\n tokenize: tokenizeDefinitionContinuation\n },\n exit: gfmFootnoteDefinitionEnd\n }\n },\n text: {\n [91]: {\n name: 'gfmFootnoteCall',\n tokenize: tokenizeGfmFootnoteCall\n },\n [93]: {\n name: 'gfmPotentialFootnoteCall',\n add: 'after',\n tokenize: tokenizePotentialGfmFootnoteCall,\n resolveTo: resolveToPotentialGfmFootnoteCall\n }\n }\n };\n}\n\n// To do: remove after micromark update.\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizePotentialGfmFootnoteCall(effects, ok, nok) {\n const self = this;\n let index = self.events.length;\n const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n /** @type {Token} */\n let labelStart;\n\n // Find an opening.\n while (index--) {\n const token = self.events[index][1];\n if (token.type === \"labelImage\") {\n labelStart = token;\n break;\n }\n\n // Exit if we’ve walked far enough.\n if (token.type === 'gfmFootnoteCall' || token.type === \"labelLink\" || token.type === \"label\" || token.type === \"image\" || token.type === \"link\") {\n break;\n }\n }\n return start;\n\n /**\n * @type {State}\n */\n function start(code) {\n if (!labelStart || !labelStart._balanced) {\n return nok(code);\n }\n const id = normalizeIdentifier(self.sliceSerialize({\n start: labelStart.end,\n end: self.now()\n }));\n if (id.codePointAt(0) !== 94 || !defined.includes(id.slice(1))) {\n return nok(code);\n }\n effects.enter('gfmFootnoteCallLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteCallLabelMarker');\n return ok(code);\n }\n}\n\n// To do: remove after micromark update.\n/** @type {Resolver} */\nfunction resolveToPotentialGfmFootnoteCall(events, context) {\n let index = events.length;\n /** @type {Token | undefined} */\n let labelStart;\n\n // Find an opening.\n while (index--) {\n if (events[index][1].type === \"labelImage\" && events[index][0] === 'enter') {\n labelStart = events[index][1];\n break;\n }\n }\n // Change the `labelImageMarker` to a `data`.\n events[index + 1][1].type = \"data\";\n events[index + 3][1].type = 'gfmFootnoteCallLabelMarker';\n\n // The whole (without `!`):\n /** @type {Token} */\n const call = {\n type: 'gfmFootnoteCall',\n start: Object.assign({}, events[index + 3][1].start),\n end: Object.assign({}, events[events.length - 1][1].end)\n };\n // The `^` marker\n /** @type {Token} */\n const marker = {\n type: 'gfmFootnoteCallMarker',\n start: Object.assign({}, events[index + 3][1].end),\n end: Object.assign({}, events[index + 3][1].end)\n };\n // Increment the end 1 character.\n marker.end.column++;\n marker.end.offset++;\n marker.end._bufferIndex++;\n /** @type {Token} */\n const string = {\n type: 'gfmFootnoteCallString',\n start: Object.assign({}, marker.end),\n end: Object.assign({}, events[events.length - 1][1].start)\n };\n /** @type {Token} */\n const chunk = {\n type: \"chunkString\",\n contentType: 'string',\n start: Object.assign({}, string.start),\n end: Object.assign({}, string.end)\n };\n\n /** @type {Array<Event>} */\n const replacement = [\n // Take the `labelImageMarker` (now `data`, the `!`)\n events[index + 1], events[index + 2], ['enter', call, context],\n // The `[`\n events[index + 3], events[index + 4],\n // The `^`.\n ['enter', marker, context], ['exit', marker, context],\n // Everything in between.\n ['enter', string, context], ['enter', chunk, context], ['exit', chunk, context], ['exit', string, context],\n // The ending (`]`, properly parsed and labelled).\n events[events.length - 2], events[events.length - 1], ['exit', call, context]];\n events.splice(index, events.length - index + 1, ...replacement);\n return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeGfmFootnoteCall(effects, ok, nok) {\n const self = this;\n const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n let size = 0;\n /** @type {boolean} */\n let data;\n\n // Note: the implementation of `markdown-rs` is different, because it houses\n // core *and* extensions in one project.\n // Therefore, it can include footnote logic inside `label-end`.\n // We can’t do that, but luckily, we can parse footnotes in a simpler way than\n // needed for labels.\n return start;\n\n /**\n * Start of footnote label.\n *\n * ```markdown\n * > | a [^b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter('gfmFootnoteCall');\n effects.enter('gfmFootnoteCallLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteCallLabelMarker');\n return callStart;\n }\n\n /**\n * After `[`, at `^`.\n *\n * ```markdown\n * > | a [^b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function callStart(code) {\n if (code !== 94) return nok(code);\n effects.enter('gfmFootnoteCallMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteCallMarker');\n effects.enter('gfmFootnoteCallString');\n effects.enter('chunkString').contentType = 'string';\n return callData;\n }\n\n /**\n * In label.\n *\n * ```markdown\n * > | a [^b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function callData(code) {\n if (\n // Too long.\n size > 999 ||\n // Closing brace with nothing.\n code === 93 && !data ||\n // Space or tab is not supported by GFM for some reason.\n // `\\n` and `[` not being supported makes sense.\n code === null || code === 91 || markdownLineEndingOrSpace(code)) {\n return nok(code);\n }\n if (code === 93) {\n effects.exit('chunkString');\n const token = effects.exit('gfmFootnoteCallString');\n if (!defined.includes(normalizeIdentifier(self.sliceSerialize(token)))) {\n return nok(code);\n }\n effects.enter('gfmFootnoteCallLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteCallLabelMarker');\n effects.exit('gfmFootnoteCall');\n return ok;\n }\n if (!markdownLineEndingOrSpace(code)) {\n data = true;\n }\n size++;\n effects.consume(code);\n return code === 92 ? callEscape : callData;\n }\n\n /**\n * On character after escape.\n *\n * ```markdown\n * > | a [^b\\c] d\n * ^\n * ```\n *\n * @type {State}\n */\n function callEscape(code) {\n if (code === 91 || code === 92 || code === 93) {\n effects.consume(code);\n size++;\n return callData;\n }\n return callData(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeDefinitionStart(effects, ok, nok) {\n const self = this;\n const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n /** @type {string} */\n let identifier;\n let size = 0;\n /** @type {boolean | undefined} */\n let data;\n return start;\n\n /**\n * Start of GFM footnote definition.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter('gfmFootnoteDefinition')._container = true;\n effects.enter('gfmFootnoteDefinitionLabel');\n effects.enter('gfmFootnoteDefinitionLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteDefinitionLabelMarker');\n return labelAtMarker;\n }\n\n /**\n * In label, at caret.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function labelAtMarker(code) {\n if (code === 94) {\n effects.enter('gfmFootnoteDefinitionMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteDefinitionMarker');\n effects.enter('gfmFootnoteDefinitionLabelString');\n effects.enter('chunkString').contentType = 'string';\n return labelInside;\n }\n return nok(code);\n }\n\n /**\n * In label.\n *\n * > 👉 **Note**: `cmark-gfm` prevents whitespace from occurring in footnote\n * > definition labels.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function labelInside(code) {\n if (\n // Too long.\n size > 999 ||\n // Closing brace with nothing.\n code === 93 && !data ||\n // Space or tab is not supported by GFM for some reason.\n // `\\n` and `[` not being supported makes sense.\n code === null || code === 91 || markdownLineEndingOrSpace(code)) {\n return nok(code);\n }\n if (code === 93) {\n effects.exit('chunkString');\n const token = effects.exit('gfmFootnoteDefinitionLabelString');\n identifier = normalizeIdentifier(self.sliceSerialize(token));\n effects.enter('gfmFootnoteDefinitionLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteDefinitionLabelMarker');\n effects.exit('gfmFootnoteDefinitionLabel');\n return labelAfter;\n }\n if (!markdownLineEndingOrSpace(code)) {\n data = true;\n }\n size++;\n effects.consume(code);\n return code === 92 ? labelEscape : labelInside;\n }\n\n /**\n * After `\\`, at a special character.\n *\n * > 👉 **Note**: `cmark-gfm` currently does not support escaped brackets:\n * > <https://github.com/github/cmark-gfm/issues/240>\n *\n * ```markdown\n * > | [^a\\*b]: c\n * ^\n * ```\n *\n * @type {State}\n */\n function labelEscape(code) {\n if (code === 91 || code === 92 || code === 93) {\n effects.consume(code);\n size++;\n return labelInside;\n }\n return labelInside(code);\n }\n\n /**\n * After definition label.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function labelAfter(code) {\n if (code === 58) {\n effects.enter('definitionMarker');\n effects.consume(code);\n effects.exit('definitionMarker');\n if (!defined.includes(identifier)) {\n defined.push(identifier);\n }\n\n // Any whitespace after the marker is eaten, forming indented code\n // is not possible.\n // No space is also fine, just like a block quote marker.\n return factorySpace(effects, whitespaceAfter, 'gfmFootnoteDefinitionWhitespace');\n }\n return nok(code);\n }\n\n /**\n * After definition prefix.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function whitespaceAfter(code) {\n // `markdown-rs` has a wrapping token for the prefix that is closed here.\n return ok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeDefinitionContinuation(effects, ok, nok) {\n /// Start of footnote definition continuation.\n ///\n /// ```markdown\n /// | [^a]: b\n /// > | c\n /// ^\n /// ```\n //\n // Either a blank line, which is okay, or an indented thing.\n return effects.check(blankLine, ok, effects.attempt(indent, ok, nok));\n}\n\n/** @type {Exiter} */\nfunction gfmFootnoteDefinitionEnd(effects) {\n effects.exit('gfmFootnoteDefinition');\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeIndent(effects, ok, nok) {\n const self = this;\n return factorySpace(effects, afterPrefix, 'gfmFootnoteDefinitionIndent', 4 + 1);\n\n /**\n * @type {State}\n */\n function afterPrefix(code) {\n const tail = self.events[self.events.length - 1];\n return tail && tail[1].type === 'gfmFootnoteDefinitionIndent' && tail[2].sliceSerialize(tail[1], true).length === 4 ? ok(code) : nok(code);\n }\n}","/**\n * @import {Options} from 'micromark-extension-gfm-strikethrough'\n * @import {Event, Extension, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { splice } from 'micromark-util-chunked';\nimport { classifyCharacter } from 'micromark-util-classify-character';\nimport { resolveAll } from 'micromark-util-resolve-all';\n/**\n * Create an extension for `micromark` to enable GFM strikethrough syntax.\n *\n * @param {Options | null | undefined} [options={}]\n * Configuration.\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `extensions`, to\n * enable GFM strikethrough syntax.\n */\nexport function gfmStrikethrough(options) {\n const options_ = options || {};\n let single = options_.singleTilde;\n const tokenizer = {\n name: 'strikethrough',\n tokenize: tokenizeStrikethrough,\n resolveAll: resolveAllStrikethrough\n };\n if (single === null || single === undefined) {\n single = true;\n }\n return {\n text: {\n [126]: tokenizer\n },\n insideSpan: {\n null: [tokenizer]\n },\n attentionMarkers: {\n null: [126]\n }\n };\n\n /**\n * Take events and resolve strikethrough.\n *\n * @type {Resolver}\n */\n function resolveAllStrikethrough(events, context) {\n let index = -1;\n\n // Walk through all events.\n while (++index < events.length) {\n // Find a token that can close.\n if (events[index][0] === 'enter' && events[index][1].type === 'strikethroughSequenceTemporary' && events[index][1]._close) {\n let open = index;\n\n // Now walk back to find an opener.\n while (open--) {\n // Find a token that can open the closer.\n if (events[open][0] === 'exit' && events[open][1].type === 'strikethroughSequenceTemporary' && events[open][1]._open &&\n // If the sizes are the same:\n events[index][1].end.offset - events[index][1].start.offset === events[open][1].end.offset - events[open][1].start.offset) {\n events[index][1].type = 'strikethroughSequence';\n events[open][1].type = 'strikethroughSequence';\n\n /** @type {Token} */\n const strikethrough = {\n type: 'strikethrough',\n start: Object.assign({}, events[open][1].start),\n end: Object.assign({}, events[index][1].end)\n };\n\n /** @type {Token} */\n const text = {\n type: 'strikethroughText',\n start: Object.assign({}, events[open][1].end),\n end: Object.assign({}, events[index][1].start)\n };\n\n // Opening.\n /** @type {Array<Event>} */\n const nextEvents = [['enter', strikethrough, context], ['enter', events[open][1], context], ['exit', events[open][1], context], ['enter', text, context]];\n const insideSpan = context.parser.constructs.insideSpan.null;\n if (insideSpan) {\n // Between.\n splice(nextEvents, nextEvents.length, 0, resolveAll(insideSpan, events.slice(open + 1, index), context));\n }\n\n // Closing.\n splice(nextEvents, nextEvents.length, 0, [['exit', text, context], ['enter', events[index][1], context], ['exit', events[index][1], context], ['exit', strikethrough, context]]);\n splice(events, open - 1, index - open + 3, nextEvents);\n index = open + nextEvents.length - 2;\n break;\n }\n }\n }\n }\n index = -1;\n while (++index < events.length) {\n if (events[index][1].type === 'strikethroughSequenceTemporary') {\n events[index][1].type = \"data\";\n }\n }\n return events;\n }\n\n /**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\n function tokenizeStrikethrough(effects, ok, nok) {\n const previous = this.previous;\n const events = this.events;\n let size = 0;\n return start;\n\n /** @type {State} */\n function start(code) {\n if (previous === 126 && events[events.length - 1][1].type !== \"characterEscape\") {\n return nok(code);\n }\n effects.enter('strikethroughSequenceTemporary');\n return more(code);\n }\n\n /** @type {State} */\n function more(code) {\n const before = classifyCharacter(previous);\n if (code === 126) {\n // If this is the third marker, exit.\n if (size > 1) return nok(code);\n effects.consume(code);\n size++;\n return more;\n }\n if (size < 2 && !single) return nok(code);\n const token = effects.exit('strikethroughSequenceTemporary');\n const after = classifyCharacter(code);\n token._open = !after || after === 2 && Boolean(before);\n token._close = !before || before === 2 && Boolean(after);\n return ok(code);\n }\n }\n}","/**\n * @import {Event} from 'micromark-util-types'\n */\n\n// Port of `edit_map.rs` from `markdown-rs`.\n// This should move to `markdown-js` later.\n\n// Deal with several changes in events, batching them together.\n//\n// Preferably, changes should be kept to a minimum.\n// Sometimes, it’s needed to change the list of events, because parsing can be\n// messy, and it helps to expose a cleaner interface of events to the compiler\n// and other users.\n// It can also help to merge many adjacent similar events.\n// And, in other cases, it’s needed to parse subcontent: pass some events\n// through another tokenizer and inject the result.\n\n/**\n * @typedef {[number, number, Array<Event>]} Change\n * @typedef {[number, number, number]} Jump\n */\n\n/**\n * Tracks a bunch of edits.\n */\nexport class EditMap {\n /**\n * Create a new edit map.\n */\n constructor() {\n /**\n * Record of changes.\n *\n * @type {Array<Change>}\n */\n this.map = [];\n }\n\n /**\n * Create an edit: a remove and/or add at a certain place.\n *\n * @param {number} index\n * @param {number} remove\n * @param {Array<Event>} add\n * @returns {undefined}\n */\n add(index, remove, add) {\n addImplementation(this, index, remove, add);\n }\n\n // To do: add this when moving to `micromark`.\n // /**\n // * Create an edit: but insert `add` before existing additions.\n // *\n // * @param {number} index\n // * @param {number} remove\n // * @param {Array<Event>} add\n // * @returns {undefined}\n // */\n // addBefore(index, remove, add) {\n // addImplementation(this, index, remove, add, true)\n // }\n\n /**\n * Done, change the events.\n *\n * @param {Array<Event>} events\n * @returns {undefined}\n */\n consume(events) {\n this.map.sort(function (a, b) {\n return a[0] - b[0];\n });\n\n /* c8 ignore next 3 -- `resolve` is never called without tables, so without edits. */\n if (this.map.length === 0) {\n return;\n }\n\n // To do: if links are added in events, like they are in `markdown-rs`,\n // this is needed.\n // // Calculate jumps: where items in the current list move to.\n // /** @type {Array<Jump>} */\n // const jumps = []\n // let index = 0\n // let addAcc = 0\n // let removeAcc = 0\n // while (index < this.map.length) {\n // const [at, remove, add] = this.map[index]\n // removeAcc += remove\n // addAcc += add.length\n // jumps.push([at, removeAcc, addAcc])\n // index += 1\n // }\n //\n // . shiftLinks(events, jumps)\n\n let index = this.map.length;\n /** @type {Array<Array<Event>>} */\n const vecs = [];\n while (index > 0) {\n index -= 1;\n vecs.push(events.slice(this.map[index][0] + this.map[index][1]), this.map[index][2]);\n\n // Truncate rest.\n events.length = this.map[index][0];\n }\n vecs.push(events.slice());\n events.length = 0;\n let slice = vecs.pop();\n while (slice) {\n for (const element of slice) {\n events.push(element);\n }\n slice = vecs.pop();\n }\n\n // Truncate everything.\n this.map.length = 0;\n }\n}\n\n/**\n * Create an edit.\n *\n * @param {EditMap} editMap\n * @param {number} at\n * @param {number} remove\n * @param {Array<Event>} add\n * @returns {undefined}\n */\nfunction addImplementation(editMap, at, remove, add) {\n let index = 0;\n\n /* c8 ignore next 3 -- `resolve` is never called without tables, so without edits. */\n if (remove === 0 && add.length === 0) {\n return;\n }\n while (index < editMap.map.length) {\n if (editMap.map[index][0] === at) {\n editMap.map[index][1] += remove;\n\n // To do: before not used by tables, use when moving to micromark.\n // if (before) {\n // add.push(...editMap.map[index][2])\n // editMap.map[index][2] = add\n // } else {\n editMap.map[index][2].push(...add);\n // }\n\n return;\n }\n index += 1;\n }\n editMap.map.push([at, remove, add]);\n}\n\n// /**\n// * Shift `previous` and `next` links according to `jumps`.\n// *\n// * This fixes links in case there are events removed or added between them.\n// *\n// * @param {Array<Event>} events\n// * @param {Array<Jump>} jumps\n// */\n// function shiftLinks(events, jumps) {\n// let jumpIndex = 0\n// let index = 0\n// let add = 0\n// let rm = 0\n\n// while (index < events.length) {\n// const rmCurr = rm\n\n// while (jumpIndex < jumps.length && jumps[jumpIndex][0] <= index) {\n// add = jumps[jumpIndex][2]\n// rm = jumps[jumpIndex][1]\n// jumpIndex += 1\n// }\n\n// // Ignore items that will be removed.\n// if (rm > rmCurr) {\n// index += rm - rmCurr\n// } else {\n// // ?\n// // if let Some(link) = &events[index].link {\n// // if let Some(next) = link.next {\n// // events[next].link.as_mut().unwrap().previous = Some(index + add - rm);\n// // while jumpIndex < jumps.len() && jumps[jumpIndex].0 <= next {\n// // add = jumps[jumpIndex].2;\n// // rm = jumps[jumpIndex].1;\n// // jumpIndex += 1;\n// // }\n// // events[index].link.as_mut().unwrap().next = Some(next + add - rm);\n// // index = next;\n// // continue;\n// // }\n// // }\n// index += 1\n// }\n// }\n// }","/**\n * @import {Event} from 'micromark-util-types'\n */\n\n/**\n * @typedef {'center' | 'left' | 'none' | 'right'} Align\n */\n\n/**\n * Figure out the alignment of a GFM table.\n *\n * @param {Readonly<Array<Event>>} events\n * List of events.\n * @param {number} index\n * Table enter event.\n * @returns {Array<Align>}\n * List of aligns.\n */\nexport function gfmTableAlign(events, index) {\n let inDelimiterRow = false;\n /** @type {Array<Align>} */\n const align = [];\n while (index < events.length) {\n const event = events[index];\n if (inDelimiterRow) {\n if (event[0] === 'enter') {\n // Start of alignment value: set a new column.\n // To do: `markdown-rs` uses `tableDelimiterCellValue`.\n if (event[1].type === 'tableContent') {\n align.push(events[index + 1][1].type === 'tableDelimiterMarker' ? 'left' : 'none');\n }\n }\n // Exits:\n // End of alignment value: change the column.\n // To do: `markdown-rs` uses `tableDelimiterCellValue`.\n else if (event[1].type === 'tableContent') {\n if (events[index - 1][1].type === 'tableDelimiterMarker') {\n const alignIndex = align.length - 1;\n align[alignIndex] = align[alignIndex] === 'left' ? 'center' : 'right';\n }\n }\n // Done!\n else if (event[1].type === 'tableDelimiterRow') {\n break;\n }\n } else if (event[0] === 'enter' && event[1].type === 'tableDelimiterRow') {\n inDelimiterRow = true;\n }\n index += 1;\n }\n return align;\n}","/**\n * @import {Event, Extension, Point, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\n/**\n * @typedef {[number, number, number, number]} Range\n * Cell info.\n *\n * @typedef {0 | 1 | 2 | 3} RowKind\n * Where we are: `1` for head row, `2` for delimiter row, `3` for body row.\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownLineEndingOrSpace, markdownSpace } from 'micromark-util-character';\nimport { EditMap } from './edit-map.js';\nimport { gfmTableAlign } from './infer.js';\n\n/**\n * Create an HTML extension for `micromark` to support GitHub tables syntax.\n *\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `extensions` to enable GFM\n * table syntax.\n */\nexport function gfmTable() {\n return {\n flow: {\n null: {\n name: 'table',\n tokenize: tokenizeTable,\n resolveAll: resolveTable\n }\n }\n };\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeTable(effects, ok, nok) {\n const self = this;\n let size = 0;\n let sizeB = 0;\n /** @type {boolean | undefined} */\n let seen;\n return start;\n\n /**\n * Start of a GFM table.\n *\n * If there is a valid table row or table head before, then we try to parse\n * another row.\n * Otherwise, we try to parse a head.\n *\n * ```markdown\n * > | | a |\n * ^\n * | | - |\n * > | | b |\n * ^\n * ```\n * @type {State}\n */\n function start(code) {\n let index = self.events.length - 1;\n while (index > -1) {\n const type = self.events[index][1].type;\n if (type === \"lineEnding\" ||\n // Note: markdown-rs uses `whitespace` instead of `linePrefix`\n type === \"linePrefix\") index--;else break;\n }\n const tail = index > -1 ? self.events[index][1].type : null;\n const next = tail === 'tableHead' || tail === 'tableRow' ? bodyRowStart : headRowBefore;\n\n // Don’t allow lazy body rows.\n if (next === bodyRowStart && self.parser.lazy[self.now().line]) {\n return nok(code);\n }\n return next(code);\n }\n\n /**\n * Before table head row.\n *\n * ```markdown\n * > | | a |\n * ^\n * | | - |\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headRowBefore(code) {\n effects.enter('tableHead');\n effects.enter('tableRow');\n return headRowStart(code);\n }\n\n /**\n * Before table head row, after whitespace.\n *\n * ```markdown\n * > | | a |\n * ^\n * | | - |\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headRowStart(code) {\n if (code === 124) {\n return headRowBreak(code);\n }\n\n // To do: micromark-js should let us parse our own whitespace in extensions,\n // like `markdown-rs`:\n //\n // ```js\n // // 4+ spaces.\n // if (markdownSpace(code)) {\n // return nok(code)\n // }\n // ```\n\n seen = true;\n // Count the first character, that isn’t a pipe, double.\n sizeB += 1;\n return headRowBreak(code);\n }\n\n /**\n * At break in table head row.\n *\n * ```markdown\n * > | | a |\n * ^\n * ^\n * ^\n * | | - |\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headRowBreak(code) {\n if (code === null) {\n // Note: in `markdown-rs`, we need to reset, in `micromark-js` we don‘t.\n return nok(code);\n }\n if (markdownLineEnding(code)) {\n // If anything other than one pipe (ignoring whitespace) was used, it’s fine.\n if (sizeB > 1) {\n sizeB = 0;\n // To do: check if this works.\n // Feel free to interrupt:\n self.interrupt = true;\n effects.exit('tableRow');\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return headDelimiterStart;\n }\n\n // Note: in `markdown-rs`, we need to reset, in `micromark-js` we don‘t.\n return nok(code);\n }\n if (markdownSpace(code)) {\n // To do: check if this is fine.\n // effects.attempt(State::Next(StateName::GfmTableHeadRowBreak), State::Nok)\n // State::Retry(space_or_tab(tokenizer))\n return factorySpace(effects, headRowBreak, \"whitespace\")(code);\n }\n sizeB += 1;\n if (seen) {\n seen = false;\n // Header cell count.\n size += 1;\n }\n if (code === 124) {\n effects.enter('tableCellDivider');\n effects.consume(code);\n effects.exit('tableCellDivider');\n // Whether a delimiter was seen.\n seen = true;\n return headRowBreak;\n }\n\n // Anything else is cell data.\n effects.enter(\"data\");\n return headRowData(code);\n }\n\n /**\n * In table head row data.\n *\n * ```markdown\n * > | | a |\n * ^\n * | | - |\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headRowData(code) {\n if (code === null || code === 124 || markdownLineEndingOrSpace(code)) {\n effects.exit(\"data\");\n return headRowBreak(code);\n }\n effects.consume(code);\n return code === 92 ? headRowEscape : headRowData;\n }\n\n /**\n * In table head row escape.\n *\n * ```markdown\n * > | | a\\-b |\n * ^\n * | | ---- |\n * | | c |\n * ```\n *\n * @type {State}\n */\n function headRowEscape(code) {\n if (code === 92 || code === 124) {\n effects.consume(code);\n return headRowData;\n }\n return headRowData(code);\n }\n\n /**\n * Before delimiter row.\n *\n * ```markdown\n * | | a |\n * > | | - |\n * ^\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headDelimiterStart(code) {\n // Reset `interrupt`.\n self.interrupt = false;\n\n // Note: in `markdown-rs`, we need to handle piercing here too.\n if (self.parser.lazy[self.now().line]) {\n return nok(code);\n }\n effects.enter('tableDelimiterRow');\n // Track if we’ve seen a `:` or `|`.\n seen = false;\n if (markdownSpace(code)) {\n return factorySpace(effects, headDelimiterBefore, \"linePrefix\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code);\n }\n return headDelimiterBefore(code);\n }\n\n /**\n * Before delimiter row, after optional whitespace.\n *\n * Reused when a `|` is found later, to parse another cell.\n *\n * ```markdown\n * | | a |\n * > | | - |\n * ^\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headDelimiterBefore(code) {\n if (code === 45 || code === 58) {\n return headDelimiterValueBefore(code);\n }\n if (code === 124) {\n seen = true;\n // If we start with a pipe, we open a cell marker.\n effects.enter('tableCellDivider');\n effects.consume(code);\n effects.exit('tableCellDivider');\n return headDelimiterCellBefore;\n }\n\n // More whitespace / empty row not allowed at start.\n return headDelimiterNok(code);\n }\n\n /**\n * After `|`, before delimiter cell.\n *\n * ```markdown\n * | | a |\n * > | | - |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterCellBefore(code) {\n if (markdownSpace(code)) {\n return factorySpace(effects, headDelimiterValueBefore, \"whitespace\")(code);\n }\n return headDelimiterValueBefore(code);\n }\n\n /**\n * Before delimiter cell value.\n *\n * ```markdown\n * | | a |\n * > | | - |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterValueBefore(code) {\n // Align: left.\n if (code === 58) {\n sizeB += 1;\n seen = true;\n effects.enter('tableDelimiterMarker');\n effects.consume(code);\n effects.exit('tableDelimiterMarker');\n return headDelimiterLeftAlignmentAfter;\n }\n\n // Align: none.\n if (code === 45) {\n sizeB += 1;\n // To do: seems weird that this *isn’t* left aligned, but that state is used?\n return headDelimiterLeftAlignmentAfter(code);\n }\n if (code === null || markdownLineEnding(code)) {\n return headDelimiterCellAfter(code);\n }\n return headDelimiterNok(code);\n }\n\n /**\n * After delimiter cell left alignment marker.\n *\n * ```markdown\n * | | a |\n * > | | :- |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterLeftAlignmentAfter(code) {\n if (code === 45) {\n effects.enter('tableDelimiterFiller');\n return headDelimiterFiller(code);\n }\n\n // Anything else is not ok after the left-align colon.\n return headDelimiterNok(code);\n }\n\n /**\n * In delimiter cell filler.\n *\n * ```markdown\n * | | a |\n * > | | - |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterFiller(code) {\n if (code === 45) {\n effects.consume(code);\n return headDelimiterFiller;\n }\n\n // Align is `center` if it was `left`, `right` otherwise.\n if (code === 58) {\n seen = true;\n effects.exit('tableDelimiterFiller');\n effects.enter('tableDelimiterMarker');\n effects.consume(code);\n effects.exit('tableDelimiterMarker');\n return headDelimiterRightAlignmentAfter;\n }\n effects.exit('tableDelimiterFiller');\n return headDelimiterRightAlignmentAfter(code);\n }\n\n /**\n * After delimiter cell right alignment marker.\n *\n * ```markdown\n * | | a |\n * > | | -: |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterRightAlignmentAfter(code) {\n if (markdownSpace(code)) {\n return factorySpace(effects, headDelimiterCellAfter, \"whitespace\")(code);\n }\n return headDelimiterCellAfter(code);\n }\n\n /**\n * After delimiter cell.\n *\n * ```markdown\n * | | a |\n * > | | -: |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterCellAfter(code) {\n if (code === 124) {\n return headDelimiterBefore(code);\n }\n if (code === null || markdownLineEnding(code)) {\n // Exit when:\n // * there was no `:` or `|` at all (it’s a thematic break or setext\n // underline instead)\n // * the header cell count is not the delimiter cell count\n if (!seen || size !== sizeB) {\n return headDelimiterNok(code);\n }\n\n // Note: in markdown-rs`, a reset is needed here.\n effects.exit('tableDelimiterRow');\n effects.exit('tableHead');\n // To do: in `markdown-rs`, resolvers need to be registered manually.\n // effects.register_resolver(ResolveName::GfmTable)\n return ok(code);\n }\n return headDelimiterNok(code);\n }\n\n /**\n * In delimiter row, at a disallowed byte.\n *\n * ```markdown\n * | | a |\n * > | | x |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterNok(code) {\n // Note: in `markdown-rs`, we need to reset, in `micromark-js` we don‘t.\n return nok(code);\n }\n\n /**\n * Before table body row.\n *\n * ```markdown\n * | | a |\n * | | - |\n * > | | b |\n * ^\n * ```\n *\n * @type {State}\n */\n function bodyRowStart(code) {\n // Note: in `markdown-rs` we need to manually take care of a prefix,\n // but in `micromark-js` that is done for us, so if we’re here, we’re\n // never at whitespace.\n effects.enter('tableRow');\n return bodyRowBreak(code);\n }\n\n /**\n * At break in table body row.\n *\n * ```markdown\n * | | a |\n * | | - |\n * > | | b |\n * ^\n * ^\n * ^\n * ```\n *\n * @type {State}\n */\n function bodyRowBreak(code) {\n if (code === 124) {\n effects.enter('tableCellDivider');\n effects.consume(code);\n effects.exit('tableCellDivider');\n return bodyRowBreak;\n }\n if (code === null || markdownLineEnding(code)) {\n effects.exit('tableRow');\n return ok(code);\n }\n if (markdownSpace(code)) {\n return factorySpace(effects, bodyRowBreak, \"whitespace\")(code);\n }\n\n // Anything else is cell content.\n effects.enter(\"data\");\n return bodyRowData(code);\n }\n\n /**\n * In table body row data.\n *\n * ```markdown\n * | | a |\n * | | - |\n * > | | b |\n * ^\n * ```\n *\n * @type {State}\n */\n function bodyRowData(code) {\n if (code === null || code === 124 || markdownLineEndingOrSpace(code)) {\n effects.exit(\"data\");\n return bodyRowBreak(code);\n }\n effects.consume(code);\n return code === 92 ? bodyRowEscape : bodyRowData;\n }\n\n /**\n * In table body row escape.\n *\n * ```markdown\n * | | a |\n * | | ---- |\n * > | | b\\-c |\n * ^\n * ```\n *\n * @type {State}\n */\n function bodyRowEscape(code) {\n if (code === 92 || code === 124) {\n effects.consume(code);\n return bodyRowData;\n }\n return bodyRowData(code);\n }\n}\n\n/** @type {Resolver} */\n\nfunction resolveTable(events, context) {\n let index = -1;\n let inFirstCellAwaitingPipe = true;\n /** @type {RowKind} */\n let rowKind = 0;\n /** @type {Range} */\n let lastCell = [0, 0, 0, 0];\n /** @type {Range} */\n let cell = [0, 0, 0, 0];\n let afterHeadAwaitingFirstBodyRow = false;\n let lastTableEnd = 0;\n /** @type {Token | undefined} */\n let currentTable;\n /** @type {Token | undefined} */\n let currentBody;\n /** @type {Token | undefined} */\n let currentCell;\n const map = new EditMap();\n while (++index < events.length) {\n const event = events[index];\n const token = event[1];\n if (event[0] === 'enter') {\n // Start of head.\n if (token.type === 'tableHead') {\n afterHeadAwaitingFirstBodyRow = false;\n\n // Inject previous (body end and) table end.\n if (lastTableEnd !== 0) {\n flushTableEnd(map, context, lastTableEnd, currentTable, currentBody);\n currentBody = undefined;\n lastTableEnd = 0;\n }\n\n // Inject table start.\n currentTable = {\n type: 'table',\n start: Object.assign({}, token.start),\n // Note: correct end is set later.\n end: Object.assign({}, token.end)\n };\n map.add(index, 0, [['enter', currentTable, context]]);\n } else if (token.type === 'tableRow' || token.type === 'tableDelimiterRow') {\n inFirstCellAwaitingPipe = true;\n currentCell = undefined;\n lastCell = [0, 0, 0, 0];\n cell = [0, index + 1, 0, 0];\n\n // Inject table body start.\n if (afterHeadAwaitingFirstBodyRow) {\n afterHeadAwaitingFirstBodyRow = false;\n currentBody = {\n type: 'tableBody',\n start: Object.assign({}, token.start),\n // Note: correct end is set later.\n end: Object.assign({}, token.end)\n };\n map.add(index, 0, [['enter', currentBody, context]]);\n }\n rowKind = token.type === 'tableDelimiterRow' ? 2 : currentBody ? 3 : 1;\n }\n // Cell data.\n else if (rowKind && (token.type === \"data\" || token.type === 'tableDelimiterMarker' || token.type === 'tableDelimiterFiller')) {\n inFirstCellAwaitingPipe = false;\n\n // First value in cell.\n if (cell[2] === 0) {\n if (lastCell[1] !== 0) {\n cell[0] = cell[1];\n currentCell = flushCell(map, context, lastCell, rowKind, undefined, currentCell);\n lastCell = [0, 0, 0, 0];\n }\n cell[2] = index;\n }\n } else if (token.type === 'tableCellDivider') {\n if (inFirstCellAwaitingPipe) {\n inFirstCellAwaitingPipe = false;\n } else {\n if (lastCell[1] !== 0) {\n cell[0] = cell[1];\n currentCell = flushCell(map, context, lastCell, rowKind, undefined, currentCell);\n }\n lastCell = cell;\n cell = [lastCell[1], index, 0, 0];\n }\n }\n }\n // Exit events.\n else if (token.type === 'tableHead') {\n afterHeadAwaitingFirstBodyRow = true;\n lastTableEnd = index;\n } else if (token.type === 'tableRow' || token.type === 'tableDelimiterRow') {\n lastTableEnd = index;\n if (lastCell[1] !== 0) {\n cell[0] = cell[1];\n currentCell = flushCell(map, context, lastCell, rowKind, index, currentCell);\n } else if (cell[1] !== 0) {\n currentCell = flushCell(map, context, cell, rowKind, index, currentCell);\n }\n rowKind = 0;\n } else if (rowKind && (token.type === \"data\" || token.type === 'tableDelimiterMarker' || token.type === 'tableDelimiterFiller')) {\n cell[3] = index;\n }\n }\n if (lastTableEnd !== 0) {\n flushTableEnd(map, context, lastTableEnd, currentTable, currentBody);\n }\n map.consume(context.events);\n\n // To do: move this into `html`, when events are exposed there.\n // That’s what `markdown-rs` does.\n // That needs updates to `mdast-util-gfm-table`.\n index = -1;\n while (++index < context.events.length) {\n const event = context.events[index];\n if (event[0] === 'enter' && event[1].type === 'table') {\n event[1]._align = gfmTableAlign(context.events, index);\n }\n }\n return events;\n}\n\n/**\n * Generate a cell.\n *\n * @param {EditMap} map\n * @param {Readonly<TokenizeContext>} context\n * @param {Readonly<Range>} range\n * @param {RowKind} rowKind\n * @param {number | undefined} rowEnd\n * @param {Token | undefined} previousCell\n * @returns {Token | undefined}\n */\n// eslint-disable-next-line max-params\nfunction flushCell(map, context, range, rowKind, rowEnd, previousCell) {\n // `markdown-rs` uses:\n // rowKind === 2 ? 'tableDelimiterCell' : 'tableCell'\n const groupName = rowKind === 1 ? 'tableHeader' : rowKind === 2 ? 'tableDelimiter' : 'tableData';\n // `markdown-rs` uses:\n // rowKind === 2 ? 'tableDelimiterCellValue' : 'tableCellText'\n const valueName = 'tableContent';\n\n // Insert an exit for the previous cell, if there is one.\n //\n // ```markdown\n // > | | aa | bb | cc |\n // ^-- exit\n // ^^^^-- this cell\n // ```\n if (range[0] !== 0) {\n previousCell.end = Object.assign({}, getPoint(context.events, range[0]));\n map.add(range[0], 0, [['exit', previousCell, context]]);\n }\n\n // Insert enter of this cell.\n //\n // ```markdown\n // > | | aa | bb | cc |\n // ^-- enter\n // ^^^^-- this cell\n // ```\n const now = getPoint(context.events, range[1]);\n previousCell = {\n type: groupName,\n start: Object.assign({}, now),\n // Note: correct end is set later.\n end: Object.assign({}, now)\n };\n map.add(range[1], 0, [['enter', previousCell, context]]);\n\n // Insert text start at first data start and end at last data end, and\n // remove events between.\n //\n // ```markdown\n // > | | aa | bb | cc |\n // ^-- enter\n // ^-- exit\n // ^^^^-- this cell\n // ```\n if (range[2] !== 0) {\n const relatedStart = getPoint(context.events, range[2]);\n const relatedEnd = getPoint(context.events, range[3]);\n /** @type {Token} */\n const valueToken = {\n type: valueName,\n start: Object.assign({}, relatedStart),\n end: Object.assign({}, relatedEnd)\n };\n map.add(range[2], 0, [['enter', valueToken, context]]);\n if (rowKind !== 2) {\n // Fix positional info on remaining events\n const start = context.events[range[2]];\n const end = context.events[range[3]];\n start[1].end = Object.assign({}, end[1].end);\n start[1].type = \"chunkText\";\n start[1].contentType = \"text\";\n\n // Remove if needed.\n if (range[3] > range[2] + 1) {\n const a = range[2] + 1;\n const b = range[3] - range[2] - 1;\n map.add(a, b, []);\n }\n }\n map.add(range[3] + 1, 0, [['exit', valueToken, context]]);\n }\n\n // Insert an exit for the last cell, if at the row end.\n //\n // ```markdown\n // > | | aa | bb | cc |\n // ^-- exit\n // ^^^^^^-- this cell (the last one contains two “between” parts)\n // ```\n if (rowEnd !== undefined) {\n previousCell.end = Object.assign({}, getPoint(context.events, rowEnd));\n map.add(rowEnd, 0, [['exit', previousCell, context]]);\n previousCell = undefined;\n }\n return previousCell;\n}\n\n/**\n * Generate table end (and table body end).\n *\n * @param {Readonly<EditMap>} map\n * @param {Readonly<TokenizeContext>} context\n * @param {number} index\n * @param {Token} table\n * @param {Token | undefined} tableBody\n */\n// eslint-disable-next-line max-params\nfunction flushTableEnd(map, context, index, table, tableBody) {\n /** @type {Array<Event>} */\n const exits = [];\n const related = getPoint(context.events, index);\n if (tableBody) {\n tableBody.end = Object.assign({}, related);\n exits.push(['exit', tableBody, context]);\n }\n table.end = Object.assign({}, related);\n exits.push(['exit', table, context]);\n map.add(index + 1, 0, exits);\n}\n\n/**\n * @param {Readonly<Array<Event>>} events\n * @param {number} index\n * @returns {Readonly<Point>}\n */\nfunction getPoint(events, index) {\n const event = events[index];\n const side = event[0] === 'enter' ? 'start' : 'end';\n return event[1][side];\n}","/**\n * @import {Extension, State, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownLineEndingOrSpace, markdownSpace } from 'micromark-util-character';\nconst tasklistCheck = {\n name: 'tasklistCheck',\n tokenize: tokenizeTasklistCheck\n};\n\n/**\n * Create an HTML extension for `micromark` to support GFM task list items\n * syntax.\n *\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `htmlExtensions` to\n * support GFM task list items when serializing to HTML.\n */\nexport function gfmTaskListItem() {\n return {\n text: {\n [91]: tasklistCheck\n }\n };\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeTasklistCheck(effects, ok, nok) {\n const self = this;\n return open;\n\n /**\n * At start of task list item check.\n *\n * ```markdown\n * > | * [x] y.\n * ^\n * ```\n *\n * @type {State}\n */\n function open(code) {\n if (\n // Exit if there’s stuff before.\n self.previous !== null ||\n // Exit if not in the first content that is the first child of a list\n // item.\n !self._gfmTasklistFirstContentOfListItem) {\n return nok(code);\n }\n effects.enter('taskListCheck');\n effects.enter('taskListCheckMarker');\n effects.consume(code);\n effects.exit('taskListCheckMarker');\n return inside;\n }\n\n /**\n * In task list item check.\n *\n * ```markdown\n * > | * [x] y.\n * ^\n * ```\n *\n * @type {State}\n */\n function inside(code) {\n // Currently we match how GH works in files.\n // To match how GH works in comments, use `markdownSpace` (`[\\t ]`) instead\n // of `markdownLineEndingOrSpace` (`[\\t\\n\\r ]`).\n if (markdownLineEndingOrSpace(code)) {\n effects.enter('taskListCheckValueUnchecked');\n effects.consume(code);\n effects.exit('taskListCheckValueUnchecked');\n return close;\n }\n if (code === 88 || code === 120) {\n effects.enter('taskListCheckValueChecked');\n effects.consume(code);\n effects.exit('taskListCheckValueChecked');\n return close;\n }\n return nok(code);\n }\n\n /**\n * At close of task list item check.\n *\n * ```markdown\n * > | * [x] y.\n * ^\n * ```\n *\n * @type {State}\n */\n function close(code) {\n if (code === 93) {\n effects.enter('taskListCheckMarker');\n effects.consume(code);\n effects.exit('taskListCheckMarker');\n effects.exit('taskListCheck');\n return after;\n }\n return nok(code);\n }\n\n /**\n * @type {State}\n */\n function after(code) {\n // EOL in paragraph means there must be something else after it.\n if (markdownLineEnding(code)) {\n return ok(code);\n }\n\n // Space or tab?\n // Check what comes after.\n if (markdownSpace(code)) {\n return effects.check({\n tokenize: spaceThenNonSpace\n }, ok, nok)(code);\n }\n\n // EOF, or non-whitespace, both wrong.\n return nok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction spaceThenNonSpace(effects, ok, nok) {\n return factorySpace(effects, after, \"whitespace\");\n\n /**\n * After whitespace, after task list item check.\n *\n * ```markdown\n * > | * [x] y.\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n // EOF means there was nothing, so bad.\n // EOL means there’s content after it, so good.\n // Impossible to have more spaces.\n // Anything else is good.\n return code === null ? nok(code) : ok(code);\n }\n}","/**\n * @typedef {import('micromark-extension-gfm-footnote').HtmlOptions} HtmlOptions\n * @typedef {import('micromark-extension-gfm-strikethrough').Options} Options\n * @typedef {import('micromark-util-types').Extension} Extension\n * @typedef {import('micromark-util-types').HtmlExtension} HtmlExtension\n */\n\nimport {\n combineExtensions,\n combineHtmlExtensions\n} from 'micromark-util-combine-extensions'\nimport {\n gfmAutolinkLiteral,\n gfmAutolinkLiteralHtml\n} from 'micromark-extension-gfm-autolink-literal'\nimport {gfmFootnote, gfmFootnoteHtml} from 'micromark-extension-gfm-footnote'\nimport {\n gfmStrikethrough,\n gfmStrikethroughHtml\n} from 'micromark-extension-gfm-strikethrough'\nimport {gfmTable, gfmTableHtml} from 'micromark-extension-gfm-table'\nimport {gfmTagfilterHtml} from 'micromark-extension-gfm-tagfilter'\nimport {\n gfmTaskListItem,\n gfmTaskListItemHtml\n} from 'micromark-extension-gfm-task-list-item'\n\n/**\n * Create an extension for `micromark` to enable GFM syntax.\n *\n * @param {Options | null | undefined} [options]\n * Configuration (optional).\n *\n * Passed to `micromark-extens-gfm-strikethrough`.\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `extensions` to enable GFM\n * syntax.\n */\nexport function gfm(options) {\n return combineExtensions([\n gfmAutolinkLiteral(),\n gfmFootnote(),\n gfmStrikethrough(options),\n gfmTable(),\n gfmTaskListItem()\n ])\n}\n\n/**\n * Create an extension for `micromark` to support GFM when serializing to HTML.\n *\n * @param {HtmlOptions | null | undefined} [options]\n * Configuration (optional).\n *\n * Passed to `micromark-extens-gfm-footnote`.\n * @returns {HtmlExtension}\n * Extension for `micromark` that can be passed in `htmlExtensions` to\n * support GFM when serializing to HTML.\n */\nexport function gfmHtml(options) {\n return combineHtmlExtensions([\n gfmAutolinkLiteralHtml(),\n gfmFootnoteHtml(options),\n gfmStrikethroughHtml(),\n gfmTableHtml(),\n gfmTagfilterHtml(),\n gfmTaskListItemHtml()\n ])\n}\n","/**\n * @import {Root} from 'mdast'\n * @import {Options} from 'remark-gfm'\n * @import {} from 'remark-parse'\n * @import {} from 'remark-stringify'\n * @import {Processor} from 'unified'\n */\n\nimport {gfmFromMarkdown, gfmToMarkdown} from 'mdast-util-gfm'\nimport {gfm} from 'micromark-extension-gfm'\n\n/** @type {Options} */\nconst emptyOptions = {}\n\n/**\n * Add support GFM (autolink literals, footnotes, strikethrough, tables,\n * tasklists).\n *\n * @param {Options | null | undefined} [options]\n * Configuration (optional).\n * @returns {undefined}\n * Nothing.\n */\nexport default function remarkGfm(options) {\n // @ts-expect-error: TS is wrong about `this`.\n // eslint-disable-next-line unicorn/no-this-assignment\n const self = /** @type {Processor<Root>} */ (this)\n const settings = options || emptyOptions\n const data = self.data()\n\n const micromarkExtensions =\n data.micromarkExtensions || (data.micromarkExtensions = [])\n const fromMarkdownExtensions =\n data.fromMarkdownExtensions || (data.fromMarkdownExtensions = [])\n const toMarkdownExtensions =\n data.toMarkdownExtensions || (data.toMarkdownExtensions = [])\n\n micromarkExtensions.push(gfm(settings))\n fromMarkdownExtensions.push(gfmFromMarkdown())\n toMarkdownExtensions.push(gfmToMarkdown(settings))\n}\n","import { existsSync } from 'node:fs';\nimport { readFile, readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { defineCommand } from 'citty';\nimport matter from 'gray-matter';\nimport { ConfigError, loadOvellumConfig, type OvellumConfig } from '@ovellum/core';\nimport { buildNav, extractMarkdownLinks, flattenNav, type NavNode } from '@ovellum/site';\nimport { detectUnsafeScheme } from './check-utils.js';\n\ninterface Issue {\n file: string;\n line: number;\n message: string;\n kind: 'broken-link' | 'unsafe-scheme';\n}\n\nexport const checkCommand = defineCommand({\n meta: {\n name: 'check',\n description:\n 'Validate config and check for broken internal links without writing any output.',\n },\n args: {\n config: {\n type: 'string',\n description: 'Path to ovellum.config.{ts,js,json}',\n },\n cwd: {\n type: 'string',\n description: 'Project root (defaults to current directory)',\n },\n },\n async run({ args }) {\n const cwd = path.resolve(args.cwd ?? process.cwd());\n let loaded;\n try {\n loaded = await loadOvellumConfig({ cwd, configFile: args.config });\n } catch (err) {\n if (err instanceof ConfigError) {\n process.stderr.write(`config error: ${err.message}\\n`);\n if (err.hint) process.stderr.write(`hint: ${err.hint}\\n`);\n process.exit(3);\n }\n throw err;\n }\n const { config, configFile } = loaded;\n\n const startedAt = Date.now();\n let issues: Issue[];\n let files: string[];\n try {\n if (config.mode === 'manual') {\n ({ issues, files } = await checkManual({ config, cwd }));\n } else {\n ({ issues, files } = await checkGenerated({ config, cwd }));\n }\n } catch (err) {\n if (err instanceof ConfigError) {\n process.stderr.write(`check error: ${err.message}\\n`);\n if (err.hint) process.stderr.write(`hint: ${err.hint}\\n`);\n process.exit(1);\n }\n throw err;\n }\n\n const elapsed = Date.now() - startedAt;\n const unsafeCount = issues.filter((i) => i.kind === 'unsafe-scheme').length;\n const brokenCount = issues.length - unsafeCount;\n const lines = [\n `ovellum check complete in ${elapsed}ms`,\n ` config: ${configFile ?? '(defaults)'}`,\n ` mode: ${config.mode}`,\n ` pages: ${files.length}`,\n ` broken links: ${brokenCount}`,\n ` unsafe schemes: ${unsafeCount}`,\n ];\n if (issues.length > 0) {\n lines.push(' details:');\n for (const it of issues) {\n const tag = it.kind === 'unsafe-scheme' ? '[SECURITY] ' : '';\n lines.push(` ${it.file}:${it.line} ${tag}${it.message}`);\n }\n }\n process.stdout.write(lines.join('\\n') + '\\n');\n\n process.exit(issues.length === 0 ? 0 : 1);\n },\n});\n\nfunction collectValidUrls(nav: NavNode, config: OvellumConfig): Set<string> {\n const urls = new Set<string>();\n for (const page of flattenNav(nav)) urls.add(page.url);\n // Landing replaces `/` when enabled.\n if (config.site.landing.enabled) urls.add('/');\n return urls;\n}\n\ninterface CheckRun {\n issues: Issue[];\n files: string[];\n}\n\ninterface CheckInput {\n config: OvellumConfig;\n cwd: string;\n}\n\n/**\n * Manual mode: walk `input/`, validate every internal link against the\n * sidebar nav. This is the original behaviour.\n */\nasync function checkManual({ config, cwd }: CheckInput): Promise<CheckRun> {\n const inputAbs = path.resolve(cwd, config.input);\n const nav = await buildNav(config.input, cwd);\n const validUrls = collectValidUrls(nav, config);\n\n const issues: Issue[] = [];\n const files: string[] = [];\n for await (const file of walkMarkdown(inputAbs)) {\n files.push(file);\n const rel = path.relative(cwd, file).replace(/\\\\/g, '/');\n const raw = await readFile(file, 'utf8');\n const { content } = matter(raw);\n const url = urlForPage(file, inputAbs);\n for (const { target, line } of extractMarkdownLinks(content)) {\n const unsafe = detectUnsafeScheme(target);\n if (unsafe) {\n issues.push({\n file: rel,\n line,\n kind: 'unsafe-scheme',\n message: `unsafe URL scheme '${unsafe}:' — link will be stripped by the HTML sanitizer (raw: ${target})`,\n });\n continue;\n }\n const resolved = resolveLink(target, url);\n if (resolved === undefined) continue; // external / mailto / fragment / unparseable\n if (!validUrls.has(resolved)) {\n issues.push({\n file: rel,\n line,\n kind: 'broken-link',\n message: `broken internal link to ${resolved} (raw: ${target})`,\n });\n }\n }\n }\n return { issues, files };\n}\n\n/**\n * Hybrid / auto modes: the .md files we want to validate are the\n * *generated* ones in `config.output`. Internal links are resolved\n * against the actual files present on disk, since there's no\n * sidebar nav in auto-generated docs.\n *\n * Exits early with a clear message when the output directory doesn't\n * exist — usually because the user hasn't run `ovellum build` yet.\n */\nasync function checkGenerated({ config, cwd }: CheckInput): Promise<CheckRun> {\n const outputAbs = path.resolve(cwd, config.output);\n if (!existsSync(outputAbs)) {\n throw new ConfigError(\n `output directory does not exist: ${path.relative(cwd, outputAbs)}`,\n { hint: 'Run `ovellum build` first; `ovellum check` validates the generated Markdown.' },\n );\n }\n\n // Collect every .md path in the output dir so we can check links against\n // real files. Keys are stored both with and without the `.md` suffix so a\n // link to `./foo` and a link to `./foo.md` both resolve.\n const fileSet = new Set<string>();\n for await (const file of walkMarkdown(outputAbs)) {\n const rel = path.relative(outputAbs, file).replace(/\\\\/g, '/');\n fileSet.add('/' + rel);\n fileSet.add('/' + rel.replace(/\\.md$/i, ''));\n }\n\n const issues: Issue[] = [];\n const files: string[] = [];\n for await (const file of walkMarkdown(outputAbs)) {\n files.push(file);\n const rel = path.relative(cwd, file).replace(/\\\\/g, '/');\n const raw = await readFile(file, 'utf8');\n const { content } = matter(raw);\n const pageRel = '/' + path.relative(outputAbs, file).replace(/\\\\/g, '/');\n for (const { target, line } of extractMarkdownLinks(content)) {\n const unsafe = detectUnsafeScheme(target);\n if (unsafe) {\n issues.push({\n file: rel,\n line,\n kind: 'unsafe-scheme',\n message: `unsafe URL scheme '${unsafe}:' — link will be stripped by the HTML sanitizer (raw: ${target})`,\n });\n continue;\n }\n const resolved = resolveGeneratedLink(target, pageRel);\n if (resolved === undefined) continue;\n if (!fileSet.has(resolved)) {\n issues.push({\n file: rel,\n line,\n kind: 'broken-link',\n message: `broken internal link to ${resolved} (raw: ${target})`,\n });\n }\n }\n }\n return { issues, files };\n}\n\n/**\n * Resolve a link in a generated Markdown file to a path within the output\n * dir (rooted at `/`). Returns undefined for external / fragment / unparseable\n * links — those are not validated.\n */\nfunction resolveGeneratedLink(target: string, pageRel: string): string | undefined {\n if (!target) return undefined;\n if (/^(https?:|mailto:|tel:|data:|ftp:|ssh:)/i.test(target)) return undefined;\n if (target.startsWith('#')) return undefined;\n const cleaned = target.replace(/[?#].*$/, '');\n if (!cleaned) return undefined;\n if (cleaned.startsWith('/')) return cleaned;\n // Relative: resolve against the directory of pageRel.\n const baseDir = pageRel.slice(0, pageRel.lastIndexOf('/') + 1);\n const joined = new URL(cleaned, `https://x.test${baseDir}`).pathname;\n return joined;\n}\n\nasync function* walkMarkdown(dirAbs: string): AsyncGenerator<string> {\n const entries = await readdir(dirAbs);\n for (const name of entries) {\n if (name.startsWith('_')) continue;\n const abs = path.join(dirAbs, name);\n const st = await stat(abs);\n if (st.isDirectory()) {\n yield* walkMarkdown(abs);\n } else if (/\\.(md|markdown)$/i.test(name)) {\n yield abs;\n }\n }\n}\n\nfunction urlForPage(absFile: string, inputAbs: string): string {\n const rel = path.relative(inputAbs, absFile).replace(/\\\\/g, '/');\n const noExt = rel.replace(/\\.(md|markdown)$/i, '');\n const parts = noExt.split('/').filter(Boolean);\n if (parts.length === 0) return '/';\n if (parts[parts.length - 1] === 'index') parts.pop();\n if (parts.length === 0) return '/';\n return '/' + parts.join('/') + '/';\n}\n\nfunction resolveLink(target: string, pageUrl: string): string | undefined {\n if (!target) return undefined;\n if (/^(https?:|mailto:|tel:|data:|ftp:|ssh:)/i.test(target)) return undefined;\n if (target.startsWith('#')) return undefined; // fragment-only — could be checked but defer\n // Strip query and fragment for the resolution check\n const cleaned = target.replace(/[?#].*$/, '');\n if (!cleaned) return undefined;\n if (cleaned.startsWith('/')) {\n return ensureTrailingSlash(cleaned);\n }\n // Relative — resolve against pageUrl's directory\n const base = pageUrl.endsWith('/') ? pageUrl : pageUrl + '/';\n const joined = new URL(cleaned, `https://x.test${base}`).pathname;\n return ensureTrailingSlash(joined);\n}\n\nfunction ensureTrailingSlash(p: string): string {\n if (/\\.[a-z0-9]+$/i.test(p)) return p; // looks like a file path (image, etc.) — leave as is\n return p.endsWith('/') ? p : p + '/';\n}\n","/**\n * URL schemes that have no legitimate use inside a documentation site and\n * are common XSS vectors. We surface these as `[SECURITY]` issues in\n * `ovellum check` even though `renderMarkdown` already strips them at render\n * time — defense in depth, and authors should learn about the link so they\n * can remove it from source.\n *\n * `file:` is included because it can probe local files when the site is\n * opened via `file://` in a desktop context (e.g. an Electron-wrapped docs\n * viewer). Not strictly XSS but still surprising.\n */\nconst UNSAFE_SCHEMES = ['javascript', 'vbscript', 'data', 'file'] as const;\n\n/**\n * Strip ASCII C0 controls, space, and the zero-width / BiDi / BOM\n * characters a browser would silently ignore between scheme bytes.\n *\n * Built via `new RegExp()` on purpose: a regex literal containing the\n * U+0000–U+0020 range trips eslint's `no-control-regex` and\n * `no-irregular-whitespace`, both of which exist for good reasons in\n * other contexts. Spelling the ranges out in a normal string keeps\n * the source linter-clean while producing exactly the same regex at\n * runtime.\n *\n * U+0000–U+0020 NUL through SPACE\n * U+200B–U+200D ZWSP / ZWNJ / ZWJ\n * U+200E–U+200F LTR / RTL marks\n * U+202F NARROW NO-BREAK SPACE\n * U+FEFF BOM / ZWNBSP\n */\nconst STRIP_CONTROLS = new RegExp(\n '[' +\n '\\\\u0000-\\\\u0020' +\n '\\\\u200B-\\\\u200D' +\n '\\\\u200E-\\\\u200F' +\n '\\\\u202F' +\n '\\\\uFEFF' +\n ']',\n 'g',\n);\n\n/**\n * Return the lowercased scheme name if `target` uses one we consider unsafe;\n * otherwise `undefined`. Leading whitespace and HTML-numeric-entity-decoded\n * characters are normalised first so attempts like `\\tjavascript:` or\n * `javas&#x09;cript:` don't slip through.\n */\nexport function detectUnsafeScheme(target: string): string | undefined {\n if (!target) return undefined;\n // Order matters: decode entities FIRST, then strip controls. If we stripped\n // controls first, `javas&#x09;cript:` would still have an entity-encoded tab\n // hiding between the letters.\n const normalised = target\n .replace(/&#x([0-9a-f]+);?/gi, (_, hex: string) => String.fromCharCode(parseInt(hex, 16)))\n .replace(/&#(\\d+);?/g, (_, dec: string) => String.fromCharCode(parseInt(dec, 10)))\n .replace(STRIP_CONTROLS, '')\n .toLowerCase();\n const match = normalised.match(/^([a-z][a-z0-9+.-]*):/);\n if (!match || !match[1]) return undefined;\n const scheme = match[1];\n return (UNSAFE_SCHEMES as readonly string[]).includes(scheme) ? scheme : undefined;\n}\n","import path from 'node:path';\nimport { defineCommand } from 'citty';\nimport { ConfigError, loadOvellumConfig } from '@ovellum/core';\nimport { startDevServer } from '../dev/server.js';\nimport { watchAndBuild } from '../dev/watcher.js';\n\nconst DEFAULT_PORT = 3000;\nconst DEFAULT_HOST = '127.0.0.1';\n\nexport const devCommand = defineCommand({\n meta: {\n name: 'dev',\n description: 'Build, watch for changes, serve, and live-reload connected browsers.',\n },\n args: {\n config: {\n type: 'string',\n description: 'Path to ovellum.config.{ts,js,json}',\n },\n cwd: {\n type: 'string',\n description: 'Project root (defaults to current directory)',\n },\n port: {\n type: 'string',\n description: `Port to bind (default ${DEFAULT_PORT}; auto-bumps if busy)`,\n },\n host: {\n type: 'string',\n description: `Host to bind (default ${DEFAULT_HOST}; pass 0.0.0.0 to expose on the network)`,\n },\n },\n async run({ args }) {\n const cwd = path.resolve(args.cwd ?? process.cwd());\n let loaded;\n try {\n loaded = await loadOvellumConfig({ cwd, configFile: args.config });\n } catch (err) {\n if (err instanceof ConfigError) {\n process.stderr.write(`config error: ${err.message}\\n`);\n if (err.hint) process.stderr.write(`hint: ${err.hint}\\n`);\n process.exit(3);\n }\n throw err;\n }\n const { config, configFile } = loaded;\n\n if (config.mode !== 'manual') {\n process.stderr.write(\n `'dev' currently supports manual mode only. Got '${config.mode}'. ` +\n `Auto / hybrid coverage is tracked in TODO.md Phase 6.\\n`,\n );\n process.exit(1);\n }\n\n const port = parsePort(args.port) ?? DEFAULT_PORT;\n const host = args.host ?? DEFAULT_HOST;\n const outputAbs = path.resolve(cwd, config.output);\n\n process.stdout.write(`ovellum dev starting from ${configFile ?? '(defaults)'}\\n`);\n\n // Start the server first so its `broadcastReload` is in scope when the\n // watcher fires its initial build. The server happily serves 404s\n // during the brief window before dist/ is populated.\n const server = await startDevServer({\n rootDir: outputAbs,\n port,\n host,\n liveReload: true,\n });\n\n const watcher = await watchAndBuild({\n cwd,\n config,\n configFile,\n onBuild: () => server.broadcastReload(),\n });\n\n const inputAbs = path.resolve(cwd, config.input);\n process.stdout.write(\n `\\nwatching ${path.relative(cwd, inputAbs) || inputAbs} for changes…\\n` +\n `local: ${server.url}\\n` +\n `press Ctrl-C to exit.\\n`,\n );\n\n const shutdown = async (): Promise<void> => {\n process.stdout.write('\\nstopping dev server…\\n');\n await Promise.all([watcher.close(), server.close()]);\n process.exit(0);\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n await new Promise(() => {});\n },\n});\n\nfunction parsePort(raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const n = Number(raw);\n if (!Number.isInteger(n) || n < 1 || n > 65535) {\n throw new Error(`--port must be an integer between 1 and 65535; got '${raw}'.`);\n }\n return n;\n}\n","import { createReadStream, existsSync, statSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport http, { type IncomingMessage, type Server, type ServerResponse } from 'node:http';\nimport path from 'node:path';\n\nconst RELOAD_PATH = '/__ovellum/events';\nconst RELOAD_SCRIPT_PATH = '/__ovellum/reload.js';\n\n// Tiny client: subscribe to the SSE channel and reload on the `reload` event.\n// `error` events fire on disconnect; EventSource reconnects on its own, no\n// special handling needed.\nconst RELOAD_CLIENT_SCRIPT = `(function () {\n if (typeof EventSource !== 'function') return;\n var src = new EventSource('${RELOAD_PATH}');\n src.addEventListener('reload', function () { location.reload(); });\n})();`;\n\nconst MIME: Record<string, string> = {\n '.html': 'text/html; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.js': 'text/javascript; charset=utf-8',\n '.mjs': 'text/javascript; charset=utf-8',\n '.json': 'application/json; charset=utf-8',\n '.xml': 'application/xml; charset=utf-8',\n '.svg': 'image/svg+xml',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n '.txt': 'text/plain; charset=utf-8',\n};\n\nexport interface DevServerOptions {\n /** Absolute path of the directory to serve. */\n rootDir: string;\n /** Starting port; the server auto-bumps up to PORT_RANGE times if busy. */\n port: number;\n /** Host to bind. */\n host: string;\n /** When true, HTML responses get a live-reload client injected. */\n liveReload: boolean;\n}\n\nexport interface DevServer {\n /** Final URL the server is listening on (after any port bumping). */\n url: string;\n /** Final port the server bound to. */\n port: number;\n /** Push a `reload` event to every connected SSE client. */\n broadcastReload: () => void;\n /** Stop accepting requests and end open responses. */\n close: () => Promise<void>;\n}\n\nconst PORT_RANGE = 20;\n\n/**\n * Spin up a dev server for a built `dist/` directory.\n *\n * Routing:\n * / → <rootDir>/index.html\n * /foo/ → <rootDir>/foo/index.html\n * /foo/bar.css → <rootDir>/foo/bar.css\n * anything else missing → <rootDir>/404.html (or a built-in fallback)\n *\n * When `liveReload` is on, HTML responses get the client script injected\n * before `</body>`, and the server exposes `/__ovellum/events` (SSE) +\n * `/__ovellum/reload.js`.\n *\n * Port-bumping: if `port` is taken, the server tries `port + 1`, `port + 2`,\n * etc. up to `port + 19`. Throws if none are free.\n */\nexport async function startDevServer(opts: DevServerOptions): Promise<DevServer> {\n const clients = new Set<ServerResponse>();\n\n const handler = async (req: IncomingMessage, res: ServerResponse): Promise<void> => {\n const url = req.url ?? '/';\n const urlPath = url.split('?')[0] ?? '/';\n\n if (opts.liveReload && urlPath === RELOAD_PATH) {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n });\n // Initial comment line keeps proxies from closing the stream early.\n res.write(': connected\\n\\n');\n clients.add(res);\n req.on('close', () => clients.delete(res));\n return;\n }\n\n if (opts.liveReload && urlPath === RELOAD_SCRIPT_PATH) {\n res.writeHead(200, {\n 'Content-Type': MIME['.js']!,\n 'Cache-Control': 'no-store',\n });\n res.end(RELOAD_CLIENT_SCRIPT);\n return;\n }\n\n const filePath = resolveFilePath(opts.rootDir, urlPath);\n if (!filePath) {\n await serve404(opts, res);\n return;\n }\n\n await serveFile(opts, filePath, res);\n };\n\n // Port 0 means \"let the OS pick\" — used in tests so they don't race on a\n // fixed port. Otherwise scan upward from the requested port to find one\n // that's free.\n const startingPort =\n opts.port === 0 ? 0 : await findFreePort(opts.host, opts.port, PORT_RANGE);\n const server: Server = http.createServer((req, res) => {\n handler(req, res).catch((err) => {\n process.stderr.write(`dev-server error: ${(err as Error).message}\\n`);\n if (!res.headersSent) res.writeHead(500);\n res.end('Internal Server Error');\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(startingPort, opts.host, () => {\n server.off('error', reject);\n resolve();\n });\n });\n\n const address = server.address();\n const port = typeof address === 'object' && address ? address.port : startingPort;\n const host = opts.host === '0.0.0.0' ? 'localhost' : opts.host;\n const url = `http://${host}:${port}/`;\n\n return {\n url,\n port,\n broadcastReload(): void {\n for (const res of clients) {\n try {\n res.write('event: reload\\ndata: {}\\n\\n');\n } catch {\n clients.delete(res);\n }\n }\n },\n close: async () =>\n new Promise<void>((resolve) => {\n for (const res of clients) res.end();\n clients.clear();\n server.close(() => resolve());\n }),\n };\n}\n\n/**\n * Resolve a URL path to an absolute filesystem path, applying pretty-URL\n * fallback (`/foo/` → `/foo/index.html`). Returns undefined if no file\n * exists. Defends against path-traversal by rejecting any resolved path\n * that escapes the root.\n */\nfunction resolveFilePath(rootDir: string, urlPath: string): string | undefined {\n // Strip query/hash and normalise.\n let p = decodeURIComponent(urlPath);\n if (!p.startsWith('/')) p = '/' + p;\n const candidate = path.normalize(path.join(rootDir, p));\n // path.normalize collapses `..`; ensure we're still under rootDir.\n const rel = path.relative(rootDir, candidate);\n if (rel.startsWith('..') || path.isAbsolute(rel)) return undefined;\n\n if (existsSync(candidate)) {\n const stat = statSync(candidate);\n if (stat.isFile()) return candidate;\n if (stat.isDirectory()) {\n const indexHtml = path.join(candidate, 'index.html');\n if (existsSync(indexHtml)) return indexHtml;\n }\n }\n // Try `<urlPath>.html` for extensionless requests like `/foo`.\n const withHtml = candidate + '.html';\n if (existsSync(withHtml) && statSync(withHtml).isFile()) return withHtml;\n return undefined;\n}\n\nasync function serveFile(\n opts: DevServerOptions,\n filePath: string,\n res: ServerResponse,\n): Promise<void> {\n const ext = path.extname(filePath).toLowerCase();\n const type = MIME[ext] ?? 'application/octet-stream';\n\n // HTML gets in-memory read so we can inject the reload script.\n if (ext === '.html' && opts.liveReload) {\n const raw = await readFile(filePath, 'utf8');\n const injected = injectReloadScript(raw);\n res.writeHead(200, {\n 'Content-Type': type,\n 'Cache-Control': 'no-store',\n });\n res.end(injected);\n return;\n }\n\n res.writeHead(200, {\n 'Content-Type': type,\n 'Cache-Control': opts.liveReload ? 'no-store' : 'public, max-age=0',\n });\n createReadStream(filePath).pipe(res);\n}\n\nasync function serve404(opts: DevServerOptions, res: ServerResponse): Promise<void> {\n // Prefer the site's own 404.html / 404/index.html so the dev experience\n // matches production behaviour.\n const candidates = [\n path.join(opts.rootDir, '404.html'),\n path.join(opts.rootDir, '404', 'index.html'),\n ];\n for (const c of candidates) {\n if (existsSync(c) && statSync(c).isFile()) {\n const raw = await readFile(c, 'utf8');\n const body = opts.liveReload ? injectReloadScript(raw) : raw;\n res.writeHead(404, {\n 'Content-Type': MIME['.html']!,\n 'Cache-Control': 'no-store',\n });\n res.end(body);\n return;\n }\n }\n res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });\n res.end('Not Found');\n}\n\n/**\n * Insert the live-reload `<script>` immediately before the closing `</body>`.\n * Falls back to appending at the end if `</body>` isn't present.\n */\nexport function injectReloadScript(html: string): string {\n const tag = `<script src=\"${RELOAD_SCRIPT_PATH}\" defer></script>`;\n // Use $& to keep the matched </body> exactly as the author wrote it\n // (mixed-case authors get their styling preserved).\n if (/<\\/body>/i.test(html)) return html.replace(/<\\/body>/i, `${tag}$&`);\n return html + tag;\n}\n\nasync function findFreePort(host: string, start: number, range: number): Promise<number> {\n for (let p = start; p < start + range; p++) {\n if (await isPortFree(host, p)) return p;\n }\n throw new Error(\n `No free port in ${start}–${start + range - 1} on ${host}. ` +\n `Pass --port to pick a different starting point.`,\n );\n}\n\nfunction isPortFree(host: string, port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const probe = http.createServer();\n probe.once('error', () => resolve(false));\n probe.listen(port, host, () => {\n probe.close(() => resolve(true));\n });\n });\n}\n","import path from 'node:path';\nimport chokidar, { type FSWatcher } from 'chokidar';\nimport { ConfigError, loadOvellumConfig, type OvellumConfig } from '@ovellum/core';\nimport { runBuild, type BuildSummary } from './run-build.js';\n\nconst DEBOUNCE_MS = 300;\n\nexport interface WatchAndBuildOptions {\n /** Resolved project root. All paths in the config resolve relative to this. */\n cwd: string;\n /** Initial loaded config. */\n config: OvellumConfig;\n /** Path to the loaded config file, or undefined when defaults-only. */\n configFile: string | undefined;\n /**\n * Called after every successful build (initial + each rebuild). Use this\n * hook to broadcast live-reload events or log custom output.\n */\n onBuild?: (result: BuildSummary) => void | Promise<void>;\n /**\n * Called when a build fails. Default: log to stderr. Override to keep a\n * dev server alive instead of crashing.\n */\n onError?: (err: Error) => void;\n}\n\nexport interface ActiveWatcher {\n /** Close chokidar and release the underlying handles. */\n close: () => Promise<void>;\n}\n\n/**\n * Run an initial build, then watch the input directory and the config file\n * and rebuild on every change (debounced 300 ms). When the config file\n * itself changes, reload it before the next build.\n *\n * Shared between `ovellum watch` (which just logs) and `ovellum dev`\n * (which also broadcasts a live-reload signal via the dev server).\n */\nexport async function watchAndBuild(input: WatchAndBuildOptions): Promise<ActiveWatcher> {\n let { config, configFile } = input;\n const { cwd, onBuild, onError } = input;\n const logError = onError ?? ((err) => process.stderr.write(`build failed: ${err.message}\\n`));\n\n await safeBuild(config, cwd, onBuild, logError);\n\n const inputAbs = path.resolve(cwd, config.input);\n const watchPaths = [inputAbs];\n if (configFile) watchPaths.push(configFile);\n\n const watcher: FSWatcher = chokidar.watch(watchPaths, {\n ignoreInitial: true,\n awaitWriteFinish: { stabilityThreshold: 80, pollInterval: 25 },\n });\n\n let timer: NodeJS.Timeout | undefined;\n let pending: Set<string> = new Set();\n\n const schedule = (file: string): void => {\n pending.add(path.relative(cwd, file).replace(/\\\\/g, '/') || file);\n if (timer) clearTimeout(timer);\n timer = setTimeout(async () => {\n const files = Array.from(pending);\n pending = new Set();\n process.stdout.write(\n `\\nchanged: ${files.length === 1 ? files[0] : `${files.length} files`}\\n`,\n );\n // Reload config if it changed.\n if (configFile && files.some((f) => path.resolve(cwd, f) === configFile)) {\n try {\n const reloaded = await loadOvellumConfig({ cwd, configFile });\n config = reloaded.config;\n configFile = reloaded.configFile;\n process.stdout.write('config reloaded\\n');\n } catch (err) {\n if (err instanceof ConfigError) {\n process.stderr.write(`config error: ${err.message}\\n`);\n if (err.hint) process.stderr.write(`hint: ${err.hint}\\n`);\n return;\n }\n throw err;\n }\n }\n await safeBuild(config, cwd, onBuild, logError);\n }, DEBOUNCE_MS);\n };\n\n watcher.on('add', schedule);\n watcher.on('change', schedule);\n watcher.on('unlink', schedule);\n\n return {\n close: async () => {\n if (timer) clearTimeout(timer);\n await watcher.close();\n },\n };\n}\n\nasync function safeBuild(\n config: OvellumConfig,\n cwd: string,\n onBuild: WatchAndBuildOptions['onBuild'],\n onError: (err: Error) => void,\n): Promise<void> {\n try {\n const result = await runBuild({ config, cwd });\n const count = result.mode === 'manual' ? result.pages?.length ?? 0 : result.written?.length ?? 0;\n const unit = result.mode === 'manual' ? 'page' : 'file';\n process.stdout.write(\n `built ${count} ${unit}(s) in ${result.elapsedMs}ms` +\n (result.warnings.length > 0 ? ` (${result.warnings.length} warning(s))` : '') +\n '\\n',\n );\n for (const w of result.warnings) process.stderr.write(`warning: ${w}\\n`);\n if (onBuild) await onBuild(result);\n } catch (err) {\n onError(err as Error);\n }\n}\n","import { existsSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { confirm, input, select } from '@inquirer/prompts';\nimport { defineCommand } from 'citty';\n\n/**\n * Scaffold a new Ovellum project in the current (or given) directory.\n *\n * Writes (only what's missing — never clobbers an existing file unless\n * `--force` is passed):\n *\n * ovellum.config.json — primary entry. Mode-specific shape.\n * content/index.md — starter doc, manual + hybrid modes only.\n * .gitignore — appended with `dist/` and `.orphans/` if missing.\n *\n * Non-interactive mode (`--yes`): picks every default without prompting.\n */\nexport const initCommand = defineCommand({\n meta: {\n name: 'init',\n description: 'Scaffold a new Ovellum project (config + starter content).',\n },\n args: {\n cwd: {\n type: 'string',\n description: 'Project root (defaults to current directory)',\n },\n yes: {\n type: 'boolean',\n description: 'Skip prompts; accept every default. Implies --force is false.',\n alias: 'y',\n },\n force: {\n type: 'boolean',\n description: 'Overwrite ovellum.config.json if it already exists.',\n },\n },\n async run({ args }) {\n const cwd = path.resolve(args.cwd ?? process.cwd());\n const yes = args.yes === true;\n const force = args.force === true;\n\n const configPath = path.join(cwd, 'ovellum.config.json');\n if (existsSync(configPath) && !force) {\n process.stderr.write(\n `ovellum.config.json already exists at ${configPath}.\\n` +\n `Pass --force to overwrite, or run \\`ovellum init\\` in a different directory.\\n`,\n );\n process.exit(2);\n }\n\n const defaults = await guessDefaults(cwd);\n\n let answers: InitAnswers;\n if (yes) {\n answers = defaults;\n } else {\n try {\n answers = await ask(defaults);\n } catch (err) {\n // @inquirer throws ExitPromptError on Ctrl-C; treat as a clean abort.\n if (err instanceof Error && err.name === 'ExitPromptError') {\n process.stderr.write('Cancelled.\\n');\n process.exit(130);\n }\n throw err;\n }\n }\n\n const writes: string[] = [];\n\n const configJson = renderConfig(answers);\n await writeFile(configPath, configJson, 'utf8');\n writes.push(path.relative(cwd, configPath));\n\n if (answers.mode !== 'auto') {\n const contentDir = path.join(cwd, answers.input);\n const indexMd = path.join(contentDir, 'index.md');\n if (!existsSync(indexMd)) {\n await mkdir(contentDir, { recursive: true });\n await writeFile(indexMd, renderStarterIndex(answers), 'utf8');\n writes.push(path.relative(cwd, indexMd));\n }\n }\n\n const gitignoreUpdated = await ensureGitignore(cwd, answers);\n if (gitignoreUpdated) writes.push('.gitignore');\n\n const lines = [\n `ovellum project initialised in ${cwd === process.cwd() ? '.' : cwd}/`,\n ` mode: ${answers.mode}`,\n ` written:`,\n ...writes.map((w) => ` + ${w}`),\n '',\n 'Next steps:',\n ...nextSteps(answers),\n ];\n process.stdout.write(lines.join('\\n') + '\\n');\n },\n});\n\ninterface InitAnswers {\n name: string;\n mode: 'manual' | 'auto' | 'hybrid';\n title: string;\n description: string;\n input: string;\n output: string;\n tsconfig: string;\n defaultTheme: 'auto' | 'light' | 'dark';\n landing: boolean;\n}\n\nasync function guessDefaults(cwd: string): Promise<InitAnswers> {\n let name = path.basename(cwd) || 'my-docs';\n // If a package.json is present, prefer its name as the default.\n try {\n const raw = await readFile(path.join(cwd, 'package.json'), 'utf8');\n const parsed = JSON.parse(raw) as { name?: string };\n if (typeof parsed.name === 'string' && parsed.name.length > 0) {\n name = parsed.name.replace(/^@[^/]+\\//, '');\n }\n } catch {\n // no package.json or unreadable — fall back to the folder name.\n }\n return {\n name,\n mode: 'manual',\n title: titleFromName(name),\n description: '',\n input: 'content',\n output: 'dist',\n tsconfig: 'tsconfig.json',\n defaultTheme: 'auto',\n landing: false,\n };\n}\n\nasync function ask(d: InitAnswers): Promise<InitAnswers> {\n const name = await input({ message: 'Project name', default: d.name });\n const mode = (await select({\n message: 'Documentation mode',\n default: d.mode,\n choices: [\n {\n name: 'manual — write Markdown by hand; Ovellum builds a static site',\n value: 'manual',\n },\n {\n name: 'auto — generate Markdown from TS/JS source on every build',\n value: 'auto',\n },\n {\n name: 'hybrid — generate, then merge with hand-written zones',\n value: 'hybrid',\n },\n ],\n })) as InitAnswers['mode'];\n\n const title = await input({ message: 'Site title', default: titleFromName(name) });\n const description = await input({\n message: 'Short description (used for <meta name=description>)',\n default: '',\n });\n\n let input_ = d.input;\n let output = d.output;\n let tsconfig = d.tsconfig;\n let landing = d.landing;\n if (mode === 'manual') {\n input_ = await input({ message: 'Content directory', default: d.input });\n output = await input({ message: 'Output directory', default: d.output });\n landing = await confirm({\n message: 'Generate a landing page at / (hero + feature grid)?',\n default: false,\n });\n } else {\n tsconfig = await input({ message: 'TypeScript config', default: d.tsconfig });\n output = await input({\n message: 'Output directory for generated Markdown',\n default: 'docs',\n });\n }\n\n const defaultTheme = (await select({\n message: 'Default theme',\n default: d.defaultTheme,\n choices: [\n { name: 'auto — follow system preference', value: 'auto' },\n { name: 'light', value: 'light' },\n { name: 'dark', value: 'dark' },\n ],\n })) as InitAnswers['defaultTheme'];\n\n return { name, mode, title, description, input: input_, output, tsconfig, defaultTheme, landing };\n}\n\nfunction renderConfig(a: InitAnswers): string {\n // Hand-rolling JSON instead of JSON.stringify so the field order matches the\n // documented schema and the file reads top-to-bottom the same way the docs\n // describe it.\n const base: Record<string, unknown> = {\n $schema: 'https://ovellum.oss.oinam.com/schema/ovellum.config.schema.json',\n name: a.name,\n mode: a.mode,\n };\n if (a.mode === 'manual') {\n base.input = a.input;\n base.output = a.output;\n } else {\n base.tsconfig = a.tsconfig;\n base.output = a.output;\n }\n base.site = renderSiteBlock(a);\n return JSON.stringify(base, null, 2) + '\\n';\n}\n\nfunction renderSiteBlock(a: InitAnswers): Record<string, unknown> {\n const site: Record<string, unknown> = {\n title: a.title,\n defaultTheme: a.defaultTheme,\n };\n if (a.description) site.description = a.description;\n if (a.mode !== 'auto' && a.landing) {\n site.landing = {\n enabled: true,\n hero: {\n title: a.title,\n subtitle: a.description || 'Edit this in ovellum.config.json.',\n ctas: [\n { label: 'Get started', href: '/getting-started/' },\n { label: 'View on GitHub', href: 'https://github.com/' },\n ],\n },\n features: [],\n };\n }\n return site;\n}\n\nfunction renderStarterIndex(a: InitAnswers): string {\n return `---\ntitle: ${a.title}\ndescription: ${a.description || 'Welcome to ' + a.title + '.'}\n---\n\n# ${a.title}\n\n${a.description || `Welcome to **${a.title}**. This file is \\`${a.input}/index.md\\` and it becomes the home page when you run \\`ovellum build\\`.`}\n\n## Next steps\n\n- Edit this file and re-run \\`ovellum build\\` (or \\`ovellum watch\\` for live rebuilds).\n- Add more \\`.md\\` files alongside this one — they become pages automatically.\n- Group pages by creating subdirectories; add \\`_meta.json\\` to control titles\n and ordering. See the [reference](https://ovellum.oss.oinam.com/reference/config/).\n\n## Tips\n\n- Code blocks are syntax-highlighted with Shiki.\n- The right-side ToC is built from your h2/h3 headings.\n- Drop static assets (images, etc.) in this directory; they're copied through.\n`;\n}\n\nasync function ensureGitignore(cwd: string, a: InitAnswers): Promise<boolean> {\n const gi = path.join(cwd, '.gitignore');\n const want = a.mode === 'auto' ? [a.output, '.orphans/'] : [a.output, '.orphans/'];\n const wantNorm = want.map((p) => stripTrailingSlash(p));\n\n let current = '';\n if (existsSync(gi)) current = await readFile(gi, 'utf8');\n const have = new Set(\n current\n .split(/\\r?\\n/)\n .map((l) => stripTrailingSlash(l.trim()))\n .filter(Boolean),\n );\n const missing = wantNorm.filter((p) => !have.has(p));\n if (missing.length === 0) return false;\n\n const prefix = current.length > 0 && !current.endsWith('\\n') ? '\\n' : '';\n const block = `${prefix}# Ovellum\\n${missing.map((p) => p + '/').join('\\n')}\\n`;\n await writeFile(gi, current + block, 'utf8');\n return true;\n}\n\nfunction nextSteps(a: InitAnswers): string[] {\n if (a.mode === 'manual') {\n return [\n ` 1. Edit ${a.input}/index.md and add more pages.`,\n ` 2. Run \\`ovellum build\\` (or \\`ovellum watch\\`) to render the site.`,\n ` 3. Run \\`ovellum check\\` to validate internal links.`,\n ` 4. Deploy ${a.output}/ to GitHub Pages, Netlify, Vercel, or any static host.`,\n ];\n }\n return [\n ` 1. Point \\`tsconfig\\` at the project you want to document.`,\n ` 2. Run \\`ovellum build\\` to generate Markdown into ${a.output}/.`,\n ` 3. ${a.mode === 'hybrid' ? 'Add hand-written zones inside `<!-- ovellum:manual:start --> … <!-- ovellum:manual:end -->` markers; they survive regeneration.' : 'Re-run on every source change; the output is fully regenerated each time.'}`,\n ];\n}\n\nfunction titleFromName(name: string): string {\n return name\n .split(/[-_./@\\s]/)\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n}\n\nfunction stripTrailingSlash(s: string): string {\n return s.endsWith('/') ? s.slice(0, -1) : s;\n}\n","import { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { defineCommand } from 'citty';\nimport { ConfigError, loadOvellumConfig } from '@ovellum/core';\nimport { startDevServer } from '../dev/server.js';\n\nconst DEFAULT_PORT = 3000;\nconst DEFAULT_HOST = '127.0.0.1';\n\nexport const serveCommand = defineCommand({\n meta: {\n name: 'serve',\n description: 'Serve the built site over HTTP. No watch, no live reload.',\n },\n args: {\n config: {\n type: 'string',\n description: 'Path to ovellum.config.{ts,js,json}',\n },\n cwd: {\n type: 'string',\n description: 'Project root (defaults to current directory)',\n },\n port: {\n type: 'string',\n description: `Port to bind (default ${DEFAULT_PORT}; auto-bumps if busy)`,\n },\n host: {\n type: 'string',\n description: `Host to bind (default ${DEFAULT_HOST}; pass 0.0.0.0 to expose on the network)`,\n },\n },\n async run({ args }) {\n const cwd = path.resolve(args.cwd ?? process.cwd());\n let loaded;\n try {\n loaded = await loadOvellumConfig({ cwd, configFile: args.config });\n } catch (err) {\n if (err instanceof ConfigError) {\n process.stderr.write(`config error: ${err.message}\\n`);\n if (err.hint) process.stderr.write(`hint: ${err.hint}\\n`);\n process.exit(3);\n }\n throw err;\n }\n const { config } = loaded;\n\n const outputAbs = path.resolve(cwd, config.output);\n if (!existsSync(outputAbs)) {\n process.stderr.write(\n `output directory does not exist: ${path.relative(cwd, outputAbs)}\\n` +\n `hint: run \\`ovellum build\\` first, or \\`ovellum dev\\` to build + watch + serve.\\n`,\n );\n process.exit(1);\n }\n\n const port = parsePort(args.port) ?? DEFAULT_PORT;\n const host = args.host ?? DEFAULT_HOST;\n\n const server = await startDevServer({\n rootDir: outputAbs,\n port,\n host,\n liveReload: false,\n });\n\n process.stdout.write(\n `ovellum serve\\n` +\n ` serving: ${path.relative(cwd, outputAbs)}/\\n` +\n ` url: ${server.url}\\n` +\n `press Ctrl-C to exit.\\n`,\n );\n\n const shutdown = async (): Promise<void> => {\n process.stdout.write('\\nstopping server…\\n');\n await server.close();\n process.exit(0);\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n await new Promise(() => {});\n },\n});\n\nfunction parsePort(raw: string | undefined): number | undefined {\n if (raw === undefined) return undefined;\n const n = Number(raw);\n if (!Number.isInteger(n) || n < 1 || n > 65535) {\n throw new Error(`--port must be an integer between 1 and 65535; got '${raw}'.`);\n }\n return n;\n}\n","import path from 'node:path';\nimport { defineCommand } from 'citty';\nimport { ConfigError, loadOvellumConfig } from '@ovellum/core';\nimport { watchAndBuild } from '../dev/watcher.js';\n\nexport const watchCommand = defineCommand({\n meta: {\n name: 'watch',\n description: 'Build the site, then rebuild on every change under input/.',\n },\n args: {\n config: {\n type: 'string',\n description: 'Path to ovellum.config.{ts,js,json}',\n },\n cwd: {\n type: 'string',\n description: 'Project root (defaults to current directory)',\n },\n },\n async run({ args }) {\n const cwd = path.resolve(args.cwd ?? process.cwd());\n let loaded;\n try {\n loaded = await loadOvellumConfig({ cwd, configFile: args.config });\n } catch (err) {\n if (err instanceof ConfigError) {\n process.stderr.write(`config error: ${err.message}\\n`);\n if (err.hint) process.stderr.write(`hint: ${err.hint}\\n`);\n process.exit(3);\n }\n throw err;\n }\n const { config, configFile } = loaded;\n process.stdout.write(\n `ovellum watch starting from ${configFile ?? '(defaults)'} (mode: ${config.mode})\\n`,\n );\n\n const watcher = await watchAndBuild({ cwd, config, configFile });\n\n const inputAbs = path.resolve(cwd, config.input);\n process.stdout.write(`watching ${path.relative(cwd, inputAbs) || inputAbs} for changes…\\n`);\n process.stdout.write('press Ctrl-C to exit.\\n');\n\n const shutdown = async (): Promise<void> => {\n process.stdout.write('\\nstopping watcher…\\n');\n await watcher.close();\n process.exit(0);\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n await new Promise(() => {});\n },\n});\n"],"mappings":"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","names":["defineCommand","path","input","path","existsSync","mkdir","writeFile","path","path","node","text","path","path","node","input","path","ANCHOR_RE","list","anchorId","formatYamlScalar","existsSync","mkdir","readFile","readdir","stat","writeFile","path","matter","code","ok","index","all","node","is","node","visit","list","node","replace","node","domain","path","trail","code","node","exit","node","exit","row","sizes","columnIndex","code","node","exit","list","node","node","exit","value","map","node","exit","code","code","node","exit","close","EXIT","node","EXIT","node","exit","subexit","value","node","node","exit","node","exit","node","node","node","exit","value","node","exit","text","node","exit","node","exit","map","node","exit","node","node","exit","close","node","node","exit","node","list","all","code","list","path","text","code","ok","trail","constructs","ok","code","ok","code","ok","code","text","ok","previous","code","ok","code","map","ok","code","close","emptyOptions","visit","readFile","path","matter","stat","unified","remarkParse","node","text","code","root","walk","input","link","stripTrailingSlash","escapeXml","escapeAttr","trail","lastModifiedISO","mkdir","html","writeFile","isMarkdown","existsSync","readdir","input","path","existsSync","mkdir","writeFile","path","existsSync","readFile","readdir","stat","path","defineCommand","matter","defineCommand","path","readFile","matter","existsSync","readdir","stat","ensureTrailingSlash","path","defineCommand","existsSync","readFile","path","url","stat","html","path","input","path","defineCommand","path","existsSync","mkdir","readFile","writeFile","path","defineCommand","stripTrailingSlash","existsSync","path","defineCommand","DEFAULT_PORT","DEFAULT_HOST","defineCommand","path","existsSync","parsePort","path","defineCommand","defineCommand","path","defineCommand"]}